ADC Auto-Trigger mit Timer1 Compare Match B

Gast #1811091
Lesenswert?

Hallo zusammen,

ich habe mal wieder Probleme mit meinem ADC.
Überblick:
Ich habe eine PWM mit 500Hz für 40 ms alle 200ms.
In den 40 ms wo die PWM an ist schalte ich nach 20 ms einen andern
Tastgrad. Das Funktioniert.

Jetzt möchte ich bei jedem Comparematch des Timers 1 B einen ADC Messung 
mit dem Auto Trigger anstoßen. Das funktioniert leider nicht.
Zum test ob bzw. wie oft die ISR ausgeführt wird lasse ich noch eine LED 
Toggeln. Leider geht sie nur an, d.h die ISR wird nur einmal ausgeführt.

Nach Lesen in dem Forum habe ich gesehen das oft vergesen wird das 
Interrupt Flag zurückzusetzten, das mache ich aber.

Da ich eine PWM mit 500 Hz habe mit verschiedenen Tastgraden sollte 
zwischen den Messungen immer mehr als 1 ms Zeit sein. Das sollte ja 
Eigentlich für die Wandlung reichen.

Hat jemand vielleicht eine Idee wieso meine ISR nur einmal aufgerufen 
wird?
(Code im Anhang)

Danke schonmal fürs anschauen!
Angehängte Dateien:
Gast #1811740
Lesenswert?

Hi

>void init_ADC_Current(void)
....
>  ADCSRA =(1<<ADEN)       //ADC Einschalten !!!!!!!!!!!!!!!!!!
>       |(1<<ADPS2)      //ADC Takt: F_Quarz/128
>       |(1<<ADPS1)       //    "-"
.....


>  ADCSRA =(1<<ADATE)       //Auto Trigger AN  !!!!!!!!!!!!!!!1
>       |(1<<ADIE);      //ADC ISR AN

Ist das so gewollt?

MfG Spess
Gast #1812374
Lesenswert?

Die Routine wird jetzt so durchlaufen wie ich will vielen dank du hast 
mir
sehr geholfen.

mit nur "=" schreibe ich eine 1. wenn aber schon eine 1 da ist wirds 
eine 0. mit "|=" bleibt die 1 selbst wenn schon eine 1 da steht. oder?

aber ich schreibe doch in kein Register was den ADC abschaltet sondern 
den Autotrigger an? Das verseth ich noch nicht ganz...kannst du mir das 
bitte erklären?
Gast #1812400
Lesenswert?

Hi

>mit nur "=" schreibe ich eine 1.

Nein. Du schreibst Einsen und Nullen.

ADCSRA =(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1) -> 0b10000110

ADCSRA =(1<<ADATE)|(1<<ADIE)            -> 0b00101000

ADCSRA |=(1<<ADATE)|(1<<ADIE)           -> 0b10101110

Mit '|=' schreibst du Einsen. Bits auf Null setzt du mit:

ADCSRA &=~((1<<ADATE)|(1<<ADIE))

MfG Spess
Gast #1827640
Lesenswert?

Hab jetzt noch eine Frage zu dem ADC verhalten, wofür ich
keinen neues Thema aufmachen will:

Der ADC misst in der Regel richtig. Ich lass mir von den Messpunkten
die mich interessieren die ADC Register wert über seriell Auslesen.

Manchmal sind aber Registerwerte von über 20000 dabei???
Dachte der Maxiaml wert wäre 1024. Was veranlasst den ADC solch einen 
Wert
ins Register zu schreiben?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren