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 } }
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.