OBJETIVOS
Utilizar PIC para la adquisición de datos analógicos y conversión a digital
Transmisión por puerto serie de los datos
Posterior análisis de datos en el PC
MEDIOS A UTILIZAR
Microchip 16F873
convertidor A/D
controlador Puerto Serie
PCB diseñado para alojar el 16F873 y módulos requeridos
código diseñado para conseguir los objetivos, PC y conexiones
PIC 16F873
CPU RISC
juego de 35 instrucciones
28 pins
FLASH: 8K x 14 words
RAM: 368 x 8 bytes
EEPROM: 256 x 8 bytes
Conversor A/D de 10 bits multicanal
Puerto Serie multifuncional
PIC 16F873 – Conversor A/D
Hasta 5 canales de entrada
Conversión por método de aproximaciones sucesivas
10 bits de resolución
Voltaje alto y bajo de referencia seleccionable por software
Posibilidad de ejecución en modo SLEEP
PIC 16F873 – Conversor A/D
4 registros básicos:
2 registros configuración:
ADCON0
ADCON1
2 registros datos: ADRESH y ADRESL
ADQUISICION DE DATOS:
1) Programación del conversor A/D:
Programar Frecuencia de Adquisición (ADCON0 – bits ADCS0 y ADCS1): Fosc/2 (00) Fosc/8 (01) Fosc/32 (10) FRC (11)
Seleccionar canal de entrada (ADCON0 – bits CHS0, CHS1, CHS2)
Canal 0 (000) … Canal 7 (111)
PIC 16F873 – Conversor A/D
Configurar Pines, voltaje referencia, … (ADCON1 – bits PCFG0, PCFG1, PCFG2, PCFG3):
Configurar bit de Resultado (ADCON1 – bit ADFM )
Habilitar el modulo conversor (ADCON0 – bit ADON )
PIC 16F873 – Conversor A/D
PIC 16F873 – Conversor A/D
2) Para cada dato a adquirir:
Empezar la conversion (ADCON0 – bit GO-DONE)
Comprobar la conversion:
por polling (comprobar ADCON0 – bit GO-DONE)
PIC 16F873 – Interfaz Serie
Posibilidad de configuración para comunicación:
full-duplex asíncrona.
Sincrona como Master
Síncrona como Slave
Utilizaremos el modo asíncrono
PIC 16F873 – Interfaz Serie
MODO ASINCRONO:
codificación standard NRZ
formato standard de 8 bits ( configurable )
se transmite primero el bit LSB
paridad no soportada por HW pero puede calcularse por SW y almacenarse en bit 9
PIC 16F873 – Interfaz Serie
DIAGRAMA DEL BLOQUE DE TRANSMISION
PROGRAMACION:
1) Inicializar registro del Generador de baudios (SPBRG) y el bit de alta velocidad si necesario (BRGH)
PIC 16F873 – Interfaz Serie
PIC 16F873 – Interfaz Serie
2) Modo Asíncrono
Clear bit SYNC
3) Habilitar puerto serie
Set bit SPEN
4) Interrupciones habilitadas
Set bit TXIE
5) Si se quiere 9º bit de datos
Set bit TX9
PIC 16F873 – Interfaz Serie
6 ) Habilitar transmision
Set bit TXEN (habilita el bit TXIF)
7) Si se ha seleccionado 9º bit
Cargar bit en TX9D
8) Cargar el registro TXREG con los datos:
empieza automáticamente la transmisión
CODIGO PIC – MAIN
// Programa principal
main(){
// Configurar modulo AD
initialice_ad();
// Configurar comunicacion serie
serial_port_configure();
while(1){
//Empezar conversion
begin_conversion();
//mandar datos
send_data();
}
PROGRAMA PRINCIPAL
CODIGO PIC – INITIALICE_AD
initialice_ad(){
// Configuracion del modulo AD
//ADCON0 (bank 0)
//set_bit( ADCS0,1); // Frecuencia de adquisicion
//set_bit( ADCS1,0);
asm bsf ADCON0,ADCS0
asm bcf ADCON0,ADCS1
//set_bit( ADFM,0); // Canal de entrada
//set_bit( ADFM,0);
//set_bit( ADFM,0);
asm bcf ADCON0,CHS2
asm bcf ADCON0,CHS1
asm bcf ADCON0,CHS0
//ADCON1
//Pasamos al banco 1 (01)
asm bcf STATUS, RP1
asm bsf STATUS, RP0
//TRISA
asm bsf TRISA,7
// Configuracion de los pines
//set_bit( PCFG3,0);
//set_bit( PCFG2,0);
//set_bit( PCFG1,0);
//set_bit( PCFG0,1);
//Utilizar 0000 (V+ = Vdd; V- = Vss)
asm bcf ADCON1,PCFG3
asm bcf ADCON1,PCFG2
asm bcf ADCON1,PCFG1
asm bcf ADCON1,PCFG0
//set_bit( ADFM,1); // datos en los 10 bits de menos peso
asm bsf ADCON1,ADFM
// Finalmente Habilitamos modulo AD
//Pasamos al banco 0 (00)
asm bcf STATUS, RP0
asm bcf STATUS, RP1
//Habilitamos
asm bsf ADCON0, ADON }
CODIGO PIC – SERIAL_PORT
void serial_port_configure(){
//Pasamos al banco 1 (01)
asm bcf STATUS, RP1
asm bsf STATUS, RP0
//configure pins 6,7
asm bsf TRISC,6
asm bsf TRISC,7
// Baud generator (9600) on
//I suppose fosc=4Mhz
// fosc=4Mhz –> SPBRG=25
// fosc=20Mhz –> SPBRG=129
// y BRGH=1
asm movlw D'25'
asm movwf SPBRG
asm bsf TXSTA,BRGH
//asyncronous mode
asm bcf TXSTA,SYNC
//Serial port enable
//Pasamos al banco 0 (00)
asm bcf STATUS, RP1
asm bcf STATUS, RP0
asm bsf RCSTA,SPEN
//enable trasnmit
//Pasamos al banco 1 (01)
asm bcf STATUS, RP1
asm bsf STATUS, RP0
asm bsf TXSTA,TXEN
}
CODIGO PIC – BEGIN_CONVERSION
begin_conversion(){
//Pasamos al banco 0 (00)
asm bcf STATUS, RP0
asm bcf STATUS, RP1
//empezamos la conversion
asm bsf ADCON0, GO_DONE
//tenemos que esperar a que se haya acabado la conversion
//while (ADCON0 & 0x04) bit GO/DONE
//b=0x04;
asm movf ADCON0, W
asm movwf _b
while ((b & 0x04) == 0x04 ){
asm movf ADCON0, W
asm movwf _b
}
}
CODIGO PIC – SEND_DATA
void send_data(){
// load register with data
//Pasamos al banco 0 (00)
asm bcf STATUS, RP1
asm bcf STATUS, RP0
// Inicio de los datos
// transmitimos una "v" ( decimal ->118)
asm movlw D'118'
asm movwf TXREG
delay_ms(10);
//transmitimos primero el byte alto y después el bajo
//Pasamos al banco 0 (00)
asm bcf STATUS, RP1
asm bcf STATUS, RP0
asm movf ADRESH, W
asm movwf TXREG
//wait until transmitted
delay_ms(10);
//Pasamos al banco 1 (01)
asm bcf STATUS, RP1
asm bsf STATUS, RP0
asm movf ADRESL, W
//Pasamos al banco 0 (00)
asm bcf STATUS, RP1
asm bcf STATUS, RP0
asm movwf TXREG
//wait until transmitted
delay_ms(10);
}
CODIGO PC – PROGRAMA PRINCIPAL
void main(){
int i,j;
char recibido;
unsigned char alta,baja;
int dato;
int v_low, v_high;
Inicializa_Comunicaciones(1,9600);
printf("Introduce Referencia V- :");
scanf("%d",&v_low);
printf("Introduce Referencia V+ :");
scanf("%d",&v_high);
printf("introducida V- = %dn",v_low);
printf("introducida V+ = %dn",v_high);
if (v_low>v_high){
printf("ERROR: Valores incorrectosn");
return;
}
printf("Preparado para recibir datos…n");
while(1){
recibido = Recibe_un_caracter();
if (recibido == 'v'){
//Recibimos parte alta
alta = Recibe_un_caracter();
baja = Recibe_un_caracter();
dato = ((alta)