Hallo. Ich wollte gerne eine LED zum leuchten bringen, wenn ich einen Taster drücke. Folgenden Code hab ich verwendet, der Compiler ist Codevision: #include <mega32.h> void main (void) { PORTA = 0x00; DDRA = 0x00; if (PINA.1) { PORTB = 0xFF; DDRB = 0xFF; } } Der Compiler kompiliert ohne Fehler und Warnungen, nur die LED an PORT A leuchtet nicht. Kann mir vielleicht jemand helfen ? Gruß Helge
Hallo, eventuell Pullup Widerstände einschalten? Oha das ist ja C-Code, mein Kopf schmerzt. Es grüsst, Arno
Hallo. Also bei Port A : PORTA = 0xFF; ? Dann ist der Pullup Widerstand gesetzt, oder ? Aber funktioniert auch nicht. Gruss Helge
void main (void) { PORTA = 0xFF; DDRA = 0x00; while(1) //Endlosschleife! { if (PINA.1) { PORTB = 0xFF; DDRB = 0xFF; } } }
Wenn der Text stimmt, steuerst du Port B an - eine LED an Port A wird da wohl nicht leuchten... Vorwiderstand? LED falsch gepolt?
Wenn dein Programm wirklich exakt so wie oben gepostet aussieht, ist es kein Wunder, dass du nie die LED leuchten siehst. Deine if-Abfrage gehört in die while-Schleife, die CodevisionAVR freundlicherweise automatisch anlegt, wenn du den Codegenerator benutzt, steht ja auch deutlich da: while (1) { // Place your code here }; In deinem Code kann ich so eine Endlos-Schleife nicht entdecken. Dein gepostetes Programm überprüft lediglich ein einziges mal, ein paar Mikrosekunden nach dem Einschalten, ob PINA.1 High ist, dann macht es nichts mehr (weil eben die Endlos-Schleife fehlt). Wenn beim Hochfahren PINA.1 noch auf Low ist (weil du den Taster erst ein paar Sekunden nach dem Einschalten betätigst), dann wird die LED nie leuchten. In den Teil der main-Funktion, der vor der Haupt-Schleife liegt, gehören lediglich Programmteile, die nur ein einziges mal beim Hochfahren ausgeführt werden. Also diverse Initialisierungen (LCD, Ports, Timer) oder z.B. die einmalige Anzeige eines Begrüßungstextes am LCD, der nur für kurze Zeit beim Hochfahren sichtbar sein soll (z.B. Anzeige der Software-Version). Es wäre vielleicht empfehlenswert, wenn du dir mal ein Buch über C-Programmierung für Mikrocontroller durchliest. MFG, Andy
Danke erstmal für die ausführliche Antwort ! if (PINA.1) {... bedeutet ja, dass die Schleife durchlaufen wird, wenn mittels des Tasters PINA1 auf VCC gezogen wird, oder ? Gruss Helge
Hi, Du hast keine Schleife. Die IF-Abfrage ist keine Schleifenkonstrukt, sondern lediglich eine Abfrage (wie der Name schon sagt). Sie wird lediglich einmal ausgeführt, solange Du sie nicht in eine Schleife setzt. Wie oben schon geschrieben, solltest Du also Deine IF-Abfrage in eine Schleife betten: WHILE (1) { //hier kommt Dein Code }; Außerdem weiß ich nicht genau, wie Du Deine LED´s angeschlossen hast. Wenn sie nach Masse geschaltet werden, musst Du natürlich PORTB=0x00 setzen. Außerdem macht es meiner Meinung nach Sinn, wenn Du erst die Ports initialisierst und dann das eigentliche Programm startest... Gruß, Doom
if (Bedingung) { mach was }; ist keine Schleife. Siehe meinen letzten Satz im vorigen Beitrag. Dir fehlen ganz essentielle Grundlagen, so kann das nichts werden. Ist nicht böse gemeint, aber wenn du noch nicht mal eine Buchseite zum Thema C-Programmierung gelesen hast, wirst du nur Frustration erleben und bald das Handtuch werfen.
Ja O.k. Ich glaub, ich muss mich mal ordentlich in die Grundlagen einlesen. Ich wollte halt am Anfang schon ein kleines Erfolgserlebnis stehen haben. Danke nochmal allen Antwortenden Gruss Helge
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.