von
lucifer (Gast)
15.08.2007 17:20
hi.
also ich habe vorhin das beispiel vom mc-project.de zum thema pwm
compiliert.
1 /***********************************************************
2 Beispiel zur Initialisierung und Verwendung
3 der PWM des Atmega8
4 --> Dimmen von LEDs an den Ports OC1A und OC1B
5 ***********************************************************/
6
7 #include <avr/io.h>
8 #include <pwm_init.c>
9 #include <simple_delayroutinen.c>
10
11 int main ( void ) {
12
13 unsigned char i = 0 ;
14 pwm_init ();
15
16 for (;;) {
17
18 for ( i = 0 ; i < 254 ; i ++ ) {
19 OCR1A = i ;
20 OCR1B = i ;
21 delay_us ( 10000 );
22 }
23 }
24 }
das compilieren an sich verlief nach einiger zeit fehlerfrei.
dann habe ich den chip mit folgendem code und avrdude geflashed:
1 avrdude -p m8 -c sp12 -U flash:w:test.hex
2 pause
aber wenn ich dann die led an oc1b halte, leuchtet diese einfach
dauerhaft.
woran könnte das liegen?
von
lucifer (Gast)
16.08.2007 06:00
von
Marcus (Gast)
16.08.2007 06:38
1. Was hat das mit PC-Programmierung zu tun?
2. Du willst doch dimmen, dann sollte die PWM doch dauerhaft an sein und
lediglich heller oder dunkler werden.
Für mehr Antworten, mehr Input
Marcus
von
lucifer (Gast)
16.08.2007 18:26
1. ich dachte es kommt hier rein, weil ich am pc programmiere und es
compiliere, naja sorry wenns falsch ist.
2. und aus dem quelltext lese ich zumindest, dass er die led von 0 auf
254 dimmt.
also müsste sie ja langsam heller werden, dann wieder dunkel sein und
wieder langsam hell werden.
und das als endlosschleife.
von
Marcus (Gast)
17.08.2007 07:13
Wo steckt denn der Timer, der die PWM generieren soll, in welchem Modus
wird der betrieben?.
Marcus
von
lucifer (Gast)
17.08.2007 14:42
hier ist mal die pwm_init.c:
1 /***********************************************************
2 Funktion zur Initialisierung der PWM des Atmega8
3 ***********************************************************/
4
5 void pwm_init ( void ) {
6
7 DDRB = ( 1 << PB1 ) | ( 1 << PB2 );
8 PORTB = ~ ( 1 << PB1 ) & ~ ( 1 << PB2 );
9
10 //Timer Counter Control Register A
11
12 TCCR1A = ( 1 << WGM10 ) | ( 1 << COM1A1 ) | ( 1 << COM1A0 ) | ( 1 << COM1B1 ) | ( 1 << COM1B0 ); //8bit PWM, phase correct
13 //TCCR1A = (1<<WGM11) | (1<<COM1A1) | (1<<COM1A0) |(1<<COM1B1) | (1<<COM1B0); //9bit PWM, phase correct
14 //TCCR1A = (1<<WGM10) | (1<<WGM11) | (1<<COM1A1) | (1<<COM1A0) |(1<<COM1B1) | (1<<COM1B0); //10bit PWM, phase correct
15
16 /*COM1A1,COM1A0,COM1B1, COM1B0 = setze OC1A und OC1B bei Compare Match beim Hochzählen,
17 lösche sie bei Compare Match beim Runterzählen*/
18
19 //Timer Counter Control Register B
20
21 //TCCR1B = (1<<CS10) | (1<<WGM12); //MCU clock / 0
22 TCCR1B = ( 1 << CS11 ) | ( 1 << WGM12 ); //MCU clock / 8
23 //TCCRB = (1<<CS10) | (1<<CS11) | (1<<WGM12); //MCU clock / 64
24 //TCCRB = (1<<CS12) | (1<<WGM12); //MCU clock / 256
25 //TCCRB = (1<<CS10) | (1<<CS12) | (1<<WGM12); //MCU clock / 1024
26
27 /*WGM12 = Timer/Counter mode of operation: CTC (Clear Timer on Compare Match)
28 8bit (/510): 7,8KHz, 980Hz, 122,5Hz, 30,6Hz, 7,7Hz
29 9bit (/1022): 3,9kHz, 488Hz, 61Hz, 15Hz, 3,8Hz
30 10bit (/2046): 1,95Khz, 244Hz, 30,5Hz, 7,6Hz, 1,9Hz*/
31
32 }
von
lucifer (Gast)
18.08.2007 18:21
von
Zeusi (Gast)
18.08.2007 18:38
Hi, also ich sehe da nicht das du den global interrupt flag setzt,
das würde sozusagen das pwm auslassen,..
Es wird auch empfohlen die änderung in OCRnX im interrupt handler zu
ändern, weil da kann dieser auch net durch ein weiteres interrupt beim
setzen unterbrochen werden,...
1 CTCint:
2 ldi temp,32
3 out OCRnX,temp
4 reti
grüüße
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.