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
voidinit_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
voidinit_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
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).