Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Balkonkraftwerk Speicher und Wechselrichter Tests und Tutorials

(Tabellen im SRAM / ERAM / XRAM)
(mehrdimensionale Tabellen)
Zeile 17: Zeile 17:
  
 
===mehrdimensionale Tabellen===
 
===mehrdimensionale Tabellen===
So direkt hat das der Bascom nicht drauf. Aber man kann sich natürlich helfen.  
+
So direkt hat das der Bascom nicht drauf. Aber man kann sich natürlich helfen.
 +
 
'''Beispiel'''
 
'''Beispiel'''
 +
 
Es wird eine 2 dimensionale Tabelle von Words benötigt, sagen wir 6 x 14. Man definiert also
 
Es wird eine 2 dimensionale Tabelle von Words benötigt, sagen wir 6 x 14. Man definiert also
 
<pre>
 
<pre>
Zeile 26: Zeile 28:
  
 
  DIM Tabelle(Max_z) as word       
 
  DIM Tabelle(Max_z) as word       
  DIM tab_index as byte          ' der berechnetet eindimensionale index
+
  DIM tab_index as byte          ' der berechnete eindimensionale Index
 
  DIM tab_x as byte
 
  DIM tab_x as byte
 
  DIM tab_y as byte
 
  DIM tab_y as byte
  DIM help as byte              ' Ein Hilfsfeld zum rechnen
+
  DIM help as byte              ' Ein Hilfsfeld zum Rechnen
  
 
' wir wollen das element 4 , 7 adressieren  (cave: 1 - max_x und 1 - max_y, s.o)
 
' wir wollen das element 4 , 7 adressieren  (cave: 1 - max_x und 1 - max_y, s.o)
Zeile 44: Zeile 46:
  
 
</pre>
 
</pre>
Wenn man einmal eine Funktion tab_index = f (x, y) definiert und schreibt, ist das nicht mehr so schlimm.  
+
Wenn man einmal eine Funktion tab_index = f (x, y) definiert und schreibt, ist das nicht mehr so schlimm.
  
 
===Tabellen im Programmspeicher===
 
===Tabellen im Programmspeicher===

Version vom 19. Januar 2006, 14:22 Uhr

Bascom Tabellen

An sich sind Tabellen in Bascom recht einfach anzuwenden.

Tabellen im SRAM / ERAM / XRAM

Man schreibt einfach bei einer Feld-dimensionierung eine Zahl dazu, und schon gibt es dieses Feld mehrfach

DIM tabelle(24) as byte
DIM strings(8) as string * 18

Um ein Element zu adressieren, wird einfach nur zusätzlich zum Feldnamen der Index angegeben

strings(4) = "viertes Element"
strings(7) = "siebtes Element"

Damit lassen sich auch sehr effiziente Schleifen bauen

dim indexwert as byte
for indexwert = 1 to 8 
  print strings(indexwert)
next

Dabei ist zu beachten, daß Basic allgemein und daher auch Bascom die Elemente mit "1" beginnend adressiert und nicht mit "0", wie z.B C. Die Angabe "BASE", um das zu ändern, gibt's bei Bascom nicht, also soll es halt so sein. Man darf das halt bei irgendwelchen Rechnungen nie vergessen.

mehrdimensionale Tabellen

So direkt hat das der Bascom nicht drauf. Aber man kann sich natürlich helfen.

Beispiel

Es wird eine 2 dimensionale Tabelle von Words benötigt, sagen wir 6 x 14. Man definiert also

const Max_x = 6
const Max_y = 14
const Max_z = Max_x * Max_y    ' 6 * 14 = 84

 DIM Tabelle(Max_z) as word      
 DIM tab_index as byte          ' der berechnete eindimensionale Index
 DIM tab_x as byte
 DIM tab_y as byte
 DIM help as byte              ' Ein Hilfsfeld zum Rechnen 

' wir wollen das element 4 , 7 adressieren   (cave: 1 - max_x und 1 - max_y, s.o)
 tab_x = 4
 tab_y = 7

   help = tab_x - 1
   help = help * Max_y 
   tab_index = help + 1
   tab_index = tab_index + tab_y
   tab_index = tab_index - 1

   Tabelle(tab_index) = wert

Wenn man einmal eine Funktion tab_index = f (x, y) definiert und schreibt, ist das nicht mehr so schlimm.

Tabellen im Programmspeicher

Auch die gibt es, nur funktioniert die Sache da etwas anders. Der Zugriff mittels "RESTORE" und "READ" ist natürlich wie gewohnt möglich, nur ist so kein direkter Zugriff in vernünftiger Zeit zu machen

Beim Anlegen der Tabelle müssen natürlich die Werte gleich reingeschrieben werden, zur Laufzeit geht da nix mehr.

Byte_Tabelle:
  DATA     &H00, &H01, 23, ...........
Integer_Tabelle:
  DATA     &H00%, &H01%, 23%, -23%, ...........  ' da gehen dann auch negative Zahlen
Long_Tabelle:
  DATA     0&, 3840&, 23&, -23&, ...........  
Single_Tabelle:
  DATA     0.44!, 3840!, 23.67!, -23!, ...........  

Klarerweise geht nur lesen, z.B. Hier ist auf die richtige definition von "Wert" zu achten, die muß zu der Tabelle passen

DIM Wert as Byte 
Wert = LOOKUP (12, Byte_tabelle)
DIM Wert as Integer  
Wert = LOOKUP (12, Integer_tabelle)

Vorsicht: das erste Byte wird hier mit der Nummer = 0 angesprochen Bitte keine Anfragen, ich kann das auch nicht erklären !


Natürlich lassen sich auch mehrdimensionale Tabellen simulieren, genau wie bei den SRAM /EPROM Tabellen

Eine interessante Umkehrung: mit dem Befehl "LOOKDOWN" kann ein Wert in einer solchen Tabelle auch gesucht werden mit dem Index als Ergebnis.

DIM Indexnr as byte
DIM Wert as Integer  
Wert = 23
indexnr = LOOKDOWN (Wert, Integer_tabelle, 5)

Hier muß die Anzahl der Elemente angegeben werden, im Beispiel ist das 5

Vorsicht: das erste Element wird hier als Indexnr = 1 bezeichnet Bitte keine Anfragen, ich kann das auch nicht erklären !

Ist der gesuchte Wert nicht enthalten, wird 255 bzw (-1) zurückgegeben.

Autor

Siehe auch


LiFePO4 Speicher Test