www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tabellen im SRAM ATiny26


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alex (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

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

Autor: Ingo Henze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.