www.mikrocontroller.net

Forum: Compiler & IDEs Am Lcd mit atmega 8 Eingänge ablesen


Autor: Stefan F. (feissy)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, habe mal wieder eine Frage zu einem kleinen Anfängerprojekt.
Nachdem ich bei meinem letzte beitrag schon auf lösungen hingewiesen 
worden bin , habe ich mal eine davon ausprobiert.Jedoch will sie nicht 
so wirklich funktionieren. Also der letzte Beitrag ging darum 
Tasterzustände am Lcd darzustellen, in meinem Fall wenn ein Taster 
gedrückt wird soll auf dem lcd stehen "Taster 1 an" oder eben aus.
Im Anhang befindet sich der komplette code in c, sowie ein Schaltplan, 
wie ich das Lcd und den taster angeschlossen habe.
Jetzt habe ich folgendes Problem, wenn ich das Lcd anschließe und den 
Tmega 8 resete, zeigt er mir wie gewünscht "Alarm" in der 1. zeile an.
Jedoch steht in der 2. zeile immer entweder "Taster 0 ein" oder "Taster 
0 aus"       egal ob der taster gedrückt ist oder nich. Man kann soviel 
drücken wie man will es passiert eben nichts.
Wenn ich jetzt jedoch den taster von PB1 trenne, wechselt die Anzeige 
immer in "Taster 0 ein" und "Taster 0 aus" also springt immer hin und 
her.
kann mir jm sagen, woran das liegt uind warum sich mit Taster die 
Anzeige nicht ändert?
mfg

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch es mal mit einem anderen Taster. Den scheinst du falsch 
angeschlossen zu haben.

Was wird ausgegeben wenn du PB1 mit 5V verbindest?
Was wird ausgegeben wenn du PB1 mit 0V verbindest?

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jau stimmt der tat wirklich irgendwie nicht ^^ danke funzt jetzt.
wie kann ich denn den Zustand des eingages speciher, dass der auch wenn 
ich drücke und dann loslasse auf "Taster 1 ein " stehen bleibt und nicht 
wieder zurückspringt auf aus???

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja und noch was wenn ich den atmega resette zeigt der mir bei den 
ersten paar malen reseten immer so komische zeichen auf dem ganzen lcd 
an???
wovon kommt das denn oder muss ich einen anderen widerstand zwischen 
reset und 5v legen???

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Feismann wrote:
> jau stimmt der tat wirklich irgendwie nicht ^^ danke funzt jetzt.
> wie kann ich denn den Zustand des eingages speciher, dass der auch wenn
> ich drücke und dann loslasse auf "Taster 1 ein " stehen bleibt und nicht
> wieder zurückspringt auf aus???

Indem du dir in einer Variablen einen Zustand merkst?

(Du solltest zunächst mal auf einem PC die Grundlagen der Programmierung 
erlernen. Auf einem PC geht das wesentlich einfacher, da du dort sehr 
viel bessere Möglichkeiten hast, deinem Programm bei der Arbeit 
zuzusehen. Das Stichwort dabei lautet Debugger, bzw. Testausgaben über 
printf

Auch solltest du den Ankauf eines C-Grundlagenbuches ernsthaft in 
Erwägung ziehen. Erstens kommst du ohne vernünftige Literatur nicht 
weit, zweitens wirst du vernünftige Unterlagen sowieso brauchen und 
drittens ist ein Forum wie dieses hier ein denkbar schlechter Platz um 
die absoluten Grundlagen zu erlernen.

Und nochwas: Du solltest dir von Anfang an angewöhnen, deinen Code auch 
optisch schön zu gestalten. Das sieht nicht nur nett aus, sondern ist 
auch ungemein hilfreich bei der Fehlersuche, wenn man nicht erst aus 
einer Buchstabenwüste die relevanten Informationen herausklauben muss. 
Nichts gegen Leerzeilen, aber wenn 5 Codezeilen über eine ganze 
Bildschirmseite mehr oder weniger wahllos verstreut sind, dann ist das 
nicht sehr hilfreich den Code zu überblicken. Auch ein konsistentes 
Einrückschema kann den Unterschied zwischen "Hilfe ich blick nicht mehr 
durch" und "Ist doch alles kein Problem" machen.
#include <avr/io.h>
#include "lcd.h"
 
int main(void)
{
  unsigned char AlarmEin;

  lcd_init();
  lcd_clear();

  lcd_print( 0, 2, "Alarm" );

  AlarmEin = 0;

  while( 1 )
  {
    if( PINB & ( 1 << PB1 ) )   // Taster an PB1 schaltet ein
      AlarmEin = 1;

    if( PINB & ( 1 << PB2 ) )   // Taster an PB2 schaltet wieder aus
      AlarmEin = 0;

    if( AlarmEin == 1 )
      lcd_print( 1, 3, "Alarm ist ein" );
    else
      lcd_print( 1, 3, "Alarm ist aus" );
  }
 
  return 0;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Feismann wrote:
> ach ja und noch was wenn ich den atmega resette zeigt der mir bei den
> ersten paar malen reseten immer so komische zeichen auf dem ganzen lcd
> an???

Wahrscheinlich ist das Timing mit dem das LCD angesteuert wird ein 
bischen knapp bemessen.

Autor: Stefan F. (feissy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ich weiß es wohl ich habe auch schon ein grundbuch zu hause und bin 
fleißig am lesen nur is das da einw enig schwer zu vesretehen. kannst du 
mir eine gute lektüre empfehlen????

ach ja habs noch hinbekommen mit dem Taster ^^
und nochmals danke
#include <avr/io.h>
#include "lcd.h"
#include <inttypes.h>
#include <util/delay.h>



  inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
  {
      if ( ! (*port & (1 << pin)) )
      {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(50);  // max. 262.1 ms 
        _delay_ms(50); 
          if ( *port & (1 << pin) )
          {
            /* Anwender Zeit zum Loslassen des Tasters geben */
              _delay_ms(50);
              _delay_ms(50); 
              return 1;
          }
      }
      return 0;
  }

 
int main(void)
{


  DDRB &= ~( 1 << PB1 );                 /* PIN PB1 auf Eingang (Taster)            */
    PORTB |= ( 1 << PB1 );  

  unsigned char AlarmEin;

  lcd_init();
  lcd_clear();

  lcd_print( 0, 2, "Alarm" );

  AlarmEin = 0;

  while( 1 )
  {
    if (debounce(&PINB, PB1))   
      AlarmEin ^= 1;


    if( AlarmEin == 1 )
      lcd_print( 1, 3, "Alarm ist ein" );
    else
      lcd_print( 1, 3, "Alarm ist aus" );
  }
 
  return 0;
}


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.