PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AD-Simulation im AVR-Studio4



Flashman
02.06.2006, 15:15
Hallo, bin neu hier und habe ein Problem mit dem AVR-Studio4. Habe einen Assemblercode für den AD-Wandler des Atmega32 geschrieben, wenn ich nun im AVR-Studio4 das simulieren möchte bekomme ich keine Anzeige in den Registern ADCL und ADCH, stehen immer auf null, und der Wandler bleibt immer in der Warteschleife. Könnte jemand mir helfen und denn Code mal anschauen ob dort was falsch ist oder liegt der Fehler im Studio4 selbst? Untenstehend mein Assembler Code.


.NOLIST
.INCLUDE "m32def.inc"
.LIST
.DEF mp = R16
.cseg
.org 0x000
jmp Main
main:
LDI mp,LOW(RAMEND)
OUT SPL,mp
LDI mp,HIGH(RAMEND)
OUT SPH,mp
; ADMUX Kanal 0, AREF auf AVCC
ldi mp,0b01100000
out ADMUX,mp
; AD-Wandler einschalten, Wandlung starten, Teilerrate = 128
ldi mp,0b11000111
out ADCSRA,mp
; warten bis AD-Wandler fertig mit Wandlung ist
WaitAdc1:
; ADSC-Bit abfragen, wenn Null ist Wandlung fertig
sbic ADCSRA,ADSC
rjmp WaitAdc1
; AD-Wandler-Wert MSB lesen
in 16,adcl
in r17,adch
; AD-Wandler wieder abschalten
ldi mp,0b00000111
out ADCSRA,mp
ret

Dankbar für jede Hilfe!
MfG Flashmann

dennisstrehl
02.06.2006, 15:35
Frag in der Schleife besser das ADIF-Flag ab.
Das wird 1, wenn die Wandlung fertig ist, du musst es danach afaik aer selber wieder auf 0 setzen.

Flashman
02.06.2006, 17:45
Danke für die Antwort, frage nun das ADIF-Flag ab. Problem ist aber immer noch das ich im AVRStudio4 keine Rückmeldung des ADIF-Flag bekomme. Programm rennt in dieser Schleife unendlich.
Es ist doch richtig das bei meiner obigen Einstellung im ADMUX-Register der PinA-0 abgefragt wird, das heißt doch wenn ich beim debug im AVR diesen Pin auf High setze sollte doch der Wert in das Register ADCL und ADCH übertragen werden. Oder habe ich da einen Gedankenfehler?

dennisstrehl
02.06.2006, 21:25
Nee, der AD-Wandler funktioniert im Studio nicht sondern gibt immer 0 aus, aber man kann den Wert dann per Klicke auf diese Kreise die die Bits darstellen eingeben.

Edit: Sorry, ich hab da gepennt, mit dem ADC-Start-Conversion Bit funktioniert es auch (ich dachte das würde sofort nach dem starten des ADC wieder 0).
Das Problem liegt imho darin, dass du nicht lange genug wartest.
Geh mal auf die Zeile "AD-Wandler-Wert MSB lesen - in r16,adcl", drück F9, dann setzt er da einen Breakpoint.
Dann drückst du F5 und er läuft so lange weiter bis er einen Breakpoint erreicht.
Dann geht's auch.

Noch nen par Anmerkungen: RJMP ist nen Takt schneller als JMP und braucht nur 2 Byte Code.
Das RET am Ende springt irgendwo in die Walachei, es läd den Wert vom Ende des SRAM, und da steht ne Zufallszahl und springt dahin.
Um das Programm zu beenden schreibt man meistens "loop: rjmp loop" oder "rjmp main" um das Programm von vorne zu beginnen (dann muss halt nen Label mit dem Namen "main" am Anfang stehen.
RET braucht man also nur um aus einer Subroutine zurückzukommen.
Und das das ganze ziemlich Ressourcenfressend ist, da er so lange in der Schleife wartet, weißt du wohl selber.

MfG

Flashman
03.06.2006, 11:57
Danke für die Info. Habe mein Programm überarbeitet nun läuft es wie gewünscht. War etwas ungeduldig, nach einer längeren Arbeitspause meiner seits hat sich auch der AD-Wandler zurück gemeldet.
Auch die Info über den RJMP war gut, habe in meiner Assemblerliste gesehen das dieser Befehl schneller abgearbeitet wird wie der Befehl JMP.
Da ich erst seit ca. 2 Wochen mit dem Atmega32 und Assembler arbeite fehlt mir natürlich noch der Überblick.
Nochmals vielen Dank!!!!!!


MfG
Flashman