Forum: Mikrocontroller und Digitale Elektronik Frage zu Afängerfehler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Daniel U. (Firma: zuhause) (uhli)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht lesenswert
Die Entprellroutine ist ausm Netz..

Hier die Dateien als Anhang

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Gut werde es eimal so probieren,

danke für die Tipps und infos!

MfG Uhli

von Samuel C. (dragonsam)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.