Autor Tema: No puedo encender PIN_B5 o PIN_A5  (Leído 1413 veces)

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

Desconectado claudiovega

  • PIC10
  • *
  • Mensajes: 31
No puedo encender PIN_B5 o PIN_A5
« en: 18 de Noviembre de 2016, 17:35:14 »
Al recibir un comando por RS232 debo encender 3 pines, uno de esos 3 es siempre B5 o A5, pero estos no se encienden en ningun caso.
Aquí el código:
Código: [Seleccionar]
#include <18F2550.h>
#include <stdlib.h>
#use delay(internal=4000000)
#fuses INTRC_IO, NOWDT, PUT, BROWNOUT, MCLR, NOLVP
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM=XBEE, parity=N, bits=8)
#define CL 17
//variables
int16 sum = 0, chs = 0;
int1 newcommand = 0;
int16 k = 0, pic = 0, picsaved = 0;
int16 op1 = 0, op2 = 0, op3 = 0, op4 = 0;
char p, command[CL] = "", term[2] = "";
//interrupcion por usart del pic
#INT_RDA
void usart_modem(void)

p = fgetc(XBEE);
if(p == '#') {
newcommand = 1;
command[k] = '\0';
k = 0;
}else if(p){
command[k] = p;
k++;
}
}
//verifica si el comando recibido es válido
int1 is_valid(){
sum = pic+op1+op2+op3+op4;
if(sum == chs){
return 1;
}else{
return 0;
}
}
/********* Programa Principal *********/
void main(void)
{
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(TRUE)
{
if(newcommand){
newcommand = 0;
picsaved = 127;
strcpy(term, "|");
pic = atoi(strtok(command, term));
op1 = atoi(strtok(0, term));
op2 = atoi(strtok(0, term));
op3 = atoi(strtok(0, term));
op4 = atoi(strtok(0, term));
chs = atoi(strtok(0, term));
if(is_valid())
{
if(pic == picsaved)
{
if(op1 == 1){
output_bit(PIN_B5, 1);
output_bit(PIN_B4, 1);
output_bit(PIN_C2, 1);
}else{
output_bit(PIN_B5, 0);
output_bit(PIN_B4, 0);
output_bit(PIN_C2, 0);
}
if(op2 == 1){
output_bit(PIN_B5, 1);
output_bit(PIN_B2, 1);
output_bit(PIN_C1, 1);
}else{
output_bit(PIN_B5, 0);
output_bit(PIN_B2, 0);
output_bit(PIN_C1, 0);
}
if(op3 == 1){
output_bit(PIN_A5, 1);
output_bit(PIN_B1, 1);
output_bit(PIN_A2, 1);
}else{
output_bit(PIN_A5, 0);
output_bit(PIN_B1, 0);
output_bit(PIN_A2, 0);
}
if(op4 == 1){
output_bit(PIN_A5, 1);
output_bit(PIN_B0, 1);
output_bit(PIN_A1, 1);
}else{
output_bit(PIN_A5, 0);
output_bit(PIN_B0, 0);
output_bit(PIN_A1, 0);
}
printf("EQUA");
}
}
}
}
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo encender PIN_B5 o PIN_A5
« Respuesta #1 en: 18 de Noviembre de 2016, 19:31:49 »
Probaste ponerlos fuera de cualquier if ?

Asi saber si el problema es configuracion de los puertos o del puerto en si, o si es problema de la recepcion de la UART

Desconectado claudiovega

  • PIC10
  • *
  • Mensajes: 31
Re:No puedo encender PIN_B5 o PIN_A5
« Respuesta #2 en: 18 de Noviembre de 2016, 20:17:02 »
Si, fuera del if funciona. Ademas, apenas recibe algo por la UART se apaga, aun cuando lo dejo prendido antes del while y no entre al if.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo encender PIN_B5 o PIN_A5
« Respuesta #3 en: 19 de Noviembre de 2016, 02:40:42 »
Citar
Si, fuera del if funciona. Ademas, apenas recibe algo por la UART se apaga, aun cuando lo dejo prendido antes del while y no entre al if.

Bueno eso descarta una mala configuracion del puerto, y que los puertos funcionen correctamente.

Ahora lo demas me parece algo raro. En tu codigo tenes:

   enable_interrupts(INT_TIMER1);

Lo cual no usas, y por ende no tenes funcion para eso, deberias quitarlo.

Tambien probaria dejar dentro del if(newcommand) solo algo para encender leds ( que haga un toggle a un led ), sin importar lo que se reciba.

Y ahi te aseguras que si recibe una trama, entra correctamente al if. Si funciona hasta aca, entonces quiere decir que el problema esta en el tratamiento de command.

Desconectado claudiovega

  • PIC10
  • *
  • Mensajes: 31
Re:No puedo encender PIN_B5 o PIN_A5
« Respuesta #4 en: 21 de Noviembre de 2016, 09:16:00 »
Gracias Killer, me explique mal. El programa funciona correctamente, quiero decir: recibe el comando, lo procesa, entra a los if (a todos de ellos, según el comando recibido) y activa 2 de los 3 pines que deseo activar en cada caso. Esos pines que no activa son: B5 y A5. Es mas, si dejo encendidos esos pines, fuera del while o incluso dentro del if newcommand, siempre que recibo por la UART el pin se apaga.
Sé que el PIN B5 se usa para la programación con "bajos voltajes", por ello uso NOVLP. Pero quizá tenga otro problema con algún FUSE o alguna instrucción necesaria para que B5 no trabaje en "bajos voltajes".
También quité la instrucción enable_interrupts(INT_TIMER1) que estaba demás.
Me faltó agregar que este comportamiento ocurre incluso en el simulador proteus (software).
Si uso otro pin (B7 en lugar de B5), funciona correctamente.
« Última modificación: 21 de Noviembre de 2016, 09:30:06 por claudiovega »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo encender PIN_B5 o PIN_A5
« Respuesta #5 en: 21 de Noviembre de 2016, 11:41:43 »
Por lo que me decis:

- Recepcion y discriminacion del resultado funciona correctamente
- Los pines esos fuera del if funcionan correctamente ( Si fuera un FUSES esto no ocurriria )
- Entra correctamente a los if
- La programacion me parece correcta

Lo unico que me queda por pensar es que es un problema del Proteus.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re:No puedo encender PIN_B5 o PIN_A5
« Respuesta #6 en: 21 de Noviembre de 2016, 15:17:05 »
Yo usaría:
Código: C
  1. #use fast_io(porta)
  2. #use fast_io(portb)
Con sus correspondientes
Código: C
  1. set_tris_... ;
para descartar que el ccs no esté agregando algunas líneas que apaguen esos pines.
Saludos
« Última modificación: 21 de Noviembre de 2016, 15:23:36 por pablomanieri »

Desconectado claudiovega

  • PIC10
  • *
  • Mensajes: 31
Re:No puedo encender PIN_B5 o PIN_A5
« Respuesta #7 en: 21 de Noviembre de 2016, 16:11:01 »
Gracias Pablo.
Agregué estas instrucciones:
Código: [Seleccionar]

//En declaraciones:

#use fast_io(A)
#use fast_io(B)

//En main:

set_tris_a(0b000000);
set_tris_b(0b00000000);


Pero sigue igual, no resultó.


 

anything