Autor Tema: Duda configuracion puerto + problema desconocido :S  (Leído 2118 veces)

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

Desconectado kordrak

  • PIC10
  • *
  • Mensajes: 17
Duda configuracion puerto + problema desconocido :S
« en: 07 de Febrero de 2012, 12:09:00 »
Hola, estoy teniendo problemas con un programa que en el que e estado trabajando y no logro identificar el problema.

Tengo el puerto C de un pic 18f252 configurado para usar el usart a 9600, y a demas estoy tratando de usar otros 4 pines del mismo puerto como entradas digitales, pero algo esta pasando en alguna parte de mi codigo, que hace que el programa falle(el programa funciona perfecto antes de incluir estos switches :S),
la duda es.. lo estoy configurando bien? es posible usar el puerto de esta menera?

el pic recibe sin problema, pero llega a un momento en el que deberia activarse un delay y despues seguir con el programa, pero se esta saltando el delay y entrando en una especie de loop.

adjunto todo el codigo del programa, en caso de que el problema no se encuentre ahi, sino en alguna otra parte.

Código: [Seleccionar]
#include <p18f252.h>
#include <adc.h>
#include <usart.h>
#include <stdlib.h>
#include <timers.h>
#include <delays.h>

#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config DEBUG = ON

unsigned char ACTIVA, DESACTIVA;
unsigned char dato, LeeDIR, LeeTP;
int estado, Dir, Tp, N_Dir;
int minutos=0;
int segundos=0;

void ConfiguraUSART(void);
void SET_DIR(void);
void ProcesarUSART(unsigned char);
void SET_TP(void);
void ProcesarPulsador(unsigned char);
void ISRTimer0(void);

#pragma code Interrupcion = 0x08
void VectorInterrupcion(void){
_asm goto ISRTimer0 _endasm
}
#pragma code

#pragma interruptlow ISRAltaPrioridad
void ISRAltaPrioridad(void){
}

#pragma interrupt ISRTimer0
void ISRTimer0(void){
  if(INTCONbits.TMR0IF==1){
WriteTimer0(26473); // 1000,012 ms a 16bit, 1:64
    INTCONbits.TMR0IF=0;
segundos++;
if (segundos==60){
minutos++;
segundos = 0;
}
if (minutos==2 && estado==1){
PORTBbits.RB0 = 0; // LED
estado = 0;
minutos = 0;
segundos = 0;
}
}
}

void main(void){
TRISA = 0xFF; // Puerto A como entrada
TRISB = 0x08; // Puerto B Salidas menos RB3(Pulsador)
PORTB = 0x00;
TRISC = 0x8F;
SET_TP();
SET_DIR();
ConfiguraUSART();
while(1){
if(DataRdyUSART()){
while(BusyUSART());
dato = ReadUSART();
}
ProcesarUSART(dato);
if(estado==1){
PORTBbits.RB0 = 1;
ProcesarPulsador(Tp);
}
if(estado==0){
PORTBbits.RB0 = 0;
}
}
}

void ProcesarUSART(unsigned char dato){
if(dato == ACTIVA){
RCONbits.IPEN=0;     // Deshabilitamos Prioridades
INTCONbits.PEIE=1;   // Habilitamos interrupcion de perifericos.-
INTCONbits.GIE=1;    // Habilitamos interrupcion global.
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_64);
WriteTimer0(26473); // 1000.012 ms
estado = 1;
minutos = 0;
segundos = 0;
}
else if(dato == DESACTIVA){
estado = 0;
}
}

void ProcesarPulsador(unsigned char Tp){
if(PORTBbits.RB3 == 1){
estado = 0;
PORTBbits.RB1 = 1; // Activa Rele
PORTBbits.RB0 = 0; // Apaga Led
switch(Tp){
case 0:
Delay10KTCYx(125); break;//500 ms

case 1:
Delay10KTCYx(250); break;//1 segundo

case 2:
Delay10KTCYx(250); Delay10KTCYx(250); break;

case 3:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 4:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 5:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 6:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); break;

case 7:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); break;

case 8:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 9:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 10 :
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 11:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); break;

case 12:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); break;

case 13:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 14:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 15:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

}
// estado = 0;
PORTBbits.RB1 = 0;/*RELE*/
}
}

