PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Puls von 1ms bis 30ms messen



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;
}

Hubert.G
17.05.2007, 14:32
Bist du dir sicher das du da nicht einen Pin-wuxel drinnen hast. Du schreibst PD6 (ICP), das ist aber AIN0, ICP1 ist PB0. Wenn du AIN0 verwenden willst musst du auch den AC enablen.
Hubert

jkn
17.05.2007, 22:35
Hallo Hubert,
Danke für deine schnelle Nachricht. PIN-WUXEL - du hast recht. Ich weiß nicht wie ich nach dem Studium des Datenblattes daruf kommen konnte ICP an den PD6 anzuschließen????? Bin scheinbar langsam betriebsblind oder urlaubsreif, was weiß ich. Danke nochmal. Ich werde es am Montag umwuxeln :-)

Gruß Joachim