PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kriege ich die LED´s aus?



RIFMAN
05.04.2007, 14:12
hallo!

ich habe es endlich hingekrigt 2 LED`s auf Tastendruck zum Leuchten gebracht,jetzt möchte ich sie wieder auf Tastendruck zum Ausschalten bringen! hat jemanden eine Idee, was dazu schreiben soll?
Das Programm lautet:


#include <avr/io.h>

//extern void wait(uint8_t T);

#define T1 0x04
#define T2 0x08
#define LED1 0x20
#define LED2 0x40


int main()
{

DDRD |= 0x60;

while(1)
{
if (PIND & T1)
{
PORTD |= LED1;
}

if (PIND & T2)
{
PORTD |= LED2;
}
else
{
PortD &= 0x00;
}
return 0;
}

jar
05.04.2007, 15:02
if (PIND & T1)
{
PORTD |= LED1;
}
if ((PIND & T1) && (PORTD & LED1))
{
PORTD &=~ LED1;
}

wie wäre es damit ?

coCo
05.04.2007, 16:22
Hi,
du musst eine Variable verwenden die getoggelt wird sobald du die Taste drückst. In der While Schleife fragst du dann einfach die Variable ab, ist sie auf 1 -> LED ein, ist sie auf 0 -> LED aus.

MfG

jar
05.04.2007, 17:37
Hi,
du musst eine Variable verwenden die getoggelt wird sobald du die Taste drückst. In der While Schleife fragst du dann einfach die Variable ab, ist sie auf 1 -> LED ein, ist sie auf 0 -> LED aus.

MfG

muss man ?

ich muss nicht, bei mir funzt die LED On Abfrage auch ohne Variable

lcd_gotoxy(19,3);
lcd_puts( (PORTB&(1<<_tog_LED_PB)) ? "T" : " " );

wenn sie also an ist, kann sie ausgeschaltet werden, wenn sie aus ist eingeschaltet

RIFMAN
10.04.2007, 08:33
if (PIND & T1)
{
PORTD |= LED1;
}
if ((PIND & T1) && (PORTD & LED1))
{
PORTD &=~ LED1;
}

es geht leider immer noch nicht!



du musst eine Variable verwenden die getoggelt wird sobald du die Taste drückst. In der While Schleife fragst du dann einfach die Variable ab, ist sie auf 1 -> LED ein, ist sie auf 0 -> LED aus.


kannst du mir vielleicht ein Beispiel posten?

jar
10.04.2007, 09:40
es geht leider immer noch nicht!
kannst du mir vielleicht ein Beispiel posten?

was geht nicht ?

schaltest du den Taster nach + oder GND ?
Pullup ist on/off ?

besser wäre Pullup setzen und die Taster nach GND zu schalten


//extern void wait(uint8_t T);

#define T1 0x04
#define T2 0x08
#define LED1 0x20
#define LED2 0x40


int main()
{

DDRD |= (1<<LED1); // LED1 definiert zum Ausgang machen
DDRD |= (1<<LED2); // LED2 definiert zum Ausgang machen
DDRD &=~(1<<T1); // T1 definiert zum Eingang machen
DDRD &=~(1<<T2); // T2 definiert zum Eingang machen

DDRD |= (1<<T1); // T1 Pullup setzen
DDRD |= (1<<T2); // T2 Pullup setzen

while(1)
{
if(PIND & T1==0)
{
while(PIND & T1==0)
;
if(PORTD & LED1)
PORTD &=~ LED1;
else
PORTD |= LED1;
}
if(PIND & T2==0)
{
while(PIND & T2==0)
;
if(PORTD & LED2)
PORTD &=~ LED2;
else
PORTD |= LED2;
}
}
return 0;
}

Achtung LED wechselt erst nach Taster loslassen , Minientprellung

SprinterSB
10.04.2007, 09:56
@jar:

Entprellt wird hier nichts... und die Shifts sind doppelt gemoppelt ;-)

jar
10.04.2007, 10:01
@jar:
Entprellt wird hier nichts... und die Shifts sind doppelt gemoppelt ;-)

1, na ja
2 ???

sind ja auch 2 LED und 2 Tasten :)

SprinterSB
10.04.2007, 10:04
(1 << LED1) ist immer 0. Dito für (1<<LED2), (1<<T1) und (1<<T2)...
Wenn der Taster prellt, wird dennoch mehrfach umgeschaltet. Gleiches, wenn der Taster länger gedrückt resp. losgelassen bleibt (je nachdem, wie er angeschlossen ist).

Zudem blockiert das "Entprellen" eines Tasters die Hauptschleife und damit insbesondere auch den jeweils anderen Taster...

jar
10.04.2007, 10:27
(1 << LED1) ist immer 0. Dito für (1<<LED2), (1<<T1) und (1<<T2)...

dann wäre die define wohl besser, mag ich eh lieber ;)
und dann klappts auch mit dem shiften

#define T1 PD2
#define T2 PD3
#define LED1 PD5
#define LED2 PD6