Servus! Ich bin Programmieranfänger und habe hier ein Programm was eine LED in 3 Zustände setzen soll. blinken, dauerleuchten, aus. Ich verwende einen Taster welcher mit 0-Pegel einen Ausgang auf 1 setzen soll. Leider tut sich nix. Also vielleicht findet jemand den Fehler, bin gerade mit meinem Latein am Ende. Grüße, Uhli Entprellroutine: char Tasterentprellung (void); // Entprellen durch Flankenerkennung #define TASTERPORT PINC #define TASTERBIT PINC5 static unsigned char Zustand=0; char ET = 0; char Tasterentprellung(void) { if(Zustand == 0 &&! (TASTERPORT & (1<<TASTERBIT))) { //Taste WIRD GEDRUECKT (steigende Flanke) Zustand = 1; // hochzaehlen der 4 Zustaende eines Tasters ET = 1; // ET ist der entprellte Tastendruck } else if (Zustand == 1 &&!(TASTERPORT & (1<<TASTERBIT))) { // Taste GEHALTEN Zustand = 2; ET = 0; } else if (Zustand == 2 && (TASTERPORT & (1<<TASTERBIT))) { // Taste LOSLASSEN (fallende Flanke) Zustand = 3; ET = 0; } else if (Zustand == 3 && (TASTERPORT & (1<<TASTERBIT))) { // Taste LOSGELASSEN Zustand = 0; ET = 0; } return ET; // Rueckgabe des entprellten Signals } Hautprogramm: * Verwendung der Entprellroutine durch Flankenerkennung nach µC-net */ #define F_CPU 1000000UL // 8 MHz interner Oszi; Takt Def. immer als 1.! #include <avr/io.h> // Standard-Bibliotheken, dann eigene Bibliotheken #include <util/delay.h> // Entprellheader Taster # include "..\includes\Entprell_Flanken.h" // Blinkheader # include "..\includes\LED_blinken.h" //################################################################### int main(void) { DDRD |=(1<<PD2); // LED ;setzen, also Ausgang DDRC &=~(1<<PC5); // Taster (low-activ); nicht setzen, also Eingang PORTC |=(1<<PC5); // Pull Up Widerstand // (nicht noetig wenn hardwaremaessig realisiert !) int Tastendruckzaehler=0; // 1=Ledblinken() , 2=LED ein, 3=LED aus while(1) //Endlosschleife des Hauptprogrammes ######################### { Tasterentprellung(); //Aufruf der EntprellFunktion _delay_ms(100); if( ET == 1 )// Bedingung ist entprellter Tastendruck { Tastendruckzaehler++; if( Tastendruckzaehler == 1 ) // blink blink blink { // 1. Zustand Ledblinken(); } if( Tastendruckzaehler == 2 ) // leucht leucht leucht { // 2. Zustand PORTD &= ~(1<<PD2); } if( Tastendruckzaehler == 3 ) // aus { // 3. Zustand PORTD |= (1<<PD2); } if ( Tastendruckzaehler >= 3 )//Ruecksetzen der Tastendrucke { Tastendruckzaehler = 0; } } // Ende if( ET == 1 ) _delay_ms(100); } // Ende while return 0; } // Ende main #########################################################
Das F_CPU und das komische Kommentar dahinter wird wohl nicht der Fehler sein, aber was das genau soll weiß ich auch nicht. Blinkt die LED denn wenn du ein einfaches Programm a la LED an - wait - LED aus - wait auf den Controller ladest?
Habe jetzt nocheinmal ein neues Projekt erstellt... das schalten der LED in 3 Zustände funktioniert jetzt. Allerdings die Entprellung noch nicht...
Deine Entprellung gibt auch nicht ganz Sinn. Der Ansatz ist in Ordnung so (wenn auch optimierungsfähig), allerdings sehen ein paar Details komisch aus. Warum gibst du ET zurück (und dann auch noch als char) und arbeitest in der Main trotzdem direkt auf ET? Ist ET in der Main überhaupt verfügbar? Warum deklarierst du Zustand als static? Poste mal bitte alle .c und .h Dateien (als Anhang, nicht als Text).
Samuel C. schrieb: > Der Ansatz ist in Ordnung so (wenn auch optimierungsfähig), Ein _delay_ms() vernichtet nur Rechenleistung und ist bestenfalls für kleinste Tesprogrämmchen sinvoll, solange die komplett auf eine Bildschirmseite passen. Richtig macht man sowas mit einem Timertick z.B. pro Millisekunde und einem Zustandsautomaten (hört sich hochgestochen an, ist aber ganz einfach, denn jeder Zähler ist schon ein Zustandsautomat)... Daniel Uhlig schrieb: > Die Entprellroutine ist ausm Netz.. Ins Netz kann jeder, der weiß, wie man etwas ins Netz stellt, etwas reinstellen. Auf jeden Fall gibt es dort unglaublich viele Anfängerprogrämmchen mit Gebastel und Gemurkse.
:
Bearbeitet durch Moderator
Lothar Miller schrieb: > Samuel C. schrieb: >> Der Ansatz ist in Ordnung so (wenn auch optimierungsfähig), > Ein _delay_ms() vernichtet nur Rechenleistung und ist bestenfalls für > kleinste Tesprogrämmchen sinvoll, solange die komplett auf eine > Bildschirmseite passen. Bitte reiße meine Aussagen nicht aus dem Kontext. Ich bezog mich auf die Entprellung. Die braucht zwar auch eine Zeitbasis, doch die Erzeugung dieser ist nicht Teil der Routine. Ist das Programm genau so wie du es gerade testest? Was heißt, die Entprellung funktioniert nicht? Bekommst du immernoch mehrere Impulse pro Tastendruck? BTW: Wenn schon Code ausgelagert wird, dann solltest du dir angewöhnen Header von Code zu trennen. Code gehört in eine .c-Datei. siehe: http://www.mikrocontroller.net/articles/Funktionen_auslagern_%28C%29
:
Bearbeitet durch User
Hallo Lothar, Lothar Miller schrieb: > Daniel Uhlig schrieb: >> Die Entprellroutine ist ausm Netz.. > Ins Netz kann jeder, der weiß, wie man etwas ins Netz stellt, etwas > reinstellen. Auf jeden Fall gibt es dort unglaublich viele > Anfängerprogrämmchen mit Gebastel und Gemurkse. Das stimmt. Aber in diesem Fall möchtest Du vielleicht einmal hierher [1] schauen. ;-) Liebe Grüße, Karl [1] http://www.mikrocontroller.net/articles/Entprellung#Flankenerkennung
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.