Forum: Mikrocontroller und Digitale Elektronik Wo liegt mein Denkfehler


von Anfänger (Gast)


Lesenswert?

Hi,

ich habe folgendes kleines Programm geschrieben:
1
void Schalter1 (void)
2
{
3
4
  PORTC &= ~(1<<PORTC0); // Bit 0 loeschen, LED an
5
  _delay_ms(2000);
6
  PORTC |= (1 << PORTC0);  // Bit 0 setzen, LED aus
7
}
8
void Schalter2 (void)
9
{
10
  PORTC &= ~(1<<PORTC1); // Bit 0 loeschen, LED an
11
  _delay_ms(2000);
12
  PORTC |= (1 << PORTC1);  // Bit 0 setzen, LED aus} 
13
}
14
15
16
int main(void)
17
{
18
  
19
  // Datenrichtung festsetzen
20
  DDRB = 0x00;  // alles Eingänge
21
  PORTB = 0xFF; // alle PullUps einschalten
22
  
23
  DDRC = 0x3F;  // Pin 0-5 Ausgänge!
24
  
25
  // Interrupts einschalten
26
  // sei ();
27
  
28
  PORTC = 0xFF;  // alle LEDs aus
29
    
30
  while (1)
31
  {
32
    if (PINB & (0<<PINB0)) 
33
    {
34
      Schalter1();
35
    }
36
    
37
    if (PINB & (0<<PINB1))
38
    {
39
      Schalter2();
40
    }    
41
  } // Ende while
42
}

Wenn ich PINB0 mit Masse verbinde, dann müsste die LED an PINC0 für 2 
Sekunden aufleuchten und dann wieder ausgehen.

Ich hab mich dabei an die Angaben aus dem Tutorial gehalten:

DDRB = 0x00, alles Eingänge
PORTB = 0xFF, alle internen PULL-Ups an

Leider blinkt die LED an PORTC0 nicht auf, wenn ich PINB0 mit Masse 
verbinde.

von Karl H. (kbuchegg)


Lesenswert?

Anfänger schrieb:

>     if (PINB & (0<<PINB0))

Eine 0 kannst du links/rechts schieben sooft du willst, das bleibt immer 
0.

Das steht also mehr oder weniger

    if( PINB & 0 )

was wiederrum zu

    if( 0 )

zusammenkürzt.


   if( PINB & ( 1 << PB0 ) )
um abzufragen, ob ein Pin 1 ist

oder eben

   if( !(PINB & ( 1 << PB0 ) )
um abzufragen, ob der Pin 0 ist.

Aber wie du es auch drehst und wendest, es heisst immer 1<<irgendwas. 
Denn 0<<irgendwas ist nichts anderes als eine komplizierte Art und Weise 
um 0 zu schreiben.

von mr. mo (Gast)


Lesenswert?

Anfänger schrieb:
> void Schalter1 (void)
> {
>
>   PORTC &= ~(1<<PORTC0); // Bit 0 loeschen, LED an
>   _delay_ms(2000);
>   PORTC |= (1 << PORTC0);  // Bit 0 setzen, LED aus
> }

Ist das nicht PC0 und nicht PORTC0? Bekommst du Warnungen oder sonst was 
ausgegeben?

Anfänger schrieb:
> if (PINB & (0<<PINB0))
>     {
>       Schalter1();
>     }

Hab das ein bisschen anders in Erinnerung:
1
#include <avr/io.h>
2
...
3
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */
4
if ( PINC & (1<<PINC1) ) {
5
  /* Aktion */
6
}
7
 
8
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das "dritte" Bit) in PINB geloescht (0) ist */
9
if ( !(PINB & (1<<PINB2)) ) {
10
  /* Aktion */
11
}
12
...

von Anfänger (Gast)


Lesenswert?

schreib ich in die Schleife nur rein

PORTC = PINB;

dann geht die Lampe0 an, wenn ich an PORTB mit Masse verbinde.

von Anfänger (Gast)


Lesenswert?

mr. mo schrieb:
> if ( !(PINB & (1<<PINB2)) )

Ja stimmt, jetzt wo Du es mir schreibst, wird es mir klar. Das erste mit 
dem Bit verschieben mit << in der Klammer und da eine Null rein, dass 
ergibt keinen Sinn. Jetzt mit dem NOT-Operator in der If-Abfrage klappt 
es :-) Vielen Dank für Deine Hilfe.

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.