Autor Tema: Pic 16f877 re loco  (Leído 1738 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado gittoidts

  • PIC10
  • *
  • Mensajes: 3
Pic 16f877 re loco
« en: 20 de Febrero de 2006, 08:06:00 »
Maestros tengo un problema, realice un programa para un menu con el teclado y que me realizara una interrupcion de tiempo y cada 60 segundos me guardara en la memoria, el problema es que el micro al entrar a la interrupcion se resetea y queda loco y no hace nada hay va el programa:
#include <16f877a.h>            //pic a utilizar
#fuses HS,NOWDT,NOPROTECT,NOLVP   //ordenes para el programador
#use delay (clock=4000000)         //Fosc=4Mhz
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7)   //manejo del RS232
#define use_portb_kbd TRUE         //definir portb keypad
#include<kbd.c>
#INT_TBE                  //libreria manejo keypad
#include "lcd.c"
#use standard_io(c)
#include <24256a.c>
#include <input.c>
#byte port_a=5
#byte port_b=6
#byte port_c=7
#byte port_d=8
#byte port_e=9
#use fast_io(a)
#use fast_io(e)
int32 address;
int horas = 00,sensor1,sensor2,f=0,z=0,w=1,s=27;
long int b,g=100,value,h,x;
int minutos = 00,k;
int segundos = 00;
int contemp1 =28; // Contador Interno 15 o 20//15  //+-4
int contemp2 = 8; // Contador Ajuste hasta 8//8   //+-8
int medicion,c;
/////////////////////////////////////////////////////////////////Registros Globales del sistema
void opciones();
void bajar();
void borrar();
void proseso();
void sensores();
///////////////////////////////////////////////////Menus
void main() {
//init_ext_eeprom();

//comienzo de programa
while(true){
byte value,cmd;
EEPROM_ADDRESS address;
lcd_init();
lcd_gotoxy(3,1);
lcd_putc("NARIZ ELECTRONICA"Giño;
lcd_gotoxy(5,2);
lcd_putc("PROTOTIPO A.2"Giño;
delay_ms(1000);
opciones();}}
//////////////////////////////////////////////////////////////////////////////////Programa inicial
void opciones(){
byte value,cmd;
EEPROM_ADDRESS address;
init_ext_eeprom();
z = READ_EXT_EEPROM(g);
lcd_putc("f"Giño;
lcd_gotoxy(3,1);
lcd_putc("f"Giño;
lcd_gotoxy(1,3);
delay_ms(2);
while(true){
lcd_putc("f"Giño;
lcd_gotoxy(1,1);
lcd_putc("(1)Archivos (2)Borrar"Giño;
lcd_gotoxy(1,2);
lcd_putc("(3)Iniciar (4)Sensores"Giño;
      do{
         c=kbd_getc();
         }while(c==0);
if(c=="1"){
bajar();}
if(c=="2"){
Borrar();}
if(c=="3"){
proseso();}
if(c=="4"){
sensores();}
}}
///////////////////////////////////////////////////////////////////////////////////
////////////////////Opciones escoja una opcion
void bajar(){
long int a=24,e=50,r;

byte value,cmd;
EEPROM_ADDRESS address;
lcd_putc("f"Giño;
if(z>0){
lcd_gotoxy(1,1);
lcd_putc("[1] Bajar [2] Analizar"Giño;
lcd_gotoxy(1,2);
lcd_putc(" (Otro Salir)"Giño;

      do{
         c=kbd_getc();
         }while(c==0);

if(c=="1"){
lcd_putc("f"Giño;
lcd_gotoxy(1,1);
lcd_putc("Bajando"Giño;
for(k=0;k<52;k++){
delay_ms(500);
//delay_ms(50);
r = READ_EXT_EEPROM( k );
printf("  %ld",r);}}
if(c=="2"){
r = READ_EXT_EEPROM( a );
delay_ms(100);
b = READ_EXT_EEPROM(e);
if(r>100){
lcd_putc("f"Giño;
lcd_gotoxy(1,1);
lcd_putc("La muestra esta podrida
No tiene posibilidad de consumo"Giño;
delay_ms(1000);
}
if(r<40){
lcd_putc("f"Giño;
lcd_gotoxy(1,1);
lcd_putc("Optima Tiempo consumo:"Giño;
lcd_gotoxy(1,2);
lcd_putc("C=30 D R= 5 D A=12 H "Giño;
delay_ms(1000);


}
delay_ms(1000);
if((r>40)&&(r<70)){
lcd_putc("f"Giño;
lcd_gotoxy(1,1);
lcd_putc("Pronto consumo:"Giño;
lcd_gotoxy(1,2);
lcd_putc("C=10 D R= 1 D A=N  "Giño;
delay_ms(1000);

}
delay_ms(1000);
if((r>70)&&(r<99)){
lcd_putc("f"Giño;
lcd_gotoxy(1,1);
lcd_putc("Extremadamente regular
     C=1 D R= N D A=N H "Giño;
delay_ms(1000);
}
}
}

if(z==0){
lcd_gotoxy(1,1);
lcd_putc("Memoria Vacia"Giño;
delay_ms(1000);
}
c=0;
}
////////////////////////////////////////////////////////////
///////////////////////////////////////////////Bajar informacion
void borrar(){
long int r;
lcd_putc("f"Giño;
r=0;
lcd_gotoxy(1,1);
lcd_putc("Borrando"Giño;
for(k=0;k<60;k++){
WRITE_EXT_EEPROM( k, r );
delay_ms(100);
z=0;
WRITE_EXT_EEPROM( g, z );
c=0;
}}
////////////////////////////////////////////////////////////
/////////////////////////////////Borrar informacion+
void proseso(){
setup_adc (adc_clock_div_32);
setup_adc_ports (RA0_RA1_ANALOG_RA3_REF);
set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
sensor1=read_adc ();
value=sensor1;
delay_us (20);
set_adc_channel (1); //Elige canal a medir RA0
delay_us (20);
sensor2=read_adc ();
h=sensor2;
/////////////////////////////////////lectura ADC
if((value>36)&&(h>20)){
lcd_putc("f"Giño;
output_low(pin_c1);
lcd_gotoxy(1,1);
lcd_putc("Los sensores no estan en "Giño;
lcd_gotoxy(1,2);
lcd_putc("Punto 0 alto riesgo "Giño;
delay_ms(1500);}/////////////////////////Sensores punto 0
if(z>0){
lcd_gotoxy(1,1);
lcd_putc("La memoria no esta vacia"Giño;
lcd_gotoxy(1,2);
lcd_putc("Debe borrar la memoria"Giño;
delay_ms(1000);
lcd_gotoxy(1,1);
lcd_putc("El analisis no es confiable"Giño;
lcd_gotoxy(1,2);
lcd_putc("Si no borra la memoria       "Giño;
delay_ms(1500);
}////////////////////Memoria llena
horas=00;
minutos=00;
segundos=00;
contemp1 =28; // Contador Interno 15 o 20//15  //+-4
contemp2 = 8;
lcd_putc("f"Giño;
delay_ms(100);
lcd_gotoxy(1,1);
lcd_putc("Muestra colocada"Giño;
lcd_gotoxy(1,2);
lcd_putc("(1) si (2) no (otro salir)"Giño;
      do{               //espera hasta...
         c=kbd_getc();
         }while(c==0);
if(c=="1"){
lcd_putc("f"Giño;
lcd_gotoxy(1,1);
lcd_putc("Comenzando Analisis"Giño;
delay_ms(1000);
lcd_gotoxy(1,1);
lcd_putc("f"Giño;
lcd_putc("Activando ventilador"Giño;
output_high(pin_c1);
delay_ms(1000);
lcd_gotoxy(1,1);
lcd_putc("f"Giño;
lcd_putc("Activando extractor"Giño;
output_high(pin_c0);
delay_ms(1000);
lcd_gotoxy(1,1);
lcd_putc("f"Giño;
lcd_putc("Duracion analisis "Giño;
lcd_gotoxy(3,2);
lcd_putc("12 minutos"Giño;
delay_ms(1000);
lcd_putc("f"Giño;
z=0;
setup_adc (adc_clock_div_32);
setup_adc_ports (RA0_RA1_ANALOG_RA3_REF);
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
set_rtcc(6);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
/////////////////////inicio conteo
while(minutos<12){
lcd_gotoxy(1,1);
lcd_putc("REALIZANDO ANALISIS"Giño;
lcd_gotoxy(1,2);
lcd_putc("TIEMPO :"Giño;
lcd_gotoxy(13,2);
printf(lcd_putc, "%02u:%02u:%02u", horas, minutos, segundos);
if(segundos==0){
set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
sensor1=read_adc ();
value=sensor1;
WRITE_EXT_EEPROM( f, value );
set_adc_channel (1); //Elige canal a medir RA0
delay_us (20);
sensor2=read_adc ();
h=sensor2;
WRITE_EXT_EEPROM( s, h );
z++;
f++;
s++;
delay_ms(700);
segundos=1;}
if(segundos==30){
set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
sensor1=read_adc ();
value=sensor1;
WRITE_EXT_EEPROM( f, value );
set_adc_channel (1); //Elige canal a medir RA0
delay_us (20);
sensor2=read_adc ();
c=sensor2;
WRITE_EXT_EEPROM( s, h );
f++;
s++;
delay_ms(700);
segundos=31;
}
}
WRITE_EXT_EEPROM( g, z );
lcd_putc("f"Giño;
lcd_putc("Desactivando ventilador"Giño;
output_low(pin_c1);
delay_ms(1000);
lcd_gotoxy(1,1);
lcd_putc("f"Giño;
lcd_putc("Desactivando extractor"Giño;
output_low(pin_c0);
delay_ms(1000);}
/////////////////////////////////////////////////////////////////////////////////
while(c=="2"){
lcd_putc("f"Giño;
lcd_gotoxy(1,1);
lcd_putc("POR FAVOR COLOCAR
   MUESTRA"Giño;
   delay_ms(1000);
   c= 0;
   }k=0;}
////////////////////////////////////////////////////////////////////////////////////
void sensores(){
lcd_putc("f"Giño;
lcd_gotoxy(1,1);
lcd_putc("[1]Estado   [2]Limpieza
       (Otra salir) "Giño;
      do{               //espera hasta...
         c=kbd_getc();
         }while(c==0);
     lcd_putc("f"Giño;
if(c=="1"){
while(true){

setup_adc (adc_clock_div_32);
setup_adc_ports (RA0_RA1_ANALOG_RA3_REF);
set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
sensor1=read_adc ();
value=sensor1;
delay_us (20);
set_adc_channel (1); //Elige canal a medir RA0
delay_us (20);
sensor2=read_adc ();
h=sensor2;
lcd_gotoxy(1,1);
printf(lcd_putc,"%02ld %02ld",value,h);
}
}
if(c=="2"){
setup_adc (adc_clock_div_32);
setup_adc_ports (RA0_RA1_ANALOG_RA3_REF);
set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
sensor1=read_adc ();
value=sensor1;
delay_us (20);
set_adc_channel (1); //Elige canal a medir RA0
delay_us (20);
sensor2=read_adc ();
h=sensor2;
//if((value>36)&&(h>20)){
lcd_putc("f"Giño;
while((value> 36)||(h> 20)){
setup_adc (adc_clock_div_32);
setup_adc_ports (RA0_RA1_ANALOG_RA3_REF);
set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
sensor1=read_adc ();
value=sensor1;
delay_us (20);
set_adc_channel (1); //Elige canal a medir RA0
delay_us (20);
sensor2=read_adc ();
h=sensor2;
output_high(pin_c1);
lcd_gotoxy(1,1);
lcd_putc("Limpiando camara de sensores"Giño;
lcd_gotoxy(1,2);
lcd_putc("Espere por favor"Giño;
}
if((value<36)&&(h<20)){
lcd_putc("f"Giño;
output_low(pin_c1);
lcd_gotoxy(1,1);
lcd_putc("Los sensores estan listos"Giño;
delay_ms(1000);
}
}
}
#INT_RTCC
void cada64ms() {

disable_interrupts(GLOBAL);

set_rtcc(6);
contemp1 = contemp1 - 1;

if (contemp1==0) {

contemp2 = contemp2 - 1;
contemp1 = 15;

if (contemp2==0){

contemp1 = contemp1 + 5;
contemp2 = 8;
}

// Rutina Aprox cada segundo - Exacta cada 8 seg.
// contemp1 se carga con 15, 15, 15, 15, 15, 15, 15, 20, 15, 15...

segundos = segundos + 1;
if (segundos==60){
minutos = minutos + 1;
segundos = 0;
}
if (minutos==60){
horas = horas + 1;
minutos = 0;
}
if (horas==13){ horas = 1; }
}

enable_interrupts(GLOBAL);
}

ademas la memoria rom se me acaba si le coloco otra instruccion



Desconectado Sebascl

  • PIC12
  • **
  • Mensajes: 73
RE: Pic 16f877 re loco
« Respuesta #1 en: 21 de Febrero de 2006, 00:14:00 »
hola, seria bueno que comentes bien el codigo para etende que tratas de hacer.

saludos.