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];
}
}
Geht so, für Verbesserungen siehe Soft-PWM. MFG Falk
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.