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ß
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...
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...
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.
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 ;)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.