¡Saludos! Tengo una duda y quisiera saber si alguno podría ayudarme a resolver. Espero poder ser claro con mi duda.
No tiene mucho que inicié mi carrera en Ing. Electrónica y ya me han atrapado muchos temas y ramas de ésta . Una de ellas es la programación de embebidos; pero apenas me estoy iniciando y hay cosas que parece que aun no entiendo del todo bien.
Hace unas semanas se me ocurrió la idea de hacer una interfaz entre un control de NES y el PIC 16F887, me leí el funcionamiento del control de Nintendo (The NES Controller Handler) y medio base mi código al que habían hecho para un Arduino (NES Controller Interface with an Arduino UNO) y de un video de Youtube.
Pero a la hora de poner todo en marcha me doy cuenta que no entiendo del todo bien cómo funcionan varios registros, y entre ellos está el RCREG. Hasta donde yo entendí es el registro en el que se guardan los datos recibidos por el pin de recepción serial, y yo con esto en mente realicé mi código.
NOTA: Uso MPLAB X y el lenguaje C con el compilador XC8.
NOTA2: El integrado que esta dentro del control de NES es un shift register 4021.
El problema viene cuando este código pasado a Proteus no hace lo que debería hacer, y yo deduzco dos cosas:
1)Es posible que la sintaxis y la lógica que estoy usando es incorrecta
2) no entiendo el funcionamiento del registro RCREG.
Además, según Proteus, RCREG jamas adquiere un valor, no importa si yo inicializo RCREG como =0, en Proteus se lee como "\0".


¿Qué estoy haciendo mal? Así fueran 100 correcciones diferentes cada una de ellas me servirían de retroalimentación de una forma estupenda para seguir aprendiendo.
¿Alguna sugerencia?
¿Alguien ya hizo interfaz con un PIC usando este control?
Sí, noté que tengo un error en el return que está dentro del while y en TRISC que en vez de poner todos como entradas puse un 1 decimal. Pero además de eso el código en Proteus no funciona y RCREG sigue sin tener cambios aún con los datos enviados por el 4021.
No tiene mucho que inicié mi carrera en Ing. Electrónica y ya me han atrapado muchos temas y ramas de ésta . Una de ellas es la programación de embebidos; pero apenas me estoy iniciando y hay cosas que parece que aun no entiendo del todo bien.
Hace unas semanas se me ocurrió la idea de hacer una interfaz entre un control de NES y el PIC 16F887, me leí el funcionamiento del control de Nintendo (The NES Controller Handler) y medio base mi código al que habían hecho para un Arduino (NES Controller Interface with an Arduino UNO) y de un video de Youtube.
Pero a la hora de poner todo en marcha me doy cuenta que no entiendo del todo bien cómo funcionan varios registros, y entre ellos está el RCREG. Hasta donde yo entendí es el registro en el que se guardan los datos recibidos por el pin de recepción serial, y yo con esto en mente realicé mi código.
NOTA: Uso MPLAB X y el lenguaje C con el compilador XC8.
NOTA2: El integrado que esta dentro del control de NES es un shift register 4021.
C:
#pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = ON // Internal External Switchover bit (Internal/External Switchover mode is enabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = ON // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
#include <xc.h>
#define _XTAL_FREQ 8000000
void main(void) {
ANSEL=ANSELH=0x00;
TRISA=0x00;
TRISC=1;
PORTC=0x00;
PORTA=0x00;
//PORTD=0;
//TRISD=0;
/////////////////
OSCCON=0b01111110; //Pongo la frecuencia del oscilador en 8MHz
/////////////////
//INTCONbits.GIE=1; //Las interrupciones las quité mejor porque iba a manejar RCREG de manera
//INTCONbits.PEIE=1; //indirecta
//PIR1bits.RCIF=0;
//PIE1bits.RCIE=1;
////////////////
RCSTAbits.SPEN=1;
RCSTAbits.CREN=1;
TXSTAbits.SYNC=0;
///////////////
BAUDCTLbits.BRG16=0;
TXSTAbits.BRGH=0;
SPBRG=12; //según el datasheet este es el valor para el baudrate de 9600 si tengo 8MHz
//RCREG=0b00000000;
while(1){
//char data;
//char resultado;
//data=RCREG; //creo que esto no es necesario
int c=0,a=1,resultado=0;
__delay_us(12);
PORTAbits.RA0=1;
__delay_us(12);
PORTAbits.RA0=0;
__delay_us(6);
for(c=0;c<8;c++){
if(!RCREG) {resultado+=a;} //Con esto trato de leer cambios en RCREG por cada pulso de relog
a<<=1; //Si hay un botón o varios presionados, según la página que leí
PORTAbits.RA1=1; //cada uno de los 8 pulsos de relog leera uno a uno los 8 botones del control
__delay_us(6); //de esta manera la variable resultado tendría un valor correspondiente a lo que se haya presionado
PORTAbits.RA1=0; //el problema aquí es que presione o no algo, siempre entra en el if, por lo que la variable resultado termina con un valor de 255
__delay_us(6);
}
if(resultado==1) //después de los 8 pulsos aquí pienso poner varios if's de prueba
{ //según el botón que se presionó será el valor que tendrá resultado.
PORTAbits.RA3=1;
__delay_ms(2000);
PORTAbits.RA3=0;
__delay_ms(2000);
}
if(resultado==!1) //uso esto para ver si al no presionar nada el pin RA4 se activa(pero no sucede)
{
PORTAbits.RA4=1;
__delay_ms(5000);
PORTAbits.RA4=0;
}
return;
} }
El problema viene cuando este código pasado a Proteus no hace lo que debería hacer, y yo deduzco dos cosas:
1)Es posible que la sintaxis y la lógica que estoy usando es incorrecta
2) no entiendo el funcionamiento del registro RCREG.
Además, según Proteus, RCREG jamas adquiere un valor, no importa si yo inicializo RCREG como =0, en Proteus se lee como "\0".


¿Qué estoy haciendo mal? Así fueran 100 correcciones diferentes cada una de ellas me servirían de retroalimentación de una forma estupenda para seguir aprendiendo.
¿Alguna sugerencia?
¿Alguien ya hizo interfaz con un PIC usando este control?
Sí, noté que tengo un error en el return que está dentro del while y en TRISC que en vez de poner todos como entradas puse un 1 decimal. Pero además de eso el código en Proteus no funciona y RCREG sigue sin tener cambios aún con los datos enviados por el 4021.
Última edición por un moderador: