Controle PWM con potenciómetro usando atmega328p

Estoy usando un atmega328p y quiero controlar el ciclo de trabajo de PWM con un potenciómetro.

La frecuencia es de 20 ms y el ciclo de trabajo está entre 0 ms y 2 ms. Problema: cuando simule esto en Proteus, el PWM no funcionó, este es mi código:

#ifndef F_CPU
#define F_CPU 16000000UL // 16 MHz clock speed
#endif

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


int main(void)
{
    DDRB |= 1<< PINB1 ;

    TCCR1A |= 1<< COM1A0 | 1<< COM1A1 | 1<<WGM11 ;
    TCCR1B |= 1<< WGM12 | 1<<WGM13 | 1<<CS10 | 1<<CS11 ;
    ICR1 = 4999 ; // 50 Hz

    ADCSRA |= 1<<ADEN | 1<< ADIE | 1<<ADPS2 | 1<<ADPS1 ;  // 64 prescaler
    ADMUX |= REFS0 ;
    sei();
    ADCSRA |= 1<<ADSC ;
    while (1) 
    {
    }
}

ISR(ADC_vect)
{
 uint8_t low = ADCL ;
 uint16_t tenvar = ADCH << 8 | low ;  // value from potentiometer 10 bit

 OCR1A = 4999 - ((499/1024)*tenvar ); // OCR1A is between 4999 and 4500 (4500 represent 2ms )


 ADCSRA |= 1<< ADSC ;
 }
Además del malentendido de las matemáticas de números enteros, intente esto sin interrupciones, simplemente sondeando el ADC y encuentre una manera de indicar la lectura (puerto serie, etc.). Su proyecto suena lo suficientemente como un "probador de servidor" basado en ** duino que probablemente podría aprender mucho al estudiar un proyecto publicado para uno, o incluso probar temporalmente su hardware con dicho enfoque antes de volver a un enfoque AVR completo. Conectó el voltaje de suministro de ADC, ¿verdad? (probablemente, ya que otras cosas básicas también dependen de ello).

Respuestas (2)

((499/1024)*tenvar )

Ups.

(tenvar * 499L / 1024)

A menos que realmente no te importe que el resultado sea siempre 0.

¿Cuál es la L y cuál es la diferencia entre su código y el mío?
La Lconvierte en una constante larga (32 bits, para evitar el desbordamiento) y (499/1024)es 0. Porque los números enteros.
aa ok lo tengo, probé tu solución pero sigo con el mismo problema
En realidad, no he revisado todas las manipulaciones de su registro, solo encontré el problema más visible.
probé el pwm sin adc y funciona bien pero con adc no funcionó

Encontré el problema: olvidé poner

1<<REFS0

en el registro ADMUX

y por simplicidad podría haber usado

OCR1A = 4999 - (ADC * 499L / 1024  ) ;

en lugar de

uint8_t low = ADCL ;
uint16_t tenvar = ADCH << 8 | low ;  

OCR1A = 4999 - (tenvar * 499L / 1024);