Gast
#628669
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