ACTIVIDAD UNO Comunicaci贸n RS232
#include<16f876.h> //#fuses xt,nowdt,nolvp,noprotect #use delay(clock=4000000) #use RS232(baud=9600,xmit=pin_c6,rcv=pin_c7) #define use_portb_lcd true #include<lcd420.c> void main(){ int b,c,d; char k,g,f;
lcd_init(); printf("Hola Estudiantes\n"); printf(lcd_putc," Hola Estudiantes\n"); delay_ms(3000); lcd_putc("\f"); b=1;
while(true){ k=getc(); if((k-48)!=-5){ printf("%c",k); lcd_putc(k);}
if((k-48)==-5){ lcd_putc("\n"); } if((k-48)==-3){ printf("\f"); lcd_putc("\f"); lcd_gotoxy(1,1); } if((k-48)==0){ lcd_putc("\f"); delay_ms(100); } b++; }}
COMUNICION BIDIRECIONAL HIPERTERMINAL CON LCD
#include<16f877.h> #fuses xt,nowdt,nolvp,noprotect #use delay(clock=4000000) #use RS232(baud=9600,xmit=pin_c6,rcv=pin_c7) #define< use_portb_lcd #include<stdlib.h> #include<lcd420.c> void main(void){
char cadena1 [6]; char cadena2[6]; char cadena3[6]; signed long x; signed long y; signed long z; signed long suma; signed long resta; signed long producto; int division; signed long total;
while (true) { printf("introduzca el valor de x, y pulse enter: \r"); gets(cadena1); x=atoi(cadena1); printf("x=%ld\r",x); printf("introduzca el valor de y,y pulse enter:\r"); gets(cadena2); y=atoi(cadena2); printf("y=%ld\r",y); printf("introduzca el valor de z,y pulsar enter:\r"); gets(cadena3); z=atoi(cadena3); printf("z=%ld\r",z); printf("el valor de sapo es: %d bytes\r",sizeof(y)); suma=x+y+z; resta=x-y-z; producto=x*y*z; division=x/y/z; total=((x+y+z)+(x-y-z)+(x*y*z)+(x/y/z)); printf(" x+y+z: %ld\n\r",suma); lcd_init(); printf(" x-y-z: %ld\r",resta); lcd_gotoxy(1,1); printf(lcd_putc," x-y-z: %ld ",resta); printf(" x*y*z: %ld\r",producto); lcd_gotoxy(1,2); printf(lcd_putc," x*y*z: %ld ",producto); printf(" x/y/z: %d\r",division); lcd_gotoxy(1,3); printf(lcd_putc," x/y/z: %d ",division); printf("resto:%ld\r",x%y); printf(" total: %ld\r",total); } }
MODULO PWM
#include<16f877.h> #device adc=8 #fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP #use delay (clock=4000000) #use RS232(baud=9600,xmit=pin_c6,rcv=pin_c7) #define use_portb_lcd true #include<lcd.c> const float escala = 255; const float d_max = 2000; void calcula_duty(int val, int valur,float&duty) { duty=(val*d_max)/escala; valur=duty; } void main(void){ int valor; float duty; int valur; lcd_init(); delay_ms(100);
lcd_gotoxy(1,1); lcd_putc("f=5000Hz->T=2ms"); lcd_gotoxy(1,2); setup_ccp1(CCP_PWM); // configura ccp1 como pwm setup_timer_2(T2_DIV_BY_16,124,1); // f=500Hz (T=2ms) setup_adc(adc_clock_div_32); // selecciona reloj setup_adc_ports(AN0); // RA0 analogico set_adc_channel (0); while(true){ valor=read_adc (); // lee valor RA0 set_pwm1_duty (valor); // establece duty com valor calcula_duty(valor,valur,duty);// escala el duty lcd_gotoxy(8,2); printf(lcd_putc,"%3.2f",duty);//muestra el resultado printf(" \f %3.2f",duty);//muestra el resultado puts("valur");//muestra el resultad } } GENRADOR DE FUNCIONES CON TIMER 0
#include<16f877.h> //#fuses #use delay(clock=4000000) #use fast_io(B) #int_RTCC
RTCC_isr(){ output_toggle(PIN_b7); set_timer0(198); } void main(void){ set_tris_b(0x00); output_low(pin_b7); setup_timer_0(RTCC_DIV_8); set_timer0(198); enable_interrupts(int_RTCC); enable_interrupts(global); while(true); }
DESARROLLO DE PROTOCOLO I2C CON PERIFERICOS
#include<16f877.h> #define adc=8 #fuses xt, nolvp, nowdt, noput, nobrownout, noprotect #use delay (clock=4000000) #use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7)
//#include <ds1307.c> #define use_portb_lcd true #include <lcd420.c> #use i2c (master,fast, scl=pin_c3,sda=pin_c4) #define ds1307_scl pin_c3 #define ds1307_sda pin_c4 #use i2c (master, sda=ds1307_sda, scl=ds1307_scl) void ds1307_init (void) // rutina para inicializar el reloj { output_float(ds1307_sda); output_float(ds1307_scl); } void write_ds1307_putc (byte address, byte data) // rutina para escriir datos { short int status; // declarar el tama単o del registro i2c_start();
i2c_write(0xd0); i2c_write(address); i2c_write(data); i2c_stop(); i2c_start(); status=i2c_write(0xd0); while (status==1) { i2c_start(); status=i2c_write(0xd0); } } byte read_ds1307(byte address) // rutina para leer { byte data; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_start(); i2c_write(0xd1); data=i2c_read(0); i2c_stop(); } void main (void) { int8 sec,min,hora,fecha,dia,mes,anio; int8 ho,mini,seco; lcd_init(); delay_ms(50); ds1307_init(); sec=read_ds1307(0); write_ds1307_putc(0,sec=0x50); write_ds1307_putc(1,min=0x59); write_ds1307_putc(2,hora=0x12); write_ds1307_putc(3,dia=0x06); write_ds1307_putc(4,fecha=0x17); write_ds1307_putc(5,mes=0x03); write_ds1307_putc(6,anio=0x12); while (true) { sec=read_ds1307(0); min=read_ds1307(1); hora=read_ds1307(2); dia=read_ds1307(3);
fecha=read_ds1307(4); mes=read_ds1307(5); anio=read_ds1307(6); putc(0x0c); delay_ms(100); lcd_gotoxy(1,1); printf(lcd_putc,"\f///Hola Jose luis////"); lcd_gotoxy(1,2); printf(lcd_putc,"///hora:%02x:%02x:%02x////",hora,min,sec); lcd_gotoxy(1,3); printf(lcd_putc,"//////dia:%02x////////",dia); lcd_gotoxy(1,4); printf(lcd_putc,"///fecha:%02x:%02x:%02x///",fecha,mes,anio); printf("hora:%02x:%02x:%02x",hora,min,sec); printf("dia:%02d",dia); printf("fecha:%02x:%02x:%02x",fecha,mes,anio); } }
PROGRAMA QUE UTILICE MEMORIA EEPROM
#include <16F877.h> //Configuraci贸n de los fusibles. //#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG #use delay(clock=4000000) //Frecuencia de reloj 4MHz #byte puerto_D = 0x08 // Identificador para el puerto C.
#int_EXT void EXT_isr( void ) { if ((read_eeprom(0)==0x99)||(read_eeprom(0)==0xFF)) { write_eeprom(0,0); puerto_D=read_eeprom(0); } else if ((read_eeprom(0) & 0x0F)<0x09) { write_eeprom(0,(read_eeprom(0))+1); puerto_D=read_eeprom(0); } else if ((read_eeprom(0) & 0x0F)>=0x09){ write_eeprom(0,(read_eeprom(0))+7); puerto_D=read_eeprom(0); } } void main() { set_tris_b(0xFF); //Puerto B como entrada set_tris_d(0x00);//Puerto D como salida enable_interrupts(GLOBAL); // Se habilita la interrupci贸n global enable_interrupts(INT_EXT); // Se habilita la interrupci贸n externa puerto_D =0xFF; //inicializo puerto D //write_eeprom(0,0xFF);//Resetear EEPROM while(true) { //Resto del programa } }
ACTIVIDAD DOS
PIC 16F877A REGISTRO OPTION_REG Contiene varios bits de control para configurar el divisor de frecuencia o pre escalar del TMR0/WDT, la interrupciรณn externa INT, TMR0 y los pull-ups para el PORTB REGISTRO OPTION RBPU INTEG TOCS TOSE PSA PS2
PS1
PS0
ESTADOS DE SUS BITS BIT'S Bit 7= RBPU PULL-UPP' PORTB
Lร E
RESET
L/E
1
Bit 6= INTEDG
L/E
1
L/E
1
L/E
1
L/E
1
Bit 5: T0CS Fte./Reloj p' TMR0 Bit 4: T0SE Flanco/T0CKI Bit 3: PSA Divisor/Frecuencia
DESCRIPCION 1 = cargas pull-up Desconectadas 0 = cargas pull-up Conectadas 1= RB0/INT serรก sensible a flanco ascendente 0= RB0/INT serรก sensible a flanco Descendente 1 = Pulsos por pata T0CKI (contador) 0 = Pulsos igual a reloj interno / 4 (temporizador) 1 = Incremento TMR0 en flanco descendente 0 = Incremento en flanco ascendente 1 = Divisor asignado al WDT 0 = Divisor asignado al TMR0
La combinación de los BIT's; PS2, PS1 y PS0 (0, 1 y 2) determinan el valor del divisor de frecuencia, el cual se puede ver en la siguiente tabla. PS2
0 0 0 0 1 1 1 1
PS1
PS0
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
División del TMR0 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256
División del WDT 1/1 1/2 1/4 1/8 1/16 1/32 1/64 1/128
REGISTRO INTCON Contiene los bits para habilitar cada una de las fuentes de interrupción y las banderas que informan el origen de la interrupción REGISTRO INTCON GIE EEIE T0IE
INTE
RBIE
T0IF
INTF
RBIF
ESTADOS DE SUS BIT’S BIT's Bit 7: GIE Habilitación Gral. Bit 6: EEIE Int. Periféricos Bit 5: T0IE Int. del TMR0 Bit 4: INTE Int. Externa Bit 3: RBIE Int. por PORTB
LóE
Reset
L/E
0
L/E
0
L/E
0
L/E
0
L/E
0
Bit 2: T0IF Bandera del TMR0. Bit 1: INTF Bandera - RB0/INT Bit 0: RBIF Bandera - RB4:RB7
L/E
0
L/E
0
L/E
x
Descripción 1 = Todas las Interrupciones activadas 0 = Todas las Interrupciones desactivadas 1 = Activada 0 = Desactivada 1 = Activada 0 = Desactivada 1 = Activada 0 = Desactivada 1 = Activada 0 = Desactivada 1 = TMR0 desbordado. Borrar por software 0 = No se ha desbordado 1 = Ocurrió una interrupción externa 0 = No ha ocurrido interrupción externa 1 = Al menos un pin cambio de estado 0 = Ningún pin ha cambiado de estado.
REGISTRO STATUS Contiene el estado aritmético de la ALU, el estado del Reset y los bits para selección de banco. REGISTRO STATUS IRP RP1
RP0
TO
PD
Z
DC
ESTADO DE SUS BIT’S BIT's Bit 7-6: IRP-RP1 Bit 5: RP0 Bank Select Bit 4: TO Time-Out Bit 3: PD Power Down Bit 2: Z Zero Bit 1: DC Digit Carry Bit 0: C Carry
LóE
Reset
Descripción
L/E
0
No implementado: ‘0’
L/E
0
L
1
L
1
L/E
x
L/E
x
L/E
x
1 = Banco 1 0 = Banco 0 1 = Recién encendido, tras CLRWDT, o SLEEP. 0 = Ocurrió un time-out en el WDT 1 = Luego de un Rset, de una instrucción CLRWDT 0 = Tras ejecutar una instrucción SLEEP 1 = El resultado de una operación lógica o aritmética es 0. 0 = El resultado es distinto de 0 1 = Acarreo en la suma y no en la resta (4º bit) 0 = Acarreo en la resta y no en la suma (4º bit) 1 = Acarreo en la suma y no en la resta (8º bit) 0 = Acarreo en la resta y no en la suma (8º bit)