AVR LEDs mit Taster programmieren ,ATMEGA8

Gast #3760064
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.
Gast #3760120
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.
Gast #3760139
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
#3760162
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.
#3760174
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.
Gast #3760182
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
#3761051
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.

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