Forum: Mikrocontroller und Digitale Elektronik [AVR Anfänger] taster an PA0 bringt atmega zum absturz


von Marco G. (marcoglatz)


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

von Manuel B. (j-manuel)


Lesenswert?

Hallo Marco Glatz

Währe hilfreich wenn Du den Code hier reinstellst, besonderst den Teil 
wo die Ports Initialisiert werden.

Gruss

von Marco G. (marcoglatz)


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
}

von Karl H. (kbuchegg)


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

von Marco G. (marcoglatz)


Lesenswert?

jo, jetzt tüttelt das, ohne absturz, warum auch immer...

von Rolf D. (rolfdegen)


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

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.