Hallo, hab mit der Input Capture Fuktion Probleme. Bei der Simulation funktioniert alles einwandfrei, aber auf dem Controller läuft es nicht. Ich möchte Pulsweiten von rechteckimpulsen messen, die ich dann im weiteren Programmverlauf analysiere. leider wird das Input Capture Flag nicht gesetzt und auch kein Wert in die ICR1 abgelegt, wenn es auf dem Controller ausgeführt wird, dies hab ich mit incircuit debuggen rausgefunden. das Programm hängt dadurch dann in der Warteschleife fest. #include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> #include <stdlib.h> int timer(); int main(void) { unsigned short dif; /* 2Byte Datenformat */ DDRD =0x00; /* PORTD als Eingang nutzen */ PORTD =0x00; /* Pull-up Widerstände nicht aktivieren */ TIMSK =0b00100000; /* Freischalten des Interrupt der Input Capture Funktion*/ DDRB =0xff; PORTB =0b11111010; while (1) { TCCR1B = 0b01000001; /* Timer startet, Input Capture reagiert auf steigende Flanke */ if ( PIND & (1<<PIND6)) /* Starte Auswertung, wenn Bit Nr. 6 in PIND gesetzt (1) ist*/ { uint16_t icr1_1= ICR1; /*schreibt den Wert aus ICR1 in icr1_1 (bei steigender Flanke ausgelöst) */ TIFR =0b00100000; /* setzt das Input Capture Flag zurück */ TCCR1B =0b00000010; /* Input Capture reagiert auf fallende Flanke */ while (TIFR <0b00100000) /*Warteschleife bis fallende Flanke kommt */ {} uint16_t icr1_2= ICR1; /* schreibt den Wert ICR1 in icr1_2 (bei fallender Flanke ausgelöst) */ TIFR =0b00100000; /* setzt das Input Capture Flag zurück */ dif = icr1_2 - icr1_1; /* Impulslänge in 16Bit angegeben*/ ich bau auf eure Hilfe Gruß Chillman
Wozu hat die Capture-Einheit eigentlich einen Interrupt? Ich kann allerdings sowieso nicht ganz nachvollziehen, was dieses Programmfragment genau machen soll...
@OP: Soll dein Programm sowas wie hier im Anhang machen? ;) hth. Jörg (jaja, hab grad zuviel Zeit)
Ja das mit dem Interrupt aktivieren ist überflüssig, ist mir auch schon aufgefallen. hab auch rausgefunden, dass im Incirciut debugmodus, wenn man schritt für schritt durchgeht flanken nicht erkannt werden, wenn man aber auf run drückt schon, beim simulator erkennt er flanken selbst im step modus. naja so ist das wohl.
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.