Forum: Mikrocontroller und Digitale Elektronik AVR LEDs mit Taster programmieren ,ATMEGA8


von Dieter (Gast)


Lesenswert?

Hallo,

ich versuche gerade, LED's so zu Programmieren, dass diese auf 
Knopfdruck an bzw aus gehen mit Hilfe von Atmel Studio.

Da ich ein totaler Anfänger bin, weiß ich bei folgenden Sachen nicht 
weiter:




Die Belegung ist wie Folgt:
Atmega8

#define BIT_1 (1 << PC1)   LED 1
#define BIT_2 (1 << PB2)   LED 2
#define BIT_3 (1 << PB1)   LED 3
#define BIT_4 (1 << PC3)   LED 4
#define BIT_5 (1 << PC2)   LED 5
#define BIT_6 (1 << PC4)   LED 6
#define BIT_7 (1 << PC5)   LED 7
#define BIT_SWITCH (1<<PB0)   Taster

Zu jeder LED soll also ein Taster gehören ( ich habe es erstmal mit 
einem versucht und bin gescheitert).


Beim Versuch alle LED's auszuschalten, fiel mir auf, dass LED 2+5,  und 
1+3
immer gleichzeitig angehen, obwohl ich nur eine anschalte. Das liegt 
vermutlich an den PINs ( B2 zbd C2, C1 und B1).
Hat jemand eine Lösung hierfür?


Könntet ihr mir ein Beispiel geben, wie ich mit dem Taster zum Beispiel 
"BIT_1" anschalte, wenn der Taster gedrückt wird? Ich habe schon 
gegoogelt, aber leider nichts passendes gefunden.

von Uwe (Gast)


Lesenswert?

Hallo Dieter,

wo ist den Dein Code ?

Taster werden i.A. mit einem Pullup nach Vcc-Pin von Pin nach GND 
geschaltet und müssen entprellt werden.

Daraus wird dann eine Zustandsänderung a) oder b) abgeleitet.

Also a) OFFEN --> GESCHLOSSEN und b) GESCHLOSSEN --> OFFEN

Damit kann man dann einfach arbeiten.

von Dieter (Gast)


Lesenswert?

1
#define F_CPU 8000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <inttypes.h>
5
6
#define BIT_1 (1 << PC1)
7
#define BIT_2 (1 << PB2)
8
#define BIT_3 (1 << PB1)
9
#define BIT_4 (1 << PC3)
10
#define BIT_5 (1 << PC2)
11
#define BIT_6 (1 << PC4)
12
#define BIT_7 (1 << PC5)
13
#define BIT_SWITCH (1<<PB0)
14
15
void turnLedOn(uint8_t led,uint8_t on);
16
uint8_t switchPressed(uint8_t Switch);
17
18
int main(void){
19
  
20
  DDRB = BIT_3 | BIT_2;
21
    DDRC = BIT_1 | BIT_4 | BIT_5 | BIT_6 | BIT_7;
22
  
23
24
25
    while(1){
26
    
27
  
28
  
29
30
  
31
  
32
33
  
34
 if(switchPressed(BIT_SWITCH)==1){
35
   if (PINB&(1<<PINB0)){
36
     turnLedOn(BIT_6,1);
37
   }
38
   else {
39
     turnLedOn(BIT_7,1);
40
     
41
   }
42
 }
43
  
44
45
46
      
47
    
48
        turnLedOn(BIT_1,0);
49
    turnLedOn(BIT_2,0);
50
    turnLedOn(BIT_3,0);
51
    turnLedOn(BIT_4,0);
52
    turnLedOn(BIT_5,0);
53
    turnLedOn(BIT_6,0);
54
    turnLedOn(BIT_7,0);
55
56
    
57
    }
58
}
59
60
void turnLedOn(uint8_t led,uint8_t on){
61
62
   if(led==BIT_1 || led==BIT_4 || led==BIT_5 || led==BIT_6 || led==BIT_7){
63
    if(on==1){
64
      PORTC &= ~led;
65
      }else{
66
      PORTC |= led;
67
      
68
    }
69
    return;
70
  }
71
  
72
  if(led==BIT_2 || led==BIT_3){
73
    if(on==1){
74
      PORTB &= ~led;
75
      }else{
76
      PORTB |= led;
77
    }
78
  } 
79
}
80
  
