mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR ATtiny45 PWM timer0 Problem


Autor: Holger H. (onifred)
Datum:

Bewertung
0 lesenswert
nicht 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:
/*  Sample program for tiny Board
 *  Timer1/Timer0 PWM
 *  Compile with AVRStudio+WinAVR*/ 

#define  __AVR_ATtiny45__  1

#define F_CPU  8000000L    /* in Hz */

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#define  LEDPort  PORTB
#define  LEDDDR  DDRB
#define  LEDin  PINB
#define  LEDP  1

#define  TastPort  PORTB
#define  TastDDR  DDRB
#define  Tastin  PINB
#define  TastP  2

//#define  IRPort  PORTB
//#define  IRDDR  DDRB
//#define  IRin  PINB
//#define  IRP 3

/* Timer0 PWM */
void init_timer0()
{
  TCCR0B  =  (1 << CS02);  //Vorteiler /256 = bei 8MHz ca 120Hz
  OCR0A  =  0;    //LED Aus
  TCCR0A  =  (1 << COM0A1) | (1 << COM0A0);   //1-0 oder 0-1 Pin auf PWM

  TCCR0A  |=  (1 << WGM01) | (1 << WGM00);  //PWMA Mode 3 An
}
/* Timer1 PWM */
void init_timer1()
{
  TCCR1  =  (1 << CS13) | (1 << CS10);  //Vorteiler /256 = bei 8MHz ca 120Hz

  TCCR1  |=  (1 << COM1A1) | (1 << COM1A0);   //1-0 oder 0-1 Pin auf PWM
  OCR1A  =  0;    //LED Aus
  TCCR1  |=  (1 << PWM1A);  //PWMA An

  GTCCR  =  (1 << COM1B1) | (1 << COM1B0);   //1-0 oder 0-1 Pin auf PWM
  OCR1B  =  0;    //LED Aus
  GTCCR  |=  (1 << PWM1B);  //PWMB An
}

void Init()
{
  PORTB  =  (1 << TastP); //PullUp an Taster An
  PORTB  |= (1 << PB4) | (1 << PB1) | (1 << PB0); //LEDs aus

  DDRB  =  (1 << PB4) | (1 << PB1) | (1 << PB0); 

  init_timer0();
  init_timer1();

  //sei();
}

const uint8_t pgmPWMArray[] PROGMEM = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
                    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
                    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
                    0, 1 }; //Wird noch mit log PWM Umrechungsdaten gefüllt

#define  pause  100
#define  PWM_R  OCR0A
#define  PWM_G  OCR1A
#define  PWM_B  OCR1B

int main()
{

  uint8_t R,G,B;  

  Init();
  

  //Startwerte
  while (1)
  {      
    PWM_R = 0;       //Zum beobachten des glimmen
    _delay_ms(500);
    _delay_ms(500);
    _delay_ms(500);
    _delay_ms(500);
    _delay_ms(500);
    _delay_ms(500);

    for ( R=0; R < 255; R+=5 ) {  //PWM Test funktioniert
      PWM_R = R;
      _delay_ms(pause);
    }
    for ( R=255; R > 0; R-=5 ) {
      PWM_R = R;
      _delay_ms(pause);
    }

  }
  return 0;
}

Autor: avr (Gast)
Datum:

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

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

avr

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ooch, zu langsam.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.