Mikrocontroller und Digitale Elektronik
›
Thread
pw funktioniert nicht oder falsch geflashed?
L
lucifer
Gast
15.08.2007 17:20
#630614
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?
L
lucifer
Gast
16.08.2007 06:00
#630925
M
Marcus
Gast
16.08.2007 06:38
#630928
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
L
lucifer
Gast
16.08.2007 18:26
#631775
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.
M
Marcus
Gast
17.08.2007 07:13
#632103
Wo steckt denn der Timer, der die PWM generieren soll, in welchem Modus
wird der betrieben?.
Marcus
L
lucifer
Gast
17.08.2007 14:42
#632539
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 }
L
lucifer
Gast
18.08.2007 18:21
#633249
Z
Zeusi
Gast
18.08.2007 18:38
#633261
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren