mikrocontroller.net

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


Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

habe auf einem selbstgebauten experimentierboard mit einem atmega32 
einen taster wie im beispiel 
(http://www.mikrocontroller.net/articles/Entprellun...) 
ü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

Autor: Manuel B. (j-manuel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marco Glatz

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

Gruss

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht 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.

void delay_1ms(u16 i)
{
    do {
        _delay_ms(1);
    } while(--i);
}



int main( void )
{
  u8 relais = 0;
  u8 ssw    = 0;  

  // eingäge definieren
  DDRA = 0b00000000;

  // ausgänge definieren
  DDRC  = 0b11111111;  
  DDRD |= (1 << DDD4) | (1 << DDD7);


    init_uart0( (u16)(XTAL / BAUD / 16 - 0.5) );
    sei();
    delay_1ms(300);

  while(1) {

    PORTC |= (1 << PC2);
    delay_1ms(300);
    PORTC &= ~(1 << PC2);

    switch(ssw) {      

      // init
      case 0:
        uputs0("Init\n\r");

        relais_off();
        led_red_on();
        led_green_off();

        ssw = 1;
        break;

      // warte auf taster
      case 1:
        PORTC |= (1 << PC1);
        delay_1ms(300);
        PORTC &= ~(1 << PC1);

        if ((PINA & (1 << PINA0)) == 1) {
          if(relais == 0) {
            relais = 1;
            ssw    = 2;
          } else {
            relais = 0;
            ssw    = 3;
          }
        }

        while((PINA & (1 << PINA0)) == 1) {
        
        }

        break;

      // relais aus -> relais an
      case 2:
        relais_on();
        led_red_off();
        led_green_on();

        ssw = 1;
        break;

      // relais an -> relais aus
      case 3:
        relais_off();
        led_red_on();
        led_green_off();

        ssw = 1;
        break;
    }

    // rs-232 test
    if(ukbhit0()) {
      uputchar0(ugetchar0());
      uputchar0('\n');
          uputchar0('\r');
    }
  }
}


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco Glatz (marcoglatz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo, jetzt tüttelt das, ohne absturz, warum auch immer...

Autor: Rolf Degen (rolfdegen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen..

Beispiel für eine Tastenabfrage mit Entprellung:
void read_keys()
  {
   // Taste "<<" abfragen (Pin PB2)
    if(key_left_status ==0 && !(PINB & (1<<PINB2)))
    {key_left_status=1;_delay_ms(50);key_left_funktion();}       // Taste wurde gedrückt springe zur Tastenfunktion
    else if(key_left_status ==1 && !(PINB & (1<<PINB2)))
    {key_left_status=2;_delay_ms(50);}                           // Taste wird gehalten
    else if(key_left_status ==2 && (PINB & (1<<PINB2)))
    {key_left_status=3;_delay_ms(50);}                           // Taste wird losgelassen
    else if(key_left_status ==3 && (PINB & (1<<PINB2)))
    {key_left_status=0;}                                         // Taste nicht gedrückt
    // Taste ">>" abfragen (Pin PB3)
     if(key_right_status ==0 && !(PINB & (1<<PINB3)))
    {key_right_status=1;_delay_ms(50);key_right_funktion();}     // Taste wurde gedrückt springe zur Tastenfunktion
    else if(key_right_status ==1 && !(PINB & (1<<PINB3)))
    {key_right_status=2;_delay_ms(50);}                          // Taste wird gehalten
    else if(key_right_status ==2 && (PINB & (1<<PINB3)))
    {key_right_status=3;_delay_ms(50);}                          // Taste wird losgelassen
    else if(key_right_status ==3 && (PINB & (1<<PINB3)))
    {key_right_status=0;}                                        // Taste nicht gedrückt
  }

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.