Atmega32 PWM en las cuatro clavijas de PWM

0

Estoy tratando de controlar el brillo de los LED utilizando PWM en el Atmega32. Tengo un LED conectado a cada uno de los 4 pines PWM (OC0, OC1A, OC1B y OC2). Usando el código a continuación, todos los LED funcionan como se espera, excepto el LED conectado a OC1A que permanece oscuro. ¿Por qué es este el caso? Gracias por su ayuda.

#define  F_CPU 100000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>



void InitPWM()
{

   TCCR0  |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
   TCCR1A |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00); 
   TCCR1B |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
   TCCR2  |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);


}



int main(void)
{

    //Configure the ADC
    ADCSRA |= 1<<ADPS2;         //Enable a prescaler
    ADMUX |= 1<<ADLAR;          //8-bit or 10-bit results
    ADMUX |= 1<<REFS0;
    ADCSRA |= 1<<ADIE;          //Enable interrupts function in ADC
    ADCSRA |= 1<<ADEN;          //Turn on the ADC feature
    sei();                      //Enable global interrupts
    ADCSRA |= 1<<ADSC;          //Start the first conversion

    DDRB = 0xFF;                // initialize port B
    DDRD = 0xFF;                // initialize port D


    InitPWM();                  //initialize PWM mode

    while(1)
    {
        OCR0 = 100;
        OCR1A = 100;
        OCR1B = 100;
        OCR2 = 100;



        _delay_ms(500);        

        OCR0 = 255;
        OCR1A =255;
        OCR1B = 255;
        OCR2 = 255;



        _delay_ms(500);       
    }

}




ISR(ADC_vect) // interrupt routine and display the results
{
char adcResult[4];
itoa(ADCH, adcResult, 10);

ADCSRA |= 1<<ADSC; //Start the next conversion 
}
    
pregunta Daveythewavey19

1 respuesta

1

Si bien puede que no sea su único problema (por ejemplo, su código es muy liviano en la configuración y parece depender mucho de los valores predeterminados, que pueden no ser lo que usted asumió), un problema grave que se destaca es el uso incorrecto de Máscaras de bits específicas de TCCR0 para todos los registros de configuración del temporizador:

TCCR0  |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
TCCR1A |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00); 
TCCR1B |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
TCCR2  |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);

De hecho, no todos son iguales, y los de TCCR1A están entre los más únicos .

Si examina <avr/iom32.h> o, presumiblemente, la hoja de datos, verá, por ejemplo, que los bits WGM disponibles en TCCR1A se llaman WGM11 y WGM10 , no WGM01 y WGM00 que no son presentes en este registro y tienen valores diferentes donde ocurren para TCCR0 que los bits funcionalmente comparables en TCCR1A .

Por lo tanto, como mínimo, debe corregir el bloque de código de configuración entre comillas para utilizar los nombres de patrón de bits adecuados o al menos los valores aplicables a cada uno de los registros que está intentando configurar.

Pero de manera más general, debe verificar todos todos los registros involucrados, tanto de temporizador como de nivel superior, que están involucrados en la realización de este trabajo, y asegurarse de que los valores que establece o confía explícitamente desde el poder -De hecho, los valores predeterminados son los adecuados para su objetivo.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas