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!
ich habe den Code kurzeit so umgeschrieben das der ADC durch den INT0 angestoßen werden soll, jedoch das selber fehler Bild...
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
spess53 schrieb: > Ist das so gewollt? dabei habe ich mir gedacht, dass ich erst eine normalnen Dummy Read mache (falls ich mal den Kanal wechseln will) und erst danach den Auto Trigger einschalte. oder habe ich da einen logik fehler?
Hi Du schaltest mit der 2. Anweisung den ADC ab. '=' -> '|=' MfG Spess
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?
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
Danke, das hab ich verstanden und vergess ich jetzt nie wieder ;)
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?
Andi schrieb: > Manchmal sind aber Registerwerte von über 20000 dabei??? Dann wird bei dir was anderes faul sein.
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.