-
sorry, das war ein Schritt in die andere Richtung,
man kann nur Bits setzen, die auch in dem Register vorkommen, bzw. wenn man andere Bezeichnungen verwendet die nicht darin vorkommen, wie zB. CS11 das vom TCCR1B ist, im TCCR1A zu verwenden, kommt was unvorhergesehenes raus.
dies läuft mit 8MHz ganz gut:
Code:
// 8Bit PWM OC1A
TCCR1A = (1 << WGM10) | (1 << COM1A1);
// Teiler CPU-clock / 8
TCCR1B = (1 << CS11);
//und dann Werte nur damit setzen:
OCR1A = 120;
-
wenns dann noch klappen würde.
gruß
patrick
-
Was hast Du eigentlich für'n µC und wieviel MHz ?
Ist auch das richtige Pin, an dem OCR1A rauskommt, auf Ausgang geschaltet ?
Bei mir haut das hin mit Mega8 mit 8MHz.
-
ich habe einen atmega mit 16mhz im moment weil die anderen nicht liefer bar sin aber den rest schaue ich gleich mal nach
-
Hier ist mein Testprogramm für PWM:
Code:
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
#include "pwmRoutines.h"
// modifier for PWM signal width
// modification is based on pin interrupts
volatile uint8_t pwmWidth = 0x40;
void pwmInit( void )
{
// enable PWM outputs
DDRD = (1<<6) | (1<<5);
pwmWidth = 0x10;
// initialise time and pwm modes
pwmInit0();
// pwmInit1();
// pwmInit2();
}
void pwmInit0( void )
{
// 8 bit phase correct PWM
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|(1<<WGM00);
// set prescaler for PWM frequency
TCCR0B = (1<<CS01);
// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
TCNT0 = 0xfe;
// set initial PWM Width
OCR0A = pwmWidth = 0x10;
OCR0B = 0x03;
}
void pwmInit1( void )
{
// 16 bit phase correct PWM
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
// set prescaler for PWM frequency
TCCR1B = (1<<CS11);
// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
TCNT1 = 0x00fe;
// set initial PWM Width
OCR1A = (uint16_t)pwmWidth;
OCR1B = (uint16_t)0x03;
}
void pwmInit2( void )
{
// 8 bit phase correct PWM
TCCR2A = (1<<COM2B1)|(1<<WGM20);
// set prescaler for PWM frequency
TCCR2B = (1<<CS21);
// for fast initialisation (OCRxA/B values are taken on the first TCNTx = TOP)
TCNT2 = 0xfe;
// set initial PWM Width
OCR2B = pwmWidth;
}
void pwmRun( void )
{
while (1)
{
;
}
}
pwmInitx() ist jeweils die Initialisierungsroutine für den TimerX. Verwendet wird ein ATMega168. Der pwmWidth Parameter wird in Interruptroutinen modifiziert. Alternativ geht aber das Setzen in pwmRun().
-
ok danke werde ich morgen mal ausprobieren.
gruß
patrick