www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED mit Taster aktivieren


Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht 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
};
};
}

Autor: Philipp R. (relaxxo)
Datum:

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

Vorwiderstand der LED nicht vergessen!

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie schalte ich den internen Pullup Widerstand ein?

Autor: Philipp R. (relaxxo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR GCC Tutorial - Punkt 11.5.2

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht 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
};
};
}

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

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

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht 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
 }

};
}

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht 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
 }
}
}

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#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<<PB0)))   //Ist PORTB.0 auf low?
  {
    PORTD |= (1<<PD0);              //Ja. LED an
  }
  else
  {
    PORTD &= ~(1<<PD0);           //Nein. LED aus
  }
}
return(0);
}

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.

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht 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
  }
}
}

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein der ist falsch. Versuch den von mir oben.

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

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

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WINAVr hab ich auch aber wie erzeugt man damit hex datein?

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

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

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm wie binde ich das denn beim avr studio ein?

Autor: Robin Tönniges (rotoe) Benutzerseite
Datum:

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

Autor: norad (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.