mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wo ist der Fehler?


Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe folgendes Problem: Möchte über einen Taster eine LED ausschalten 
nur so um die funktion zu verstehen. Habe folgendes Prog geschrieben nur 
leider geht die LED nicht aus sonder leuchtet heller beim betätigen des 
Tasters wo liegt der fehler?

#include <mega8.h> // Ein/Ausgabe Datei für Mega8 Controller eingebunden

void main (void)
{
DDRD = 0xFF; // Alle Pins von PORTD auf Ausgang
PORTD = 0xFF; // Alle Pins von PORTD auf high (5V)
DDRB = 0xFF;  // Alle Pins von PORTB auf Ausgang
PORTB =0x00; //PORTB auf low (0V)



while (1)
{
PORTD.0 = 0; // LED1 an


if (PINB.0==0)
{
PORTD.0 = 1; //LED1 aus
}


else
{
PORTD.0 = 0; //LED1 weiterhin an
}
}
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> DDRB = 0xFF;  // Alle Pins von PORTB auf Ausgang
                                           ^^^^^^^
> if (PINB.0==0)

Komisch ;-)

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
teste mal ohne

PORTD.0 = 0; // LED1 an

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while (1)
{
PORTD.0 = 0; // LED1 an  << = das sollte vor der Schleife stehen oder
             //                 komplett gelöscht werden,
             //                 weil es überflüssig ist


if (PINB.0==0)
{
PORTD.0 = 1; //LED1 aus
}


else
{
PORTD.0 = 0; //LED1 weiterhin an
}
}
}

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um welche Programmiersprache handelt es sich hier überhaupt, scheint 
eine Mischung aus Bascom und C zu sein ?

dachte in C gehts nur in der Art:
if (PINB & (1 << PB0)) {
    ;
}

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

Bewertung
0 lesenswert
nicht lesenswert
Tiny 80 wrote:
> Um welche Programmiersprache handelt es sich hier überhaupt, scheint
> eine Mischung aus Bascom und C zu sein ?
>
> dachte in C gehts nur in der Art:
>
> if (PINB & (1 << PB0)) {
>     ;
> }
> 

Sowas gabs hier neulich schonmal. Da dachte ich auch das es eingetlich
so wie du es geschrieben hast heißen müsste.

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Programmiersprache ist C ......Programmiere mit code vision

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und, kann man in code vision diese Zeile verbessern?

> DDRB = 0xFF;  // Alle Pins von PORTB auf Ausgang

Wenn alles Auf Ausgang steht, kann keine Eingabe funktionieren.

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was soll da denn verbessert werden nur den PORTB.0 auf ausgang setzten 
also low (0V) oder was meinst du?

Autor: willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTB auf eingang wenn du den zustand abfragen möchtest?!?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vitalij K. wrote:

> was soll da denn verbessert werden nur den PORTB.0 auf ausgang setzten
> also low (0V) oder was meinst du?

Mann, Mann, Mann

DDRB ist das Datenrichtungsregister für Port B.

Wenn durch die Zeile

> DDRB = 0xFF;  // Alle Pins von PORTB auf Ausgang

alle Pins 0 bis 7 an Port B als Ausgang definiert sind, kannst du 
später im Programm nicht mit der Zeile

> if (PINB.0==0)

