LED ein/ausschalten

Gast #2112770
Lesenswert?

hallo zusammen,
ich habe diese programm geschrieben mit Interrupt, um ein LED ein/aus 
zuschalten. d.h wenn ich den taster drücke soll eingeschaltet wird und 
wenn ich den Taster nocheinmal drücke soll die LED ausgeschlatet wird.
ich kann es nur einschalten aber auschalten gehts nicht.

kann jemand mir schreiben was mir fehlt.
vielen Danke
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>



ISR(INT0_vect)
{

 PORTA|=(1<<PA0);
 }


int main(void)
{
   // Schalte alle Pins von PortA als Ausgänge


  DDRA = (1<<PA0);
  DDRB &=~(1<<PB2);
  GIMSK = (1<<INT0);
  MCUCR = (1 << ISC01)|(1<<ISC00);
  sei();

   while(1)
   {



   }
   if (bit_is_clear(PINB,2))
  {

  PORTA &=~(1<<PA0);


   }


   return 0;
}
Gast #2112782
Lesenswert?

Justus Skorps schrieb:

Danke für die Antwort
> Paulo_rock schrieb:
>> kann jemand mir schreiben was mir fehlt.
>
> ein richtiges Konzept...
>
> und du kommst nie aus deiner while-Schleife

ich habe in while schleife
if ( PINB & (1<<PINB2) )
{

PORTA |= (1<<PA0);

}


if ( PINB & (1<<PINB2) ) / LED2 aus.

{

PORTA &= ~(1<<PA0);

}
aber hat nischts gebracht
ich muss irgen wie zum main(9 zurück aber ich weisse es nicht wie.
#2118145
Lesenswert?

Vor allen Dingen muss die Erkentnis her, dass der µC viel schneller 
arbeitet, als der Benutzer drücken kann.

das hier
1
  while( 1 )
2
  {
3
    if ( PINB & (1<<PINB2) )
4
    {
5
      PORTA |= (1<<PA0);
6
    }
7

8
    if ( PINB & (1<<PINB2) ) / LED2 aus.
9
    {
10
      PORTA &= ~(1<<PA0);
11
    }
12
  }

wird bei gedrückter Taste viele tausend male abgearbeitet. Und da beide 
if-Bedingungen gleich sind, wird bei jeder Abfrage jeweils der Teil im 
if ausgeführt und der µC schaltet die LED ständig ein/aus, solange die 
Taste gedrückt ist.

Einen Tastendruck nur einmal auszuwerten ist gar nicht so einfach wie 
man auf den ersten Blick glauben könnte. Vor allem auch deshalb, weil 
noch das Entprell-Problem dazu kommt.

Daher: Rat an den TO
Benutze 2 Tasten. Mit der einen schaltest du die LED ein, mit der 
anderen schaltest du sie wieder aus. Das vereinfacht die Programmierung 
zunächst enorm, auch wenn du das Thema Tastenauswertung und Entprellung 
nicht ewig vor dir herschieben kannst. Aber fürs erste geht es auch so.

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