Am Lcd mit atmega 8 Eingänge ablesen

OP #1245381
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
Angehängte Dateien:
#1245526
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
}
OP #1245676
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren