Also, ich grab diesen Thread noch mal aus;
ich habe mich jz wieder hingesetzt und an dem Problem weitergearbeitet;
nun habe ich auch einen besseren Ansatz:
Der Timer, sowie, die PC-Interrupts werden so konfiguriert:
(16 MHz)
1 | TCCR5B = (1<<WGM02)|(1<<CS51);//eneble Timer5(16bit) - CTC; prescaler 8 => every 0,5us
|
2 | OCR5A = 116;//every 58us
|
3 | TIMSK5 = (1<<OCIE5A);//enable timer 5 overflow
|
4 | TCNT5 = 0;
|
5 | PCICR=(1<<PCIE0); // enable PCINT7:0
|
6 | PCMSK0=(1<<PCINT1); // enable PCINT 1
|
Der Rest, der die Ultraschallsensoren betrifft:
1 | ISR(PCINT0_vect)
|
2 | {
|
3 | if(PINB & (1<<PB1))//pin changed to high
|
4 | {
|
5 | usVal = TCNT5;
|
6 | }
|
7 | else if(!(PINB & (1<<PB1)))//pin changed to low
|
8 | {
|
9 | us = TCNT5;
|
10 | }
|
11 | }
|
12 | ISR(TIMER5_COMPA_vect)
|
13 | {
|
14 | TCNT5++;
|
15 | }
|
Die Variablen usVal(also der Startwert, uint16_t) und us(Endwert, auch
uint16_t) sind volatile.
Eigentlich wurden auch die Interrupts während dem Auslösen des
Messvorgangs(Pin für 50us auf High) gesperrt:
1 | PCMSK0 &= ~(1<<PCINT1);
|
2 | DDRB |= (1<<PB1);
|
3 | PORTB |= (1<<PB1);
|
4 | _delay_us(50);
|
5 | PORTB &= ~(1<<PB1);
|
6 | DDRB &= ~(1<<PB1);
|
7 | PCMSK0 |= (1<<PCINT1);
|
Aber die Sensoren liefern keine sinnvollen Ergebnisse. Leider habe ich
kein Oszi, nur ein LCD, also keine sehr genauen Zeitangaben.
Hat jemand eine Idee, was ich falsch mache?
Weiter Infos gebe ich natürlich gerne ;)