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


von Stefan F. (feissy)


Angehängte Dateien:

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

von Gast (Gast)


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?

von Stefan F. (feissy)


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

von Stefan F. (feissy)


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

von Karl H. (kbuchegg)


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.
1
#include <avr/io.h>
2
#include "lcd.h"
3
 
4
int main(void)
5
{
6
  unsigned char AlarmEin;
7
8
  lcd_init();
9
  lcd_clear();
10
11
  lcd_print( 0, 2, "Alarm" );
12
13
  AlarmEin = 0;
14
15
  while( 1 )
16
  {
17
    if( PINB & ( 1 << PB1 ) )   // Taster an PB1 schaltet ein
18
      AlarmEin = 1;
19
20
    if( PINB & ( 1 << PB2 ) )   // Taster an PB2 schaltet wieder aus
21
      AlarmEin = 0;
22
23
    if( AlarmEin == 1 )
24
      lcd_print( 1, 3, "Alarm ist ein" );
25
    else
26
      lcd_print( 1, 3, "Alarm ist aus" );
27
  }
28
 
29
  return 0;
30
}

von Karl H. (kbuchegg)


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.

von Stefan F. (feissy)


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
1
#include <avr/io.h>
2
#include "lcd.h"
3
#include <inttypes.h>
4
#include <util/delay.h>
5
6
7
8
  inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
9
  {
10
      if ( ! (*port & (1 << pin)) )
11
      {
12
        /* Pin wurde auf Masse gezogen, 100ms warten   */
13
        _delay_ms(50);  // max. 262.1 ms 
14
        _delay_ms(50); 
15
          if ( *port & (1 << pin) )
16
          {
17
            /* Anwender Zeit zum Loslassen des Tasters geben */
18
              _delay_ms(50);
19
              _delay_ms(50); 
20
              return 1;
21
          }
22
      }
23
      return 0;
24
  }
25
26
 
27
int main(void)
28
{
29
30
31
  DDRB &= ~( 1 << PB1 );                 /* PIN PB1 auf Eingang (Taster)            */
32
    PORTB |= ( 1 << PB1 );  
33
34
  unsigned char AlarmEin;
35
36
  lcd_init();
37
  lcd_clear();
38
39
  lcd_print( 0, 2, "Alarm" );
40
41
  AlarmEin = 0;
42
43
  while( 1 )
44
  {
45
    if (debounce(&PINB, PB1))   
46
      AlarmEin ^= 1;
47
48
49
    if( AlarmEin == 1 )
50
      lcd_print( 1, 3, "Alarm ist ein" );
51
    else
52
      lcd_print( 1, 3, "Alarm ist aus" );
53
  }
54
 
55
  return 0;
56
}

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.