Manual Prácticas microcontrolador 30f4013 en Mikroc for DSPIC

Page 1


INDICE

1. INTRODUCCION……………………………………………… 2. OBJETIVO……………………………………………………… 3. INSTALACION MIKRO C…………………………………… 4. INSTALACION PICKIT……………………………………… 5. MARCO TEORICO DE MATERIALES A UTILIZAR 6. EJERCICIOS PRACTICOS…………………………………


INTRODUCCION

El objetivo principal es realizar un manual teórico y practico acerca de

las

practicas realizadas en clases para un conocimiento más practico poder explicativo, uno de los motivos principales del desarrollo de este manual es poder exponer o facilitar a estudiantes que desean tener el conocimiento de la materia; presentando

ejercicios

prácticos

paso

a paso

para

el

desarrollo

del

microcontrolador y la programación de cada parte del mismo esperando que sea comprensible

OBJETIVO Diseñar un manual teórico explicativo del os ejercicios realizados en clases durante el curso en práctica para el mejor entendimiento, y explicativo para estudiantes que están cercanos a coger la materia


INSTALACION DEL MIKROC PRO Realizamos la ejecucion del archivo setup

Ejecutamos clic en el boton next y seguimos las instrucciones

Aceptamos las condiciones de la licencia y clic en next


Ponemos clic en next y realizamos la ubicaci贸n de la carpeta del archivo

Realizamos clic en el bot贸n next y ponemos instalar y esperamos q se realice la instalaci贸n

Y finalizamos la instalacion


Podemos abrir nuestro programa realizamos un clic en nuevo proyecto se puede cualquier nombre, escoger el tipo de micro q vamos a utilizar y podemos empezar a realizar nuestra programacion. Pero estos son son los unicos pasos que podemos dar porque en nuestro caso con el dspic 30f4013 no se puede realizar ninguna simulacion es por tal motivo que debemos trabajar armando el circuito y haciendo la prueba a cada instante, siempre y cuando en la compilacion no exista ningun error, para ello necesitamos el requirimiento de la instalacion de otro programa.

INSTALACION DEL PROGRAMA PICKIT

Los pasos para realizar esta instalaci贸n son los siguientes: Realizamos la ejecuci贸n a setup en la carpeta en la que se encuentre nuestro archivo


Realizamos clic en el botรณn next y seguimos las instrucciones, aceptando las condiciones de la licencia y next

Realizamos clic y dejamos el progreso de la instalaciรณn escogiendo si deseamos una instalaciรณn completa o una instalaciรณn personalizada

Revisamos la carpeta de ubicaciรณn de la carpeta pero no le cambiamos del lugar


Despu茅s para la grabaci贸n del microcontrolador la tenemos que hacer en el protoboard mismo no se puede grabar dentro del grabador mismo y procedemos a trabajar. Tambi茅n debemos tener un poco del conocimiento de los elementos que vamos a utilizar por tal motivo los detallamos a continuaci贸n.


MATERIALES A UTILIZAR MICROCONTROLADOR 30F4013 Un microcontrolador es como un ordenador en pequeño: dispone de una memoria donde se guardan los programas, una memoria para almacenar datos, dispone de puertos de entrada y salida, etc. A menudo se incluyen puertos seriales (RS-232), conversores analógico/digital, generadores de pulsos PWM para el control de motores, bus I2C, y muchas cosas más. Por supuesto, no tienen ni teclado ni monitor, aunque podemos ver el estado de teclas individuales o utilizar pantallas LCD o LED para mostrar información. DSpic30f4013:

Arquitectura Harvard 

Compilador optimizado la arquitectura del conjunto de instrucciones C

84 instrucciones básicas con modos de direccionamiento flexibles

Instrucciones de 24 bits de ancho, camino de datos amplia de 16 bits

16 x 16 bits de trabajo arsenal registro

Hasta 30 MIPS operación:


DC a 40 MHz entrada de reloj externa

Entrada FRC interno con PLL activo (4x, 8x, 16x)

4 MHz-10 MHz entrada del oscilador con PLL activo (4x, 8x, 16x)

10 MHz - 20 MHz en la entrada del oscilador HS / 2 o HS / 3 con PLL activo (4x, 8x, 16x)

Fuentes de interrupción periféricos y Externa

8 niveles de prioridad de usuario seleccionables para cada interrupción

