Holaaaa...
Estoy realizando un programa en C18 con el pic 18f2550, trata de realizar una comunicación serial RS-232 a travez de interrupciones; el programa consta en el control de dos leds por medio del puerto B.
El problema es que cuando simulo en proteus con el MAX 232 y la hyper terminal, relativamente se imprimen los comentarios.
Pero al mandar un dígito desde la hyper terminal para realizar una sentencia de control no se digita nada,
y no entiendo.
Pido de favor que alguien pueda ayudarme en mi programa llevo varias semanas con este dolor de cabeza.
Les dejo el programa para que puedan analizar y colaborar para esta causa.
AQUI LES DEJO UNA IMAGEN DE LA SIMULACION EN PROTEUS.
Estoy realizando un programa en C18 con el pic 18f2550, trata de realizar una comunicación serial RS-232 a travez de interrupciones; el programa consta en el control de dos leds por medio del puerto B.
El problema es que cuando simulo en proteus con el MAX 232 y la hyper terminal, relativamente se imprimen los comentarios.
Pero al mandar un dígito desde la hyper terminal para realizar una sentencia de control no se digita nada,
y no entiendo.
Pido de favor que alguien pueda ayudarme en mi programa llevo varias semanas con este dolor de cabeza.
Les dejo el programa para que puedan analizar y colaborar para esta causa.
AQUI LES DEJO UNA IMAGEN DE LA SIMULACION EN PROTEUS.
Código:
#include <p18f2550.h>
#include <usart.h>
#include <stdio.h>
#include <stdlib.h>
#include <portb.h>
#include <delays.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config PBADEN = OFF
#pragma config MCLRE = ON
#define BAUD = 9600
#define OSCCON = 4000000
volatile char Dato = 0, recibe = 0;
void ISRRecepcion(void);
#pragma code Interrupcion = 0x008
void VectorInterrupcion(void){
_asm goto
ISRRecepcion
_endasm
}
#pragma code //se cierra la seccion
#pragma interrupt ISRRecepcion
void ISRRecepcion(void){
if(PIR1bits.RCIF==1){
Dato=getcUSART();
recibe = 1;
PIR1bits.RCIF=0;
PORTB = ~PORTB;
}
}
void main (void)
{
TRISA=255; //puerto a entradas
OpenRB0INT(PORTB_CHANGE_INT_ON & FALLING_EDGE_INT & PORTB_PULLUPS_OFF);
//USART configuration:no interrupt, 8 N 1 async. mode,baud-rate=9600
OpenUSART(USART_TX_INT_OFF & //Disable Interrupts
USART_RX_INT_ON & //----------------
USART_ASYNCH_MODE & //Modo asincronico
USART_EIGHT_BIT & //8 bit
USART_CONT_RX & //resepcion continua
USART_BRGH_HIGH,
26); //FOSC / (16 * (spbrg + 1));
baudUSART( BAUD_IDLE_CLK_HIGH &
BAUD_8_BIT_RATE &
BAUD_WAKEUP_OFF &
BAUD_AUTO_OFF);
RCONbits.IPEN = 0; //Deshabilitacion de los niveles de prioridad de las interrupciones
INTCONbits.GIE = 1; //Habilitamos global de las interrupciones
recibe = 0;
TRISB=0b10000000;
/* SECUENCIA DE COMANDOS QUE SE VISUALIZAN EN LA PANTALLA DE LA HYPERTERMINAL */
printf("COMUNICACION LISTA SERIAL RS-232 \r");
Delay10KTCYx(250);
printf("SELECCIONAR DIRECCION DEL MOTOR:\r");
while(BusyUSART());
while(!DataRdyUSART());
while (1){
switch (Dato){
case'a':
PORTB=0b10011000;
Delay10KTCYx(100);
putrsUSART("DIRECCION DEL MOTOR HACIA ADELANTE\r\n");
break;
case'b':
PORTB=0b10010000;
Delay10KTCYx(100);
putrsUSART("DIRECCION DEL MOTOR A LA IZQUIERDA\r\n");
break;
case'c':
PORTB=0b10001000;
Delay10KTCYx(100);
putrsUSART("DIRECCION DEL MOTOR A LA DERECHA\r\n");
break;
case'd':
PORTB=0b10000000;
putrsUSART("STOP\r\n");
Delay10KTCYx(100);
break;
}
}
}
Adjuntos
Última edición: