/* ============================================================================== */
/* == <- INCLUCIONES -> == */
/* ============================================================================== */
#include "GenericTypeDefs.h" // Define todos los tipos de variables
#include "Compiler.h"
#include "usb_config.h"
#include "usb_device.h"
#include "usb.h"
#include "usb_function_cdc.h"
#include "HardwareProfile.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <p18F4550.h>
#include <delays.h>
/* ============================================================================== */
/* == <- CONFIGURACION -> == */
/* ============================================================================== */
/* == Es igual al Bootloader original de la MCE Starter Kit y no se carga == */
/* ============================================================================== */
#define GetSystemClock() 48000000
/* ============================================================================== */
/* == <- V A R I A B L E S -> == */
/* ============================================================================== */
#pragma udata
char LeerBuffer[64]; // Dato que llega del PC
char EscribirBuffer[64]; // Para devolver num bits + 1
BYTE numBytesRead; // Para devolver num bits + 1
/* ============================================================================== */
/* == <- P R O T O T I P O S P R I V A D O S -> == */
/* ============================================================================== */
void ProcessIO(void);
void USBDeviceTasks(void);
void InitUSART(void);
/* ============================================================================== */
/* == <- REMAPEADO Para Bootloader original de la MCE Starter Kit -> == */
/* ============================================================================== */
#define REMAPPED_RESET_VECTOR_ADDRESS 0x800
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x808
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x818
extern void _startup (void); // Ver c018i.c en directorio del C18
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
void _reset (void)
{
_asm goto _startup _endasm
}
#pragma code HIGH_INTERRUPT_VECTOR = 0x808 //0x08 corregido por Alfredo.
void High_ISR (void)
{
_asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
}
#pragma code LOW_INTERRUPT_VECTOR = 0x818 //0x18 corregido por Alfredo.
void Low_ISR (void)
{
_asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
}
/* ============================================================================== */
/* == <- D E C L A R A C I O N E S -> == */
/* ============================================================================== */
#pragma code
void main(void)
{ // INICIALIZA EL SISTEMA
TRISAbits.TRISA1 = 1; // Entrada Detecta alimentación externa
TRISAbits.TRISA2 = 1; // Entrada Detecta alimentación USB
TRISD = 0; // Puerto D inicializado como salida
USBDeviceInit(); // usb_device.c. Initializes USB module SFRs and firmware variables to known states.
InitUSART(); // Inicializa USART
while(1)
{
USBDeviceTasks();
if(mUSBUSARTIsTxTrfReady()) // Si el canal de transmisión/ recepción está libre
if(getsUSBUSART(LeerBuffer,4)) // Lee lo enviado por la PC a travez del USB
{
switch(LeerBuffer[0]) // Lee el primer caracter, que es el código de la tarea
{
case 97: PORTD=0x0F; break;
case 112: PORTD=0xFF; break;
case 98:
if(mUSBUSARTIsTxTrfReady()) // Verifica que pueda enviar
{putsUSBUSART('a');} // Envía la cadena
}
}
ProcessIO(); // Está aquí
}
}
/* ============================================================================== */
/* == <- CUERPO DE LOS PROTOTIPOS -> == */
/* ============================================================================== */
void ProcessIO(void)
{
if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
CDCTxService();
}
void USBCBSuspend(void)
{
// Rellenar
}
#if 0
void __attribute__ ((interrupt)) _USB1Interrupt(void)
{
#if !defined(self_powered)
if(U1OTGIRbits.ACTVIF)
{
LATAbits.LATA7 = 1;
IEC5bits.USB1IE = 0;
U1OTGIEbits.ACTVIE = 0;
IFS5bits.USB1IF = 0;
//USBClearInterruptFlag(USBActivityIFReg,USBActivityIFBitNum);
USBClearInterruptFlag(USBIdleIFReg,USBIdleIFBitNum);
//USBSuspendControl = 0;
LATAbits.LATA7 = 0;
}
#endif
}
#endif
void USBCBWakeFromSuspend(void)
{
//Rellenar
}
void USBCB_SOF_Handler(void)
{
// No need to clear UIRbits.SOFIF to 0 here.
// Callback caller is already doing that.
}
void USBCBErrorHandler(void)
{
//Rellenar
}
void USBCBCheckOtherReq(void)
{
USBCheckCDCRequest();
}
void USBCBStdSetDscHandler(void)
{
// Must claim session ownership if supporting this request
}
void USBCBInitEP(void)
{
CDCInitEP();
}
void USBCBSendResume(void)
{
static WORD delay_count;
USBResumeControl = 1; // Start RESUME signaling
delay_count = 1800U; // Set RESUME line for 1-13 ms
do
{
delay_count--;
}while(delay_count);
USBResumeControl = 0;
}
#if defined(ENABLE_EP0_DATA_RECEIVED_CALLBACK)
void USBCBEP0DataReceived(void)
{
}
#endif
void InitUSART(void)
{
TXSTAbits.SYNC = 0; // No es sincrónica la conexión
TXSTAbits.BRGH = 0; // Es baja velocidad
TXSTAbits.TXEN = 1; // Habilita la transmisión
RCSTAbits.SPEN = 1; // Configura los pines RX en RC7 y Tx en RC6
RCSTAbits.CREN = 1; // Habilita recepción contínua
BAUDCONbits.BRG16 = 0; // Transmitimos en 8 bits.
BAUDCONbits.ABDEN = 0; // Auto Baud Detect es no
SPBRG = 77; // (48000000/64/9600)-1 = 77.12 para SYNC=0 BRG16=0 BRGH=0(da 64)9600Baudios
TRISCbits.TRISC6 = 0; // RC6 es salida y corresponde a Tx
TRISCbits.TRISC7 = 1; // RC7 es entrada y corresponde a Rx
}
/** Fin de archivo main.c **/