Forum: Mikrocontroller und Digitale Elektronik Frage zu Afängerfehler


von Daniel U. (Firma: zuhause) (uhli)


Lesenswert?

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

von Nils Friess (Gast)


Lesenswert?

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?

von Daniel U. (Firma: zuhause) (uhli)


Lesenswert?

Habe jetzt nocheinmal ein neues Projekt erstellt...
das schalten der LED in 3 Zustände funktioniert jetzt.

Allerdings die Entprellung noch nicht...

von Samuel C. (dragonsam)


Lesenswert?

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

von Daniel U. (Firma: zuhause) (uhli)


Angehängte Dateien:

Lesenswert?

Die Entprellroutine ist ausm Netz..

Hier die Dateien als Anhang

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
von Daniel U. (Firma: zuhause) (uhli)


Lesenswert?

Gut werde es eimal so probieren,

danke für die Tipps und infos!

MfG Uhli

von Samuel C. (dragonsam)


Lesenswert?

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
von Karl Käfer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.