Forum: Mikrocontroller und Digitale Elektronik [ASM] Atmega8 - ADC Wert im SRAM speichern


von Stephan W. (stipo)


Lesenswert?

Nabend zusammen,

da ich mir einen Platinen-Laminator baue, muss ich einen 
Temperaturmesswert einlesen. Dazu nutze ich den ADC Eingang.

Nun möchte ich den Wert des ADC im SRAM ablegen, das ich den dann mit 
einem Wert im EEPROM vergleichen kann.

Folgenden Code habe ich geschrieben. Bin mir aber nicht sicher, ob das 
auch so richtig ist (ob ich das richtig verstanden habe). Mit mehr als 
8Bit habe ich noch keine Erfahrung. Ich habe bisher nur mit 8Bit 
gearbeitet.
1
add adlow, adhigh
2
sts ADC_Messwert, adlow
Für ADC_Messwert habe ich im SRAM 2Byte reserviert.

Deshalb meine frage. Ist das richtig, das ich adhigh mit adlow addieren 
muss und dann in SRAM abspeichern kann. Irgendwie habe ich das noch 
nicht ganz verstanden.

Danke schonmal.

Grüße
Stephan

von Herr M. (herrmueller)


Lesenswert?

Nicht addieren. Auch das Sram besteht nur aus 8 bit Speicherstellen. Du 
musst erst Adlow abspeichern und dann in ADC_Messwert+1 Adhigh

Nur zum Vergleichen kannst Du sie aber auch in 2 Register übertragen, da 
brauchst Du nicht unbedingt das Sram. Immer erst ADCL, dann ADCH lesen.

von Stephan W. (stipo)


Lesenswert?

Herr Mueller schrieb:
> Nicht addieren. Auch das Sram besteht nur aus 8 bit Speicherstellen. Du
> musst erst Adlow abspeichern und dann in ADC_Messwert+1 Adhigh
Hmm. Okay, dann hab ich das wohl nicht ganz verstanden gehabt.
Nun zu dem was Du sagst. Habe ich dann wenigstens das richtig 
verstanden?
1
    sts ADC_Messwert, adlow
2
    sts ADC_Messwert+1, adhigh

>
> Nur zum Vergleichen kannst Du sie aber auch in 2 Register übertragen, da
> brauchst Du nicht unbedingt das Sram. Immer erst ADCL, dann ADCH lesen.
Naja. Ein bisschen üben ist da auch noch mit dabei. Ob das gebraucht 
wird oder nicht, stelle ich mal hinten an. Und solange der Flash nicht 
bei 100% angekommen ist, kann ich mich getrost austoben zum lernen :)

von Herr M. (herrmueller)


Lesenswert?

genau so, wenn Du zuvor

in  adlow,ADCL    ; low einlesen
in adhigh,ADCH    ; high einlesen

gemacht hast.

zum Vergleichen dann

    lds adlowAlt ,ADC_Messwert
    lds adhighAlt,ADC_Messwert+1

    cp  adlow ,adlowAlt
    cpc adhigh,adhighAlt
    br..

von Stephan W. (stipo)


Lesenswert?

Okay, dann fehlt mir nur noch das verständnis dazu, was der Code dann 
genau macht.

Hier mal, was ich mir dazu denken kann.
Da ich im SRAM ja 2Byte reserviert habe, wird durch das +1 der Zeiger 
auf die nächsten 8Bit gesetzt.
Stimmt das so?

Ach ja, das mit dem Low-Byte als erstes lesen steht ja auch im Tutorial 
drinne. Genauso, das man immer auch das High-Byte lesen muss, da sonst 
eine nachfolgende Messung nicht mehr möglich ist. Steht aber auch im 
Datenblatt.

von Herr M. (herrmueller)


Lesenswert?

genau,

wenn Du z.B dein   'ADC_Messwert'  gleich am Anfang des Datensegments

.dseg
ADC_Messwert:  .byte 2

gesetzt hast, hat es die Adresse 0x0060

das  .byte 2   bedeutet nur, dass die nächste freie Adresse für die 
nächste Speicherstelle erst wieder 0x0062 ist

der Assembler rechnet ADC_Messwert+1 aus in 0x0061 und setzt die Werte 
in dein Programm ein. d.h.  aus

    sts ADC_Messwert, adlow
    sts ADC_Messwert+1, adhigh

wird

    sts 0x0060, R18
    sts 0x0061, R19     ; R18/19 nur als Beispiel

von Stephan W. (stipo)


Lesenswert?

Okay. Dann habe ich das verstanden.
Danke Dir nochmal für die nette Hilfe.
Stück für stück fügt sich das ganze zu einem logischen Gebilde in meinem 
Kopf :)

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.