Forum: Mikrocontroller und Digitale Elektronik LED mit Taster aktivieren


von Vitalij K. (kingvita1989)


Lesenswert?

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
};
};
}

von Philipp R. (relaxxo)


Lesenswert?

Hast du einen PullUp-Widerstand am Taster? Falls nicht schalte den 
internen PullUp ein.

Vorwiderstand der LED nicht vergessen!

von Vitalij K. (kingvita1989)


Lesenswert?

wie schalte ich den internen Pullup Widerstand ein?

von Philipp R. (relaxxo)


Lesenswert?

AVR GCC Tutorial - Punkt 11.5.2

von Robin T. (rotoe) Benutzerseite


Lesenswert?

> 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.

von Vitalij K. (kingvita1989)


Lesenswert?

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
};
};
}

von Robin T. (rotoe) Benutzerseite


Lesenswert?

1
 if (!(PINB & (1<<PB0)))   //Ist PORTB.0 auf low?
2
 {
3
   PORTD.0 = 1;              //Ja. LED an
4
 }
5
 else
6
 {
7
   PORTD.0 = 0;           //Nein. LED aus
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.

von Vitalij K. (kingvita1989)


Lesenswert?

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
 }

};
}

von Vitalij K. (kingvita1989)


Lesenswert?

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
 }
}
}

von Robin T. (rotoe) Benutzerseite


Lesenswert?

1
#include <io.h>
2
3
void main (void)
4
{
5
DDRD = 0x01;     //PORTD.0 Ausgang
6
DDRB = 0xFE;    //PORTB.0 Eingang
7
PORTB = 0x01;  //Pullup Widerstand aktiviert
8
while (1) 
9
{
10
  if (!(PINB & (1<<PB0)))   //Ist PORTB.0 auf low?
11
  {
12
    PORTD |= (1<<PD0);              //Ja. LED an
13
  }
14
  else
15
  {
16
    PORTD &= ~(1<<PD0);           //Nein. LED aus
17
  }
18
}
19
return(0);
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.

von Vitalij K. (kingvita1989)


Lesenswert?

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
  }
}
}

von Robin T. (rotoe) Benutzerseite


Lesenswert?

Nein der ist falsch. Versuch den von mir oben.

von Vitalij K. (kingvita1989)


Lesenswert?

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

von Robin T. (rotoe) Benutzerseite


Lesenswert?

AH. Du benutzt CodeVision. Ok Damit kenne ich mich nicht aus^^ Dachte du 
benutzt WinAVR.

von Vitalij K. (kingvita1989)


Lesenswert?

WINAVr hab ich auch aber wie erzeugt man damit hex datein?

von Robin T. (rotoe) Benutzerseite


Lesenswert?

Entweder indem du es bei AVR Studio einbindest und einfach Build klickst 
oder mit einem Makfile. Zweiteres hab ich noch nie gemacht.

von Vitalij K. (kingvita1989)


Lesenswert?

ähm wie binde ich das denn beim avr studio ein?

von Robin T. (rotoe) Benutzerseite


Lesenswert?

Macht AVR Studio eigentlich automatisch sobald du WinAVR installiert 
hast. Danach brauchste nur noch ein neues Projekt zu erstellen und 
deinen Code reinzuschreiben.

von norad (Gast)


Lesenswert?

@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.

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