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 } } }
> DDRB = 0xFF; // Alle Pins von PORTB auf Ausgang ^^^^^^^ > if (PINB.0==0) Komisch ;-)
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 | }
|
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 | }
|
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.
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.
was soll da denn verbessert werden nur den PORTB.0 auf ausgang setzten also low (0V) oder was meinst du?
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
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 } } }
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
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>
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.
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 } } }
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).
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 } } }
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?
> Habe jetzt den Taster auf GND angeschloßen
Wie? Bitte neuen Schaltplan posten.
so mit dem erste code funktioniert es mit dem zweiten nicht warum und welcher ist denn nun richtig?
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)
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??
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 } } }
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 } }
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.....
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.