81
uint8_t switchPressed(uint8_t Switch){
82
    
83
    if(PINB & Switch){
84
      return 0;
85
      }else{
86
      return 1;
87
    }
88
  }

Der Taster funktioniert nicht, das LED Problem besteht noch

von Dieter (Gast)


Lesenswert?

LED 2+3 Leuchten dauerhaft, was ich auch nicht verstehe

von Uwe (de0508)


Lesenswert?

Hallo Dieter,

hast Du die Sätze nach der Frage "wo dein Code sei" gelesen ?

Und verstehst die meine Absichten ?
Sie sind zielführend Zu Deiner Fragestellung.

Insbesondere nach der Beschaltung des Taster ?

von Karl H. (kbuchegg)


Lesenswert?

Was auch zielführend ist, ist sich erst mal EINEM Taster und EINER Led 
zu wiedmen. Nicht gleich alle 8 auf einmal.


Und nein, beim Mega8 gibt es da keine Querverbindung zwischen den Pins.

Mach dein Programm nicht so kompliziert fürs erste. Ein simples
1
int main()
2
{
3
  DDRD Register richtig setzen
4
  Pullup für die Taster einschalten (falls nowendig)
5
6
  while( 1 ) {
7
8
    if( Taster gedrückt )
9
      Led einschalten
10
    else
11
      Led ausschatlen
12
13
  }
14
}
reicht völlig aus. Du muss da aus dieser Aufgabe erst mal nicht mehr 
machen.

Für die Operationen 'Taster gedrückt' bzw. 'Led einschalten' bzw- 'Led 
ausschalten' musst du auch nicht künsteln, sondern du benutzt ganz 
einfach erst mal direkt die Bitoperationen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Wenn du einen Umschalter programmieren willst, als das die LED mit jedem 
Tastendruck zwischen an und aus wechselt - heb dir das noch für später 
auf. Denn diese Aufgabenstellung ist nicht so simpel, wie es zunächst 
scheint. Da spielt nämlich noch eine Zutat mit, die dir den Tag versauen 
kann: Taster prellen.

von Dieter (Gast)


Lesenswert?

Danke Karl Heinz.
Was mucss ich für "Schalter gedrückt etc" einsetzen?
wenn ich LED 1 einschalte:


        turnLedOn(BIT_1,1);
    turnLedOn(BIT_2,0);
    turnLedOn(BIT_3,0);
    turnLedOn(BIT_4,0);
    turnLedOn(BIT_5,0);
    turnLedOn(BIT_6,0);
    turnLedOn(BIT_7,0);

Schaltet sich LED 3 automatisch mit an, nachdem ich "return" 
rausgenommen habe, ansonsten lässt sich LED 3 ja nicht anschalten

von Karl H. (kbuchegg)


Lesenswert?

Dieter schrieb:
> Danke Karl Heinz.
> Was mucss ich für "Schalter gedrückt etc" einsetzen?

Dazu brauchst du die
Bitoperationen

Ehrlich und wirklich. Die sind wichtig! Die sind sozusagen das kleine 
Einmaleins in der µC Programmierung, die du im Schlaf beherrschen musst.



> wenn ich LED 1 einschalte:
>         turnLedOn(BIT_1,1);

BItte vergiss diese Funktion. Das bringt dich alles nicht weiter, 
solange du die Bitoperationen nicht im kleinen Finger hast.

Bit auf 1 setzen
1
     register |= ( 1 << Bitnummer );

Bit auf 0 setzen (löschen)
1
     register &= ~( 1 << Bitnummer );


Bit an einem Eingang testen, ob es 1 ist
1
     if( register & ( 1 << Bitnummer ) )

Bit an einem Eingang testen, ob es 0 ist
1
     if( !( register & ( 1 << Bitnummer ) ) )


und damit baust du dein Programm neu auf. Wirf diese turnOnLed Funktion 
weg. Ganz weit weg. Speziell dann, wenn du Anfänger bist. Es gibt 
Grundlagen, die müssen sitzen, sonst ist alles andere sinnlos. Der 
sichere Umgang mit den Bitoperationen gehört dazu. Für die 3 
Codezeilen in der Hauptschleife brauchst du wirklich keine eignene 
Funktionen. Das geht locker alles noch so. Und - ganz wichtig - du 
kriegst Übung.

: Bearbeitet durch User
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.