PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum kann ich 2 LED's mit diesem Programm nicht ansteuern.!



RIFMAN
10.04.2007, 08:58
Ich will 2LED's auf Tastendruck an und ausschalten aber leider klappt es nicht was ist denn in meinem Programm Falsch!

#include <avr/io.h>
//#define F_CPU 16000000
//#include <avr/delay.h>

//extern void wait(uint8_t T);

#define T1 0x04
#define T2 0x08
#define LED1 0x20
#define LED2 0x40
#define LED1AUS 0xDF
#define LED2AUS 0x9F

int main()
{

DDRD |= 0x60;//PD5 und PD6 als Ausgänge setzen


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

franzl
10.04.2007, 09:15
hallo,
wie hast du denn deine taster angeschlossen. einfach nur an 5V und nach dem taster auf den mega oder an gnd und dann zum mega. wenn du sie auf gnd hast musst du die internen pull-up widerstände an den tastenpins noch aktivieren mit port und dann eben die an denen du sie brauchst, da der avr immer einen definierten pegel braucht. such einfach mal im forum nach pull up widerstand müsste man schon was drunter finden.
mfg franz

RIFMAN
10.04.2007, 09:22
Hallo Franz,
die Taster habe ich auf High angeschlossen,das hast auch beim anschalten funktioniert ,jetzt will die an und ausschalten, es geht irgendwie nicht!

franzl
10.04.2007, 09:31
hallo,
hast du an den tastern externe pull up widerstände. ansonsten hängt der pin in der luft wenn der taster nicht gedrückt ist und schaltet wirr je nach lust und laune. guck dir mal die seite an http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_Ports und schreib danach vielleicht nochmal.
mfg franz

franzl
10.04.2007, 09:39
hallo nochmal,
also ich glaub ich weiß jetz deinen fehler und zwar überprüfst du ja dauernd den eingang und wenn du jetz eine taste drückst dann ist sie ja nicht nur ganz kurz aktiv sondern sie prellt und ist läger high und wieder low. du musst also entweder deine tasten entprellen mit einer geeigneten wartezeit oder zum testen einfach mal in die schleife eine delay 10ms einbauen.
mfg franz

RIFMAN
10.04.2007, 09:40
ich übe grad auf einem Evaluation Board, da ist schon alles intern geregelt, mit dieser code hat leider auch nicht funktioniert!


#include <avr/io.h>
//#define F_CPU 16000000
//#include <avr/delay.h>

//extern void wait(uint8_t T);

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


int main()
{

DDRD |= 0x60;//PD5 und PD6 als Ausgänge setzen


while(1)
{
if (PIND & T1)
{
do{ PORTD &= ~LED1;} //LED1 ausschalten
while(PORTD & LED1); //wenn LED1 auf HIGH ist

PORTD |= LED1; //LED1 anschalten
}
if (PIND & T2)
{
do{ PORTD &= ~LED2;} //LED2 ausschalten
while(PORTD & LED2);//wenn LED2 auf HIGH ist

PORTD |= LED2;//LED2 anschalten
}
}
return 0;
}

jar
10.04.2007, 09:46
ich übe grad auf einem Evaluation Board, da ist schon alles intern geregelt, mit dieser code hat leider auch nicht funktioniert!


dann schau hier
https://www.roboternetz.de/phpBB2/viewtopic.php?p=271207#271207

SprinterSB
10.04.2007, 09:52
Wemm du einen Taster drückst, wird ja eine LED dauernd umgeschaltet. Nach dem Loslassen des Tasters hat die LED dann einen quasi zufälligen Zustand.

Du musst deine Taster also entprellen.

Hier eine Version ohne entprellte Taster, die einfach nur die Tastenzustände an den LEDs reflektiert (also nicht umschaltet).

Wenn das nicht funktioniert, hast du was falsch verdrahtet.


#include <avr/io.h>

#define T1 (1 << 2)
#define T2 (1 << 3)
#define LED1 (1 << 5)
#define LED2 (1 << 6)

int main()
{
// LEDn als OUT
DDRD |= LED1;
DDRD |= LED2;

// PullUps an Tn
PORTD |= T1;
PORTD |= T2;

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

if (PIND & T2)
{
PORTD &= ~LED2;
}
else
{
PORTD |= LED2;
}
} // while (1)
} // main

RIFMAN
10.04.2007, 10:26
Wemm du einen Taster drückst, wird ja eine LED dauernd umgeschaltet. Nach dem Loslassen des Tasters hat die LED dann einen quasi zufälligen Zustand.

Du musst deine Taster also entprellen.

Hier eine Version ohne entprellte Taster, die einfach nur die Tastenzustände an den LEDs reflektiert (also nicht umschaltet).

Wenn das nicht funktioniert, hast du was falsch verdrahtet.



PORTD |= T1;
PORTD |= T2;

warum hast du die pull up's gesetzt? die Tasten sind ja an High angeschlossen. das verstehe ich nicht!

jar
10.04.2007, 10:30
warum hast du die pull up's gesetzt? die Tasten sind ja an High angeschlossen. das verstehe ich nicht!

kann man das hier riechen ? wo ist dein Schaltplan ?

ich meine immer noch , besser wär ein GND schalten mit internem Pullup
wenn es anders sein soll bitte sehr, dann alles umdrehen

Tasten entprellen würde ich mit _delay_ms(50) machen

