AVR ATtiny45 PWM timer0 Problem

OP #1519556
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
}
Gast #1519584
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren