/*
* Author: Leonardo Barreiro
* Created on 20 de enero de 2017, 12:14
*/
#include <pic16f628a.h>
#include <xc.h>
// #pragma config statements should precede project file includes.
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 4000000
// Pines
#define Boton_apagado PORTAbits.RA1
#define Boton_velocidades PORTBbits.RB7
#define Boton_LUZ PORTBbits.RB6
#define Vel_1_led PORTAbits.RA0
#define Vel_2_led PORTAbits.RA7
#define Vel_3_led PORTAbits.RA6
#define TRIAC_out PORTBbits.RB1
#define TIRA_LED_out PORTBbits.RB2
#define ZERO_CROSS_in PORTBbits.RB0
// Source statements
#define TMR0_Carga_MAX 255
#define TMR0_Carga_MED 203 //0b11001011 // 203 = 3.392ms -> Triac 66.08%
#define TMR0_Carga_LOW 152 //0b10011000 // 152 = 6.656ms -> Triac 33.44%
#define TMR0_Carga_OFF 0 //0b00000000 // 0 = 16.384ms -> Triac 0%
unsigned char dimmer_time;
unsigned char Velocidad = 0;
bit LUZ;
void interrupt ISR(void){
if(INTF){
TMR0 = dimmer_time; /* TOIF = 1 -> Triac 100%
* Carga 203 = 3.392ms -> Triac 66.08%
* Carga 152 = 6.656ms -> Triac 33.44%
* Carga 0 = 16.384ms -> Triac
*/
INTF = 0; // Clear interruption flag
}
if(T0IF){
TRIAC_out = 1;
__delay_us(1500); //Triac fire propagation delay
TRIAC_out = 0;
T0IF = 0;
}
}
void main(void){
OPTION_REG = 0b01000101; /* Pull-ups are enabled by individual port latch values,
* interrupt on rising edge of INT,
* TMR0 clock source on internal instruction,
* nothing to do,
* Prescaler is assigned to the TMR0,
* Prescaler rate 1:64
*/
CCP1CON = 0b00000000;
CMCON = 0b00000111;
INTCON = 0b10110000; /* Global interrupt enable,
* Peripheral interrupt disable,
* TMR0 overflow interrupt enable,
* RB0/INT external interrupt enable,
* RB Port change interrupt disable,
* All flags bit did not overlow.
*/
PCONbits.OSCF = 1; //Oscilador en 4MHZ
TRISA = 0b00111110;
TRISB = 0b11111001; /* 1 = IN ; 0 = OUT
* RA_IN RA1 - RA_OUT RA0 RA6 RA7
* RB_IN RB0 RB6 RB7 - RB_OUT RB1 RB2
*/
PORTA = 0;
PORTB = 0;
while(1){
if(Boton_velocidades == 1){
__delay_ms(500);
switch (Velocidad) {
case 3:
Velocidad = 0;
dimmer_time = TMR0_Carga_OFF;
Vel_3_led = 0;
break;
case 2:
Velocidad = 3;
dimmer_time = TMR0_Carga_MAX;
Vel_2_led = 0;
Vel_3_led = 1;
break;
case 1:
Velocidad = 2;
dimmer_time = TMR0_Carga_MED;
Vel_1_led = 0;
Vel_2_led = 1;
break;
case 0:
Velocidad = 1;
dimmer_time = TMR0_Carga_LOW;
Vel_1_led = 1;
break;
default:
break;
}
}
if(Boton_apagado == 1){
Velocidad = 0;
dimmer_time = TMR0_Carga_OFF;
Vel_1_led = 0;
Vel_2_led = 0;
Vel_3_led = 0;
__delay_ms(500);
}
if(Boton_LUZ == 1){
TIRA_LED_out = LUZ;
LUZ = !LUZ;
__delay_ms(500);
}
}
}
Sé que es mala costumbre poner un delay en una interrupción, aunque no veo contraposición en este caso.
En la programación expresé LOW como indicador de una baja velocidad del motor. Creo que logré expresarlo de esa manera en el switch. No entendí muy bien a que te referís.