Forum: Mikrocontroller und Digitale Elektronik pw funktioniert nicht oder falsch geflashed?


von lucifer (Gast)


Lesenswert?

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)


Lesenswert?

niemand ne idee?

von Marcus (Gast)


Lesenswert?

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)


Lesenswert?

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)


Lesenswert?

Wo steckt denn der Timer, der die PWM generieren soll, in welchem Modus 
wird der betrieben?.

Marcus

von lucifer (Gast)


Lesenswert?

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)


Lesenswert?

:/

von Zeusi (Gast)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.