Pin 0 von Port B als Eingang abfragen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das Programm jetzt überarbeitet aber es geht immer noch nicht was 
mach ich falsch? Folgendes soll gemacht werden die LED an PORTD.0 soll 
leuchten und bei betätigen des Tasters nicht mehr leuchten. [LED ist mit 
der Kathode zum controller geschaltet der Taster hat minus am Controller 
und plus beim 7805 baustein (5v)] Was Mach ich falsch? (ich programmiere 
mit CodeVision.


#include <mega8.h>

void main (void)
{
DDRD = 0xFF; // PORTD als Ausgang
PORTD = 0xFF; //PORTD auf high (5V)
DDRB = 0x00; // PORTB als Eingang
PORTB = 0xFE; // PORTB.0 auf low (0V)



while (1)
{

if (PORTB.0 == 0)
{
PORTD.0 = 1; //LED aus
}

else
{
PORTD.0 = 0; //LED an
}
}
}

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal deine Schaltung bitte mal auf!

Autor: willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich werd aus deiner beschreibung wie die schaltung aussieht nihct 
schlau. zeichne mal einen schaltplan und stell den hier rein.
wenn PortB eingang ist dann schaltest du mit dieser anweisung:
PORTB = 0xFE; // PORTB.0 auf low (0V)
die internen PullUp Widerstände ein bzw. aus. bei einem eingang ist da 
nix mit 0V. ist der pin EINGANG und das zugehörige PORT-Bit 1 dann ist 
der interne PullUp eingeschaltet. deine anweisung PORTB = 0xFE; // 
PORTB.0 auf low (0V) schaltet also den PullUp für PORTB0 ab

Autor: Philipp R. (relaxxo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zeichne mal deine schaltung, und poste sie

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist nach wie vor nicht klar, wie die LEDs angeschlossen sind.

Und Taster gegen Plus zu schalten ist sinnlos. Die müssen stattdessen 
einen Portpin gegen Masse ziehen.

Und jetzt stelle ich mir gerade vor, wie schwierig es werden wird, zu 
erklären, was ein Pullup - Widerstand ist und wie man den im Controller 
aktiviert...

<zurücklehn>

Autor: Vitalij K. (kingvita1989)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier die Schaltung auf die schnelle

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Es ist doch nicht schwer eine Skizze anzuhängen... das kann man mit ganz 
primitiven Mitteln machen, wenn man Angst vor einem Schaltplaneditor 
hat...
(Edit: Sehe gerade, dass du eine Skizze angegeben hast)

Dein Programm würde mit der Hardware im Anhang (Edit: mein Anhang) 
funktionieren. Die Widerstände dienen zur Strombegrenzung und damit dem 
Überleben der Bauteile.

Die Schaltung ist auch im Tutorial erklärt
http://www.mikrocontroller.net/articles/AVR-Tutori...

Bei

> LED ist mit der Kathode zum controller geschaltet

wäre die LED low-aktiv (Leuchten bei PORTD.0 0 und Dunkelheit bei 
PORTD.0 1) geschaltet. Wichtig ist, womit die Anode ("langes Beinchen") 
verbunden ist. Es sollte über einen Vorwiderstand eine Spannungsquelle 
sein, damit es funktioniert. Bei einer Verbindung Anode zu GND leuchtet 
diese LED nie.

Bei

> der Taster hat minus am Controller und plus beim 7805 baustein (5v)]

liegt bei offenem Taster an PINB.0 0 an und bei geschlossenem Taster 1. 
So kann die LED nicht aus gehen, weil die if-Abfrage nicht erfüllt ist.

Wenn deine (unbekannte) Schaltung bei offenem Taster die LED leuchten 
lässt, ist das nicht mit dem Programmcode und deiner Beschreibung ("LED 
ist mit der Kathode zum controller") in Einklang zu bringen.

Dieses Verhalten wäre erklärbar, wenn die Anode der LED zum Controller 
und die Kathode zu GND (bzw. dem Vorwiderstand) verbunden ist und damit 
die LED high-aktiv geschaltet ist.

Edit: Dein Taster kann keinen 0 Pegel herstellen, weil er keine 
Verbindung zu GND schafft. Zum Glück, denn ohne Widerstand würde eine 
Verbindung zu GND einen Kurzschluss bedeuten.

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat einer ne idee was ich falsch mache der code ist richtig oder wie seh 
ich das?

#include <mega8.h>

void main (void)
{
DDRD = 0xFF; // PORTD als Ausgang
PORTD = 0xFF; //PORTD auf high (5V)
DDRB = 0x00; // PORTB als Eingang
PORTB = 0xFE; // PORTB.0 auf low (0V)



while (1)
{

if (PORTB.0 == 0)
{
PORTD.0 = 1; //LED aus
}

else
{
PORTD.0 = 0; //LED an
}
}
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan "stefb" B. wrote:

> Bei
>
>> der Taster hat minus am Controller und plus beim 7805 baustein (5v)]
>
> liegt bei offenem Taster an PINB.0 0 an und bei geschlossenem Taster 1.
> So kann die LED nicht aus gehen, weil die if-Abfrage nicht erfüllt ist.

Sorry, 0-Fall stimmt nicht. Es liegt dann kein definierter Zustand an 
(Eingang ist im sog. TRISTATE-Zustand).

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe jetzt den Taster auf GND angeschloßen und siehe da mit diesem code 
geht es :
#include <mega8.h> // Ein/Ausgabe Datei für Mega8 Controller eingebunden

void main (void)
{
DDRD = 0xFF; // Alle Pins von PORTD auf Ausgang
PORTD = 0xFF; // Alle Pins von PORTD auf high (5V)
DDRB = 0xFF;  // Alle Pins von PORTB auf Ausgang
PORTB =0xFF; //PORTB.0 auf low (0V)


while (1)
{



if (PINB.0==0)
{
PORTD.0 = 1; //LED1 aus
}


else
{
PORTD.0 = 0; //LED1 weiterhin an
}
}
}



Jedoch mit dem kleinen fehler das der PORTB auf Ausgang geschaltet ist 
und nicht auf Eingang so wie hier aber mit diesem programm wie es mir 
hier gesagt wurde geht es nicht wieso wo liegt der unterschied :

#include <mega8.h>

void main (void)
{
DDRD = 0xFF; // PORTD als Ausgang
PORTD = 0xFF; //PORTD auf high (5V)
DDRB = 0x00; // PORTB als Eingang
PORTB = 0xFE; // PORTB.0 auf low (0V)



while (1)
{

if (PORTB.0 == 0)
{
PORTD.0 = 1; //LED aus
}

else
{
PORTD.0 = 0; //LED an
}
}
}

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner einen Rat für mich möchte nur wissen wieso es mit dem zweiten 
code nciht geht wenn ich auf eingang gehe wie es eigentlich richtig ist 
oder?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habe jetzt den Taster auf GND angeschloßen

Wie? Bitte neuen Schaltplan posten.

Autor: Vitalij K. (kingvita1989)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so mit dem erste code funktioniert es mit dem zweiten nicht warum und 
welcher ist denn nun richtig?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei dem einen ist es PORTB = 0xFE und bei dem anderen ist es ist es 
0xFF. allerdings schließt du den ausgang kurz beim ersten, das mag der 
mega nicht.
du musst im ersten code noch die pullups einschalten.

(shifttaste ist im arsch)

Autor: willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRB = 0xFF;  // Alle Pins von PORTB auf Ausgang
PORTB =0xFF; //PORTB.0 auf low (0V)

dieser code gibt eine 1 auf PORTB.0 aus, also 5V! wenn du jetzt deinen 
taster drückst machst du einen kurzschluss! kein wunder das dann die led 
aus ist, weil die gesamte schaltung ohne spannung ist


beim zweiten code
DDRB = 0x00; // PORTB als Eingang
PORTB = 0xFE; // PORTB.0 auf low (0V)

schaltest du den pullup von portb0 nicht ein! ersetze die dritte zeile 
durch:
PORTB = 0xFF;
und es sollte funktionieren, falls du deinen controller oder den port 
noch nicht zerstört hast

hast du auch nur annähernd eine ahnung von dem was du tust??

Autor: Vitalij K. (kingvita1989)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier der jetzige Schaltplan und der code den ich dafür geschrieben habe 
was mach ich immer noch falsch die LED leuchtet reagiert aber nicht auf 
den taster geht nicht aus bei betätigen: HELP


#include <mega8.h>

void main (void)
{
DDRD = 0xFF; // PORTD als Ausgang
PORTD = 0xFF; //PORTD auf high (5V)
DDRB = 0x00; // PORTB als Eingang
PORTB = 0xFF;



while (1)
{

if (PORTB.0 == 0)
{
PORTD.0 = 1; //LED aus
}

else
{
PORTD.0 = 0; //LED an
}
}
}

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na wenn schon LED mit Vorwiderstand benutzen und zur Abfrage eines Pins 
musst du PINB schreiben, nicht PORTB

hier richtig:

while (1)
{

if (PINB.0 == 0)
{
PORTD.0 = 1; //LED aus
}

else
{
PORTD.0 = 0; //LED an
}
}

Autor: Vitalij K. (kingvita1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Viele Dank an alle läuft jetzt alles. Weiß jemand ob man irgendwie mit 
dem controller die anzahl der betätigungen des tasters zählen kann? und 
so z.b beim einmal drücken LED1 angeht bei zwei mal drücken LED2 
usw.....

Autor: willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja kann man, mit so einem controller kann man sogar noch um einiges 
mehr. aber ich glaube kaum das du hier alles vorgekaut bekommen wirst. 
lerne programmieren, lerne C oder Assembler oder meinetwegen auch 
BASCOM, aber um programmierkenntnisse und die grundlagen der 
elektrotechnik wirst du nicht herumkommen. außerdem solltest du das 
datenblatt des controllers kennen und auch einigermaßen begriffen haben 
wie ein controller aufgebaut ist und was er macht, sonst wird das garnix

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.