www.mikrocontroller.net

Forum: Compiler & IDEs LED ein/ausschalten


Autor: Paulo_rock (Gast)
Datum:

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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Paulo_rock schrieb:
> kann jemand mir schreiben was mir fehlt.


und du kommst nie aus deiner while-Schleife

Autor: Paulo_rock (Gast)
Datum:

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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paulo_rock schrieb:
> aber hat nischts gebracht

natürlich nicht...

schau dir doch mal deinen Code an und versuch zu erklären, was die 
Befehle machen, und nicht, was du dir beim schreiben gedacht hast...dann 
sollte dir auffallen, was nicht stimmt...

Autor: sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,
du musst nich nach main zurück. Das mit der while(1) hat so seine 
richtigkeit. Aber muss der Rücksetzbefehl für dein Bit nicht so aussehen


(bit_is_clear (PINB, PINB2))
{
 tu was
}

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

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

das hier
  while( 1 )
  {
    if ( PINB & (1<<PINB2) )
    {
      PORTA |= (1<<PA0);
    }

    if ( PINB & (1<<PINB2) ) / LED2 aus.
    {
      PORTA &= ~(1<<PA0);
    }
  }

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

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.