void SET_DIR(void){
OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_0ANA_0REF, ADC_INT_OFF);
LeeDIR = PORTA;
switch(LeeDIR){
case 0b00000001: Dir = 0x01; ACTIVA = 0x65; DESACTIVA = 0x01; N_Dir = 1; break;
case 0b00000010: Dir = 0x02; ACTIVA = 0x66; DESACTIVA = 0x02; N_Dir = 2; break;
case 0b00000011: Dir = 0x03; ACTIVA = 0x67; DESACTIVA = 0x03; N_Dir = 3; break;
case 0b00000100: Dir = 0x04; ACTIVA = 0x68; DESACTIVA = 0x04; N_Dir = 4; break;
case 0b00000101: Dir = 0x05; ACTIVA = 0x69; DESACTIVA = 0x05; N_Dir = 5; break;
case 0b00000110: Dir = 0x06; ACTIVA = 0x6A; DESACTIVA = 0x06; N_Dir = 6; break;
case 0b00000111: Dir = 0x07; ACTIVA = 0x6B; DESACTIVA = 0x07; N_Dir = 7; break;
case 0b00001000: Dir = 0x08; ACTIVA = 0x6C; DESACTIVA = 0x08; N_Dir = 8; break;
case 0b00001001: Dir = 0x09; ACTIVA = 0x6D; DESACTIVA = 0x09; N_Dir = 9; break;
case 0b00001010: Dir = 0x0A; ACTIVA = 0x6E; DESACTIVA = 0x0A; N_Dir = 10; break;
case 0b00001011: Dir = 0x0B; ACTIVA = 0x6F; DESACTIVA = 0x0B; N_Dir = 11; break;
case 0b00001100: Dir = 0x0C; ACTIVA = 0x70; DESACTIVA = 0x0C; N_Dir = 12; break;
case 0b00001101: Dir = 0x0D; ACTIVA = 0x71; DESACTIVA = 0x0D; N_Dir = 13; break;
case 0b00001110: Dir = 0x0E; ACTIVA = 0x72; DESACTIVA = 0x0E; N_Dir = 14; break;
case 0b00001111: Dir = 0x0F; ACTIVA = 0x73; DESACTIVA = 0x0F; N_Dir = 15; break;
case 0b00010000: Dir = 0x10; ACTIVA = 0x74; DESACTIVA = 0x10; N_Dir = 16; break;
case 0b00010001: Dir = 0x11; ACTIVA = 0x75; DESACTIVA = 0x11; N_Dir = 17; break;
case 0b00010010: Dir = 0x12; ACTIVA = 0x76; DESACTIVA = 0x12; N_Dir = 18; break;
case 0b00010011: Dir = 0x13; ACTIVA = 0x77; DESACTIVA = 0x13; N_Dir = 19; break;
case 0b00010100: Dir = 0x14; ACTIVA = 0x78; DESACTIVA = 0x14; N_Dir = 20; break;
case 0b00010101: Dir = 0x15; ACTIVA = 0x79; DESACTIVA = 0x15; N_Dir = 21; break;
case 0b00010110: Dir = 0x16; ACTIVA = 0x7A; DESACTIVA = 0x16; N_Dir = 22; break;
case 0b00010111: Dir = 0x17; ACTIVA = 0x7B; DESACTIVA = 0x17; N_Dir = 23; break;
case 0b00011000: Dir = 0x18; ACTIVA = 0x7C; DESACTIVA = 0x18; N_Dir = 24; break;
case 0b00011001: Dir = 0x19; ACTIVA = 0x7D; DESACTIVA = 0x19; N_Dir = 25; break;
case 0b00011010: Dir = 0x1A; ACTIVA = 0x7E; DESACTIVA = 0x1A; N_Dir = 26; break;
case 0b00011011: Dir = 0x1B; ACTIVA = 0x7F; DESACTIVA = 0x1B; N_Dir = 27; break;
case 0b00011100: Dir = 0x1C; ACTIVA = 0x80; DESACTIVA = 0x1C; N_Dir = 28; break;
case 0b00011101: Dir = 0x1D; ACTIVA = 0x81; DESACTIVA = 0x1D; N_Dir = 29; break;
case 0b00011110: Dir = 0x1E; ACTIVA = 0x82; DESACTIVA = 0x1E; N_Dir = 30; break;
case 0b00011111: Dir = 0x1F; ACTIVA = 0x83; DESACTIVA = 0x1F; N_Dir = 31; break;
}
}

