Atmega32 - STK500 Programmierung

Gast #3935386
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
#3935396
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren