Forum: Compiler & IDEs 24 Kanal PWM in c


von Michael F. (jiro)


Lesenswert?

Hi ich versuche mich grade an einem c Programm für PWM mit 24 Kanälen da 
es mein erster Versuch ist wolte ich mal auf diesem Weg fragen ob das 
Grundgerüst so in Ordnung ist oder es irgendwo grobe Schnitzer hat die 
man noch ändern könnte.


#include <avr/io.h>
#include <avr/interrupt.h>

#ifndef F_CPU
#define F_CPU 16000000UL
#endif

#define  RELOAD_H   0xd8
#define  RELOAD_L   0xf4

#define  PWMKanaele 24

volatile unsigned char 
PWMKanal[PWMKanaele]={1,2,3,4,5,6,7,8,16,32,64,127,227,127,127,127,255,2 
55,255,255,255,255,255,255};
volatile unsigned char counter=0;
volatile unsigned char PWMBYTE[(PWMKanaele/8)+1];

ISR (TIMER1_OVF_vect)
{
  unsigned char counterA=0,counterB=0,counterC=0;

  TCNT1H = RELOAD_H;
    TCNT1L = RELOAD_L;
    counter++;

    if (counter==0)
    counter++;

    while(counterA != (PWMKanaele/8)+1)
    {
                   while(counterB !=8)
                   {
                                  PWMBYTE[counterA]<<=1;

                                  if (PWMKanal[counterC]>=counter)
                                  ++PWMBYTE[counterA];

                                  ++counterB;
                                  ++counterC;
                   }
                   counterB=0;
                   ++counterA;
    }
}


void timer1_init (void)
{

  TCCR1A    = 0;
  TCCR1B   |= (1<<CS11);    // prescaler f_cpu/8

  TCNT1H = RELOAD_H;
  TCNT1L = RELOAD_L;

  TIMSK   |= (1<<TOIE1);
}


void main(void)
{

  DDRB=0xff;
  DDRC=0xff;
  DDRD=0xff;

  timer1_init();

  sei();

  while(1!=0)
  {
    PORTB=PWMBYTE[0];
    PORTC=PWMBYTE[1];
    PORTD=PWMBYTE[2];
  }

}

von Falk B. (falk)


Lesenswert?

Geht so, für Verbesserungen siehe Soft-PWM.

MFG
Falk

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.