Forum: Mikrocontroller und Digitale Elektronik Tabellen im SRAM ATiny26


von Alex (Gast)


Lesenswert?

Hallo...
Ich verwende einen Atiny26 und möchte mit ihm Druck messen.
Er verfügt über einen 10Bit AD-wandler und hat 128Byte SRAM.
In den Tabellen sollen die Druckwerte des nicht linearen Drucksensors
abgespeichert werden und später aufgerufen werden.
128Byte SRAM bedeutet doch das ich maximal 128 Einträge pro Tabelle
machen kann um diese dann später in´s SRAM zu laden und mit hilfe der
Pointer auf sie  drauf zugreifen kann  Oder????

mein programm ist so aufgebaut das ich den AD-Wandler auslese und
später dann durch vergleichen mit konstanten auf die einzelnen tabellen
 zugreife..das klappt auch alles super bloß leider habe ich das problem
das mir zwischendurch falsche werte angezeigt werden...ich habe 5
tabellen angeleget die jeweils 120 einträge enthalten und die ich dann
je nach bedarf ins SRAM lade...hier mal ein auschnitt vom code,

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
tab5:
ldi compareL,low (tabelle5)
ldi compareH,high(tabelle5)
cp  compareL,wandlerL
cpc compareH,wandlerH
brcc tab4
ldi ZH,high(tabe5*2)
ldi ZL,low (tabe5*2)
subi wandlerL,low (501)
sbci wandlerH,high(501)
add ZL,wandlerL
lpm
mov wandlerL,r0
clr wandlerH

rjmp convert


tab4:
ldi compareL,low (tabelle4)
ldi compareH,high(tabelle4)
cp  compareL,wandlerL
cpc compareH,wandlerH
brcc tab3
ldi ZH,high(tabe4*2)
ldi ZL,low (tabe4*2)
subi wandlerL,low (381)
sbci wandlerH,high(381)
add ZL,wandlerL
lpm
mov wandlerL,r0
clr wandlerH

rjmp convert


.
.
.
usw.

meine frage ist eigentlich wieviel einträge ich ins SRAM laden kann,
wie man die auswertung mit tabellen evtl. eleganter gestalten kann, und
ob man jedesmal bevor man eine neue tabelle laden will den stack neu
initialisieren muss... ich hoffe ihr könnt mir tips geben...
danke Alex

von Andi (Gast)


Lesenswert?

Den Stack mußt Du nicht neu initiallisieren.
Mußt halt wissen, wie weit der Stack runtergehen kann und das passiert
mit RCALL, PUSH und durch Interrupts.
Wenn Du jetzt merkst das der Stack Programmgemäß um max. 10 Bytes
herunter geht darfst Du halt nur auf die unteren 118 Bytes
zugreifen/ändern.

Gruß
Andi

von ...HanneS... (Gast)


Lesenswert?

Hi...

Warum kopierst du die Tabelle den überhaupt ins SRAM?
Du kannst sie doch im Flash lassen und nach der Messung nur das
gewünschte Byte holen. Dauert auch nicht viel länger als aus dem SRAM.

Z-Pointer auf Tabellenanfang (Label der Tabelle * 2) setzen, Messwert
addieren, LPM...

Wenn du die Tabelle auf eine durch 128 teilbare Adresse legst (.org),
dann reicht sogar die 8-Bit-Addition ohne Berücksichtigung des
Übertrags.

Bit- & Bytebruch...
...HanneS...

von Alex (Gast)


Lesenswert?

ok.. danke für die antworten.
jetzt zu hannes. wie meinst du das mit der durch 128 teilbare adresse?
und wie bekomme ich heraus bei welcher adresse mein programmcode endet
um die tabelle mit .org anzulegen?

von Alex (Gast)


Lesenswert?

habe grad aus den 5 einzelnen tabellen eine gemacht. jetzt komt die
fehlermeldung das das maximum des programmspeichers erreicht ist
...warum denn dies ?

von Alex (Gast)


Lesenswert?

ok das mit dem überfüllten programmspeicher hat sich erledigt. wäre
jetzt nur noch das problem mit der durch 128 teilbaren adresse...

von Ingo Henze (Gast)


Lesenswert?

Hier mal zwei Möglichkeiten:

; Tabellengröße festlegen
.equ tsize = 128
; halbe Größe wegen WORD-Adressierung
.equ tsize2 = tsize/2

;-----------------------------------------
;  Variante 1 
; Tabelle beginnt nach dem Programmcode
;
; falls wir nicht ohnehin schon auf einer
; durch tsize2 teilbaren Adresse stehen
; wird org entsprechend gesetzt
;-----------------------------------------

; aktuelle Flash-Adresse
cur_flash:
.if cur_flash != cur_flash/tsize2
.org  cur_flash/tsize2+tsize2
.endif
; hier folgt die Tabelle
tabelle1:
.db    "Tabelle..."


;-----------------------------------------
;  Variante 2 
; Tabelle liegt am Ende des Flash
;
; falls ein Bootloader verwendet wird,
; muß anstelle von (FLASHEND+1) entsprechend
; BOOTSTART verwendet werden
;-----------------------------------------
.org  (FLASHEND+1)-tsize2
tabelle2:
.db    "Tabelle..."


Gruß
Ingo

von Profi (Gast)


Lesenswert?

Du kannst evtl. weniger Werte speichern und/oder noch genauer werden mit
Interpolation: wenn der Eingangswert zwischen zwei Tabellenwerten steht,
berechne den Ausgangswert proportional (oder anders, z.B. quadratisch)
zu diesen beiden Tabellenwerten.

z.B. Tabelle:
10 400
20 450
30 600
40 700
Eingang: 25  Ausgang: (450 + 600) /2 = 525

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.