4 excepciones del procesador y las trampas de software

Tablas de vectores de interrupción primarios y alternativos

PROTOBOARD

Es una especie de tablero con orificios, en la cual se pueden insertar componentes electrónicos y cables para armar circuitos. Como su nombre lo indica, esta tableta sirve para experimentar con circuitos electrónicos, con lo que se asegura el buen funcionamiento del mismo. Es en la actualidad una de las placas de prueba más usadas. Está compuesta por bloques de plástico perforados y numerosas láminas delgadas, de una aleación de cobre, estaño y fosforo, que unen dichas perforaciones, creando una serie de líneas de conducción paralelas. Las líneas se cortan en la parte central del bloque de plástico para garantizar que dispositivos en circuitos integrados tipo Depredan ser insertados perpendicularmente y sin ser tocados por el proveedor a las líneas de conductores. En la cara opuesta se coloca un forro con pegamento, que sirve para sellar y mantener en su lugar las tiras metálicas.


RESISTENCIAS La resistencia eléctrica de un objeto es una medida de su oposición al paso de corriente. La unidad de la resistencia en el Sistema Internacional de Unidades es el ohmio (Ω).Una resistencia real en corriente continua (CC) se comporta prácticamente de la misma forma que si fuera ideal, esto es, transformando la energía eléctrica en calor por efecto Joule. La variación de la temperatura produce una variación en la resistencia. En la mayoría de los metales aumenta su resistencia al aumentar la temperatura, por el contrario, en otros elementos, como el carbono o el germanio la resistencia disminuye. El fabricante dará como dato el valor en vatios que puede disipar cada resistencia en cuestión. Este valor puede estar escrito en el cuerpo del componente o se tiene que deducir de comparar su tamaño con los tamaños estándar y sus respectivas potencias. El tamaño de las resistencias comunes, cuerpo cilíndrico con 2 terminales, que aparecen en los aparatos eléctricos domésticos suelen ser de 1/4 W, existiendo otros valores de potencias de comerciales de. W, 1 W, 2 W, etc.


DISPLAY 7 SEGMENTOS

El displays de 7 segmentos, es un componente que se utiliza para la representación de números en muchos dispositivos electrónicos. Cada vez es más frecuente encontrar LCD´s en estos equipos (debido a su bajísima demanda de energía), todavía hay muchos que utilizan el display de 7 segmentos por su simplicidad. Este elemento se ensambla o arma de manera que se pueda activar cada segmento (diodo LED) por separado logrando de esta manera combinar los elementos y representar todos los números en el display (del 0 al 9). El display de 7 segmentos más común es el de color rojo, por su facilidad de visualización. Cada elemento del display tiene asignado una letra que identifica su posición en el arreglo del display. Ver el gráfico arriba - Si se activan todos los segmentos se forma el número "8" - Si se activan solo los segmentos: "a,b,c,d,f," se forma el número "0"


- Si se activan solo los segmentos: "a,b,g,e,d," se forma el número "2" - Si se activan solo los segmentos: "b,c,f,g," se forma el número " El display ánodo común En el display ánodo común, todos los ánodos de los diodos LED unidos y conectados a Lafuente. En este caso para activar cualquier elemento hay que poner el cátodo del elemento a tierra a través de una resistencia para limitar la corriente que pasa por el elemento

El display cátodo común El display cátodo común tiene todos los ánodos de los diodos LED unidos y conectados a tierra. Para activar un segmento de estos hay que poner el ánodo del segmento a encender a Vcc (tensión de la fuente) a través de una resistencia para limitar el paso de la corriente

LCD La pantalla de cristal líquido o LCD (Liquid Crystal Display) es un dispositivo μControlado de visualización grafico para la presentación de caracteres, símbolos o incluso dibujos (en algunos modelos), es este caso dispone de 2 filas de 16 caracteres cada una y cada carácter dispone de una matriz de 5x7 puntos (pixeles), aunque los hay de otro número de filas y caracteres. Este dispositivo está gobernado internamente por un microcontrolador y regula todos los parámetros de presentación, este modelo es el más comúnmente usado y esta información se basará en el manejo de este u otro LCD compatible.


Características principales: -Pantalla de caracteres ASCII, además de los caracteres Kanji y Griegos. -Desplazamiento de los caracteres hacia la izquierda o la derecha. -Proporciona la dirección de la posición absoluta o relativa del carácter. -Memoria de 40 caracteres por línea de pantalla. -Movimiento del cursor y cambio de su aspecto. -Permite que el usuario pueda programar 8 caracteres. -Conexión a un procesador usando un interfaz de 4 u 8 bits

LED LED (Light-Emitting Diode: Diodo Emisor de Luz), es un dispositivo semiconductor que emite luz incoherente de espectro reducido cuando se polariza de forma directa la unión PN en la cual circula por él una corriente eléctrica . Este fenómeno es una forma de electroluminiscencia, el LED es un tipo especial de diodo que trabaja como un diodo común, pero

que al

ser

atravesado

por

la

corriente eléctrica, emite luz.


LDR Una fotorresistencia es un componente electrónico cuya resistencia disminuye con el aumento de intensidad de luz incidente. Puede también ser llamado fotorresistor, fotoconductor, célula fotoeléctrica o resistor dependiente de la luz, cuyas siglas, LDR, se originan de su nombre en inglés light-dependent resistor. Su cuerpo está formado por una célula o celda y dos patillas. En la siguiente imagen se muestra su símbolo eléctrico. El valor de resistencia eléctrica de un LDR es bajo cuando hay luz incidiendo en él (puede descender hasta 50 ohms) y muy alto cuando está a oscuras (varios megaohmios).


EJERCICIOS PLANTEADOS Y RESUELTOS 1.- SEMAFORO ENUNCIADO Diseテアar un circuito para el funcionamiento de semテ。foros que regularan el transito tanto peatonal como vehicular

DIAGRAMA DE LOS SEMテ:OROS

LOGICA DEL CIRCUITO SEMAFORO 1

PEATON

V

R

R

V

A

R

R

V

1

SEMAFORO PEATON 2 2


R

V

V

R

R

V

A

R

V

R

R

V

DIAGRAMA DE FLUJO


CODIGO DE PROGRAMACION void main() { ADPCFG=0XFFFF; TRISB=0; PORTB=0; while(1) //bo=verde b1=amarillo b2=rojo b3verde=verde b4=rojo b5=verde b6=amarillo b7=rojo b8=verde b9=rojo { PORTB.F1=0; // DAMOS LA CONDICION DEL CODIGO A CADA PORTB.F2=0; PUERTO PARA LA SECUENCIA CON SU RESPECTIVO PORTB.F3=0; TIEMPO PORTB.F5=0; PORTB.F6=0; PORTB.F9=0; PORTB.F0=1; PORTB.F4=1; PORTB.F7=1; PORTB.F8=1; delay_ms(2500); PORTB.F0=0; PORTB.F2=0; PORTB.F3=0; PORTB.F5=0; PORTB.F6=0; PORTB.F9=0; PORTB.F1=1; PORTB.F4=1; PORTB.F7=1; PORTB.F8=1; delay_ms(2500); PORTB.F0=0; PORTB.F1=0; PORTB.F4=0; PORTB.F6=0; PORTB.F7=0; PORTB.F8=0; PORTB.F2=1; PORTB.F3=1; PORTB.F5=1; PORTB.F9=1; delay_ms(2500);


PORTB.F0=0; PORTB.F1=0; PORTB.F4=0; PORTB.F5=0; PORTB.F7=0; PORTB.F8=0; PORTB.F3=1; PORTB.F2=1; PORTB.F6=1; PORTB.F9=1; delay_ms(2500); } }

2.- RELOJ CON DISPLASY ENUNCIADO

Dise単ar un circuito el cual nos permita simular un reloj con displays 7 segmentos y un contador ascendente descendente visualizado en leds.

DIAGRAMA DE BLOQUES


DIAGRAMA DE FLUJO


