Forum: Mikrocontroller und Digitale Elektronik Pin-Status innerhalb eines Interrupts überprüfen


von C. H. (hedie)


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?

von holger (Gast)


Lesenswert?

Da kommt 0x40 raus wenn der Pin high ist. Und das ist nun mal nicht 1.

PINB & (1<<PINB6

von Davis (Gast)


Lesenswert?

if( RX_PIN == (1<<PINB6) )

von Dussel (Gast)


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?

von C. H. (hedie)


Lesenswert?

holger schrieb:
> Da kommt 0x40 raus wenn der Pin high ist. Und das ist nun mal nicht 1.
>
> PINB & (1<<PINB6

Ok wobei wenn ich ja if(PIN_RX) habe, müsste dies ja auch gehen.
Da if(9) oder if(500) ja auch geht.

Sobald es grösser 0 ist

von Karl H. (kbuchegg)


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.

von C. H. (hedie)


Lesenswert?

Liebe Leute

Es funktioniert nun..


Danke :)

es war ein bisschen von allem!

Unteranderem auch das ich == 1 hatte


Grüsse

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.