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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.