void SET_TP(void){
if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 0){Tp = 0;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 1){Tp = 1;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 0){Tp = 2;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 1){Tp = 3;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 0){Tp = 4;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 1){Tp = 5;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 0){Tp = 6;}
else if(PORTCbits.RC3 == 0 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 1){Tp = 7;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 0){Tp = 8;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 1){Tp = 9;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 0){Tp = 10;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 1){Tp = 11;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 0 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 0){Tp = 12;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 0 && PORTCbits.RC0 == 1){Tp = 13;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 0){Tp = 14;}
else if(PORTCbits.RC3 == 1 && PORTCbits.RC2 == 1 && PORTCbits.RC1 == 1 && PORTCbits.RC0 == 1){Tp = 15;}
}
void ConfiguraUSART(void){
TRISC = 0x8F;
PORTC = 0x00;
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 64);
}

De antemano se agradece cualquier ayuda que me puedan brindar
« Última modificación: 07 de Febrero de 2012, 12:12:15 por kordrak »

Desconectado kordrak

  • PIC10
  • *
  • Mensajes: 17
Re: Duda configuracion puerto + problema desconocido :S
« Respuesta #1 en: 07 de Febrero de 2012, 12:18:46 »
logre salir del loop, borrando una redundancia que se estaba produciendo, estaba itnentando poner en cero algo que ya estaba en cero.
 Pero el delay sigue sin funcionar, quizas tenga que ver con las interrupciones que estoy usando?, estas funcionaban bien antes de incluir el dip

las interrupciones las estoy usando para que se apague y desactive un pulsador pasados 2 minutos(funcionaban antes de incluir el dip, ahora no hacen nada D:)

Desconectado kordrak

  • PIC10
  • *
  • Mensajes: 17
Re: Duda configuracion puerto + problema desconocido :S
« Respuesta #2 en: 07 de Febrero de 2012, 13:04:34 »
sigo con las pruebas.. comente el comando que apaga el rele me di cuenta que este no es el causante de mi problema, osea.. nunca se esta ejecutando esa linea, sin embargo el rele se esta desactivando de todas maneras.. creo que el pic se esta reiniciando de alguna manera cada vez que presiono el pulsador

osea que el problema deberia estar entre estas lineas .. creo.. :S
Código: [Seleccionar]
PORTBbits.RB1 = 1; // Activa Rele
PORTBbits.RB0 = 0; // Apaga Led
switch(Tp){

realice cambios al programa, asi quedo desde el main hasta la funcion procesar pulsador

Código: [Seleccionar]
void main(void){
TRISA = 0xFF; // Puerto A como entrada
TRISB = 0x08; // Puerto B Salidas menos RB3(Pulsador)
PORTB = 0x00;
SET_DIR();
ConfiguraUSART();
SET_TP();
while(1){
if(DataRdyUSART()){
while(BusyUSART());
dato = ReadUSART();
}
ProcesarUSART(dato);
ProcesarPulsador(Tp);
}
}

void ProcesarUSART(unsigned char dato){
if(dato == ACTIVA){
RCONbits.IPEN=0;     // Deshabilitamos Prioridades
INTCONbits.PEIE=1;   // Habilitamos interrupcion de perifericos.-
INTCONbits.GIE=1;    // Habilitamos interrupcion Global.
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_64);
WriteTimer0(26473); // 1000.012 ms
estado = 1;
minutos = 0;
segundos = 0;
}
else if(dato == DESACTIVA){
estado = 0;
}
}

void ProcesarPulsador(unsigned char Tp){
if(estado==1){
PORTBbits.RB0 = 1;
if(PORTBbits.RB3 == 1){
estado = 0;
PORTBbits.RB1 = 1; // Activa Rele
PORTBbits.RB0 = 0; // Apaga Led
switch(Tp){
case 0:
Delay10KTCYx(125); break;//500 ms

case 1:
Delay10KTCYx(250); break;//1 segundo

case 2:
Delay10KTCYx(250); Delay10KTCYx(250); break;

case 3:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 4:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 5:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 6:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); break;

case 7:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); break;

case 8:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 9:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 10 :
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 11:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); break;

case 12:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); break;

case 13:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 14:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

case 15:
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250);
Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); Delay10KTCYx(250); break;

}
PORTBbits.RB1 = 0;/*RELE*/
}

}
else if(estado==0){
PORTBbits.RB0 = 0;
}
}

se aceptan comentarios y teorias sobre lo que podria estar fallando

Con el codigo actual,
Al llegar el mensaje que activa, se enciende el led indicador de estado, al presionar el pulsador, el rele envia un pulso a penas visible por una ampolleta de 220V(la luz deberia quedarse encendida x segundos dependiendo de la lectura del PORTC y luego apagarse)
y vuelve a su estado de espera por un nuevo comando


 

anything