avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] Tiny26 PWM?


From: Kris
Subject: [avr-gcc-list] Tiny26 PWM?
Date: Sat, 4 Oct 2003 20:07:54 -0400

I've tried replicating the PWM demo on an ATtiny26, but my results are
sporadic at best. I've read all the docs I could find on the tiny26, and
while they describe the general procedure you should take, they're
incredibly light on the specifics. Any help would be appreciated. Here's my
code:

/*
 attiny26 specifics:
 output led should be on pb3, pin 4
*/

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

// for the attiny26
#define OC1 PB3 // 1 or OC1B
#define DDROC DDRB // TCCR1A file://COM1B0/1 TIMSK
#define OCR OCR1B

enum { UP, DOWN };

volatile uint16_t pwm;
volatile uint8_t direction;

SIGNAL (SIG_OVERFLOW1){

    switch (direction)
    {
        case UP:
            if (++pwm == 1023)
                direction = DOWN;
            break;

        case DOWN:
            if (--pwm == 0)
                direction = UP;
            break;
    }

    OCR = pwm;
}

void ioinit (void){

 // set PWM value to 0
 OCR = 0;

 // enable OC1 (PB3) as output
    DDROC |= _BV(OC1);

 // Enable and lock PLL
 PLLCSR |= _BV(PLLE);

 // Wait for PLL to lock (app. 100 ms)
 while(!(PLLCSR & _BV(PLOCK))){;}// may need to manually set plock?

 // Set PLL as asynchronous PWM clock source
 PLLCSR |= _BV(PCKE);

 // Set PWM mode: toggle OC1B on compare
 TCCR1A &= ~_BV(COM1B1);// COM1B1 = 0
 TCCR1A |= _BV(COM1B0);// COM1B0 = 1

 // Set PWM Top value: OCR1C = 0xFF
 OCR1C = 0xff;

 // enable PWMB
 TCCR1A |= _BV(PWM1B);

 // Enable Timer/ Set PWM clock prescaler to PCK/2 (32 MHz PWM clock)
 TCCR1B |= _BV(CS12) | _BV(CS10);// CS13=0, CS12=1, CS11=0, CS10=1 => 4 Mhz?
 // TCCR1B |= _BV(CS11);//CS13=0, CS12=0, CS11=1, CS10=0 => 32 Mhz?
 // TCCR1B |= _BV(CS10);//CS13=0, CS12=0, CS11=0, CS10=1 => 64 Mhz?

 // Enable Timer1 OVF interrupt
 // TIMSK |= _BV(TOIE1);
    timer_enable_int (_BV (TOIE1));

    // enable interrupts
    sei ();
}

int main (void){

    ioinit ();

    // loop forever, the interrupts are doing the rest

    for (;;){;}

    return 0;
}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]