Hallo Leute,
ich habe heute eine ISR in C++ implementiert, die alle 10µs ausgeführt
werden soll (F_CPU = 16MHz). Die ISR funktioniert soweit ganz gut, aber
beim Einlesen des PORTB (PINB) reagiert die if nicht, obwohl ich weiß
(Oszi) dass das PINB1 garantiert 400µs auf 1 ist.
CodeAusschnitt:
1 | void ultrasonic::isrTimer()
|
2 | {
|
3 | switch(m_Status) {
|
4 | case inAktive:
|
5 | m_Status = triggerActive;
|
6 | (*TriggerPort) |= (1 << TriggerPin);
|
7 | break;
|
8 | case triggerActive:
|
9 | m_Status = awaitingEcho;
|
10 | (*TriggerPort) &= ~(1 << TriggerPin);
|
11 | break;
|
12 | case awaitingEcho:
|
13 | if((*EchoPort) & EchoPin) // !!!!!! wird nie true ??? !!!!!!!!
|
14 | m_Status = measureActive;
|
15 | m_distanceCount=1;
|
16 | break;
|
17 | case measureActive:
|
18 | if((*EchoPort) & EchoPin)
|
19 | m_distanceCount++;
|
20 | else {
|
21 | if (m_Behavior == single) {
|
22 | TCCR0B &= ~(1 << CS00); // Timer stoppen
|
23 | TCNT0 = 0;
|
24 | }
|
25 | (*TriggerPort) &= ~(1 << TriggerPin);
|
26 | m_Status = inAktive;
|
27 | }
|
28 | break;
|
29 | } // switch
|
30 | }
|
bis case awaitingEcho: funktioniert alles sehr gut. Der TriggerPin wird
gesetzt, beim nächsten Durchgang gelöscht. Und dann sollte auf das Echo
gewartet werden um die Messzählung zu starten. Aber die if wird nie
true!
Aufgebaut mit: ATmega1284, die Adressen der Ports stimmen mit dem
Datenblatt überein. Für das EchoPort wird PINB übergeben und EchoPin =
1.
Hab ich hier einen Denkfehler?