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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.