www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Attiny trotz verschiedener Vergleichswerte Frequenz konstant


Autor: Ralf G. (sense)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche mir mit einem ATtiny2313 mir einen PWM-Controller zu 
basteln, der via uart steuerbar ist.
Der Befehl zum Steuern soll so aussehen:
1.Byte 0xFF
2.Byte 0xEE
3-6. Byte jeweils das Byte für OCR0A, OCR0B, OCR1A und OCR1B

Allerdings hab ich jetzt, dass Problem das alle 4 LEDS, die an OC0A - 
OC1B hängen, konstant gleich leuchten. Auf den jeweiligen Pins messe ich 
mit meinem Multimeter eine Frequenz von ca. 225Hz. Ich initialisiere 
aber im Controller die Timer und setze jeweils einen anderen 
Vergleichswert, somit dürfte nicht bei allen 4 die gleiche Frequenz 
messen. Daher die Frage wo liegt mein Fehler ?
Hier mein Quelltext. Die UART-Lib ist von Peter Fleury. Quarzfrequenz 
ist 3,6864 Mhz.
#include<avr/io.h>
#include<avr/interrupt.h>
#include"uart.h"
#ifndef F_CPU
#define F_CPU 3686400UL
#endif

#define UART_BAUD_RATE      38400
#define RX_BUFFER_SIZE  4
volatile uint8_t rx_buffer[RX_BUFFER_SIZE];
void init_pwm (void)
{  
  
  // Timer 0 PWM Init

  TCCR0A = (1 << WGM00)
       | (1 << WGM01)
     | (1 << COM0A1)
     | (1 << COM0B1);
  TCCR0B = (1 << CS00)
     | (1 << CS01);


  // OC0A PWM Port

  DDRB   |= (1 << PB2);

  OCR0A = 16;


  // OC0B PWM Port
  
  DDRD   |= (1 << PD5);

  OCR0B = 32;
  

  // Timer 1 PWM Init

  TCCR1A = (1 << WGM10)
     | (1 << COM1A1)
     | (1 << COM1B1);
  TCCR1B = (1 << WGM12)
     | (1 << CS10)
     | (1 << CS11);


  // OC1A PWM Port

  DDRB   |= (1 << PB3);
       
  OCR1A = 64;


  // OC1B PWM Port

  DDRB   |= (1 << PB4);
       
  OCR1B = 128;

}
int main(void)
{
  init_pwm();
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
  sei();
  while(1)
  {
    while(uart_getc()!=0xFF)
    {uart_putc('w');}
    if(uart_getc() == 0xEE)
    {
      for(uint8_t get= 0; get < RX_BUFFER_SIZE;get++)
      {
        rx_buffer[get] = uart_getc();
      }
      OCR0A = rx_buffer[0];
      OCR0B = rx_buffer[1];
      OCR1A = rx_buffer[2];
      OCR1B = rx_buffer[3];
      uart_puts("read\n");
    }

  }
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>        rx_buffer[get] = uart_getc();

uart_getc() wartet nicht bis etwas empfangen wurde.
Deshalb bekommst du für alle LEDs den gleichen Wert.

Autor: Ralf G. (sense)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, das wäre eine Erklärung warum das mit den Befehlen nicht 
funktioniert. Ich hatte allerdings schon mal alles in der while(1){} 
auskommentiert und hatte wieder überall die selbe Frequenz. Mir leuchtet 
nur nicht ein warum.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Außerdem wird bei PWM nicht die Frequenz, sondern das Tastverhältnis 
verändert.

MfG Spess

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> hatte wieder überall die selbe Frequenz

Dir ist aber schon klar, dass bei PWM sich die Frequenz nicht ändert?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und hatte wieder überall die selbe Frequenz. Mir leuchtet
>nur nicht ein warum.

Weil PWM nicht die Frequenz verstellt, sondern das Tastverhältnis.

Autor: Ralf G. (sense)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, dann war das ein Denkfehler meinerseits sorry. Letztendlich 
leuchten die 4 LEDS aber konstant, die müssten aber ja nach init_pwm() 
verschieden hell leuchten oder steh ich jetzt völlig am Schlauch ?

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Nächstes würde ich prüfen, ob die CPU überhaupt an der Stelle 
vorbeikommt, an der die OCRs gesetzt werden (LED toggeln o.ä.).

Ich würde darauf tippen, dass sie nie dort vorbeikommt.  Denn (wenn 
uart_getc()) sofort zurückkehrt, auch wenn kein Zeichen verfügbar ist) 
zwischen den einzelnen Zeichen wird immer eine Pause sein müssen, so 
dass nie 2 gültige Zeichen in zwei direkt aufeinanderfolgenden Aufrufen 
von uart_getc() gemeldet werden können.

Also scheitert's schon an der Präambel: nach FF kommt „kein Zeichen“ und 
nicht EE (und zwar mindestens 1/4 ms lang bei 38.4 kBd)-- und schon geht 
es von vorne mit Warten auf FF los.

P.S. Ich halte FF für eine schlechtes Einleitungszeichen - ein einziger 
Störimpuls, der gerade lang genug ist, dass er als gültiges Startbit 
erkannt wird, erzeugt genau das.

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.