jkn
17.05.2007, 12:14
Hallo,
Ich möchte mit dem Mega8 / Timer 1 eine Pulsmessung durchführen. Der Pulseingang ist an PD6 (ICP), Bei ansteigender Flanke soll der Timer1 auf null gesetzt werden und bei abfallender Flanke stoppen. Der Wert soll dann , wenn es mal funzt, ins RAM und dann weiterverarbeitet werden.
Im Simulator läuft es nur in der Hardware nicht. Ich habe am PD6 einen Puls-Generator.Also Schalterprellen kann nicht der Fehler sein. Auch zwischen 2 Pulsen ist genug Zeit. Irgendeinen Fehler mache ich - kann mir jemand weiterhelfen?????
Im voraus mal vielen Dank
Hier der ( im wahrsten Sinne :-) ) Code:
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint16_t wert,wort;
volatile uint8_t i,y=0;
SIGNAL(SIG_INPUT_CAPTURE1)
{
if(i>10)
{
wort=ICR1;// Timer auslesen
wert=wort;//>>8;//nur high byte
PORTB = wort;//>>8;// Zähler ausgeben
TCCR1B &=~(1<<ICES1);// Inter. Steigende Flanke
i=5;// Flag zurücksetzen
}
else
{
TCNT1=0;// Zähler auf Null = Reset Timer
TCCR1B |=(1<<ICNC1)|(1<<ICES1)|(1<<CS11)|(1<<CS10);// Inter.auf fallende Flanke
i=15;// Flag setzen
}
}
int main(void)
{
DDRB = 0xff;//Portb =Ausgabe
PORTD = 0x00;
TIMSK |= (1<<TICIE1);//Input Capture frei
TCCR1B |= (1<<ICES1)|(1<<CS11) | (1<<CS10);
sei();
while(1)
{ }
return 0;
}
Ich möchte mit dem Mega8 / Timer 1 eine Pulsmessung durchführen. Der Pulseingang ist an PD6 (ICP), Bei ansteigender Flanke soll der Timer1 auf null gesetzt werden und bei abfallender Flanke stoppen. Der Wert soll dann , wenn es mal funzt, ins RAM und dann weiterverarbeitet werden.
Im Simulator läuft es nur in der Hardware nicht. Ich habe am PD6 einen Puls-Generator.Also Schalterprellen kann nicht der Fehler sein. Auch zwischen 2 Pulsen ist genug Zeit. Irgendeinen Fehler mache ich - kann mir jemand weiterhelfen?????
Im voraus mal vielen Dank
Hier der ( im wahrsten Sinne :-) ) Code:
#include <avr/io.h>
#include <avr/interrupt.h>
volatile uint16_t wert,wort;
volatile uint8_t i,y=0;
SIGNAL(SIG_INPUT_CAPTURE1)
{
if(i>10)
{
wort=ICR1;// Timer auslesen
wert=wort;//>>8;//nur high byte
PORTB = wort;//>>8;// Zähler ausgeben
TCCR1B &=~(1<<ICES1);// Inter. Steigende Flanke
i=5;// Flag zurücksetzen
}
else
{
TCNT1=0;// Zähler auf Null = Reset Timer
TCCR1B |=(1<<ICNC1)|(1<<ICES1)|(1<<CS11)|(1<<CS10);// Inter.auf fallende Flanke
i=15;// Flag setzen
}
}
int main(void)
{
DDRB = 0xff;//Portb =Ausgabe
PORTD = 0x00;
TIMSK |= (1<<TICIE1);//Input Capture frei
TCCR1B |= (1<<ICES1)|(1<<CS11) | (1<<CS10);
sei();
while(1)
{ }
return 0;
}