Forum: Mikrocontroller und Digitale Elektronik ADC-Auto Trigger Mode


von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich möchte mit meinem ATmega168 nun einen Strom Rückmessen.
Die HW Funktioniert, am ADC eingang liegt der erwartete Wert an.

Ich benutze Timer 1 um eine Fast PWM zu Erzeugen.
Alle 200 ms habe ich für 40 ms eine PWM.
Diese hat eine Frequenz von 500 Hz und ändert innerhalb der 40 ms nach 
20 ms ihren Duty Cycle. (erste 20 ms 25% dann 10%). => Funktioniert

Jetzt möchte ich bei jedem Timer1 Compare Match eine ADC Messung machen.
Dazu soll angehängter Code dienen, welcher aber leider nicht 
funktioniert.

Kann man die AUTO-Trigger Messungen etwa nur in der ISR des ADC 
abhandeln?

Vielen Dank schonmal für die Hilfe & Gruß

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

habe immer noch das selber Problem wie oben.
Mittlerweile mach ich die Messung im ADC Interrupt.
Innerhalb der ISR ist die Convertierung schon abgeschlossen oder?
(so versteh ich das Datenblatt)

Jedoch bleibt meine LED weiter aus, die richtigen Werte liegen aber am 
ADC PIN an.

wenn ich die Funktion init_Current_OPV(); in meine Hauptschleife schiebe
wechselt meine LED zwischen AN AUS.

Kann mir das verhalten nicht erklären...

von Andi (Gast)


Lesenswert?

Hab jetzt noch einen Fehler verbessert:

Ich dachte man muss muss ADIF zurück setzten um wieder eine neue 
Wandlung
starten zu können.
also habe ich:

ADCSRA &= ~(1<<ADIF);
durch
TIFR1 = (1<<OCF1B);

in der ADC ISR geändert...aber es geht totzdem noch nicht...

von JW (Gast)


Lesenswert?

Hallo Andy,
1
static volatile unsigned int test =0;
Gruß,
Jürgen

von Andi (Gast)


Lesenswert?

das zusätzliche "volatile" bringt leider keine Verbesserung.

von JW (Gast)


Lesenswert?

aber ohne merkt der compiler nicht, daß
1
test
 in der ISR geändert wird ;-)

von MitLeser (Gast)


Lesenswert?

Du musst das Timer1 Capture Compare-Flag nach dem Event selbst
zurücksetzen, weil der entsprechende Interrupt nicht ausgeführt wird.
D.h. wahrscheinlich wird der ADC nur einmal vom Timer1 angestossen.

von Andi (Gast)


Lesenswert?

MitLeser schrieb:
> Du musst das Timer1 Capture Compare-Flag nach dem Event selbst
>
> zurücksetzen, weil der entsprechende Interrupt nicht ausgeführt wird.
>
> D.h. wahrscheinlich wird der ADC nur einmal vom Timer1 angestossen.


Andi schrieb:
> TIFR1 = (1<<OCF1B);
>
> in der ADC ISR geändert...aber es geht totzdem noch nicht...

Ich setzte es in der ADC ISR durch  TIFR1 = (1<<OCF1B); zurück.


JW schrieb:
> aber ohne merkt der compiler nicht, daßtest
>
>  in der ISR geändert wird ;-)

dann sollte ich bei meiner PWM den counter auch static volatile machen, 
funktioniert zwar auch ohne aber sicher ist sicher ;)

von JW (Gast)


Lesenswert?

Andi schrieb:
> dann sollte ich bei meiner PWM den counter auch static volatile machen,
> funktioniert zwar auch ohne aber sicher ist sicher ;)

wenn eine Variable nur in der ISR oder nur im "Hauptprogramm" benutzt 
wird, dann braucht man volatile nicht. Es sorgt nämlich dafür, daß immer 
aus dem RAM nachgelesen wird, auch wenn der Wert schon in einem Register 
stand. Er kann sich ja jederzeit ändern.

Peter Dannegger benutzt ein paar Macros um das zu umgehen:
Variable ohne volatile, in der ISR (aber nur wenn nur eine ISR auf die 
Variable zugreift) und in der "Mainschleife" per Macro auf volatile 
casten. Damit optimiert der GCC in der ISR besser.

Gruß,
Jürgen

von Andi (Gast)


Lesenswert?

JW schrieb:
> wenn eine Variable nur in der ISR oder nur im "Hauptprogramm" benutzt
> wird, dann braucht man volatile nicht. Es sorgt nämlich dafür, daß immer
> aus dem RAM nachgelesen wird, auch wenn der Wert schon in einem Register
> stand. Er kann sich ja jederzeit ändern.

ok verstanden.
Ich seh denoch keinen Fehler warum mein Programm nicht geht.

Ich habe meine PWM die geht.
Ich habe den ADC auf Autotrigger an gestellt.
Ich habe Compare Match T1B als Trigger Quelle.
Ich Verrechne das ADC Ergebniss in seiner ISR und setze das Timer
Flag zurück.
Ich greife per Funktion auf meine static volatile variable zu
und vergleiche den wert.
Funktioniert vielleicht da was nicht?

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