CODIGO void main() { ADPCFG=0XFFFF; TRISB=0; PORTB=0; while(1) //bo=verde b1=amarillo b2=rojo b3verde=verde b4=rojo b5=verde b6=amarillo b7=rojo b8=verde b9=rojo { LATB.F1=0; LATB.F2=0; LATB.F3=0; LATB.F5=0; LATB.F6=0; LATB.F9=0; LATB.F0=1; LATB.F4=1; LATB.F7=1; LATB.F8=1; delay_ms(2500); LATB.F0=0; LATB.F2=0; LATB.F3=0; LATB.F5=0; LATB.F6=0; LATB.F9=0; LATB.F1=1; LATB.F4=1; LATB.F7=1; LATB.F8=1; delay_ms(2500); LATB.F0=0; LATB.F1=0; LATB.F4=0; LATB.F6=0; LATB.F7=0; LATB.F8=0; LATB.F2=1; LATB.F3=1; LATB.F5=1; LATB.F9=1; delay_ms(2500); LATB.F0=0; LATB.F1=0; LATB.F4=0; LATB.F5=0; LATB.F7=0; LATB.F8=0; LATB.F3=1; LATB.F2=1; LATB.F6=1;


LATB.F9=1; delay_ms(2500); } }

3.- FRECUENCIOMETRO ENUNCIADO Dise単ar un circuito el cual nos permita visualizar la frecuencia de 1-50hz

DIAGRAMA DE BLOQUE


DIAGRAMA DE FLUJO


CODIGO DE PROGRAMACION char cont; char dece; char inte; char pulso; char decepulso; // iniciando el timer para que me lea cada 25ms void InitTimer1(){ T1CON = 0x8000; T1IE_bit = 1; T1IF_bit = 0; IPC0 = IPC0 | 0x1000; PR1 = 62500; } // se prduce l interupcion cada tiempo de 25ms void Timer1Interrupt() iv IVT_ADDR_T1INTERRUPT{ if (T1IF_bit==1) { //ASCENDENTE if(RD1_bit==0) { if(cont<=9) { cont++; } if(cont==9) { cont=0; dece++; } if((cont==9)&&(dece==9)) { cont=0; dece=0; }

do { }while(RD1_bit==0); } inte++; //acumulando variable hasta que se produsca un segundo T1IF_bit = 0; // Clear TMR0IF


} } void main() { ADPCFG=0XFFFF; TRISB=0; TRISF=0; TRISD=0XFFFF; cont=0; inte=0; pulso=0; dece=0; decepulso=0; do { // para acivar timer if (RD0_bit==0) { InitTimer1(); if(inte==40) //para que me cuente asta un segundo { LATF=cont; LATB=dece; delay_ms(500); inte=0; cont=0; dece=0; LATF=cont; LATB=dece; PR1 }

= 62500; // resetendo el valor inicial

} else { //para activar el contador con pulsos if(RD0_bit==1) { if(!RD2_bit) { if(pulso<=9) { pulso++; LATF=pulso; if((pulso==9)&&(decepulso==9)) { pulso=0; decepulso=0; LATB=decepulso;


LATF=pulso;

} } if(pulso==9) { pulso=0; decepulso++; LATB=decepulso; LATF=pulso; } do { }while(!RD2_bit); delay_ms(50); } }

}

}while(1);

}


4.- RMANEJO DEL ADC ENUNCIADO Dise単ar un circuito el cual nos permita visualizar los valores de voltaje de los canales ADC en una LCD y nos indique que canal presenta el mayor voltaje.

DIAGRAMA DE BLOQUES

DIAGRAMA DE FLUJO



CODIGO unsigned int adc_rd0; unsigned int adc_rd1; unsigned int adc_rd2; unsigned int adc_rd3; unsigned int adc_rd4; unsigned char ch0; unsigned char ch1; unsigned char ch2; unsigned char ch3; unsigned char ch4; long tlong0; long tlong1; long tlong2; long tlong3; long tlong4; char *text; char *text0; char *text1; char *text2; char *text3; char *text4; //LCD module conecctions sbit LCD_RS at LATF0_bit; sbit LCD_EN at LATF1_bit; sbit LCD_D4 at LATF2_bit; sbit LCD_D5 at LATF3_bit; sbit LCD_D6 at LATF4_bit; sbit LCD_D7 at LATF5_bit; sbit LCD_RS_Direction at TRISF0_bit; sbit LCD_EN_Direction at TRISF1_bit; sbit LCD_D4_Direction at TRISF2_bit; sbit LCD_D5_Direction at TRISF3_bit; sbit LCD_D6_Direction at TRISF4_bit; sbit LCD_D7_Direction at TRISF5_bit; void display() //comparaci贸n entre adcs y visualizaci贸n en displays { if ((tlong0>tlong1)&&(tlong0>tlong2)&&(tlong0>tlong3)&&(tlong0>tlong4) ) { LATD=0; } if ((tlong1>tlong0)&&(tlong1>tlong2)&&(tlong1>tlong3)&&(tlong1>tlong4) ) {


