Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum kann ich 2 LED's mit diesem Programm nicht ansteuern.!
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;
}
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
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!
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
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
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;
}
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, 10: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
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!
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
Danke für eure Hilfe!
hats denn geholfen ? und vor allem was ? O:)
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, 16: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
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, 10: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
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, 13:49
Hier ist was interessantes über Tasten entprellen:
http://www.mikrocontroller.net/articles/Entprellung
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(
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.