Skip to content

Instantly share code, notes, and snippets.

@vduenasg
Last active May 6, 2016 23:21
Show Gist options
  • Save vduenasg/3157540 to your computer and use it in GitHub Desktop.
Save vduenasg/3157540 to your computer and use it in GitHub Desktop.
Timer0 Fast PWM
// * Author: Victor Dueñas Guardia
// * Info: www.netzek.com
// @Ejemplo3 - Timer en Fast PWM:
// Este programa genera en OC0 una señal periódica, cada vez que se presiona un pulsador aumenta
// el ciclo de trabajo y al presionar el otro pulsador disminuye el ciclo de trabajo.
// Pseudocódigo:
// - Configuro al timer en modo Fast PWM.
// - Cada vez que se inicia una interrupción externa se aumenta o disminuye el valor de OCR.
.INCLUDE "M16DEF.INC" //Incluye definicion archivos ATmega16
.EQU OCR_INICIAL=128
.ORG $00
JMP PROGRAMA //Interrupcion Reset
.ORG $02
JMP INTER0 //Interrupcion 0
.ORG $04
JMP INTER1 //Interrupcion 1
PROGRAMA:
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,0B00001000
OUT DDRB,R16 //Habilito salida OC0
LDI R17,OCR_INICIAL
OUT OCR0,R17 //Coloco la señal al 50% ciclo de trabajo
LDI R16,0B01101101
OUT TCCR0,R16 //No invertido OC0 - Fast PWM - CLK/1024
LDI R16,0B00001010
OUT MCUCR,R16 //INT0 e INT1 Flanco de Bajada
LDI R16,0B11000000
OUT GICR,R16 //INT0 e INT1 Habilitada
SEI
BUCLE: RJMP BUCLE
//......INTERRUPCIONES
INTER0:
CALL RETARDO
CPI R17,0
BREQ Salir0
DEC R17
OUT OCR0,R17
Salir0:
RETI
INTER1:
CALL RETARDO
CPI R17,255
BREQ Salir1
INC R17
OUT OCR0,R17
Salir1:
RETI
//......PROCEDIMIENTOS
RETARDO: //Configurado Evitar Rebote
LDI R25,31
Bucle_Externo:
LDI R24,255
Bucle_Interno:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DEC R24
BRNE Bucle_Interno
DEC R25
BRNE Bucle_Externo
RET
/*
* Timer0FastPWM.c
*
* Author: Victor Dueñas Guardia
* Info: www.netzek.com
@Ejemplo3 - Timer en Fast PWM:
Este programa genera en OC0 una señal periódica, cada vez que se presiona un pulsador aumenta
el ciclo de trabajo y al presionar el otro pulsador disminuye el ciclo de trabajo.
Pseudocódigo:
- Configuro al timer en modo Fast PWM.
- Cada vez que se inicia una interrupción externa se aumenta o disminuye el valor de OCR.
*/
#include <avr/io.h>
//Incluyo las definiciones del ATmega16
#include <avr/interrupt.h>
//Incluyo las definiciones de las Interrupciones
#include "mdelay.h"
//Incluyo las definiciones de retardo
//__INTERRUPCIONES
ISR(INT0_vect)
{
_delay_ms(300);
//Delay para evitar efecto rebote
if(OCR0 == 0)
OCR0;
else
OCR0--;
}
ISR(INT1_vect)
{
_delay_ms(300);
//Delay para evitar efecto rebote
if(OCR0 == 255)
OCR0;
else
OCR0++;
}
//__PROGRAMA PRINCIPAL
int main(void)
{
DDRB |= (1<<PB3);
//PB3 como salida
MCUCR |= (1<<ISC11) | (1<<ISC01);
//INT0 e INT1 Flanco de Bajada
GICR |= (1<<INT1) | (1<<INT0);
//INT0 e INT1 Habilitada
TCCR0 |= (1<<WGM00) | (1<<COM01) | (1<<WGM01) | (1<<CS02) | (1<<CS00);
//No invertido OC0 - Fast PWM - CLK/1024
OCR0 = 128;
//50% de ciclo de trabajo
sei();
//Interrupciones habilitadas
while (1)
{
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment