Forum: Compiler & IDEs LED ein/ausschalten


von Paulo_rock (Gast)


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;
}

von Justus S. (jussa)


Lesenswert?

Paulo_rock schrieb:
> kann jemand mir schreiben was mir fehlt.


und du kommst nie aus deiner while-Schleife

von Paulo_rock (Gast)


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.

von Justus S. (jussa)


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...

von sepp (Gast)


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
}

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.