Assembler automatische Triggerung und Umschaltung ADC

Sinnsucher

Neues Mitglied
24. Mai 2011
2
0
0
Sprachen
Hallo,

bin am verzweifeln. Ich möchte eine AD-Wandlung mit Timer0 OC aut. starten und in der ADC-ISR den analogen Eingang wechseln.
Klingt erst mal nicht so schwer, habe ich mir gedacht. Beschäftigt mich aber schon mehrere Tage.
Es scheint so, als ob nur einmal gewandelt wird. Das Prog springt zwar immer wieder in die ADC-ISR aber der Wert in ADCH bzw. ADCL wird nicht aktualisiert.
Am Oszi ist das Timing in Ordnung, d.h. erst Timer-Int. und ca. 200µs danach der ADC Int.
Kurios ist, dass wenn ich einen Breakpoint ans Ende der ADC-ISR setze, funktioniert beim debuggen alles wunderbar.

Über Ideen würde ich mich sehr freuen
 

Anhänge

  • ADC_code.asm
    6,3 KB · Aufrufe: 7
Hallo,

ich habe mir dein Assemblerprogramm einmal angesehen. Die Initialisierung von Timer0 OC und ADC habe ich nicht überprüft.

Hier mal ein paar Ideen, die dir eventuell weiterhelfen ...

Was mir aufgefallen, bzw. unklar ist:

(1) Im ADC-Interrupt änderst du den logischen Zustand eines Portpins von PORTE, um mit Oszilloskop zu prüfen:
sbi PORTE, PCL4 ; for Oscilloscope
cbi PORTE, PCL4 ; for Oscilloscope
"PCL4" ist mir nicht bekannt. Ich nutze allerdings m32U4def.inc, eventuell hast du eine neuere (gepatchte) Version vom AVR Studio5?!
Wenn PCL4 den Wert 4 hat, dann wirkt das auf PE4, der aber bei ATmega32U4 nicht vorhanden ist.

(2) In der ADC-ISR gibt es in deinem Source label, die nicht vorhanden sind...

Code:
    load    temp3, ADMUX        ; read ADMUX reg
    sbrc    temp3, MUX0        ; M2 sense input active?
    rjmp    [B][COLOR=#b22222]adc_spk[/COLOR][/B]        ; yes-> adc_M2
    sbrs    temp3, MUX0        ; [COLOR=#b22222][B]hier gibt es nie einen skip[/B][/COLOR]
    rjmp    [COLOR=#b22222][B]adc_mic[/B][/COLOR]        ; no-> adc_M1

    rjmp    adc_ret        ; return  [B][COLOR=#b22222]wird nie erreicht![/COLOR][/B]

Ich nehme an, du hattest ursprüglich die label adc_M1 und adc_M2?! Wenn ja, müsste es eigentlich funktionieren.

(3) Was mir im Datenblatt nicht ganz klar ist, es gibt ja zwei Timer0 CompareMatch, A und B. Beim ADC kann man nur die Triggerquelle Timer0OC einstellen, aber nicht zwischen A un B unterscheiden,
wird hier bei beiden getriggert?

(4) Du nutzt das richtige Include-File?

(5) Hast du auch einmal ohne Umschalten der Kanäle probiert. Also einfach mal einen Kanal messen und durch Timer0OC alle 5ms triggern lassen?


Vielleicht hilft dir ja irgendwas davon weiter :)

Gruß,
Dirk
 
Hallo Dirk,

vielen Dank für die Mühe. Ich habe den Code vorm posten etwas modifiziert (ich weiß, das macht das Helfen nicht einfacher). Deshalb auch ein paar Relikte wie PLC4 und die falschen Labels.
Ich glaube, dass ich meinen Fehler gefunden habe. Das einzige Problem war wahrscheinlich, dass ich ADCH vor ADCL eingelesen habe. Das könnte im Datenblatt auch ruhig etwas dicker gedruckt sein.
Das mit der Triggersource habe ich mich auch schon gefragt, aber es funktioniert auf jeden Fall mit OCA.

Nochmals Danke
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)