Forum: Mikrocontroller und Digitale Elektronik LED blinken über timer (Atmega8)


von Andreas (Gast)


Lesenswert?

hallo zusammen,

folgendes Problem...ich möchte über einen timer des Atmega8 eine LED 
blinken lassen...die Einrichtung des timers ist kein Problem...mir geht 
es um den Programmausschnitt welcher die LED blinken lässt (mit einer 
globalen Variablen) damit das Programm nebenbei weiterlaufen 
kann...danke schonmal im voraus

von Bülent C. (mirki)


Lesenswert?

ISR(TIMER1_COMPA_vect)
{
   PORTB ^= (1 << 0);
}

von Andreas (Gast)


Lesenswert?

danke aber damit blinkt doch noch keine LED... ich hätte da eher an eine 
globale variable in der timer routine gedacht und diese im Hauptprogramm 
über:

if ( x <= 2 )  { LED an; }

if ( x >= 2 )  { LED aus; }

if ( x == 4 )  { x=0; }


geht das auch??

von Ingo (Gast)


Lesenswert?

Andreas schrieb:
> if ( x <= 2 )  { LED an; }
>
> if ( x >= 2 )  { LED aus; }
x sollte nur einmal mit <= oder >= abgefragt werden, denn bei x = 2 ist 
es für beide Abfragen gültig.

von Karl H. (kbuchegg)


Lesenswert?

Andreas schrieb:
> danke aber damit blinkt doch noch keine LED...


natürlich blinkt sie. Mag sein, dass sie zu schnell blinkt. Aber sie 
blinkt.

Du möchtest dich erst mal schlau machen, was eigentlich genau die ^ 
Operation ist, und wie sich die auf Biteben auswirkt.

> geht das auch??

Natürlich geht das auch. Aber warum umständlich?

: Bearbeitet durch User
von Andreas (Gast)


Lesenswert?

dann so?

if ( x <= 2 )  { LED an; }

if ( x >= 3 )  { LED aus; }

if ( x == 4 )  { x=0; }

von Andreas (Gast)


Lesenswert?

Karl Heinz schrieb:
> Andreas schrieb:
>> danke aber damit blinkt doch noch keine LED...
>
> natürlich blinkt sie. Mag sein, dass sie zu schnell blinkt. Aber sie
> blinkt.
>
> Du möchtest dich erst mal schlau machen, was eigentlich genau die ^
> Operation ist, und wie sich die auf Biteben auswirkt.


ah ok...und wie heißt diese Operation??

von Alex (Gast)


Lesenswert?

Andreas schrieb:
> ah ok...und wie heißt diese Operation??

Bitweises Exklusiv-Oder, oder kurz XOR.

von Karl H. (kbuchegg)


Lesenswert?


von Andreas (Gast)


Lesenswert?

Karl Heinz schrieb:
> Andreas schrieb:
>> danke aber damit blinkt doch noch keine LED...
>
> natürlich blinkt sie. Mag sein, dass sie zu schnell blinkt. Aber sie
> blinkt.


bekommt man auch damit verschiedene Blinkfrequenzen hin??

von Fassungslos (Gast)


Lesenswert?

Andreas schrieb:
> bekommt man auch damit verschiedene Blinkfrequenzen hin??

Hast du dir schon IRGENDWELCHE Grundlagen angeeignet?

von Andreas (Gast)


Lesenswert?

Grundlagen sind da...

von Fassungslos (Gast)


Lesenswert?

Andreas schrieb:
> Grundlagen sind da...

Dann ist die Antwort: ja. Du musst es nur programmieren.

von Ingo (Gast)


Lesenswert?

Andreas schrieb:
> bekommt man auch damit verschiedene Blinkfrequenzen hin??
Das eine ist das Bit manipulieren und das andere ist das Aufrufintervall 
fürs Bitmanipulieren.

wenn du schon umständlich machst, dann auch richtig.
1
ISR (1KHz)
2
{
3
 static unt16_t count = 0;
4
 count++;
5
6
 if (count == 500){
7
   count = 0;
8
   PORTx ^= (1<<Pxy);
9
 }
10
11
...
12
}

macht in diesem Fall 2x500ms Periodedauer => T=1s => f= 1Hz, Duty 50%.

von Andreas (Gast)


Lesenswert?

ok danke...das ist hilfreich

von Bülent C. (mirki)


Lesenswert?

Andreas schrieb:
> danke aber damit blinkt doch noch keine LED...

Die Blinkt...Wetten?! Letztendlich ändert es nur den aktuellen Zustand 
des Bit's.
Du hattest nur nach dem Code snippet gefragt, welche die LED blinken 
lässt.
Et voila...

Ich gehe mal davon aus, das Du Deinen Timer richtig eingestellt hast. 
Dann müsste es klappen.

von hp-freund (Gast)


Lesenswert?

Andreas schrieb:
> bekommt man auch damit verschiedene Blinkfrequenzen hin??

Grundlagen...
Na ja, lass es dir erklären:

https://www.youtube.com/watch?v=Zr0842FEC5Q

von Andreas (Gast)


Lesenswert?

noch ne Frage zur ISR...ich hab mal gelesen das in die ISR höchstens 
Variablen rein sollen zumm hochzählen z.B. ...wenn das stimmt sollte man 
dann diese if Bedingung nicht lieber ins Hauptprogramm legen??

von Bülent C. (mirki)


Lesenswert?

Andreas schrieb:
> noch ne Frage zur ISR...ich hab mal gelesen das in die ISR
> höchstens
> Variablen rein sollen zumm hochzählen z.B. ...wenn das stimmt sollte man
> dann diese if Bedingung nicht lieber ins Hauptprogramm legen??

Das brauchst Du doch nicht, wenn Du nur eine LED blinken lassen 
möchtest. Wofpr eine Variable inkremmentieren??.. Ach, ja es geht auch 
ganz ohne Code...Nimm einen NE555, damit kannst Du auch eine LED blinken 
lassen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Andreas schrieb:
> noch ne Frage zur ISR...ich hab mal gelesen das in die ISR höchstens
> Variablen rein sollen zumm hochzählen z.B. ...wenn das stimmt sollte man
> dann diese if Bedingung nicht lieber ins Hauptprogramm legen??

So wie alle Dogmen, ist auch dieses so nicht haltbar.

Du machst in einer ISR das, was es zu tun gibt. Das kann durchaus auch 
mehr sein, als nur eine Flagvariable auf einen Wert zu setzen.

Es macht wenig Sinn einen komplizierten Mechanismus aufzusetzen, wenn 
dadurch andere Funktionalität den Bach runter geht. Eine Portbit 
umzuseten dauert auch nicht länger als eine Variable auf 1 zu setzen. 
Also kannst du auch gleich das Portbit umsetzen, anstelle dir die Finger 
mit 78 Flags und 12 Zusatzvariablen abzubrechen.

Was du in einer ISR nicht machen solltest, das sind Aktionen die lange 
dauern! Insbesonders wenn diese Aktionen dann auch noch ein 'Warten auf 
...' beinhalten, kann das ein No-No sein. Aber nichts von dem ist hier 
der Fall.

: Bearbeitet durch User
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.