www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik frage zu programm


Autor: Stk 500 anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo leute, als noch recht unerfahrener STK500 anfänger bin ich gerade 
dabei mir die basics wie tasterentprellung, delays, led- lauflicht.... 
beizubringen.
dazu will ich nun ein programm schreiben, welches bei drücken von 
taster0 ein led- lauflicht von Led0- Led2 durchführt. das lauflicht soll 
so lange laufen, bis ich taster1 drücke. dann soll es abgebrochen werden 
und alle Leds erlöschen.

hier mein programm (die tasterentprellung hab ich aus dem AVR tutorial):

#include <avr/io.h>
#include <util/delay.h>  


uint8_t Taster0;
uint8_t Taster1;

void long_delay(uint16_t ms)
{
  for(;ms>0; ms--)
  {
  _delay_ms(1);
  }
}



inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
    if ( ! (*port & (1 << pin)) )
    {
        /* Pin wurde auf Masse gezogen, 100ms warten   */
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
        _delay_ms(50); 
        if ( *port & (1 << pin) )
        {
            /* Anwender Zeit zum Loslassen des Tasters geben */
            _delay_ms(50);
            _delay_ms(50); 
            return 1;
        }
    }
    return 0;
}


      


  
int main(void)
{
  DDRB = 0b00001111; //PB0 bis PB4 als Ausgang
  DDRD = 0b11110000; // PD0 bis PD3 als Eingang
  
  PORTB = 0xFF;   // Alle Ausgänge auf high => alle LEDs aus    

  while (1)
  {

 if (debounce(&PIND, PD0))             // Falls Taster0 gedrückt
     {  
    Taster0 = 1;
    Taster1 = 0;
   }






if(Taster0 ==1 && Taster1 ==0)      //Lauflicht
  {
  PORTB = 0b11111110;    // LED0 an
     long_delay(300);      
    PORTB= 0b11111101;      // LED1 an
    long_delay(300);      
    PORTB= 0b11111011;      // LED2 an
    long_delay(300);  
  }

  
    if (debounce(&PIND, PD1))        // Falls Taster1 gedrückt
    {
    Taster0 = 0;
    Taster1 = 1;

    }
  
    if(Taster1 == 1 && Taster0== 0)
    {  
    PORTB = 0xFF;           //Alle Ausgänge auf high => Lauflicht aus

    }


  }
  return 0;
}


das lauflicht funtioniert aber ich habe noch probleme mit dem abbrechen 
beim drücken von taster2. denn wenn ich taster2 drücke läuft das 
lauflicht einfacht weiter.

kann mir jemand sagen wo mein programmierfehler liegt.

mfg

Autor: Stk 500 anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.........

Autor: Spezi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das STK500 richtig in Erinnerung habe, sind die Tasten 
masse-schaltend. Also AVR-Eingang High (1), wenn nicht gedrückt, und Low 
(0), wenn gedrückt.
In deinem Programm ist es anders herum.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nö, siehe debounce-makro.

Autor: Schmatze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehe ich richtig, dass du im Programm abfragst ob der Taster gerade 
gedrückt ist?

Falls ja: Dann musst du den Taster genau in dem Moment gedrückt haben, 
wenn dass Programm gerade den Taster abfragt. Dies kann man machen, wenn 
das Programm recht kurz ist und sich dauernd wiederholt, aber du hast da 
Pausen von mehreren hundert Millisekunden drinnen. Drückst du da den 
Taster, merkt das Programm das garnicht.

Interrupts sind da wohl das Schlagwort.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schmatze schrieb:
> Interrupts sind da wohl das Schlagwort.

völlig daneben!
Glaub das bitte nicht und vergiss es gaaaanz ganz schnell wieder.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wüßte nicht, wie man ohne den Timer-Interrupt den Taster sinnvoll 
schneller abfragen könnte.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies den Text von Schmatze nochmal... er meint die externen oder 
Pin-Change Interrupts.

Autor: Schmatze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin immer wieder erstaunt, wie man Sätze interpretieren kann.

Autor: Schmatze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich allerdings auch.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Gegensatz zu Michael hab ich da nichts hineininterpretiert, sondern 
es einfach so gelesen, wie es da steht. Was eigentlich gemeint war, ist 
aber auch ziemlich egal.
Es gilt jedenfalls: Der externe Interrupt-Eingang ist zum Einlesen der 
Taster keine gute Idee. Aber man kann per Timer-Interrupt den Taster 
"schnell genug" aufragen, unabhängig davon, wie schnell die 
Hauptschleife läuft.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Im Gegensatz zu Michael hab ich da nichts hineininterpretiert, sondern
So? Du hast "Interrupts" als Timer-Interrupt interpretiert, ich als 
externe Interrupts.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na wenn du meinst...
Ich hab keine Lust, darüber weiter zu diskutieren.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>kann mir jemand sagen wo mein programmierfehler liegt.

Du hast nicht programmiert, was passieren soll wenn, der zweite Taster 
gedrückt wird!

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.