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
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?
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???
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???
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 | }
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.