LATD=1; } if ((tlong2>tlong0)&&(tlong2>tlong1)&&(tlong2>tlong3)&&(tlong2>tlong4) ) { LATD=2; } if ((tlong3>tlong0)&&(tlong3>tlong1)&&(tlong3>tlong2)&&(tlong3>tlong4) ) { LATD=3; } if ((tlong4>tlong0)&&(tlong4>tlong1)&&(tlong4>tlong2)&&(tlong4>tlong3) ) { LATD=4; } } void ad4() //funci贸n para leer adc del canal 4 { display(); text4="ADC4"; Lcd_Out(2,1,text4); adc_rd4= ADC1_read(4); tlong4 = (long)adc_rd4 * 5000; tlong4 = tlong4 / 4011; ch4 = tlong4 / 1000; LCD_Chr(2,9,48+ch4); LCD_Chr_CP('.'); ch4 = (tlong4 / 100) % 10; LCD_Chr_CP(48+ch4); ch4 = (tlong0 / 10) % 10; LCD_Chr_CP(48+ch4); LCD_Chr_CP('V'); } void ad3() //funci贸n para leer adc del canal 3 { display(); text3="ADC3"; Lcd_Out(2,1,text3); adc_rd3= ADC1_read(3); tlong3 = (long)adc_rd3 * 5000; tlong3 = tlong3 / 4011; ch3 = tlong3 / 1000; LCD_Chr(2,9,48+ch3);


LCD_Chr_CP('.'); ch3 = (tlong3 / 100) % 10; LCD_Chr_CP(48+ch3); ch3 = (tlong3 / 10) % 10; LCD_Chr_CP(48+ch3); LCD_Chr_CP('V'); } void ad2() //funci贸n para leer adc del canal 2 { display(); text2="ADC2"; Lcd_Out(2,1,text2); adc_rd2= ADC1_read(2); tlong2 = (long)adc_rd2 * 5000; tlong2 = tlong2 / 4011; ch2 = tlong2 / 1000; LCD_Chr(2,9,48+ch2); LCD_Chr_CP('.'); ch2 = (tlong2 / 100) % 10; LCD_Chr_CP(48+ch2); ch2 = (tlong2 / 10) % 10; LCD_Chr_CP(48+ch2); LCD_Chr_CP('V'); } void ad1() //funci贸n para leer adc del canal 1 { display(); text1="ADC1"; Lcd_Out(2,1,text1); adc_rd1= ADC1_read(1); tlong1 = (long)adc_rd1 * 5000; tlong1 = tlong1 / 4011; ch1 = tlong1 / 1000; LCD_Chr(2,9,48+ch1); LCD_Chr_CP('.'); ch1 = (tlong1 / 100) % 10; LCD_Chr_CP(48+ch1); ch1 = (tlong1 / 10) % 10;


LCD_Chr_CP(48+ch1); LCD_Chr_CP('V'); } void ad0() //funci贸n para leer adc del canal 0 { display(); text0="ADC0"; Lcd_Out(2,1,text0); adc_rd0= ADC1_read(0); tlong0 = (long)adc_rd0 * 5000; tlong0 = tlong0 / 4011; ch0 = tlong0 / 1000; LCD_Chr(2,9,48+ch0); LCD_Chr_CP('.'); ch0 = (tlong0 / 100) % 10; LCD_Chr_CP(48+ch0); ch0 = (tlong0 / 10) % 10; LCD_Chr_CP(48+ch0); LCD_Chr_CP('V'); } void main() { ADPCFG = 0xFFFF; TRISD=0; Lcd_Init(); LCD_Cmd(_LCD_CURSOR_OFF); LCD_Cmd(_LCD_CLEAR); text = "ADC COMPARADOR"; Lcd_Out(1,1,text); Delay_ms(2000);; while(1) { ad0(); delay_ms(750); //Tiempo de visuallizaci贸n entre adcs ad1(); delay_ms(750); ad2(); delay_ms(750);


ad3(); delay_ms(750); ad4(); delay_ms(750); } }