RIFMAN
10.04.2007, 14:22
Danke für eure Hilfe!

jar
10.04.2007, 20:29
Danke für eure Hilfe!

hats denn geholfen ? und vor allem was ? O:)

RIFMAN
11.04.2007, 13:05
Ja, jetzt gehen die LED's an und aus auf Tastendruck, nur das Problem ist,
solange ich auf Taste 1 bzw. Taste 2 drücke ist der Processor totol mit der entsprechenden Led beschäftigt er kann nichts anders machen, woran kann das denn liegen?
der Code lautet:










#include <avr/io.h>
//#define F_CPU 16000000
//#include <avr/delay.h>

//extern void wait(uint8_t T);

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


int main()
{

DDRD |= 0x60;//PD5 und PD6 als Ausgänge setzen
DDRD &= ~(0x0c);
PORTD &= 0x00;


while(1)
{

if(PIND & T1)
{
while(PIND & T1)
if(PORTD & LED1)

{

PORTD &= ~LED1;
}
else
{

PORTD |= LED1;
}
}

if(PIND & T2)
{
while(PIND & T2)
if(PORTD & LED2)
{
PORTD &= ~LED2;
}
else
{
PORTD |= LED2;
}

}
}
return 0;
}

Hubert.G
11.04.2007, 15:58
Sag mal, verendest du nicht das AVR-Studio? Das ist genau für solche kleine Progs zum simulieren geeignet, aber auch für größere Prog.
Was glaubst du was der µC hier macht "while(PIND & T1) " solange du auf die Taste drückst.
Hubert

RIFMAN
12.04.2007, 08:10
Sag mal, verendest du nicht das AVR-Studio? Das ist genau für solche kleine Progs zum simulieren geeignet, aber auch für größere Prog.

Doch, aber was hat das mit meinem Problem zu Tun?


Was glaubst du was der µC hier macht "while(PIND & T1) " solange du auf die Taste drückst.
Hubert

while(PIND&T1) : damit bleibt die Led an- bzw. ausgeschaltet wenn ich auf die Taste drücke.
MfG

Hubert.G
12.04.2007, 09:34
Und wenn du das simuliert hättest dann müsstest du auch wissen das solange du die Taste drückst das dieser Teil:
while(PIND & T1)
if(PORTD & LED1)

{

PORTD &= ~LED1;
}
else
{

PORTD |= LED1;
}
nicht verlassen wird solange du die Taste gedrückt hältst und somit sich auch im Rest des Progs nichts tut.
Ausserdem flimmert die LED in der Zeit.
Hubert

RIFMAN
12.04.2007, 10:21
Danke Hubert!
ich habe es jetzt so gelöst:


#include <avr/io.h>
//#define F_CPU 16000000
//#include <avr/delay.h>

//extern void wait(uint8_t T);

#define T1 0x04
#define T2 0x08
#define LED1 0x20
#define LED2 0x40
#define SUM 0x80;

int main()
{
uint8_t release1;
uint8_t release2;
DDRD |= 0xE0;//PD5,PD6,PD7 als Ausgänge setzen
DDRD &= ~(0x0c);
PORTD &= 0x00;

release1 = 0x01;
release2 = 0x01;

while(1)
{

if((PIND & T1) && (release1 == 0x01))
{
release1 = 0x00;
if(PORTD & LED1)
{
PORTD &= ~LED1;
PORTD &= ~SUM;
}
else
{
PORTD |= LED1;
PORTD |= SUM;
}

}
else
{
if (!(PIND & T1))
{
release1 = 0x01;
}
}


if ((PIND & T2) && (release2 == 0x01))
{
release2 = 0x00;
if(PORTD & LED2)
{
PORTD &= ~LED2;
PORTD &= ~SUM;
}
else
{
PORTD |= LED2;
PORTD |= SUM;
}
}
else
{
if (!(PIND & T2))
{
release2 = 0x01;
}
}
}

return 0;
}

kann noch eine bessere Lösung?
MfG

Hubert.G
12.04.2007, 12:49
Hier ist was interessantes über Tasten entprellen:
http://www.mikrocontroller.net/articles/Entprellung

jar
12.04.2007, 12:52
Danke Hubert!
ich habe es jetzt so gelöst:

kann noch eine bessere Lösung?
MfG

hab mir deine nicht angesehen, aber es gibt doch so nette defines :D

#include <avr/sfr_defs.h>

#define _TASTER1_PC PC4
#define _TASTER2_PC PC5

dazu das obligatorische

DDRC &=~ (1 << _TASTER1_PC); // Pin PC4 input TASTER
DDRC &=~ (1 << _TASTER2_PC); // Pin PC5 input TASTER

PORTC |= (1 << _TASTER1_PC); // Pin PC4 pull-up enabled
PORTC |= (1 << _TASTER2_PC); // Pin PC5 pull-up enabled



if(bit_is_clear(PINC, _TASTER1_PC))
{ lcd_gotoxy(10,0); lcd_puts("T1"); }
else
{ lcd_gotoxy(10,0); lcd_puts(" "); }

if(bit_is_clear(PINC, _TASTER2_PC))
{ lcd_gotoxy(14,0); lcd_puts("T2"); }
else
{ lcd_gotoxy(14,0); lcd_puts(" "); }

das bit_is_clear(
gibt es für den der mag auch als bit_is_set(