Forum: Mikrocontroller und Digitale Elektronik HILFE! Tasten sollen LED einschalten AT90CAN128


von Jürgen (Gast)


Lesenswert?

Hallo,
Ich lese hier schön öfter mal und hab nun selber ein Problem und wollte 
euch mal um Hilfe bitten.
Ich hab noch nicht viel Ahnung vom Programieren und wollte über eine 
Taste eine LED einschalten und über eine andere wieder ausschalten.

Das ist mein Programm:

unsigned char col = 0;
  while(1){

    if(col==0)      //Beginn LED steuerung
    {
     LED = 0b00000000; //LED aus
      }
    if(col==1)
    {
     LED = 0b00000001; //LED0 ein
      }
    if(TASTEN==TASTE0) //Beginn Cursor
                             //(TASTEN und TASTE0 und 1 sind deklariert)
    {
     col++;
    }
    if(TASTEN==TASTE1)
    {
     col--;
    }

    }

jetzt leuchtet die LED allerdings durchgehend und wenn ich die Taste0 
drücke geht sie aus.

schonmal danke im voraus
mfg Jürgen

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wenn die LED von Anfang an leuchtet, stimmt dieser Kommentar nicht:

     LED = 0b00000000; //LED aus

Es kann auch sein, dass du die Zeile von einer LED schaltng übernommen 
hast, bei der die LED active high angeschlossen ist,

               LED       R
µC-Pin )-------->|------###----- GND

bei deiner Schaltung die LED aber active low angeschlossen ist.

               LED       R
µC-Pin )--------|<------###----- Vcc

Schaltplan oder Link zum Schaltplan wäre nützlich.

> //(TASTEN und TASTE0 und 1 sind deklariert)

aber leider unsichtbar, deswegen kann man nicht sagen, ob die Abfragen 
richtig sind.

von Jürgen (Gast)


Lesenswert?

mit dem komentar war mehr gemeint : "das soll dazu führen"
aber das tut es ja nicht.

wenn ich folgendes eingebe:

while(1){

           if (PINE==0b00000001) // taster
       {
        PORTA=0b00000001; // leds
       }

        }

dann geht die LED0 an wenn ich TASTER0 drücke.
Daher vermute ich jetzt mal Pull-down.

das hier ist meine include:

#define LED   PORTA   // LEDs an Port A
#define LED0   PORTA0
#define LED1   PORTA1
#define LED2   PORTA2
#define LED3   PORTA3
#define LED4   PORTA4
#define LED5   PORTA5
#define LED6   PORTA6
#define LED7   PORTA7


#define TASTEN   PINE    // Tasten an Port E
#define TASTE0   PINE0
#define TASTE1   PINE1
#define TASTE2   PINE2
#define TASTE3   PINE3
#define TASTE4   PINE4
#define TASTE5   PINE5
#define TASTE6   PINE6
#define TASTE7   PINE7

von Karl H. (kbuchegg)


Lesenswert?

Jürgen schrieb:
> mit dem komentar war mehr gemeint : "das soll dazu führen"
> aber das tut es ja nicht.
>
> wenn ich folgendes eingebe:

2 Dinge

* bitte poste immer kompletten Code!
  Dann müssen wir nicht raten

* eine Taste die am Port PIN hängt, und dort am Pin PINNR
  fragt man so ab
1
   if( PIN & ( 1 << PINNR ) )

bzw. wenn die Taste beim Drücken den Portpin auf 0 zieht
1
  if( !( PIN & ( 1 << PINNR ) ) )

umgekehrt genauso. Einen Ausgangspin setzt man gezielt auf 1
1
     PORT |=  ( 1 << PINNR );
bzw. man setzt ihn gezielt auf 0
1
     PORT &= ~( 1 << PINNR );

1
int main()
2
{
3
  DDRA = 0xFF;  // LED auf Ausgang
4
  
5
  while( 1 ) {
6
7
    if( TASTEN & ( 1 << TASTE0 ) )
8
      LED &= ( 1 << LED0 );
9
10
    if( TASTEN & ( 1 << TASTE1 ) )
11
      LED |= ( 1 << LED0 );
12
  }

eventuell kann es jetzt noch sein, dass du die Abfrage noch umdrehen 
musst, weil deine Tasten beim Drücken eine 0 liefern.
Hättest du das ganze Programm gezeigt, hätte man das rauslesen können. 
So muss man raten.

Gewöhn dich an diese Schreibweisen und du hast weniger Probleme.

von Jürgen (Gast)


Lesenswert?

Erstmal vielen dank für die antworten.
Ich hab jezt nochmal selber ein bischen rumbrobiert und folgendes 
geändert:

int main(){

 DDRA=0xff;  //LED Port =Ausgang
 DDRB=0xff;  //Grafikdisplay und Display Beleuchtung  =Ausgan
 DDRC=0xff;  //LCD Display (Daten & Befehle )  =Ausgang
 DDRE=0x00;  //Taster Port = Eingang
 DDRG=0x00;  //Cursor Port = Eingang


lcd_init(LCD_DISP_ON); //Befehl an Display (Diplay on. Cursor off)

PORTB = (1<<PINB7);  //Beleuchtung LCD einschalten
                     //entspricht :PORTB = 0b10000000:;
lcd_clrscr();
lcd_gotoxy(7,1);   //Angabe in Stelle (horizontal) , Zeile (vertikal)
lcd_puts("Rot");
lcd_clrscr();
lcd_gotoxy(7,1);   //Angabe in Stelle (horizontal) , Zeile (vertikal)
lcd_puts("Grün");
lcd_clrscr();
lcd_gotoxy(7,1);   //Angabe in Stelle (horizontal) , Zeile (vertikal)
lcd_puts("Blau");

unsigned char col = 0;
  while(1){

    if(col==0)      //Beginn LED steuerung
    {
     LED = 0b00000000;
      }
    if(col==1)
    {
     LED = 0b00000001;
      }

    if(CURSOR==OBEN) //Beginn Cursor
    {
     col++;
    }
    if(CURSOR==UNTEN)
    {
     col--;
    }

    }
}//main zu

Das ganze Für den LCD ist erstmal noch nicht so wichtig. Ich will später 
nur mal darauf hinaus, dass ich auf meinem LCD z.B. Blau anzeige und 
dann durch drücken der MITTE, auch die blaue LED angeht.
Ich probiere jetzt erstmal nur mit den internen LEDs auf meinem Board 
rum.

Ich hatte vor durch die "unsigned char col" (durch drücken von OBEN und 
UNTEN) einen Wert rauf zu setzen (++) oder runter (--).
Und dann z.B.: "if (col=1)
            {
             lcd_clrscr();
             lcd_gotoxy(7,1);
             lcd_puts("Blau");
            }
Aber den Display wolte ich erstmal weg lassen.
Das ist noch nicht so wichtig und (ich vermute) auch nicht mehr so ein 
Problem, wenn ich ertmal das mit den LEDs im griff hab.


Mir gehts jetzt erstmal nur darum mit OBEN und UNTEN zwischen
LED0 bis LED3 zu wechseln.

So wie es oben Steht kann ich LED0 mit "OBEN" ein schalten und mit 
"UNTEN"
wieder ausschalten.
Wenn ich jetzt, nach meinem Verständnis nach, versuche die zweite LED 
wie folgt einzubinden:

while(1){

    if(col==0)      //Beginn LED steuerung
    {
     LED = 0b00000000;
      }
    if(col==1)
    {
     LED = 0b00000001;  //LED0
      }
    if(col==2)
    {
     LED = 0b00000010;  //LED1
      }

Leuchtet nur LED1 :-(

Ich versteh das nicht.

nochmal die include mit geänderten Cursorn:

#define LED   PORTA   // LEDs an Port A
#define LED0   PORTA0
#define LED1   PORTA1
#define LED2   PORTA2
#define LED3   PORTA3
#define LED4   PORTA4
#define LED5   PORTA5
#define LED6   PORTA6
#define LED7   PORTA7

#define G_DISPLAY PORTB     //Anschluss Grafikdisplay
#define BELEUCHTUNG PORTB7  //Beleuchtung Display

#define TASTEN   PINE    // Tasten an Port E
#define TASTE0   PINE0
#define TASTE1   PINE1
#define TASTE2   PINE2
#define TASTE3   PINE3
#define TASTE4   PINE4
#define TASTE5   PINE5
#define TASTE6   PINE6
#define TASTE7   PINE7

#define CURSOR   PING   // Cursorblock an Port G
#define LINKS   0b00000001
#define OBEN   0b00000010
#define MITTE   0b00000100
#define RECHTS   0b00001000
#define UNTEN   0b00010000

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Meinst Du etwa, die Tastenaktion wird nur einmal beim Drücken des 
Tasters ausgeführt?
1
    if(CURSOR==OBEN) //Beginn Cursor
2
    {
3
     col++;
4
    }
5
    if(CURSOR==UNTEN)
6
    {
7
     col--;
8
    }

Solange Du die Taste OBEN drückst, wird col um eins erhöht.
Das kann, je nach Taktfrequenz mehrere Millionen mal pro Sekunde sein.

von Jürgen (Gast)


Lesenswert?

Christian H. schrieb:
> Meinst Du etwa, die Tastenaktion wird nur einmal beim Drücken des
> Tasters ausgeführt?

So hatte ich mir das eigentlich gedacht.

Damit das ganze also funktioniert muss ich einfach einen delay einbauen
wie z.B 0,3s und dann sollte es ja eig funktionieren (oder?), wenn man 
die taste nicht länger drückt.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Kein Delay, sondern eine Tastenentprellung. Die Variable wird erst dann 
weitergeschaltet, wenn der erkannte Tastenzustand von "losgelassen" auf 
"gedrückt" wechselt.

Dann kann man auch noch einen Timer starten, der alle 0,3s überprüft, ob 
die Taste noch gedrückt ist. Ist dies der Fall, wird die Variable um 
eins weiter gezählt. Das nennt man dann "auto-repeat".

Wird die Taste losgelassen, so wird dieser Timer wieder gestoppt.

von Karl H. (kbuchegg)


Lesenswert?

Jürgen schrieb:
> Christian H. schrieb:
>> Meinst Du etwa, die Tastenaktion wird nur einmal beim Drücken des
>> Tasters ausgeführt?
>
> So hatte ich mir das eigentlich gedacht.

:-)

> Damit das ganze also funktioniert muss ich einfach einen delay einbauen
> wie z.B 0,3s und dann sollte es ja eig funktionieren (oder?), wenn man
> die taste nicht länger drückt.

In diesen 0.3 Sekunden macht dein Rechner dann nichts anderes :-) 0.3 
Sekunden sind zwar für dich kurz, für einen Rechner aber eine halbe 
Ewigkeit.

Du bist reif für das hier:
http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29

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.