Habe folgende Problem möchte mit dem Mega8 Controller mit einem Taster eine LED einschalten. LED Ist an PORTD.0 angeschloßen mit der Masse der Taster an PORTB.0 ebenfalls mit der Masse. Hier das Prog was mach ich falsch bzw. wo liegt der fehler? #include <mega8.h> void main (void) { DDRD = 0x01; //PORTD.0 Ausgang DDRB = 0xFE; //PORTB.0 Eingang while (1) { if (!(PINB & (PINB.0=0))) //Ist PORTB.0 auf low? { PORTD.0 = 0; //Ja. LED an } else { PORTD.0 = 1; //Nein. LED aus }; }; }
Hast du einen PullUp-Widerstand am Taster? Falls nicht schalte den internen PullUp ein. Vorwiderstand der LED nicht vergessen!
wie schalte ich den internen Pullup Widerstand ein?
AVR GCC Tutorial - Punkt 11.5.2
> if (!(PINB & ("PINB.0=0")))
Ist das in "" gesetze nicht BASCOM-Dialekt? Ich mache es immer so:
if (!(PINB & (1<<PB0)))
Ich weiß nicht ob es so funktioniert wie du es geschrieben hast weil ich
es noch nie so Probiert habe aber ich wollte drauf mal hinweisen :)
Oh aber was ich noch sehe: Selbst wenn es funktioniert. Fragst du damit
ab ob PINB.0 = "1" ist und nicht "0". Weil du Fragst ob PINB.0 ungleich
"0" ist.
Habe das Programm jetzt geändert. Ist der Pullup Widerstand am Taster jetzt aktiv? Wieso leuchtet die LED sofort wenn der Controller Betriebsspannung hat (LED ist gegen Masse geschltet) und da DDRD.0 = 1 ist müsste sie doch aus sein oder? Und erst beim betätigen des Tasters aufleuchten oder verstehe ich da was falsch? #include <mega8.h> void main (void) { DDRD = 0x01; //PORTD.0 Ausgang DDRB = 0xFE; //PORTB.0 Eingang PORTB.0 = 0x01; //Pullup Widerstand aktiviert while (1) { if (!(PINB & (1<<PINB.0))) //Ist PORTB.0 auf low? { PORTD.0 = 0; //Ja. LED an } else { PORTD.0 = 1; //Nein. LED aus }; }; }
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Versuchs mal damit. Achso und "DDRB = 0xFE;" kannst du auch getrost weglassen wenn du bei PORTB nichts als Ausgang brauchst weil der AVR beim Starten alle Ports als Eingänge deklariert. Und nochwas: Die Semikola nach den geschweiften Klammern kannst du auch weglassen.
Die LED leuchtet nicht mehr ... geht aber beim betätigen des Tasters auch nicht an.... WAS kann DAS Problem sein? #include <mega8.h> void main (void) { DDRD = 0x01; //PORTD.0 Ausgang DDRB = 0xFE; //PORTB.0 Eingang PORTB.0 = 0x01; //Pullup Widerstand aktiviert while (1) { if (!(PINB & (1<<PINB.0))) //Ist PORTB.0 auf low? { PORTD.0 = 1; //Ja. LED an } else { PORTD.0 = 0; //Nein. LED aus } }; }
include <mega8.h>
void main (void)
{
DDRD = 0x01; //PORTD.0 Ausgang
PORTB.0 = 0x01; //Pullup Widerstand aktiviert
while (1) {
if (!(PINB & (1<<PINB.0))) //Ist PORTB.0 auf low?
{
PORTD.0 = 1; //Ja. LED an
}
else
{
PORTD.0 = 0; //Nein. LED aus
}
}
}
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
Versuch es GENAU so dann muss es funktionieren. Wenn nicht dann...ja dann weiß ich auch nicht^^ STOP!! Wurde gerade geändert. Du hast den PullUp falsch aktiviert. AH noch mehr STOP! Das mir das alles net aufgefallen ist. Schande über mich!! Hast mal BASCOM programmiert gibs zu^^ So jetzt muss es aber stimmen.
geht leider auch nicht .....hmm was kann das bloß sein der code ist
richtig oder
#include <io.h>
void main (void)
{
DDRD = 0x01; //PORTD.0 Ausgang
DDRB = 0xFE; //PORTB.0 Eingang
PORTB.0 = 0x01; //Pullup Widerstand aktiviert
while (1)
{
if (!(PINB & (1<<PINB.0))) //Ist PORTB.0 auf low?
{
PORTD.0 = 1; //Ja. LED an
}
else
{
PORTD.0 = 0; //Nein. LED aus
}
}
}
Nein der ist falsch. Versuch den von mir oben.
hab den code soweit wie möglich übernommen nur paar sachen geändert da
CodeVision die sonst als fehler nennt z.B PD0 = PIND.0 oder return= (0)
ganz weg weil oben steht ja void main (void)
#include <io.h>
void main (void)
{
DDRD = 0x01; //PORTD.0 Ausgang
DDRB = 0xFE; //PORTB.0 Eingang
PORTB = 0x01; //Pullup Widerstand aktiviert
while (1)
{
if (!(PINB & (1<<PINB.0))) //Ist PORTB.0 auf low?
{
PORTD |= (1<<PIND.0); //Ja. LED an
}
else
{
PORTD &= ~(1<<PIND.0); //Nein. LED aus
}
}
}
GEHT IMMER NOCH NICHT Hilfe
AH. Du benutzt CodeVision. Ok Damit kenne ich mich nicht aus^^ Dachte du benutzt WinAVR.
WINAVr hab ich auch aber wie erzeugt man damit hex datein?
Entweder indem du es bei AVR Studio einbindest und einfach Build klickst oder mit einem Makfile. Zweiteres hab ich noch nie gemacht.
ähm wie binde ich das denn beim avr studio ein?
Macht AVR Studio eigentlich automatisch sobald du WinAVR installiert hast. Danach brauchste nur noch ein neues Projekt zu erstellen und deinen Code reinzuschreiben.
Gast
#819585
@Vitalij K.
>DDRB = 0xFE; //PORTB.0 Eingang
Lass mal die Zeile weg, weil das Datenrichtungsregister für Eingang
nicht gesetzt werden muss soviel ich weiss.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.