HOLA ..hace poco q estoy con los pic ..y mucho menos con el CCS...hice un programa y tengo un problema con la INT_EXT ..no entra (todo esto simulado en PROTEUS ......el programa es una lavadora de picadoras ...hace la presentacion ..presiono "INICIO" ...mueve una cinta tramsportadora ..si encuentra picadora ...llena de agua ..calienta agua ..y comienza a lavar ....si no encuentra picadora ..pone un mensaje de final de proceso y me indica cuantas picadoras se lavaron ....
PD:hay intrucciones q no se usar ...acepto consejos para mejorar el codigo ..gracias
//------Directivas para el compilador--------
#include <16f877a.h> //PIC utilizado
#fuses XT,NOWDT,NOPROTECT,NOLVP //Configuramos los fuses
#use delay (clock=4000000) //Oscilador a 4Mhz
#use fast_io(A) //Optimizamos E/S del PORTA
#use fast_io(B) //Optimizamos E/S del PORTB
#use fast_io(C) //Optimizamos E/S del PORTC
#use fast_io(D) //Optimizamos E/S del PORTD
#use fast_io(E) //Optimizamos E/S del PORTE
#INCLUDE "lcd.c" //Incluyo LCD.C
//------Prototipos de funciones-----
void corrigo_salida(void);
void lcd_saludo_inicial(void);
void inicio_proceso(void);
void busca_pica1(void);
void nohay_pica1(void);
int lleno_agua(void);
int calor_agua(void);
int lavando_pica1(void);
void busca_pica2(void);
int lavando_pica2(void);
//VARIABLES GLOBALES
int vhaypica1 ; //ESTAS VARIABLES VOY HACER Q SI HAY UN 0 ES POR Q NO SE CARGO EL
int vhayagua ; //AGUA(CARGO EL AGUA Y PONGO UN 1 EN LA VARIABLE)Y ASI CADA VES Q PASA
int vhaycalor ; //UNA PICA SI LA VARIABLE ESTA EN 1 NO CARGA PASA AL LAVADO(O SIMPLEMENTE
int paso_pica1 ; //LO USO CON EL SENSOR 1 DE PICA Y VA A PASAR UNA SOLA VES Y DESPUES ME
long cant_pica ;
//INTERRUPCION RB0---------------------
#INT_EXT
void isr(void) {
delay_ms(20); //antirrebote
if(input(PIN_A3)==1) output_low(PIN_C0); //paro la cinta
if(input(PIN_A3)==1)vhaypica1=1;
if(input(PIN_A3)==1) cant_pica++;
}
// #INT_EXT
//void
//{
//if (!bit_test(PIN_A2)) {
// output_bit( PIN_A2, 0);
//Ddelay_ms(1000);
//direccion=1;
/// }
// }
//------Programa principal----------
void main(void) {
//------Puertos y pines-------------
#byte PORTA=0x05
#byte PORTB=0x06
#byte PORTC=0x07
#byte PORTD=0x08
#byte PORTE=0x09
set_tris_A(0xFF); //PUERTO A como entrada.
set_tris_B(0xFF); //PUERTO B como entrada.
set_tris_C(0x90); //PUERTO C 0,1,2,3 como salida y 4,5,6,7 como entrada
set_tris_D(0x108); //PUERTO D como salida
set_tris_E(0xFF); //PUERTO E 3 como entrada y 0,1,2,4,5,6,7 como salida
ext_int_edge(L_TO_H);
disable_interrupts(INT_EXT);
disable_interrupts(GLOBAL);
//-----Inicializo el LCD y muestro el saludo inicial----------
corrigo_salida();
lcd_init();
lcd_saludo_inicial();
inicio_proceso();
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
busca_pica1();
lleno_agua();
calor_agua();
lavando_pica1();
buscapica2:
busca_pica2();
lavando_pica2();
goto buscapica2;
}
//------------------------------------------------------------------------------
//FUNCIONES
//------------------------------------------------------------------------------
//----IMPRIME SALUDO INICIAL.-------------
void lcd_saludo_inicial(void) {
lcd_gotoxy(4,1);
Lcd_putc ("LAVAMATIC"); //Escribo en la primera fila
lcd_gotoxy(3,2); //columna 4, fila 2
Lcd_putc( "VERSION 1.00"); //Escribo en la segunda fila
delay_ms(2000); //Espero tres segundos
}
//-----INICIO PROCESO------------------
void inicio_proceso(void) {
disable_interrupts(INT_EXT);
Lcd_putc( "\f"); //Limpio pantalla
salta:
lcd_gotoxy(3,1);
Lcd_putc ("PRESIONE EL"); //Escribo en la primera fila
lcd_gotoxy(2,2); //columna 2, fila 2
Lcd_putc( "BOTON *INICIO*"); //Escribo en la segunda fila
if(!input(PIN_A0)) //COMPRUEBO Y NIEGO LA SALIDA DE RA0
{goto salta; }
Lcd_putc( "\f"); //Limpio pantalla
}
//----PONGO EN CERO PINES--------------
void corrigo_salida(void)
{
output_low(PIN_C0);
output_low(PIN_B0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
}
//-------BUSCA PICA1--------------------
void busca_pica1(void) {
long i ;
Lcd_putc( "\f"); //Limpio pantalla
lcd_gotoxy(5,1);
Lcd_putc ("BUSCANDO"); //o en la primera fila
lcd_gotoxy(2,2); //columna 4, fila 2
Lcd_putc( "PICADORA 1"); //Escribo en la segunda fila
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
output_high(PIN_C0); //mueve cinta tramsportadora
delay_ms(2500); //Espero tres segundos
for (i==0 ; i<1600 ; i++) //con el valor de i regulo el tiempo
{ //en que busco la pica
delay_ms(50);
IF(vhaypica1==1) //si hay vhaypica1=1 ,i=2536 y salgo
{ //del bucle for
i=1600;
}
}
IF(vhaypica1==0)
nohay_pica1();
}
//-------BUSCA PICA2--------------------
void busca_pica2(void) {
long i ;
Lcd_putc( "\f"); //Limpio pantalla
lcd_gotoxy(5,1);
Lcd_putc ("BUSCANDO"); //o en la primera fila
lcd_gotoxy(3,2); //columna 4, fila 2
cant_pica++;
printf(lcd_putc, "PICADORA %lu",cant_pica); //Escribo en la segunda fila
cant_pica--;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
output_high(PIN_C0); //mueve cinta tramsportadora
delay_ms(2500); //Espero tres segundos
for (i==0 ; i<80 ; i++) //con el valor de i regulo el tiempo
{ //en que busco la pica
delay_ms(80);
IF(vhaypica1==1) //si hay vhaypica1=1 ,i=2536 y salgo
{ //del bucle for
i=80;
}
}
IF(vhaypica1==0)
nohay_pica1();
}
//--------LLENO DE AGUA------------------
int lleno_agua(void) {
Lcd_putc( "\f"); //Limpio pantalla
lcd_gotoxy(4,1);
Lcd_putc ("LLENANDO "); //Escribo en la primera fila
lcd_gotoxy(4,2); //columna 4, fila 2
Lcd_putc( "DE AGUA"); //Escribo en la segunda fila
delay_ms(1000); //Espero tres segundos
salta2:
output_high(PIN_C1); //conecto bomba agua
if(!input(PIN_A1)) //COMPRUEBO Y NIEGO LA SALIDA DE RA0
{goto salta2; }
output_low(PIN_C1); //apago bomba agua
vhayagua =1 ;
return vhayagua;
}
//----------CALIENTO AGUA--------------------
int calor_agua(void) {
Lcd_putc( "\f"); //Limpio pantalla
lcd_gotoxy(3,1);
Lcd_putc ("CALENTANDO "); //Escribo en la primera fila
lcd_gotoxy(4,2); //columna 4, fila 2
Lcd_putc( "EL AGUA"); //Escribo en la segunda fila
delay_ms(1000); //Espero tres segundos
salta3:
output_high(PIN_C2); //enciendo resistencias
if(!input(PIN_A2)) //COMPRUEBO Y NIEGO LA SALIDA DE RA0
{goto salta3; }
output_low(PIN_C2); //apago resistencias
vhaycalor=1;
return vhaycalor;
}
//----------LAVANDO PICADORA 1-----------------
int lavando_pica1(void){
long cant_pica1 ;
cant_pica1 = cant_pica ;
disable_interrupts(GLOBAL); //deshabilito las interrupciones
disable_interrupts(INT_EXT); //deshabilito las interrupciones
Lcd_putc( "\f"); //Limpio pantalla
lcd_gotoxy(3,1);
Lcd_putc ("LAVANDO "); //Escribo en la primera fila
lcd_gotoxy(3,2); //columna 4, fila 2
printf(lcd_putc, "PICADORA %lu",cant_pica1); //Escribo en la segunda fila
delay_ms(100);
output_high(PIN_C3); //conecta leva, cepi y agua presion
delay_ms(6000); //Espero seis segundos
output_low(PIN_C3); //apago leva y cepillo
vhaypica1=0;
return paso_pica1;
}
//----------LAVANDO PICADORA 2-----------------
int lavando_pica2(void){
long cant_pica1 ;
cant_pica1 = cant_pica ;
disable_interrupts(GLOBAL); //deshabilito las interrupciones
disable_interrupts(INT_EXT); //deshabilito las interrupciones
Lcd_putc( "\f"); //Limpio pantalla
lcd_gotoxy(3,1);
Lcd_putc ("LAVANDO "); //Escribo en la primera fila
lcd_gotoxy(4,2); //columna 4, fila 2
printf(lcd_putc, "PICADORA %lu",cant_pica1); //Escribo en la segunda fila
delay_ms(100);
output_high(PIN_C3); //conecta leva, cepi y agua presion
delay_ms(6000); //Espero seis segundos
output_low(PIN_C3); //apago leva y cepillo
vhaypica1=0;
return vhaypica1;
}
//------NO HAY PICA1-------------------
void nohay_pica1(void) {
long cant_pica1 ;
cant_pica1 = cant_pica ;
disable_interrupts(GLOBAL); //deshabilito las interrupciones
disable_interrupts(INT_EXT);
// disable_interrupts(INT_RTCC);
output_low(PIN_C0); //apago la cinta
repito:
Lcd_putc( "\f"); //Limpio pantalla
lcd_gotoxy(3,1);
Lcd_putc ("NO HAY JUEGO"); // la primera fila
lcd_gotoxy(3,2); //columna 4, fila 2
Lcd_putc( "DE PICADORA"); //bo en la segunda fila
delay_ms(1000); //Espero 10 segundos
Lcd_putc( "\f"); //Limpio pantalla
lcd_gotoxy(5,1);
Lcd_putc ("PROCESO"); //o en la primera fila
lcd_gotoxy(4,2); //columna 4, fila 2
Lcd_putc( "TERMINADO"); //Escribo en la segunda fila
delay_ms(1000); //Espero 10 segundos
Lcd_putc( "\f"); //Limpio pantalla
lcd_gotoxy(1,1);
Lcd_putc ("TOTAL PICADORAS"); //Escribo en la primera fila
lcd_gotoxy(2,2); //columna 4, fila 2
printf(lcd_putc, "LAVADAS %lu",cant_pica1); //Escribo en la segunda fila
delay_ms(2000);
goto repito; //repitoel mensaje
}