Forum: Mikrocontroller und Digitale Elektronik Hilfe, was ist hier falsch (10-Zeilen-Code.)


von Maxim (Gast)


Lesenswert?

Steige gerade von 8252 auf AVR und von Assembler auf C um, habt also 
Verständnis. :D

Habe schon viel ausprobiert und einige Fehler gefunden, aber das Ding 
läuft trotzdem nicht. Es soll immer die LED leuchten wenn ich den Taster 
betätige.
1
#include <avr/io.h>
2
3
#define  led_1    PD6
4
#define button_1  PIND2
5
6
int main(void) {
7
8
  DDRD = 0xff;
9
  DDRD |= (1<<led_1);    //LED-Pin als Ausgang
10
  DDRD &= ~(1<<button_1);  //Taster-Pin als Eingang
11
12
    
13
  while(1) {
14
    if(button_1) {
15
      PORTD |= (1<<led_1);
16
    } else {
17
      PORTD &= ~(1<<led_1);
18
    }  
19
  }
20
21
  return 0;
22
}

von D. W. (dave) Benutzerseite


Lesenswert?

naja.. man darf nicht einfach "if (button_1)" machen. Dieses PIND2 ist 
für den Compiler nur "2" ;) ist halt für den Programmierer leichter zu 
erkennen, was man damit vor 2-3 Jahren mal meinte.

Du musst mit diesem 2 (oder PIND2) das passende Bit im Input-Register 
maskieren.
So:
1
if(PIND & (1 <<button_1)) {
2
      PORTD |= (1<<led_1);
3
    } else {
4
      PORTD &= ~(1<<led_1);
5
    }

Bedeutet:
PIND (Eingänge) werden eingelesen und wird mit 0000 0100 maskiert (2x 
nach links geshiftete 1). Wenn 100 rauskommt, wars gesetz, wenn nicht, 
isses 0 gewesen. Dieses dritte Bit entspricht dann deinem Eingang.

von gast (Gast)


Lesenswert?

schau mal hier rein, da gibts auch viele Beispiele:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Maxim (Gast)


Lesenswert?

Aha, danke!

ps: Den Link kenne ich, ohne den Artikel wäre ich total aufgeschmissen. 
;)

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.