Forum: Mikrocontroller und Digitale Elektronik ADC-lesen debuggen


von Alex (Gast)


Lesenswert?

Hallo,

Ich habe ein Assembler-Programm mit dem ich ein Analog-Signal einlesen
kann (können sollte).

Um die Funktion zu testen möchte ich es  debuggen, aber ich weiss nicht
wie.

Kann ich nicht enfach am PortA den PIN7 (ATmega32) auf high oder Low
setzen und dann (wenn ich diesen Analogwert einlese) im HighByte oder/
und LowByte etwas sehen ???

Ich möchte also einen Analogwert vorgeben, diesen einlesen und im High
und Lowbyte sehen ....  wie geht das / geht es überhaupt ????


Grüsse Alex

von Läubi (Gast)


Lesenswert?

Du kanst natürlich an eine Port einfach 8 LEDs hängen, den ADChigh wert
z.B. drauf ausgeben, dann mußt du nurnoch mit dem Windowstaschenrechner
den Binärwert umrechnen.

Also VDD ---->|-- [1kohm]--AVR

von Hannes L. (hannes)


Lesenswert?

Falls du das ASM-Programm mit AVR-Studio geschrieben hast, dann kannst
du es mit dessen Simulator simulieren. Dann siehst du, wie die Werte in
die Register übernommen werden.

Bei realer Hardware ist Ausgabe auf Ports mit LEDs schonmal nicht
falsch.

Den WINDOWS-Taschenrechner (Tasche??? Ist wohl eher ein Mausklick-
Bildschirmrechner) brauchst du allerdings nur, wenn du nicht bis 2
zählen kannst. Wenn du erstmal die Wertigkeit der Bits im Byte bzw.
Nibble begriffen hast, dann erübrigt sich das.

...

von Alex (Gast)


Lesenswert?

Danke schonmal....

die wertigkeit der Bytes und nibbles sind mir wohl bekannt, jedoch will
ich doch im Studio-Simulator sehen wie die werte ins ADCH und ADCL
übernommen werden, und das geht eben nicht. Und zwar lese ich von PA7
der nun als ADC7 konfigurirt sein müsste. Und wie kann ich nun diesem
ADC7 einen Wert (wärend der Simulation) vor-geben ?

UND:  Wie kann ich abfragen ob mein eingelesener Wert > oder < als  z.B
2.5V ist bzw wie heisst der Befehl?

Danke für euere Unterstützung

von Hannes L. (hannes)


Lesenswert?

Nunja, du musst den Wert (den du beim Simulieren ja nicht "messen"
kannst) schon in die I/O-Register ADCL und ADCH "einklicken", also
die Kästchen mit Häkchen versehen (im "Workspace", I/O, ADC).
Alternativ kannst du mit Doppelklick auf die angezeigten Zahlenwerte
einen Eingabedialog öffnen.

Zum Vergleich:
Den Wert liest du ja mit
 in wl,adcl   ;Register wl nimmt den Wert von I/O-Reg. adcl an
 in wh,adch   ;Register wh nimmt den Wert von I/O-Reg. adch an
ein, wobei ich mit wl und wh Register meine, die zu Programmbeginn per

.def wl=r24   ;r24 heißt jetzt "wl" ("working-Low", temprär
genutzt)
.def wh=r25   ;r25 heißt jetzt "wh" ("working-High", temporär)
definiert wurden.

Nun musst du die Werte in den Registern noch mit deinen Referenzwerten
vergleichen. Dazu musst du erstmal erkennen/beachten, dass dein Wert 0
bis 1023 betragen kann (rechtsbündiges Auslesen vorausgesetzt, siehe
ADCLAR in ADMUX im Datenblatt). Davon stehen die 8 unteren Bits in wl
(0-255), die 2 oberen Bits in wh.(0-3 mal 256).

Ist deine Referenz in einem Registerpaar, dann vergleichst du mit
 cp wl,r2     ;unteres Byte vergleichen und damit Flags beeinflussen
 cpc wh,r3    ;oberes Byte incl. Carry vergleichen
die temporären Register mit den Referenzregistern, von denen r2 das
untere Byte enthält und r3 das obere. Der Vergleich hat nun die
einzelnen Flags (Zustandsbits) im Statusregister "sreg" beeinflusst
(siehe Datenblatt, instruction set summary). Um nun darauf zu
reagieren, dienen die vielen "brxx"-Befehle, also die bedingten
Sprungbefehle (BRanch wenn Bedingung).
 BRCC label1  ;BRanch if Carry Clear
springt z.B. zur Sprungmarke "label1:" wenn Carry gelöscht ist, also
wenn bei der vorherigen Operation/Vergleich kein Übertrag stattfand.
Welche Branch-Befehle auf welche Flags reagieren, erfährst du im
Datenblatt (instruction set summary) und natürlich auch in der
Online-Hilfe des AVR-Studio (Cursor auf fragwürdigen Befehl,
F1-Taste).
Die Tabellen "instruction set summary" und "I/O-Register-Summary"
(kann geringfügig anders heißen, ich meine die Zusammenfassungen am
Ende des Datenblattes) sollte man sich als Anfänger unbedingt
ausdrucken, die benötigt man immer wieder als Referenz.

...

von Alex (Gast)


Lesenswert?

Hallo ...HanneS...,

vielen Dank erstmal.

Ok funtz nun alles, also analog-Daten einlesen und das Lowbyte wieder
an LEDs ausgeben.

Wenn ichs richtig verstanden habe hast du doch oben erklärt wie man die
Werte dann vergleicht- oder.

Habe nämlich folgendes Problem dass ich abfragen solle ob der Wert
(10bit) grösser 514 oder kleiner 510 ist, und dementsprechend
reagieren. mit dem Lowbyte alleine einen vergleich zu machen ist kein
Problem, aber in dem Fall muss ich ja Low-und HighByte zusammen
betrachten.

Wo im Handbuch finde ich eigentlich die ganzen unterstützten Befehle ?

Haste nicht ein paar Zeilen die das erledigen.

ungefähr:

cp GESAMMTBYTE,510
brge Label2

Vielen Dank

von Hannes L. (hannes)


Lesenswert?

> cp GESAMMTBYTE,510
> brge Label2

Geht nicht...

cp vergleicht 2 Register, keine Konstanten (fixe Zahlen), du müsstest
also cpi nehmen (immidiate)

Ein Byte fasst nur 8 Bit, kann also nur Werte von 0 bis 255 darstellen.
Mit 510 wird das also nix.

Ich habe dir doch bereits einen 16-Bit-Vergleich gezeigt:

 cp wl,r2     ;unteres Byte vergleichen und damit Flags beeinflussen
 cpc wh,r3    ;oberes Byte incl. Carry vergleichen
 brcs label1  ;Springe zu Label1, falls Carry-Flag gesetzt ist

In diesem Beispiel wurde davon ausgegangen, dass der Messwert in den
Registern wh:wl liegt und deine Referenz in den Registern r3:r2.

8-Bit Vergleiche gehen auch mit Konstanten:

 cpi wl,231   ;beeinflusst Flags, ohne wl zu verändern

16-Bit-Vergleiche mit Konstanten sind etwas schwieriger, da es keinen
Befehl "cpic" (ComPare Immidiate with Carry) gibt. Hier muss das
H-Byte der Referenzkonstante in ein Hilfsregister geladen werden, mit
dem man dann vergleicht:

 ldi temp,high(ref)  ;oberes Byte der Konstante "ref" in Hilfsreg.
 cpi wl,low(ref)     ;Vergleich unteres Byte mit L-Byte Konstante
 cpc wh,temp         ;Vergleich oberes Byte+Carry mit Hilfsreg.
 brcs label1         ;springe, wenn Carry gesetzt
 rjmp irgendwohin    ;springe irgendwoandershin, wenn Carry=0

Da du in ASM auf Byte-Ebene arbeitest, musst du dich von den
komfortablen Vergleichsmöglichkeiten der Hochsprachen verabschieden.
Sowas wie:
 if wert>referenz then
musst du also selbst bis auf Byte-Ebene auflösen.

Ich empfehle dir dazu etwas mit dem Simulator des AVR-Studios zu
spielen. Dort bist du aufgrund der Online-Hilfe auch sehr dicht an den
Erklärungen der Befehle. (F1 drücken, wenn Cursor auf dem Befehl
steht)

...

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.