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
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
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...
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?
habe grad aus den 5 einzelnen tabellen eine gemacht. jetzt komt die fehlermeldung das das maximum des programmspeichers erreicht ist ...warum denn dies ?
ok das mit dem überfüllten programmspeicher hat sich erledigt. wäre jetzt nur noch das problem mit der durch 128 teilbaren adresse...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.