hallo, habe auf einem selbstgebauten experimentierboard mit einem atmega32 einen taster wie im beispiel (http://www.mikrocontroller.net/articles/Entprellung#Einfacher_Taster) über einen 74HCT14N an PA0 angeschlossen. über den taster wird dann einfach eine led ein- bzw. ausgeschaltet. drücke ich nun diesen taster, hängt sich der atmega auf. ein reset hilft auch nichts. liegt das daran das PORTA analoge eingänge sind? ich hab mal im datenblatt gestöbert, aber so richtig schlau geworden bin ich auch nicht. gruß, marco
Hallo Marco Glatz Währe hilfreich wenn Du den Code hier reinstellst, besonderst den Teil wo die Ports Initialisiert werden. Gruss
hallo, ich hatte gestern mal alles mögliche auskommentiert und dabei festgestellt, das der teil wo die led an- und ausgeht scheinbar dafür verantwortlich ist. je mehr blinkgedöns, umso schneller schmiert der atmel ab.
1 | void delay_1ms(u16 i) |
2 | {
|
3 | do { |
4 | _delay_ms(1); |
5 | } while(--i); |
6 | }
|
7 | |
8 | |
9 | |
10 | int main( void ) |
11 | {
|
12 | u8 relais = 0; |
13 | u8 ssw = 0; |
14 | |
15 | // eingäge definieren
|
16 | DDRA = 0b00000000; |
17 | |
18 | // ausgänge definieren
|
19 | DDRC = 0b11111111; |
20 | DDRD |= (1 << DDD4) | (1 << DDD7); |
21 | |
22 | |
23 | init_uart0( (u16)(XTAL / BAUD / 16 - 0.5) ); |
24 | sei(); |
25 | delay_1ms(300); |
26 | |
27 | while(1) { |
28 | |
29 | PORTC |= (1 << PC2); |
30 | delay_1ms(300); |
31 | PORTC &= ~(1 << PC2); |
32 | |
33 | switch(ssw) { |
34 | |
35 | // init
|
36 | case 0: |
37 | uputs0("Init\n\r"); |
38 | |
39 | relais_off(); |
40 | led_red_on(); |
41 | led_green_off(); |
42 | |
43 | ssw = 1; |
44 | break; |
45 | |
46 | // warte auf taster
|
47 | case 1: |
48 | PORTC |= (1 << PC1); |
49 | delay_1ms(300); |
50 | PORTC &= ~(1 << PC1); |
51 | |
52 | if ((PINA & (1 << PINA0)) == 1) { |
53 | if(relais == 0) { |
54 | relais = 1; |
55 | ssw = 2; |
56 | } else { |
57 | relais = 0; |
58 | ssw = 3; |
59 | }
|
60 | }
|
61 | |
62 | while((PINA & (1 << PINA0)) == 1) { |
63 | |
64 | }
|
65 | |
66 | break; |
67 | |
68 | // relais aus -> relais an
|
69 | case 2: |
70 | relais_on(); |
71 | led_red_off(); |
72 | led_green_on(); |
73 | |
74 | ssw = 1; |
75 | break; |
76 | |
77 | // relais an -> relais aus
|
78 | case 3: |
79 | relais_off(); |
80 | led_red_on(); |
81 | led_green_off(); |
82 | |
83 | ssw = 1; |
84 | break; |
85 | }
|
86 | |
87 | // rs-232 test
|
88 | if(ukbhit0()) { |
89 | uputchar0(ugetchar0()); |
90 | uputchar0('\n'); |
91 | uputchar0('\r'); |
92 | }
|
93 | }
|
94 | }
|
Schmeiss mal das ganze externe Entprellgedöns raus und häng den Taster direkt an den PA0 Pin. Den Taster baust du so ein, dass der den Pin bei Betätigung mit Masse verbindet. Im Programm aktivierst du noch den Pullup am Port A und die Tastenabfragen drehst du um auf == 0
jo, jetzt tüttelt das, ohne absturz, warum auch immer...
Hallöchen.. Beispiel für eine Tastenabfrage mit Entprellung:
1 | void read_keys() |
2 | {
|
3 | // Taste "<<" abfragen (Pin PB2)
|
4 | if(key_left_status ==0 && !(PINB & (1<<PINB2))) |
5 | {key_left_status=1;_delay_ms(50);key_left_funktion();} // Taste wurde gedrückt springe zur Tastenfunktion |
6 | else if(key_left_status ==1 && !(PINB & (1<<PINB2))) |
7 | {key_left_status=2;_delay_ms(50);} // Taste wird gehalten |
8 | else if(key_left_status ==2 && (PINB & (1<<PINB2))) |
9 | {key_left_status=3;_delay_ms(50);} // Taste wird losgelassen |
10 | else if(key_left_status ==3 && (PINB & (1<<PINB2))) |
11 | {key_left_status=0;} // Taste nicht gedrückt |
12 | // Taste ">>" abfragen (Pin PB3)
|
13 | if(key_right_status ==0 && !(PINB & (1<<PINB3))) |
14 | {key_right_status=1;_delay_ms(50);key_right_funktion();} // Taste wurde gedrückt springe zur Tastenfunktion |
15 | else if(key_right_status ==1 && !(PINB & (1<<PINB3))) |
16 | {key_right_status=2;_delay_ms(50);} // Taste wird gehalten |
17 | else if(key_right_status ==2 && (PINB & (1<<PINB3))) |
18 | {key_right_status=3;_delay_ms(50);} // Taste wird losgelassen |
19 | else if(key_right_status ==3 && (PINB & (1<<PINB3))) |
20 | {key_right_status=0;} // Taste nicht gedrückt |
21 | }
|
key_left_status = Tastenstatus (Taste gedrückt nicht gedrückt usw) key_right_status = dito Die Funktion read_keys() wird in einer Schleife im Main-Programm ständig aufgerufen. Gruß Rolf
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.