[AVR Anfänger] taster an PA0 bringt atmega zum absturz

OP #1659057
Lesenswert?

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
OP #1659207
Lesenswert?

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
}
#1659220
Lesenswert?

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
#1659430
Lesenswert?

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

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