5.- CALCULADORA ENUNCIADO Dise単ar un circuito el cual nos permita visualizar los valores de voltaje de dos canales ADC en display 7 segmentos y nos permita sumar, restar, multiplicar y dividir estos valores y mostrar el resultado en displays 7 segmentos.

DIAGRAMA DE BLOQUES


DIAGRAMA DE FLUJO


CODIGO unsigned int adc_rd0; unsigned int adc_rd1; long tlong0; long tlong1; unsigned int multi; long multip; unsigned int an0ente; unsigned int an0deci; unsigned int an1ente; unsigned int an1deci; unsigned int multipli; unsigned int multidec; unsigned int multiuni; unsigned int multiuni2; unsigned int multideci; unsigned int multidecidecim; long sumal; //variables parala suma int sumad; int sumau; int sumadec; long restal; //variables parala resta int restad; int restau; int restadec; float divl; int divd; int divu; int divdec;

//variables para la divisi贸n

int i; int j; int tabla[7]={0X1,0X2,0X4,0X8,0X10,0X20,0X40}; //PERMITE ACTIVAR LOS DIFERENTES DISPLAYS A UTLILIZAR

void dividir()

//funci贸n dividir


{ divl=(float)(tlong0/tlong1); divd=divl/1000; } void multiplicar() {

//funci贸n multiplicar

multip=(long)(tlong0*tlong1); multi=multip/10000000; multiuni=(multip/1000000)% 10; multideci= (multip/100000)% 10; /* multi=an0ente*an1ente; multidec=multi/10; multiuni=multi%10; multideci=an0deci*an1deci; multidecidecim= multideci/10; */

} void resta() //funci贸n resta { restal=(long)(tlong0-tlong1); restad=restal/1000; restau=(restal/100)% 10; restadec= (restal/10)% 10;

} void suma() //funci贸n suma { sumal=(long)(tlong0+tlong1); sumad=sumal/10000; sumau=(sumal/1000)% 10; sumadec= (sumal/100)% 10;

} void ad1() //funci贸n para leer el canal 1 del adc { adc_rd1= ADC1_read(1); tlong1=(long)adc_rd1 * 5000; tlong1 = tlong1 / 4095; an1ente = tlong1/1000;


an1deci = (tlong1/100)% 10; } void ad0() //funci贸n para leer el canal 0 del adc { adc_rd0= ADC1_read(0); tlong0=(long)adc_rd0 * 5000; tlong0 = tlong0 / 4095; an0ente = tlong0/1000; an0deci = (tlong0/100)% 10; } void Timer1Interrupt() iv IVT_ADDR_T1INTERRUPT{ //Timer para que me testee el puerco cada 10ms y poder elegir funciones if(T1IF_bit==1) { if(RB8_bit==0) { j++; if(j>3) { j=0; } do { }while(RB8_bit==0); delay_ms(1); } } T1IF_bit = 0; //Enter your code here } void InitTimer1(){ //funci贸n para iniciar par谩metros de timer T1CON = 0x8000; T1IE_bit = 1; T1IF_bit = 0; IPC0 = IPC0 | 0x1000; PR1 = 25000; } void main() {


ADPCFG = 0xFFFF; TRISD=0; TRISF=0; TRISC=0; j=0;

while(1) { InitTimer1(); ad0(); ad1(); suma(); resta(); multiplicar(); dividir();

for(i=0;i<=6;) // CICLO PARA ROTAR LAS POSICIONES DE ACTIVACION DE LOS DISPLAYS { LATF=tabla[i]; if(j==0) //suma { if(LATF.F5==1) { LATD=an0ente; delay_ms(2); } if(LATF.F4==1) { LATD= an0deci; delay_ms(2); } if(LATF.F3==1) { LATD=an1ente; delay_ms(2); } if(LATF.F2==1) { LATD=an1deci;


delay_ms(2); } if(LATF.F1==1) { LATD=sumad; delay_ms(2); } if(LATF.F0==1) { LATD= sumau; delay_ms(2); } if(LATF.F6==1) { LATD= sumadec; delay_ms(2); } } if(j==1) //resta { if(LATF.F5==1) { LATD=an0ente; delay_ms(2); } if(LATF.F4==1) { LATD= an0deci; delay_ms(2); } if(LATF.F3==1) { LATD=an1ente; delay_ms(2); } if(LATF.F2==1) { LATD=an1deci; delay_ms(2); } if(LATF.F1==1)


{ LATD=restad; delay_ms(2); } if(LATF.F0==1) { LATD= restau; delay_ms(2); } if(LATF.F6==1) { LATD= restadec; delay_ms(2); } } if(j==2)

//multiplicaci贸n

{ if(LATF.F5==1) { LATD=an0ente; delay_ms(2); } if(LATF.F4==1) { LATD= an0deci; delay_ms(2); } if(LATF.F3==1) { LATD=an1ente; delay_ms(2); } if(LATF.F2==1) { LATD=an1deci; delay_ms(2); } if(LATF.F1==1) { LATD=multi; delay_ms(2); }


if(LATF.F0==1) { LATD= multiuni; delay_ms(2); } if(LATF.F6==1) { LATD= multideci; delay_ms(2); } } if(j==3)

//divisi贸n

{ if(LATF.F5==1) { LATD=an0ente; delay_ms(2); } if(LATF.F4==1) { LATD= an0deci; delay_ms(2); } if(LATF.F3==1) { LATD=an1ente; delay_ms(2); } if(LATF.F2==1) { LATD=an1deci; delay_ms(2); } if(LATF.F1==1) { LATD=0; delay_ms(2); } if(LATF.F0==1) { LATD= divl;


delay_ms(2); } if(LATF.F6==1) { LATD= divd; delay_ms(2); } } i++; } } }

6.- MANEJO DEL PWM ENUNCIADO Diseñar un circuito el cual nos permita visualizar los valores en porcentaje del ciclo de trabajo de manejo del PWM y según este encienda o atenué la luz de un LED que aumentara o disminuya la frecuencia y velocidad de un contador de 0999.


DIAGRAMA DE BLOQUES


DIAGRAMA DE FLUJO


CÁLCULOS PARA LOS VALORES DEL CURRENT_DUTY

Para una frecuencia de 1000Hz(Encendido del led)

Tosc 

1 1   0.1s Fosc 10 Mhz

TMR2 prescaler value  1  Para un valor del prescaler igual 1 PWM period 

1 FPWM

1  1ms 1000 Hz

1ms  PR2  1* 4 * 0.1s *1

PR2  1 

1ms 0.4s

PR2  2500  1 PR2  2499 : Donde PR2 es el current_duty es decir mi ciclo de trabajo donde lo puedo variar desde 0-2449.

LÓGICA PARA EL VALOR DEL CICLO DE TRABAJO tlong=(long)current_duty1*99; tlong=tlong/2499; Lógica para varar la frecuencia de de 0-100Hz

 4   T  Pr ec arg a PRX   Pr escler  f osc   T=1/Fhz T=1/100Hz T=10ms

CÁLCULOS PARA 10 MS CON EL TIMER 1


T=10ms Prescaler=256

    T   PR1   4   Pr escaler   f osc  

    10 ms   PR1   256  4    10 Mhz   PR1  97.65

Valor de 1 Hz Cálculos para 1s con el timer 1 T=1/Fhz T=1/1Hz T=1s

    T   PR1   4   Pr escaler   f osc  

    1 s   PR1   256  4    10 Mhz   PR1  9765 .625

LÓGICA EMPLEADA Para un valor mínimo de 1Hz se requiere un PR1=9765.25 Para un valor mínimo de 100Hz se requiere un PR1=97.65 Para obtener ese rango de valores


adc_rd1 = ADC1_read(0); tlongvari =(long)adc_rd1*9765 ; tlongvari = tlongvari /4095; PR1

= tlongvari;

CODIGO ADC FRECUENCIA sbit LCD_RS at LATF0_bit; sbit LCD_EN at LATF1_bit; sbit LCD_D4 at LATF2_bit; sbit LCD_D5 at LATF3_bit; sbit LCD_D6 at LATF4_bit; sbit LCD_D7 at LATF5_bit;

//Configuraci贸n de bits de la LCD

sbit LCD_RS_Direction at TRISF0_bit; sbit LCD_EN_Direction at TRISF1_bit; sbit LCD_D4_Direction at TRISF2_bit; sbit LCD_D5_Direction at TRISF3_bit; sbit LCD_D6_Direction at TRISF4_bit; sbit LCD_D7_Direction at TRISF5_bit; unsigned char ch; unsigned int adc_rd; unsigned int adc_rd1; unsigned int adc_rd2; long tlongvari; int uni1; int dece1; unsigned char chcon; int i; long tlongcon; long tlong; long tlongfrec; unsigned char chf;

