Pin-Status innerhalb eines Interrupts überprüfen

OP #3157872
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.