Pin-Status innerhalb eines Interrupts überprüfen

OP #3157872
Lesenswert?

Hallo zusammen

Ich habe folgenden Code:
1
#define RX_PIN ( PINB & (1<<PINB6) )
2

3
volatile unsigned char ucSynchroCount = 0;
4

5

6
void init(void)
7
{
8

9
OCR0A   = TIMER_VALUE/2;
10
  TCCR0A |= (1<<WGM01); //CTC MODE
11
  TCCR0B |= (1<<CS02);  //10MHz div 256
12
  TIMSK0 |= (1<<OCIE0A);      //Interrupt aktivieren
13
}
14

15

16

17
ISR(TIMER0_COMPA_vect)
18
{
19
  LED_1;
20

21
if(RX_PIN == 1) //Wird nicht high, bzw 1. Auch if(RX_PIN) geht nicht
22
      {
23
        ucSynchroCount++;
24
      }
25
      else
26
      {
27
        //ucSynchroCount = 0;
28
      }
29

30
      if(ucSynchroCount == 10)  
31
      {              
32
        
33
        
34
        TIMSK0 &= ~(1<<OCIE0A); //Interrupt deaktivieren
35
        LED_0;
36
        
37
      }
38
}

Leider kann ich den Status von RX_Pin nicht überprüfen
Ich weiss leider nicht weshalb.
Mit dem Oszi gemessen, ist der Pin immer high

Hat jemand von euch eine Idee?
Gast #3157880
Lesenswert?

Zuerst solltest du richtig einrücken, sonst wird es schnell 
unübersichtlich.

Bist du sicher, dass es an der Bedingung liegt? So wie die da steht kann 
es nicht funktionieren, aber mit
// if(RX_PIN)
sollte es eigentlich gehen.
Wird der Interrupt aufgerufen? Sind Interrupts aktiviert?
#3157885
Lesenswert?

Claudio Hediger schrieb:


> if(RX_PIN == 1) //Wird nicht high, bzw 1. Auch if(RX_PIN) geht nicht

In C ist weniger oft mehr.
Alles ungleich 0 ist in C logisch wahr.

WEnn dein Pin ein 0 Potential hat, dann liefert

   PINB & (1<<PINB6)

mit Sicherheit eine 0. Aber wenn er ein 1 Potential hat, dann kommt da

   00100000   PINB
&  00100000   (1<<PINB6)
  ---------
   00100000

raus. Und das ist nun mal nicht 1. Aber es ist ungleich 0. Und das 
reicht dann auch schon
1
    if( RX_PIN )
2
       ....


es ist oft gerade bei Abfragen gefährlich, auf Bitebene auf einer 1 zu 
bestehen. Gewöhn es dir ab.

    if(  PIN & (1 << PINB6) )        // wenn der Pin auf 1 ist


    if( ! (PIN & (1 << PINB6) ) )      // wenn der Pin auf 0 ist

oder eben bei dir mit dem Makro

    if( RX_PIN )            // ist der Pin auf 1

    if( ! RX_PIN )          // ist der Pin auf 0


Blinder Eifer schadet hier mehr als er nützt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren