Tabellen im SRAM ATiny26

Gast #107809
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
Gast
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
Gast
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...
Gast
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?
Gast
habe grad aus den 5 einzelnen tabellen eine gemacht. jetzt komt die
fehlermeldung das das maximum des programmspeichers erreicht ist
...warum denn dies ?
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.