Forum: Mikrocontroller und Digitale Elektronik Atmega32 - STK500 Programmierung


von µC Anfänger (Gast)


Lesenswert?

Hallo!

Ich bin neu in der Mikrocontroller-Programmierung und habe eine Frage. 
Und zwar programmiere ich mit dem Atmega32 und möchte gerne zu Anfang 
mal eine LED schalten über einen Taster auf dem STK500. Jedoch 
funktionieren meine Codes nicht. Kann mir bitte jemand sagen, wo 
mein/meine Fehler liegt/liegen?

Code 1:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define LED_PORT PORTB
5
#define LED_DDR DDRB
6
#define LED_PIN PB0
7
#define SWITCH_PORT PORTD
8
#define SWITCH_DDR DDRD
9
#define SWITCH_PIN PD0
10
#define CHOOSE_LED 0xFF
11
12
int main(void)
13
{
14
    LED_DDR |= (1 << LED_PIN);
15
    SWITCH_DDR = 0x00;
16
  
17
    while(1)
18
    {
19
  if (SWITCH_PIN==1)
20
  {
21
     LED_PORT |= (1 << LED_PIN);
22
     _delay_ms(3000);
23
     LED_PORT &= ~ (1 << LED_PIN);
24
  }
25
    }
26
}
Code 2:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main(void)
5
{
6
  DDRB |= (1<<PB0); 
7
8
  DDRD &= ~(1<<PD0);
9
  
10
  while(1)
11
  {
12
    if(PIND & (1<<PD0) == 1)
13
    {
14
      PORTB |= (1<<PB0); 
15
      _delay_ms(2000);
16
      PORTB &= ~(1<<PB0); 
17
    }
18
  }
19
}
Vielen Dank vorab schon mal für die Antworten :)
LG

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

µC Anfänger schrieb:

>     if(PIND & (1<<PD0) == 1)

Hier sind die Prioritäten nicht so wie du vermutest.

Der Compiler liest das entsprechend den Sprachregeln als
1
     if(PIND & ( (1<<PD0) == 1 ) )
und das ist nicht ganz das was du willst.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> µC Anfänger schrieb:
>
>>     if(PIND & (1<<PD0) == 1)

Im übrigen solltest du von derartigen expliziten Vergleichen Abstand 
nehmen. Man schiesst sich zuleicht damit ins Knie.
In C ist weniger oft mehr. Nachdem du das entsprechende Bit mit dem & 
ausmaskiert hast, willst du nur wissen ob das Ergebnis 0 oder nicht 0 
ist (denn dann ist das Bit gesetzt). Der springende Punkt ist, dass es 
dich ja im Grunde gar nicht interessiert, welche Zahl sich ergibt, wenn 
das Bit 3 gesetzt ist. Du weisst, dass nach dem ausmaskieren nur 
entweder 0 übrig bleibt (wenn das Bit auf 0 war) oder eben nicht 0 (wenn 
das Bit auf 1 war). Aber welche Zahl das genau ist, ist dir ja 
eigentlich egal.

Du könntest natürlich schreiben
1
    if( ( PIND & (1 << PD3) ) == (1 << PD3) )
aber eigentlich willst du das nicht wirklich. Da in C jedes Ergebnis 
ungleich 0 automatisch auch als logisch TRUE gilt, kannst du ganz 
einfach schreiben
1
    if( PIND & (1 << PD3) )
und gut ists. Ein if verlangt keinen Vergleich. Ein if verlangt einen 
Ausdruck (welcher auch immer das ist) und es bewertet das Ergebnis 
dieses Ausdrucks. Ist das Ergebnis 0, dann gilt das als logisch FALSE. 
Ist es ungleich 0, dann ist es logisch TRUE.

Willst du wissen, ob das Bit auf 1 ist, dann kannst du zb schreiben
1
    if( ( PIND & (1 << PD3) ) == 0 )

aber einfacher ist diese Variante
1
    if( !( PIND & (1 << PD3) ) )


Beachte: In diesem Fall ist ein Vergleich auf explizit 0 eben nicht ca. 
fast dasselbe wie ein Vergleich auf explizit 1, nur mit anderem 
Zahlenwert. Denn wenn du auf eine Zahl vergleichst, dann muss auch genau 
diese Zahl rauskommen, damit der Vergleich TRUE ergibt. Maskierst du 
aber lediglich 1 Bit aus einem 8 Bit Wert aus, dann ist das Ergebnis 
nicht notwendigerweise 1, wenn das entsprechende Bit auf 1 ist. Je nach 
Bit ergeben sich da auch andere Zahlen. Und spätestens dann wird das 
mühsam. Daher: Lass den expliziten Vergleich weg. Das das Ergebnis nach 
der & Maskierung ungleich 0 reicht völlig aus. Du musst nicht fordern, 
dass es 1 sein muss.

In C ist weniger eben oft mehr.

von µC Anfänger (Gast)


Lesenswert?

habe es nun hinbekommen vielen Dank :)

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.