Forum: Mikrocontroller und Digitale Elektronik Wo ist der Fehler?


von Vitalij K. (kingvita1989)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

Komisch ;-)

von Marcus (Gast)


Lesenswert?

teste mal ohne

PORTD.0 = 0; // LED1 an

von STK500-Besitzer (Gast)


Lesenswert?

1
while (1)
2
{
3
PORTD.0 = 0; // LED1 an  << = das sollte vor der Schleife stehen oder
4
             //                 komplett gelöscht werden,
5
             //                 weil es überflüssig ist
6
7
8
if (PINB.0==0)
9
{
10
PORTD.0 = 1; //LED1 aus
11
}
12
13
14
else
15
{
16
PORTD.0 = 0; //LED1 weiterhin an
17
}
18
}
19
}

von John S. (linux_80)


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:
1
if (PINB & (1 << PB0)) {
2
    ;
3
}

von Robin T. (rotoe) Benutzerseite


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:
>
1
> if (PINB & (1 << PB0)) {
2
>     ;
3
> }
4
>

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

von Vitalij K. (kingvita1989)


Lesenswert?

Die Programmiersprache ist C ......Programmiere mit code vision

von Stefan B. (stefan) Benutzerseite


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.

von Vitalij K. (kingvita1989)


Lesenswert?

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

von willi (Gast)


Lesenswert?

PORTB auf eingang wenn du den zustand abfragen möchtest?!?

von Stefan B. (stefan) Benutzerseite


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-Tutorial#Datenrichtung_bestimmen

von Vitalij K. (kingvita1989)


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

von STK500-Besitzer (Gast)


Lesenswert?

Mal deine Schaltung bitte mal auf!

von willi (Gast)


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

von Philipp R. (relaxxo)


Lesenswert?

zeichne mal deine schaltung, und poste sie

von Peter R. (gelb)


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>

von Vitalij K. (kingvita1989)


Angehängte Dateien:

Lesenswert?

Hier die Schaltung auf die schnelle

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

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-Tutorial:_IO-Grundlagen

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.

von Vitalij K. (kingvita1989)


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

von Stefan B. (stefan) Benutzerseite


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

von Vitalij K. (kingvita1989)


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

von Vitalij K. (kingvita1989)


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?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Habe jetzt den Taster auf GND angeschloßen

Wie? Bitte neuen Schaltplan posten.

von Vitalij K. (kingvita1989)


Angehängte Dateien:

Lesenswert?

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

von Martin (Gast)


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)

von willi (Gast)


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

von Vitalij K. (kingvita1989)


Angehängte Dateien:

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

von Martin (Gast)


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

von Vitalij K. (kingvita1989)


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

von willi (Gast)


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

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.