- LiFePO4 Speicher Test         
Ergebnis 1 bis 5 von 5

Thema: AD-Simulation im AVR-Studio4

  1. #1
    Neuer Benutzer
    Registriert seit
    09.04.2006
    Ort
    Isenburg
    Beiträge
    3

    AD-Simulation im AVR-Studio4

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.02.2006
    Alter
    54
    Beiträge
    781
    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.

  3. #3
    Neuer Benutzer
    Registriert seit
    09.04.2006
    Ort
    Isenburg
    Beiträge
    3
    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?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.02.2006
    Alter
    54
    Beiträge
    781
    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

  5. #5
    Neuer Benutzer
    Registriert seit
    09.04.2006
    Ort
    Isenburg
    Beiträge
    3
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen