Ejemplo: Test UART PIC16F873 en CCS

14 05 2008

Voy a explicar un ejemplo de un programa para un sencillo test de la UART (RS232) del PIC 16f873, programado en CCS C. En este programa, se envía una frase al PC y después se pasa a hacer eco de lo enviado por el PC al PIC.

Bien, para hacer este programa se ha usado la última versión del compilador de CCS C llamado PCW. Gracias al Project Wizard, se ha configurado el proyecto para lo siguiente:

  • Cristal de 4Mhz, XT
  • Power Up Timer, PWRT (retrasa el inicio del programa desde que se enciende el PIC para que el clock se estabilice)
  • Reset when Brown Out Detected, BODEN en ic-prog o BROWNOUT en PCW (resetea el PIC si ve que la alimentación baja hasta casi 0V)
  • Se desactiva Low Voltage Programming, NOLVP (así se podrá usar RB3)
  • Se activa RS232, sin paridad, 9600 baudios y siendo Transmit C6 y Receive C7
  • Se desactiva WDT, para que el PIC no se reinicie constantemente
  • Se activa la interrupción de RS232 receive data available (importante, esta interrupción salta cuando un byte está disponible para ser leído. Si no borramos ese byte haciendo getc(), volverá a saltar la interrupción porque no se habrá vaciado el buffer y lógicamente seguirá habiendo data available)
  • Se configuran los I/O Pins adecuadamente
  • Se setea tris_b con set_tris_b, ya que aunque el C se hace automáticamente, el b necesita ser seteado.

Para grabarlo se ha usado ic-prog. Los fuses serán: PWRT (PUT en CCS) y BODEN (BROWNOUT en CCS), además de XT.

Descargar Source

Aquí está el código fuente:

TestLedsNoWDT.c

#include "C:\Archivos de programa\PICCNUEV\Projects\TestLedsNoWDT.h"
#int_RDA
void RDA_isr()
{
port_b=0b00000010;
delay_ms(1000);
putc(getc());
port_b=0b00000000;
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
set_tris_b(0b00000000);
// TODO: USER CODE!!
port_b=0b11111111;
delay_ms(1000);
port_b=0b11111101;
printf("hola");
while(true){
port_b=0b11111101;
}
}

TestLedsNoWDT.h

#include
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#byte port_B=6
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

About these ads

Acciones

Information

4 responses

15 05 2008
Daniel García

Bueno el programa de java de TestRS232 ha sufrido un arreglillo, ahora ya recibe correctamente y limpia el buffer de lectura cuando pides mostrar lo leído. Pero hay un nuevo problema que llevo un rato intentando averiguar la solucion y me es imposible: cómo enviar un byte no-ascii como 11100000 desde el PIC al PC.
Si se pone printf(“%c”,byte); no envía nada. Si se pone printf(“%u”,byte) envía el byte del 2 en el código ascii, es decir, 00110010.

!·/”((!)”·(!!!!!!!!!!!!!!!!!!!!!!

16 05 2008
Daniel García

Bueno arreglado, no entiendo porque pero si pones un while(true){} al final del código, el PIC no hace bien lo último que le mandas.

21 10 2010
yumbrellasb

zzzz

15 12 2012
guide

Have you ever thought about creating an e-book or guest authoring on
other websites? I have a blog based on the same ideas you discuss
and would really like to have you share some stories/information.
I know my viewers would appreciate your work. If you are even remotely interested, feel free to
shoot me an e mail.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: