Forum: Mikrocontroller und Digitale Elektronik AVR ATtiny45 PWM timer0 Problem


von Holger H. (onifred)


Lesenswert?

Hallo MC Gemeinde,
habe ein Problem mit dem Timer0 PWM.
Erst mal zu meinem Wissensstand: Habe vor 14 Jahren MCS48 MCS51 und Z80 
in Assembler programmiert. Bin dieses Jahr wieder ins Hobby 
eingestiegen. Bin gleich zu AVR gewechselt. Startset hier aus dem Shop. 
Habe schon Timer, LCD, UART zum laufen gekriegt. Habe RC5-Dekoder, 
DCF77-Dekoder selbst geschrieben. Alles in Assmbler für mega8. Alles 
kein Problem gewesen.
Bin jetzt schon seit Monaten hier im Forum am lesen. Tolles Forum.

Jetzt bin ich am verzweifeln. Habe auch schon hier im Forum gesucht und 
gegooglt, nichts gefunden.
Möchte RGB LED Würfel mit RC5 Empfänger bauen.
Problem: Eine LED glimmt auch bei PWM Wert 0.

Zur Hardware: ATtiny45 auf Lochraster mit ISP Stecker, 5V 
Spannungregler, RN Datenport, Reset Taster und Taster an INT0.
LEDs aus RGB Würfel ausgeschlachtet und an 5V über Vorwiderstände an 
Ports B0, B1 und B5 angeschlossen.

Zur Software: Sollte mein erstes C Programm werden.

Bisherige Fehlersuche: LEDs vertauscht. Problem nur an PB0 also Timer0
tiny45 PIN aus Fassung gebogen und LED direkt an PIN angeschlossen, 
keine Besserung.
Vorteiler auf 1024. PWM blinken ist erkennbar. LED glimmt in Pausen und 
bei PWM=0 immer noch.
Mit Voltmeter gemessen: Vcc 5,12V An PWM Pin 5,02V
Habe leider kein Oszi.
Verschieden Reihenfolgen beim Init getestet.

Nehme jetzt an das es ein Software Fehler ist.
Vielen Dank im vorraus für die Hilfe.

Grüße Holger H.

Programm:
1
/*  Sample program for tiny Board
2
 *  Timer1/Timer0 PWM
3
 *  Compile with AVRStudio+WinAVR*/ 
4
5
#define  __AVR_ATtiny45__  1
6
7
#define F_CPU  8000000L    /* in Hz */
8
9
#include <avr/io.h>
10
#include <util/delay.h>
11
#include <avr/interrupt.h>
12
#include <avr/pgmspace.h>
13
14
#define  LEDPort  PORTB
15
#define  LEDDDR  DDRB
16
#define  LEDin  PINB
17
#define  LEDP  1
18
19
#define  TastPort  PORTB
20
#define  TastDDR  DDRB
21
#define  Tastin  PINB
22
#define  TastP  2
23
24
//#define  IRPort  PORTB
25
//#define  IRDDR  DDRB
26
//#define  IRin  PINB
27
//#define  IRP 3
28
29
/* Timer0 PWM */
30
void init_timer0()
31
{
32
  TCCR0B  =  (1 << CS02);  //Vorteiler /256 = bei 8MHz ca 120Hz
33
  OCR0A  =  0;    //LED Aus
34
  TCCR0A  =  (1 << COM0A1) | (1 << COM0A0);   //1-0 oder 0-1 Pin auf PWM
35
36
  TCCR0A  |=  (1 << WGM01) | (1 << WGM00);  //PWMA Mode 3 An
37
}
38
/* Timer1 PWM */
39
void init_timer1()
40
{
41
  TCCR1  =  (1 << CS13) | (1 << CS10);  //Vorteiler /256 = bei 8MHz ca 120Hz
42
43
  TCCR1  |=  (1 << COM1A1) | (1 << COM1A0);   //1-0 oder 0-1 Pin auf PWM
44
  OCR1A  =  0;    //LED Aus
45
  TCCR1  |=  (1 << PWM1A);  //PWMA An
46
47
  GTCCR  =  (1 << COM1B1) | (1 << COM1B0);   //1-0 oder 0-1 Pin auf PWM
48
  OCR1B  =  0;    //LED Aus
49
  GTCCR  |=  (1 << PWM1B);  //PWMB An
50
}
51
52
void Init()
53
{
54
  PORTB  =  (1 << TastP); //PullUp an Taster An
55
  PORTB  |= (1 << PB4) | (1 << PB1) | (1 << PB0); //LEDs aus
56
57
  DDRB  =  (1 << PB4) | (1 << PB1) | (1 << PB0); 
58
59
  init_timer0();
60
  init_timer1();
61
62
  //sei();
63
}
64
65
const uint8_t pgmPWMArray[] PROGMEM = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
66
                    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
67
                    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
68
                    0, 1 }; //Wird noch mit log PWM Umrechungsdaten gefüllt
69
70
#define  pause  100
71
#define  PWM_R  OCR0A
72
#define  PWM_G  OCR1A
73
#define  PWM_B  OCR1B
74
75
int main()
76
{
77
78
  uint8_t R,G,B;  
79
80
  Init();
81
  
82
83
  //Startwerte
84
  while (1)
85
  {      
86
    PWM_R = 0;       //Zum beobachten des glimmen
87
    _delay_ms(500);
88
    _delay_ms(500);
89
    _delay_ms(500);
90
    _delay_ms(500);
91
    _delay_ms(500);
92
    _delay_ms(500);
93
94
    for ( R=0; R < 255; R+=5 ) {  //PWM Test funktioniert
95
      PWM_R = R;
96
      _delay_ms(pause);
97
    }
98
    for ( R=255; R > 0; R-=5 ) {
99
      PWM_R = R;
100
      _delay_ms(pause);
101
    }
102
103
  }
104
  return 0;
105
}

von avr (Gast)


Lesenswert?

Deine PWM macht kein dauerhaftes low bei 0, ist bei Fast-PWM
halt so.

hier aus den Datenblatt:
1
The extreme values for the OCR0A Register represents special cases when generating a PWM
2
waveform output in the fast PWM mode. If the OCR0A is set equal to BOTTOM, the output will
3
be a narrow spike for each MAX+1 timer clock cycle. Setting the OCR0A equal to MAX will result
4
in a constantly high or low output (depending on the polarity of the output set by the COM0A1:0
5
bits.)

avr

von Hc Z. (mizch)


Lesenswert?

Aus dem Datenblatt:

"If the OCR0A is set equal to BOTTOM, the output will be a narrow spike 
for each MAX+1 timer clock cycle."

Du kommst also nie ganz auf 0 (es sei denn, Du schaltest den Ausgang 
direkt ab).

von Hc Z. (mizch)


Lesenswert?

Ooch, zu langsam.

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.