mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED blinkt nicht!


Autor: Lara (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Sven Günther (s705081)
Datum:
Angehängte Dateien:

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

Autor: Lara (Gast)
Datum:

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

Autor: Lara (Gast)
Datum:

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

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.