Trotzdem ich alles richtig gemacht habe, funktioniert der Code nicht!
Es ist keine Veränderung der Helligkeit zu erkennen! Die LED an PD4
leuchtet mit 50% Helligkeit, Die Helligkeit der LED's an PD5 und PD6
ändert sich nicht!
Weiß jemand Rat?
Danke
1
/*
2
* InterruptProbeII.c
3
*
4
* Created: 10.01.2015 17:46:26
5
* Author: ArduStemmi
6
*/
7
#define F_CPU 16000000UL
8
9
#include<avr/io.h>
10
#include<avr/interrupt.h>
11
#include<stdlib.h>
12
#include<stdio.h>
13
14
15
volatileuint8_tPWM_Rot=32;
16
volatileuint8_tPWM_Gruen=221;
17
volatileuint8_tPWM_Blau=127;
18
volatileuint8_tPWM_Weiss=127;
19
20
volatileuint16_tZaehler=0;
21
22
23
voidtimer0_init()
24
{
25
// Fast PWM Mode 3, setzt OC0A (PD6, Gruen) und OC0B (PD5, Rot) bei Erreichen von OCR0A bzw. OCR0B auf Null
26
// und bei Overflow jeweils auf 1! Prescaler auf 1024 -> f = 15.625 Hz für jeden Zählakt, f/256 = 61,.. Hz PWM Frequenz ,
ArduStemmi schrieb:> Trotzdem ich alles richtig gemacht habe, funktioniert der Code nicht!
Du glaubst, du hättest alles richtig gemacht. Das ist was anderes.
Timer2 ist nicht konfiguriert und es fehlen 2 ISRs.
mfg.
Wozu brauche ich den bei dem gezeigten Programmschnipsel Timer2? Und
Welche ISR fehlen?
Zur Erklärung: Du siehst eine stark abgespeckte Variante, in der habe
ich jetzt die OCR2A und OCR2B nicht rausgenommen, hat aber glaube ich
mit meinem Problem nichts zu tun!
Im Simulator werden die Werte für OCR0A und OCR0B nicht in die Register
übernommen! TCNT0 zählt auch im Simulator nicht!
Gibt es ein Kurzzeichen für Verzweiflung?
sage ich dem µC: Nimm PWM Mode 3 (WGM 00, WGM01) und setzte OC0A und
OC0B auf Null, bei Erreichen von OCR0A bzw. OCR0B. Meines Erachtens sind
eben keine weiteren ISR's erforderlich um die Pins wieder auf eins zu
setzen! Deshalb ja Hardware PWM!!!
Das kuriose ist, der erstmals eingestellte Wert wird ja übernommen! Nur
die Änderung eben nicht!
Nach meinem Dafürhalten zählt der Timer 0 mit 16 MHz / 1024 = 15,625
KHz. Das heißt, die PWM Frequenz beträgt 15.625 / 256 = 61,.. Hz.
Das bedeudet: Dass sich PWM_Rot und PWM_Gruen in jeder Sekunde um 61
Wertw ändert. Das sollte man doch erkennen? Oder
ArduStemmi schrieb:> Meines Erachtens sind> eben keine weiteren ISR's erforderlich um die Pins wieder auf eins zu> setzen!
Richtig.
Aber hier werden die 2 Interrupts eingeschaltet, die keine ISR haben:
ArduStemmi schrieb:> TIMSK0 = (1 << OCIE0A)|(1 << OCIE0B)|(1 << TOIE0);
Damit macht der Controller beim Match von OCR0B einen Reset, genau
genommen einen Jump auf 0 und fängt wieder von vorne an.
Aber zeig erstmal dein ganzes Programm. Insbesondere den Teil, in dem
der Fehler garantiert nicht liegt.
mfg.
ArduStemmi schrieb:> Das bedeudet: Dass sich PWM_Rot und PWM_Gruen in jeder Sekunde um 61> Wertw ändert. Das sollte man doch erkennen? Oder
und wie oft werden rot und grün in der Hauptschleife auf Ausgangswert
gesetzt?
Thomas Eckmann schrieb:> ArduStemmi schrieb:>> TIMSK0 = (1 << OCIE0A)|(1 << OCIE0B)|(1 << TOIE0);>> Damit macht der Controller beim Match von OCR0B einen Reset, genau> genommen einen Jump auf 0 und fängt wieder von vorne an.
Du hast recht!
Man darf die beiden Bits OCIE0A und OCIE0B nicht setzen! Die soll man
ausschließlich im CTC Mode verwenden!
Danke!
PS: Und dann doch nicht alles richtig gemacht!
ArduStemmi schrieb:> Man darf die beiden Bits OCIE0A und OCIE0B nicht setzen! Die soll man> ausschließlich im CTC Mode verwenden!
Die Interrupts kann man durchaus auch in den anderen Modi verwenden.
Nur, für jeden freigegebenen Interrupt MUSS eine ISR vorhanden sein.
mfg.
ArduStemmi schrieb:> Trotzdem ich alles richtig gemacht habe, funktioniert der Code nicht!
Wie kommst Du auf diese Absurde Idee? Ich behaupte mal Du hast alles
falsch gemacht was man nur falsch machen kann.
Mich wundern gerade zwei Dinge:
1) Ist 61Hz für eine PWM nicht etwas arg wenig? Ich sehe immer zu, dass
ich da so 4-8 KHz habe, je nachdem, was ich mit dem Timer sonst noch so
tun will.
2) Vermutlich ist es nur ein Cut&Paste-Überbleibsel aus einem Test, aber
die PWM-Werte werden sowohl in der ISR als auch in der Hauptschleife
hochgezählt, das wirkt nicht so, als wäre es wirklich so gewollt.
Gregor Ottmann schrieb:> Mich wundern gerade zwei Dinge:>> 1) Ist 61Hz für eine PWM nicht etwas arg wenig?
Das kommt immer auf den Zweck der PWM an.
Hier geht es ja offensichtlich um die Helligkeitssteuerung von LEDs.
Solange die nur für kleinflächige Signalzwecke verwendet werden, sind
60Hz mehr als ausreichend. Bei vielen Consumer-Geräten werden sogar weit
geringere Mux/PWM-Frequenzen für die Displays verwendet.
Wenn allerdings "Beleuchtung" im Vordergrund steht, sind 60Hz
tatsächlich etwas knapp, denn Großflächenflimmern nimmt das Auge/Gehirn
dank der evolutionär erworbenen höheren zeitlichen Auflösung in den
Randbereichen des Sichtfeldes doch noch recht gut wahr.
Für Beleuchtung und auch großflächige Signalisierung sind deshalb 200Hz
anzustreben. Das stellt ungefähr die Grenze dar, an der auch die
Framerate-Esotheriker in objektiven Doppelblindtests passen müssen.
Alles, was wesentlich (also etwa eine Größenordnung) darüber hinausgeht,
ist also komplett nutzloser Schwachsinn. 400Hz sind also durchaus noch
OK, 2kHz allerdings schon komplett sinnfrei.
Thomas Holmes schrieb:> ArduStemmi schrieb:>> Trotzdem ich alles richtig gemacht habe, funktioniert der Code nicht!>> Wie kommst Du auf diese Absurde Idee? Ich behaupte mal Du hast alles> falsch gemacht was man nur falsch machen kann.
Werd mal bitte konkreter?
Zur PWM Frequenz: Richtig die wird später erhöht!
Zur doppelten Erhöhung der PWM Werte: Richtig, ist schon geändert, war
nur ein Versuch, soll so nicht sein, die PWM Werte werden nur im
ISR(Timer0_OVF) gesetzt!
Gelernt habe ich:
a) Jeder gesetzte Interrupt braucht eine ISR!
b) Für PWM Mode drei brauche ich die OCR Interrupts nicht setzen!
Hardware PWM eben!
Fazit: Bisher bin ich mit dem thread zufrieden, mir wurde geholfen!
Wäre da nicht die oben zitierte Generalaussage!
ArduStemmi schrieb:> Werd mal bitte konkreter?>Wäre da nicht die oben zitierte Generalaussage!
Also mal konkret, aus Zeitgründen ohne Anspruch auf Volständigkeit.
Es fängt damit an, das Du (1) weder den Controller beim Namen nennst,
(2) noch die potentiellen Antwortenden darüber aufklärst was Du
eigentlich implementieren willst. Hard.- oder Soft PWM. Beide Angaben
sind essentiell. Dein Code selbst macht bei keiner Implementierungsart
einen Sinn.
Die Art wie Du programmiert hast lässt darauf schließen, das Du weder
ein vernünftiges Buch gelesen hast über die Programmierung von µC, noch
einen verstehenden ausführlichen Blick ins Datenblatt des Controllers
den Du nutzt geworfen hast. Beides ist nicht schlimm, das tun viele am
Anfang nicht, weil Ausprobieren eben mehr Spass macht. Aber nicht jeder
hat Lust und Zeit für jeden Fragesteller ein privates Einführungsbuch zu
schreiben und alles bei den Grundlagen angefangen zu erklären.
Diese These des nicht belesen seins unterstützt dein Resümee dessen was
Du in diesen Thread alles gelernt hast.
By the way, alles richtig gemacht zu haben und es funktioniert trotzdem
nicht, ist etwas was sich logisch ausschließt.