Hola a todos.
He estado intentando hacer funcionar un PIC24FJ128GA010 y un monedero de la marca mei CF 7000.
El monedero utiliza un protocolo estandarizado para mas maquinas "vending" (de refrescos, papas fritas, dulces, etc.), el cual es MDB/ICP, se puede encontrar el datasheet del protocolo en la pagina siguiente:
www.vending.org dentro de la pestaña de "Technology".
He estado leyendo el protocolo y para su funcionamiento es necearia una interfaz de hardware, en donde en las hojas del datasheet te dan un esquemático de ejemplo, el cual he estado probando estos dias. Ademas el protocolo es a 9600 bps NRZ con 9 bits de datos 1 de start y uno de stop.
Lo que me encuentro probando es la interfaz que te proponen en las hojas de datos con el UART del PIC24F, pero he tenido muchisimas dudas respecto a si lo estoy haciendo correctamente, ya que aún leyendo las hojas de datos se me hace algo complejo.
A continuacion comparto mi codigo para pruebas del PIC24F usando el modulo UART en 9-bits de datos. Basicamente en el while(1) estoy haciendo un poll de los pines RX y TX. Transmito las "WORDs" 0x108 3 veces, en donde se supone q es el comando para que el monedero haga un Reset de ahi leo el registro U1RxREG y lo intento desplegar en unos LEDs conectados al puerto B.
#include "p24fj128ga010.h"
#include "uart.h"
#include "stdlib.h"
#include "string.h"
#define FCY 4000000
#include "libpic30.h"
#define XTFREQ 8000000
#define FCY XTFREQ/2
#define BAUDRATE 9600
#define BRGVAL (((FCY/BAUDRATE)/16)-1)
_CONFIG2(FNOSC_FRC & POSCMOD_NONE);
void UART_Init (void);
int main (void);
void UART_Init (void)
{
CloseUART1();
U1MODEbits.UEN0 = 0;
U1MODEbits.UEN1 = 0;
U1MODEbits.BRGH = 0;
U1STAbits.UTXISEL1 = 0;
U1STAbits.UTXISEL0 = 0;
U1STAbits.UTXEN = 1;
U1STAbits.URXISEL1 = 0;
U1STAbits.URXISEL0 = 0;
U1MODEbits.PDSEL1 = 1;
U1MODEbits.PDSEL0 = 1;
U1STAbits.ADDEN = 1;
U1BRG = BRGVAL;
U1MODEbits.UARTEN = 1 ;
}
char recibeDato()
{
WORD dato;
if(!U1STAbits.OERR & !U1STAbits.FERR & !U1STAbits.PERR)
{
while(!U1STAbits.RIDLE);
dato=U1RXREG;
IFS0bits.U1RXIF = 0;
}
else
{
U1STAbits.OERR = 0;
U1STAbits.FERR = 0;
U1STAbits.PERR = 0;
}
return dato;
}
void mandaDato(char dato)
{
__delay_us(100);
while (!U1STAbits.TRMT);
U1TXREG = dato;
IFS0bits.U1TXIF = 0;
}
int main (void)
{
LATB = recibeDato();
mandaDato(0x108);
mandaDato(0x108);
mandaDato(0x108);
}
CloseUART1();
return 0;
}
Ahora mis pin Tx y RX los tengo como en el esquematico adjunto (proveniente de la hoja de datos del protocolo).
Pero pues al hacer todo esto ni recibo nada ni el monedero responde a mis comandos...
Espero alguien me pueda echar la mano en este proyecto.
Gracias.