Hola amigos.
tengo este código en bascom avr, en la simulación proteus corre de maravilla, pero
al montarlo en el protoboard, la señal pwm solo alcanza el 40% en estado alto, y se desfasa al llegar al mínimo, provocando parpadeo en la lampara.
Se trata de un dimer ac, con un ATMEGA328P.
subo código y simulación.
$regfile = "m328Pdef.dat" 'ATmega8
$crystal = 8000000 'Frecuencia de cristal=8 MHz
$hwstack = 32 'Hardware Stack
$swstack = 10 'Software Stack
Config Portb = Output 'Puerto B como salida
Config Portc = Input 'Puerto C como entrada
Config Portd.2 = Input
'Definicion de variables
'Dato medido en ADC1=Sensor
Dim Rampa As Single 'Señal escalón
Dim D As Word 'Variable para lectura de potenciómetro
Dim T As Single
'Configuracion ADC
Config Adc = Single , Prescaler = Auto
Admux = $40 '$40
'Configuracion de unterrupciones
Config Int0 = Low Level
Enable Int0 'INT1, flanco de bajada
On Int0 Int_zc
Config Timer1 = Timer , Prescale = 1024 'Configuración TIMER1, f=31.25 KHz
On Compare1a Int_timer1 'Interrupción por comparación
Enable Compare1a 'Habilitación interrupción por comparación
'Interrupción externa INT1 'Habilitación INT1
Enable Interrupts 'Habilitación global de interrupciones
Timer1 = 0 'Reinicialización de Timer1
Compare1a = 1
Stop Timer1
Rampa = 0 'Reiniciar Rampa en cada Interrupción
'Programa principal
'Reinicialización de Rampa
Do
nop 'Bucle infinito
Loop
'Rutinas de interrupción
'Interrupcion cruce por cero
Int_zc:
Stop Timer1
Timer1 = 0
Rampa = 0 'Interrupción cada 7*1/31250= 0.22 ms = 7.5ms/32
Portb.0 = 0 'Señal a Triac =0
'Obtensión de señales Referencia y Sensor
Start Adc
D = Getadc(0)
Stop Adc
T = D / 1023 '1024
T = T * 360 'Rango 0 - 360 => precisión 0.5 grados.
Start Timer1
Return
'Interrupcion Timer cada 0.22 ms 32 escalones por semiciclo
Int_timer1:
'Stop Timer1
Timer1 = 0 'Reiniciar Timer1
Rampa = Rampa + 2.8 'Incrementar rampa por cada interrupción
If T > Rampa Then
Portb.0 = 0 'Señal a Triac = 0
Else
Portb.0 = 1 'Señal a Triac =1
End If
'Start Timer1
Return
End