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
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
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. ...
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
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. ...
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.