44245042 Tutorial de CCS

download 44245042 Tutorial de CCS

of 22

Transcript of 44245042 Tutorial de CCS

Tutorial de CCS Sintaxis de programaEstructura general: rs232_buffer.c Un programa se escribe con los siguientes cuatro elementos: - Comentarios - Directivas del pre-procesador ( #BYTE, #FUSES, etc.) - Definciones de datos - Definiciones de funciones Todo programa en C debe tener una funcin principal (main) que es el punto de partida de la ejecucin del progama. Comentarios: rs232_buffer.c Los comentarios pueden ir en cualquier parte del programa. Los caracteres entre /* y */ se ignoran al igual que los escritos despus de // hasta que finalice la lnea. Mltiples archivos en un proyecto : rs232_buffer.c Cuando hay muchos archivos en un proyecto, todos pueden ser incluidos utilizando #INCLUDE en el archivo main o en los sub-archivos mediante el linker incluido en el compilador. Por ejemplo, si tenemos los archivos main.c, x.c, x.h, y.c, y.h y z.h en un proyecto: main.c x.c y.c z.c #include #include #include #include #include #include #include

En este ejemplo hay 8 archivos y una unidad de compilacin. Main.c es el nico archivo compilado. Ejemplo: Aqu tenemos un ejemplo de programa utilizando CCS C para leer unas muestras de un conversor analgicodigital a travs de RS-232: #include // directiva del pre-procesador que selecciona el PIC 16F876 #fuses XT,NOWDT,NOPROTECT,NOLVP // directiva del pre-procesador que define los fusibles del PIC

#use delay(clock=4000000) //directiva del pre-procesador que define la velocidad del reloj #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // directiva del pre-procesador que incluye las libreras de RS-232 void main() { // funcin main int i, valor, min, max; printf("Muestreando:"); // declaracin de variables locales // la funcin printf est incluida en la librera RS232

setup_adc_ports( ALL_ANALOG ); // Seteo los pines del puerto A como anlogicos setup_adc( ADC_CLOCK_INTERNAL ); // 2-6 us set_adc_channel( 0 ); // selecciono canal 0 do { // do/while min=255; // expresin max=0; for(i=0; i=expr lvalue>8); // byte alto de comando i2c_stop(); i2c_stop : enva una condicin de STOP en modo MASTER. Sintaxis: i2c_stop () Ejemplo: i2c_start(); i2c_write(0xa0); // Direccin del dispositivo i2c_write(5); // Comando del dispositivo

i2c_write(12); // Dato del dispositivo i2c_stop(); // Condicin de STOP

#USE RS232: #use rs232 (opciones) donde opciones van separadas por comas y algunas pueden ser BAUD=x XMIT=pin RCV=pin RESTART_WDT PARITY=X BITS =X STOP=X x: velocidad en baudios Pin de transmisin Pin de recepcin Hace que GETC() borre el WDT mientras espera por un caracter. donde x es N, E, o O. donde x es 5-9 Setea el nmero de bits de parada (por defecto es 1).

Ejemplo: #use rs232(baud=9600, xmit=PIN_A2, rcv=PIN_A3) #USE STANDARD_IO: #use standard_io (port) donde port es A-J o todos. Afecta a como el compilador generar cdigo para las instrucciones de entrada y salida. Es el mtodo por defecto. Ejemplo: #use standard_io(A)

InterrupcionesLas siguientes funciones permiten el manejo de interrupciones en los microcontroladores. Con estas funciones, las interrupciones pueden ser habilitadas, deshabilitadas y borradas. Funciones relevantes: disable_interrupts(): deshabilita la interupcin especificada enable_interrupts(): habilita la interupcin especificada ext_int_edge(): habilta una interrupcin externa por flanco, el cual puede ser de subida o bajada (L_TO_H o H_TO_L) clear_interrupt(): borra la bandera(flag) de interrupcin. Puede ser utilizada si una isr(interrupt service routine) global es utilizada o para prevenir que una interrupcin sea servida. Ejemplo: #int_timer0 void timer0interrupt()

// #int_timer asocia la siguiente funin con la rutina // de servicio de interrupcin que ser llamada enable_interrupts(TIMER0); // habilita la interrupcin TIMER0 disable_interrtups(TIMER0);// deshabilita la interrupcin TIMER0 clear_interrupt(TIMER0); // borra el flag de la interrupcin TMER0 EJEMPLO Descripcin: Este dispositivo tiene un registro de desplazamiento de 8 bits (entrada serial / salida paralela) que alimenta un registro de almacenamiento de 8 bits del tipo D. El registro de almacenamiento posee 8 salidas (3 estados). Relojes (clocks) independientes se utilizan para ambos registros (almacenamiento y desplazamiento) El registro de desplazamiento tiene un pin para cascada.

Diagrama de pines :

Tabla de verdad :

Descripcin de pines : Pin: 1, 2, 3, 4, 5, 6, 7, 15 Smbolo: Qa a Qh Funcin:Salidas de datos Pin: 9 Smbolo: QH Funcin: Salida de dato serial Pin: 10 Smbolo: SCLR negado Funcin: entrada de borrado del registro de desplazamiento Pin: 11 Smbolo: SCK Funcin: entrada de reloj del registro de desplazamiento Pin: 13 Smbolo: OE negado Funcin: Entrada de habilitacin de salida (Output Enable) Pin: 14 Smbolo: DS Funcin: entrada de dato serial Pin: 12 Smbolo: RCK Funcin: entrada de reloj de registro de almacenamiento Pin: 8 Smbolo:GND Funcin: Tierra( Ground 0V ) Pin: 16 Smbolo: Vcc Funcin: alimentacin

Ejemplo: Turnero. Al presionar un pulsador(interrupcin en RB0) se incrementa en una cuenta el display de 7 segmentos. Cuando el turnero est en 9 y se pulsa se inicializa a cero. Diagrama en Proteus:

Representacin de los dgitos 0-9: Q0 1 0 1 1 0 1 1 1 1 1 Q1 1 1 1 1 1 0 0 1 1 1 Q2 1 1 0 1 1 1 1 1 1 1 Q3 1 0 1 1 0 1 1 0 1 1 Q4 1 0 1 0 0 0 1 0 1 0 Q5 1 0 0 0 1 1 1 0 1 1 Q6 0 0 1 1 1 1 1 0 1 1 Q7 0 0 0 0 0 0 0 0 0 0

0 1 2 3 4 5 6 7 8 9

Programa en CCS : //www.asysc.com.ar * www.asysc.com.ar * www.asysc.com.ar // 25/OCT/2010 // PIC16F6876A + 74HC595 + Display 7 segmentos // Simulador : Proteus 7.5 SP3 // Compilador: CCS version 4.068 // Descripcin: - al presionar un pulsador se incrementa en una cuenta el // display de 7 segmentos. Cuando el turnero est en 9 y se pulsa se inicializa // a cero.

//www.asysc.com.ar * www.asysc.com.ar * www.asysc.com.ar #include #FUSES NOWDT //No Watch Dog Timer #FUSES XT //Crystal/Resonator #FUSES NOPROTECT //Code not protected from reading #FUSES NOBROWNOUT //No brownout reset #FUSES PUT //Power Up Timer #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for // I/O #use delay(clock=4000000) //Reloj: 4 MHz #use fast_io(ALL) #define DATA PIN_A1 #define CLOCK PIN_A0 #define STROBE PIN_A2 int8 TABLA[10]={0b11111100,0b01100000,0b11011010,0b11110010,0b01100110, 0b10110110,0b10111110,0b11100000,0b11111110,0b11110110}; int mascara[8]={0b00000001,0b00000010,0b00000100,0b00001000,0b00010000, 0b00100000,0b01000000,0b10000000}; int i=0; void AumentarCuenta(void); #INT_EXT void RB0_isr(){ AumentarCuenta(); } void main(){ set_tris_a(0x00); // todas salidas set_tris_b(0x01); // RB0 entrada, las dems salidas port_b_pullups(TRUE); enable_interrupts(int_ext); ext_int_edge(H_TO_L); enable_interrupts(GLOBAL); while(1){}; } void AumentarCuenta(void){ int j,i; for(j=0;j