Forum: Mikrocontroller und Digitale Elektronik LED blinkt nicht!


von Lara (Gast)


Lesenswert?

Hallo und Guten Morgen!
Ich versuche mich an meiner ersten PWM, einfach mal um eine LED ein-und
auszuschalten. Dazu verwende ich eine STK500 und flashe einen AT90S8515.
Irgendwas ist falsch, da die LED nicht blinkt. Vielleicht kann ja jemand
mal den (primitiven) Quellcode ueberfliegen und mir sagen warum's nicht
geht. Bei dem Vergleichswert bin ich mir ueberhaupt nicht sicher, und
weiss nicht, ob das ueberhautp so richtig ist.
Vielen herzlichen Dank
Lara


#include<avr/io.h>

void init(void)
{
DDRB=(1<<PB5)|(1<<PB0);                //Port B.5 als Ausgang
PORTB=(1<<PB5)|!(1<<PB0);              //LED 5 aus, LED 0 an
}

void pwm(void)
{
TCCR1A=(1<<PWM11)|(1<<PWM10)|(1<<COM1A1);  //Timer1 als
nichtinvertierende 10Bit-PWM aktiviert
                      //Obergrenze (10Bit-Auflösung: 4 MHz/2046 = 1,96 
kHz)
TCCR1B=(1<<CS12)|(1<<CS10);          //Vorteiler f/1024 (4 MHz/1024 = 
3,9
kHz)
}

int main(void)
{
  init();
  pwm();
  for (;;)
  {
  OCR1A=0x0200;                  //Vergleichswert: 512
  }
}

von johnny.m (Gast)


Lesenswert?

Hallo

Um ne LED zum Blinken zu kriegen brauchste eigentlich keine PWM. Wenn
ich das richtig geschnallt hab, dann sollen die BEIDEN LEDs im Wechsel
blinken. Aber du schaltest die LEDs ja auch gar net um. Hast ne
Endlosschleife, in der immer wieder das OCR1A mit immer dem selben Wert
geschrieben wird. Da denkt der Timer auch irgendwann 'Die ist heute
aber nervig' :-) Um die LEDs an PORTB umzuschalten musste das
Compare-Flag (oder, ohne PWM, das Overflow-Flag) abfragen (entweder
direkt [Polling] oder Interrupt).

Das PORTB=(1<<PB5)|!(1<<PB0) macht so nicht viel Sinn.
1. Bitkomplement-Operator ist ~ und nicht !
2. Musst zum Setzen und Löschen der Bits zwei Ops durchführen.
Vorschlag:
//Bit 0 löschen
PORTB &= ~(1 << PB0);
//Bit 5 setzen
PORTB |= 1 << PB5;

wenn mehrere Bits gesetzt oder gelöscht werden müssen, dann kann man
die natürlich kombinieren.

Des weiteren empfehle ich DRINGENDST das Tutorial. Da steht eigentlich
alles Wissenswerte drin. Auch zu PWM usw. PWM mach eigentlich nur dann
wirklich Sinn, wenn man nen Wert kontinuierlich verstellen will. Z.B.
kannste damit ne Helligkeitssteuerung für Deine LED bauen. Dann
solltest Du sie aber an PORTD.5 anschließen, das ist nämlich der
Compare-Ausgang von dem Timer. Kannst Dir dann die Abfrage von
irgendwelchen Flags sparen.

Ansonsten: Tutorial und weitere Quellen auf dieser und auf anderen
Seiten zur Kenntnis nehmen und dann...Viel Erfolg beim Basteln und
Programmieren

Gruß

Johnny

von Sven G. (s705081)


Angehängte Dateien:

Lesenswert?

Hallo Lara,

hier ist ein stück Code der läuft. Must du aber noch etwas an deine CPU
anpassen. Dein Fehler ist vermutlich der Fehlende Interrupt Vector, der
durch den PWM code aufgerufen werden soll.

Wenn es Probleme mir dem Compilieren gibt einfach noch mal melden.

Gruss Sven

von Lara (Gast)


Lesenswert?

Hallo Jonny!
Eigentlich soll nur eine LED blinken, und da ich spaeter die Helligkeit
regeln moechte, soll dies ueber eine PWM geschehen (daher die Definition
der nichtinvertierenden 10Bit-PWM). LED0 wollte ich einfach nur
anschalten, sie soll einfach nur leuchten ohne irgendwas.
Der Fehler war, dass die LED an PORTB hing und nicht an D... jetzt geht
es, juhe! Genau der Code, nur ein bissl die Ports geaendert:
DDRD=(1<<PB5)|(1<<PD0);                //PORT D.5 als Ausgang (PWM 
Compare
output)
PORTD=(1<<PB5)|~(1<<PB0);              //LED 5 aus, LED 0 an
Das war wohl Schusseligkeit mit dem Verwechseln von B und D. Vielen
Dank fuer den Hinweis und einen guten Start in die Woche!
Gruss
Lara

von Lara (Gast)


Lesenswert?

Hallo Sven!
Herzlichen Dank fuer den Code, ich werde es ausprobieren. Allerdings
laeuft jetzt ja das Prograemmchen (auch ohne Interrupt Vektor??) der
Ausgang war falsch definiert.
Viele Gruesse und nochmals Danke fuer die Antwort
Lara

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.