miércoles, 2 de septiembre de 2009


El siguiente es un circuito que me resulto sumamente util en el aprendizaje de muchas de los perifericos de los PIC18F , como por ejemplo UART , ADC (de 10 bits en el caso del 18f2550 usado aqui) y un poco de USB puesto que en el implemente el bootloader con el que Microchip precarga su kit de desarrollo llamado PICDEM FS USB DEMONSTRATION KIT (haciendo unas pocas modificaciones).

En esta ocasion voy a describir una aplicacion realizada en visual basic que primero se comunica con la UART del micro a traves del control MSCOMM , y luego, envia periodicamente un caracter, que al ser recibido por el micro, este lee su ADC y regresa 2 bytes conteniendo los 10 bits de la conversion.

Este circuito luce (y de hecho es) simple, pero representa una muy buena herramienta didactica para quienes quieren iniciarse en la programacion en C de los PIC de la Familia 18F de Microchip y como base para el prototipado de alguna idea profesional (Datalogger o control de Leds por ejemplo) .


La placa esta basada en el PIC18F2550 de Microchip, como se ve en la ilustracion, practicamante todos los pines estan disponibles excepto los de la UART y usb,
hay que señalar que el circuito necesita 5 vdc para alimentaicion y que esta NO la toma del puerto USB (se use o no) , esta pensado para fabricarse "a mano" por que es de una cara y todos los componentes son "trouhg hole", con unos cuantos puentes por la cara de arriba, si alguien se interesa me puede enviar un mail y le mando el pdf por correo para que lo fabrique.

El firmware del micro esta escrito en C , use en compilador C18 de Microchip, mientras que el de la PC esta en VB (visual basic).
El PIC revisa por poleo si acaso recibe un caracter 'c' o 'C' Mayuscula, de ser asi lee su ADC y regresa dos bytes con la conversion, el codigo es muy muy corto (considerando que el C nos facilita bastante la codificacion comparado en el codigo que se requeriria en ensamblador), aqui esta:

el oscilador interno es de 8 Mhz y en este caso el ciclo de instruccion toma (1/8M) * 4 0 sea: medio microsegundo:
en este caso conecte el pin central de un potenciometro al pin RAO del pic y los extremos a 5vdc y tierra respectivamente:
//Este programa configura un p18f2550
//para trabajar con el oscilador interno,
//lee una señal analogica por el
//pin RA0 , utiliza los 10 bits de la conversion
//y despliega por la uart (9600 baudios) el valor en formato
//legible ASCII


#pragma config PLLDIV=1
#pragma config CPUDIV=OSC1_PLL2
#pragma config MCLRE = ON
#pragma config WDT = OFF
#pragma config PBADEN = ON
#pragma config IESO = ON
#pragma config LVP=OFF
#pragma config FOSC = INTOSCIO_EC
//#pragma config FOSC = HS


#include
#include
#include
#include

#define Led1 PORTBbits.RB0
#define Led1_On() Led1 = 1
#define Led1_Off() Led1 = 0
#define Led1_Toggle() Led1 = !Led1


void main(void)
{

unsigned char c,valueADC_h,valueADC_l;

OSCCON=0XF2;
ADCON1 = 0x0F;
CMCON = 0X07;
TRISA = 0xFF;
TRISB = 0x00;

ADCON0=0X81;
ADCON1=0X4E;
PORTB=0x03;
//while(!OSCCONbits.OSTS); //PRIMARY OSCILATOR IS RUNING
while(!OSCCONbits.IOFS); //INTOSC FREC IS STABLE


OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_OFF &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,
51 );
putrsUSART("\r\nINTERFACING WITH VISUAL BASIC\r\n");

while(4){
if(PIR1bits.RCIF){
c=RCREG;
if(c=='c' || c=='C'){
ADCON0bits.GO=1;
while(ADCON0bits.DONE==1);
valueADC_h = ADRESH;
valueADC_l = (ADRESL&0XC0)>>6;
WriteUSART( valueADC_h );
//Delay1KTCYx(100); // 50ms
WriteUSART( valueADC_l );
//putrsUSART("\r\n");
}
if(c=='1')
Led1_Toggle();
}
}
}





























VISUAL BASIC : FORMULARIO:















CODIGO. este codigo es util como referencia, esta probado y funciona bien, pero no maneja errores de conexion con el puerto serie ni mucho menos. Esta bien para aprender.

******************************


Private Sub Form_Load()
' el codigo es deficiente pero muy util si lo que se quiere es aprender
' el timer va a enviar cada 80 ms un caracteral micro
' el PIC RESPONDERA con 2 bytes (de la conversion)
'cuando se envie el caracter '1' al micro este va a encender o apagar
'un led conectado a RB0
'el scroll bar sirve para ajustar un SET POINT que al ser rebasado
' se emite un beep de la PC y cambia el color de un circulo (lmp1)
'RECUERDE AJUSTAR EL NUMERO DE PUERTO AL QUE CONECTA EL CIRCUITO DEL MICRO
'en este caso es 3 pero puede cambiar de acuerdo a su PC!!

tmr1.Enabled = False
tmr1.Interval = 80
counter = 0
lmp1.FillColor = &HFF00&
MSComm1.InBufferCount = 0 'reset bufer de recepcion
MSComm1.InBufferSize = 30
MSComm1.InputMode = comInputModeText
MSComm1.InputLen = 0 ' El valor 0 hace que se lea todo el buffer
MSComm1.RThreshold = 2 ' al recibir uno o mas caracteres se generará el evento OnComm
MSComm1.SThreshold = 1 ' al enviar uno o mas caracteres se generará el evento OnComm

End Sub


Private Sub btnGo_Click()
If tmr1.Enabled = True Then
GoTo Salir
Else
counter = 1
tmr1.Enabled = True
MSComm1.CommPort = 3
MSComm1.Settings = "9600,N,8,1"
lmp1.FillColor = &HFF&
MSComm1.PortOpen = True
End If
Salir:
End Sub
Private Sub MSComm1_OnComm()
Dim buffer As Variant
Dim adcValue As Integer
Dim adc_string As String
Dim StrLen As Long, I As Long

If MSComm1.CommEvent = comEvReceive Then
adc_string = MSComm1.Input
StrLen = Len(adc_string) ' 2 caracteres
adcValue = 0
'Mid devuelve una cadena que a su vez contiene un número especificado de caracteres de una cadena.
adcValue = (Asc(Mid(adc_string, 1, 1))) * 4
adcValue = adcValue + Asc(Mid(adc_string, 2, 1))
prb1.Value = adcValue
txt2.Text = adcValue

If prb1.Value <= prb2.Value Then
lmp1.FillColor = &HFF00&
Else
lmp1.FillColor = &HFF&
Beep
End If





MSComm1.InBufferCount = 0
End If


End Sub

Private Sub ProgressBar1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)

End Sub

Private Sub Picture1_Click()
Dim led1On As Variant

led1On = "1"
MSComm1.Output = led1On

End Sub

Private Sub tmr1_Timer()
Dim texto_salida As Variant
MSComm1.InBufferCount = 0
texto_salida = "c"
MSComm1.Output = texto_salida
End Sub

Private Sub vscBar_Change()
'txtVal.Text = vscBar.Value
prb2.Value = vscBar.Value
End Sub

******************************
espero sea util.
javierzavalaponce@gmail.com

No hay comentarios:

Publicar un comentario