PROTEUS VSM 5
N.- Uso do PICC com o Proteus.
· Armar o seguinte circuito:
· Este circuito se utilizou como controle de um inversor monofásico de múltiplos pulsos, com freqüência e voltagem variável.
18F452
Componentes:
· MICRO (PIC18F452)
· DISPLAY (LM016L)
· ACTIVE (BUTTON)
· ACTIVE (SWITCH)
· Salvar o circuito em uma nova pasta só para o circuito. Nesta pasta se deve salvar também o código fonte gerado com o PICC.
· Pegar o seguinte programa em um novo arquivo usando PICC.
Programa:
// Inversor 05 "Final"
#include <18F452.h>
#use delay(clock=20000000)
#fuses HS,PUT,BROWNOUT,NOWDT,NOPROTECT,NOLVP, BORV20, STVREN
#use fast_io(C)
#use fast_io(B)
#include <lcd.c>
int16 delta = 0, d1 = 0, delta_back,
d1_back;
int8 volfrec = 0, cuenta = 0, periodo = 0;
int1 inicio = 0, arranque = 0, flag1 = 0, flag2 = 0;
void cambio();
#INT_EXT
void modo()
{
if (inicio == 0)
{
inicio = 1;
flag1 = 1;
lcd_gotoxy(5,2); lcd_putc("000");
lcd_gotoxy(14,2); lcd_putc("000");
}
else
{
if (input(PIN_B2) == 1)
{
if (volfrec <= 11)
{
volfrec += 1;
}
}
else
{
if (volfrec > 0)
{
volfrec -= 1;
}
}
cambio();
}
}
#INT_EXT1
void motor()
{
disable_interrupts(INT_EXT1);
inicio = 0;
arranque = 1;
volfrec = 3;
cambio();
}
#INT_TIMER0
void mot_arr()
{
if (volfrec <= 11)
{
set_timer0(26473);
volfrec += 1;
cambio();
if (volfrec == 12)
{
disable_interrupts(INT_TIMER0);
setup_timer_0(RTCC_OFF);
}
}
}
#INT_TIMER1
void carga_delta()
{
SET_TRIS_C(0x00);
SET_TRIS_B(0xFF);
output_C(0x00);
disable_interrupts(INT_EXT);
disable_interrupts(INT_TIMER1);
setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
set_timer3(d1_back);
setup_timer_3(T3_INTERNAL|T3_DIV_BY_2);
enable_interrupts(INT_TIMER3);
periodo += 1;
cuenta += 1;
if (cuenta == 5)
{
cuenta = 0;
if (flag2 == 0)
{
flag2 = 1;
}
else
{
flag2 = 0;
}
}
output_low(PIN_C0);
output_low(PIN_C1);
enable_interrupts(INT_EXT);
}
#INT_TIMER3
void carga_d1()
{
disable_interrupts(INT_EXT);
disable_interrupts(INT_TIMER3);
setup_timer_3(T3_DISABLED|T3_DIV_BY_2);
set_timer1(delta_back);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
if (flag2 == 0)
{
output_high(PIN_C0);
}
else
{
output_high(PIN_C1);
}
enable_interrupts(INT_TIMER1);
}
void main()
{
port_b_pullups(TRUE);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_2(T2_DISABLED,0,1);
disable_interrupts(INT_TIMER1);
disable_interrupts(INT_TIMER3);
setup_timer_0(RTCC_OFF);
ext_int_edge(H_TO_L);
lcd_init();
lcd_putc('\f');
lcd_gotoxy(2,1); lcd_putc("INVERSOR ITA");
lcd_gotoxy(1,2); lcd_putc("VOL:OFF FREC:OFF");
setup_timer_1(T1_DISABLED|T1_DIV_BY_1);
set_timer1(0x0001);
setup_timer_3(T3_DISABLED|T3_DIV_BY_2);
set_timer3(0x0001);
setup_timer_0(RTCC_OFF);
set_timer0(0x0001);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
while(TRUE)
{
if (inicio == 1)
{
if (periodo == 10)
{
periodo = 0;
flag1 = 0;
}
if (flag1 == 0)
{
delta_back = delta;
d1_back = d1;
flag1 = 1;
set_timer3(d1_back);
setup_timer_3(T3_INTERNAL|T3_DIV_BY_2);
enable_interrupts(INT_TIMER3);
}
}
else
{
if (arranque == 1)
{
disable_interrupts(INT_EXT1);
set_timer0(26473);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
enable_interrupts(INT_TIMER0);
arranque = 0;
inicio = 1;
flag1 = 0;
}
}
}
}
void cambio()
{
switch (volfrec)
{
case 0: disable_interrupts(INT_TIMER1);
disable_interrupts(INT_TIMER3);
enable_interrupts(INT_EXT1);
output_low(PIN_C0);
output_low(PIN_C1);
flag1 = 1;
lcd_gotoxy(5,2); lcd_putc("000");
lcd_gotoxy(14,2); lcd_putc("000");
break;
case 1: flag1 = 0;
disable_interrupts(INT_EXT1);
delta = 65227;
d1 = 15690;
lcd_gotoxy(5,2); lcd_putc("010");
lcd_gotoxy(14,2); lcd_putc("005");
break;
case 2: delta = 64919;
d1 = 40845;
lcd_gotoxy(5,2); lcd_putc("020");
lcd_gotoxy(14,2); lcd_putc("010");
break;
case 3: delta = 64610;
d1 = 49332;
lcd_gotoxy(5,2); lcd_putc("030");
lcd_gotoxy(14,2); lcd_putc("015");
break;
case 4: delta = 64301;
d1 = 53653;
lcd_gotoxy(5,2); lcd_putc("040");
lcd_gotoxy(14,2); lcd_putc("020");
break;
case 5: delta = 63993;
d1 = 56308;
lcd_gotoxy(5,2); lcd_putc("050");
lcd_gotoxy(14,2); lcd_putc("025");
break;
case 6: delta = 63684;
d1 = 58129;
lcd_gotoxy(5,2); lcd_putc("060");
lcd_gotoxy(14,2); lcd_putc("030");
break;
case 7: delta = 63376;
d1 = 59473;
lcd_gotoxy(5,2); lcd_putc("070");
lcd_gotoxy(14,2); lcd_putc("035");
break;
case 8: delta = 63067;
d1 = 60521;
lcd_gotoxy(5,2); lcd_putc("080");
lcd_gotoxy(14,2); lcd_putc("040");
break;
case 9: delta = 62758;
d1 = 61369;
lcd_gotoxy(5,2); lcd_putc("090");
lcd_gotoxy(14,2); lcd_putc("045");
break;
case 10: delta = 62450;
d1 = 62079;
lcd_gotoxy(5,2); lcd_putc("100");
lcd_gotoxy(14,2); lcd_putc("050");
break;
case 11: delta = 62141;
d1 = 62688;
lcd_gotoxy(5,2); lcd_putc("110");
lcd_gotoxy(14,2); lcd_putc("055");
break;
case 12: delta = 61832;
d1 = 63221;
lcd_gotoxy(5,2); lcd_putc("120");
lcd_gotoxy(14,2); lcd_putc("060");
break;
}
}
NOTA: recomenda-se tabular o programa anterior para que seja mais fácil sua leitura.
· Salvar o arquivo na mesma pasta em que se salvou o circuito.
· Compilar o arquivo.
Para que o programa anterior funcione corretamente é necessário editar o arquivo LCD.C que vem com o PICC, substituindo a instrução delay_cycles(1) por delay_us(1). Este arquivo se encontra em:
C:\Archivos de programa\PICC\Drivers
· Carregar o arquivo *.HEX gerado pelo PICC, como se realizou para os microcontroladore PIC16F84 e 877. A freqüência do relógio deve ser trocada para 20MHz.