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
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.
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
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.
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
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.