void frecuencia() { LCD_Chr(1,4,'F');


LCD_Chr_CP('R'); LCD_Chr_CP('E'); LCD_Chr_CP('C'); adc_rd2 = ADC1_read(0); tlongfrec =(long)adc_rd2*100; tlongfrec = tlongfrec /4095; chf = tlongfrec / 100; LCD_Chr(1,9,48+chf); chf = ( tlongfrec / 10) % 10; LCD_Chr_CP(48+chf); chf = ( tlongfrec / 1) % 10; LCD_Chr_CP(48+chf); LCD_Chr(1,13,'H'); LCD_Chr_CP('z');

} void ascendente() { //ASCENDENTE if(tlongcon>999) { tlongcon=0; } LCD_Chr(2,1,'C'); LCD_Chr_CP('O'); LCD_Chr_CP('N'); chcon = tlongcon / 100; LCD_Chr(2,5,48+chcon); chcon = (tlongcon / 10)%10; LCD_Chr(2,6,48+chcon); chcon = tlongcon %10; LCD_Chr(2,7,48+chcon); } void adc() { LCD_Chr(2,9,'A'); LCD_Chr_CP('D'); LCD_Chr_CP('C'); adc_rd = ADC1_read(0); tlong =(long)adc_rd*5000; tlong = tlong /4095; ch = tlong / 1000; LCD_Chr(2,12,48+ch); LCD_Chr_CP('.'); ch = (tlong / 100) % 10; LCD_Chr_CP(48+ch); ch = (tlong / 10) % 10; LCD_Chr_CP(48+ch);


LCD_Chr_CP('V'); } void InitTimer1(){ T1CON = 0x8030; T1IE_bit = 1; T1IF_bit = 0; IPC0 = IPC0 | 0x1000; PR1 = 97; } void Timer1Interrupt() iv IVT_ADDR_T1INTERRUPT{ tlongcon++; T1IF_bit = 0; //Enter your code here } void main() { ADPCFG = 0xFFFF; TRISB=0XFFFF;; TRISB.F0=1; TRISF=0X0000; LCD_Init(); LCD_Cmd(_LCD_CURSOR_OFF); LCD_Cmd(_LCD_CLEAR); delay_ms(100); tlongcon=0; InitTimer1(); while(1) { adc(); ascendente(); frecuencia(); adc_rd1 = ADC1_read(0); tlongvari =(long)adc_rd1*9765 ; tlongvari = tlongvari /4095; if(tlongvari<100) { PR1 = 97; } PR1 = tlongvari; } }


DISPLAY current_duty1; int pwm_period1; int tabla[2]={0X1,0X2}; int i; long tlong; unsigned int uni; unsigned int dece; void porcentaje() { tlong=(long)current_duty1*99; tlong=tlong/2499; dece= tlong/10; uni=(tlong/1)%10; } void pwm() {

if (RB6_bit==0) { current_duty1 = current_duty1+21; do { }while(RB6_bit==0); delay_ms(1); } if (current_duty1 > pwm_period1) { current_duty1 = 0; } PWM_Set_Duty(current_duty1, 1); if (RB7_bit==0) { current_duty1 = current_duty1-21; do { }while(RB7_bit==0); delay_ms(1); } if (current_duty1 > pwm_period1) { current_duty1 = 0;


} PWM_Set_Duty(current_duty1, 1); } void Inicio_Pwm() { pwm_period1 = PWM_Init (1000,1,1,2); PWM_Start (1); PWM_Set_Duty(current_duty1,1); } void main () { ADPCFG=0xFFFF; PORTB = 0; TRISB = 0; TRISB.F6 =1; TRISB.F7 =1; PORTF = 0; TRISF = 0; current_duty1 = 0; Inicio_Pwm();

while (1) { pwm(); porcentaje(); for(i=0;i<=1;) // CICLO PARA ROTAR LAS POSICIONES DE ACTIVACION DE LOS DISPLAYS { LATF=tabla[i]; if(LATF.F0==1) { LATB=uni; delay_ms(2); } if(LATF.F1==1) { LATB=dece; delay_ms(2); } i++; } } }



Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.