p10

ESCUELA POLITÉCNICA NACIONAL FACULTAD DE INGENIERÍA ELÉCTRICA Y ELECTRÓNICA LABORATORIO DE SISTEMAS MICROPROCESADOS PRE

Views 168 Downloads 6 File size 569KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

ESCUELA POLITÉCNICA NACIONAL FACULTAD DE INGENIERÍA ELÉCTRICA Y ELECTRÓNICA

LABORATORIO DE SISTEMAS MICROPROCESADOS PREPARATORIO 10

TEMA: Conversor Análogo/Digital Realizado por: -

Fátima Cortez

Grupo: Gr- 8

Con un microcontrolador Atmega164P, diseñar un sistema que funcione como:  Voltímetro  Termómetro Se dispone de un pulsador que permite cambiar el modo de funcionamiento del sistema de voltímetro a termómetro o viceversa, por lo que este pulsador debe ser manejado como interrupción. Voltímetro Diseñar un circuito que permita medir un voltaje entre 0V y 5V conectado en el canal ADC0 utilizando el conversor A/D del microcontrolador AtMega 164p con una resolución de 10 bits,En esas condiciones la relación será: 5V = 1023 (lectura del A/D). El valor de la medición deberá ser mostrado en 4 displays de 7 segmentos en base 10; mientras que en 10 LED debe mostrarse directamente la salida del convertidor A/D; utilizar la opción AVcc interno como referencia. El pin de AREF debe estar desconectado de Vcc pero debe colocarse un condensador a tierra para filtrar el ruido. También debe colocar un condensador entre Vcc y GND del microcontrolador para controlar el ruido. Siempre se deben mostrar cuatro dígitos significativos, un entero y tres decimales por lo que deberá en este caso encender el punto que está luego del primer dígito. Obligatoriamente las operaciones deben hacerse usando aritmética de 16 bits para obtener una buena precisión. El instructor comprobará si sus operaciones son correctas de acuerdo a la siguiente ecuación: 𝑉𝑎𝑙𝑜𝑟 𝑎 𝑚𝑜𝑠𝑡𝑟𝑎𝑟 𝑒𝑙 𝑙𝑜𝑠 𝑑𝑖𝑠𝑝𝑙𝑎𝑦 = 𝑙𝑒𝑐𝑡𝑢𝑟𝑎 𝑑𝑒 𝑙𝑜𝑠 𝐿𝐸𝐷 ∗ 5 𝑉𝑜𝑙𝑡𝑖𝑜𝑠 1023 Se puede comprobar si usted está usando aritmética de 16 bits pues el cambio de lectura de voltaje si cambia un LSB( bit menos significativo) es de aproximadamente 4.88 mV. Ejemplo: Voltímetro: 4.370V

Termómetro Diseñar un circuito que permita medir la temperatura utilizando el circuito integrado LM35 conectado al canal ADC1, utilizar obligatoriamente la referencia interna de 1.1 V (esto será verificado por el instructor) y en esas condiciones 1.1V = 110 °C = 1023 (lectura del A/D). El pin de AREF debe estar desconectado de Vcc pero debe colocarse un condensador para filtrar el ruido. También debe colocar un condensador entre Vcc y GND del microcontrolador para controlar el ruido. Obligatoriamente las operaciones deben hacerse usando aritmética de 16 bits para obtener una buena precisión. El rango del termómetro será de 00,00° C a 99,99° C, (y siempre mostrará cuatro dígitos

significativos con dos dígitos enteros y dos dígitos decimales) . Se asume que el punto decimal en este caso está luego del segundo dígito por lo que debe encenderlo. También en este caso en 10 LED debe mostrarse directamente la salida del convertidor A/D . El instructor comprobará si sus operaciones son correctas de acuerdo a la siguiente ecuación: 𝑇𝑒𝑚𝑝𝑒𝑟𝑎𝑡𝑢𝑟𝑎 𝑎 𝑚𝑜𝑠𝑡𝑟𝑎𝑟 𝑒𝑙 𝑙𝑜𝑠 𝑑𝑖𝑠𝑝𝑙𝑎𝑦 = 𝑙𝑒𝑐𝑡𝑢𝑟𝑎 𝑑𝑒 𝑙𝑜𝑠 𝐿𝐸𝐷 ∗ 1.1 𝑥 100/ 1023 Se puede comprobar si usted está usando aritmética de 16 bits pues el cambio de lectura temperatura si cambia un LSB( bit menos significativo) es de aproximadamente 0.1075 °C Cuando el sensor LM35 detecte un nivel mayor a 40ºC deberá encender una alarma visual (Led indicador), que se apagará una vez que el nivel baje del 30ºC Código /*CONVERSOR ANALOGO DIGITAL, MODO VOLTIMETRO AREF 1.1V Interno del microcontrolador La variable analogica ingresara a travez de a8 mientras que desde a0 hasta a7, se usara para encender el display En el portc se encuentran desde c0 hasta c3 las lineas de habilitacion del barrido de display Los diez leds saldran por el PORTB y PORTD D0-D1 */ .def tempo=r16 .def barrer=r17 .def conta=r18 .def multiplicador=r23 .def aux2=r19 .def aux3=r20 .def converl=r21 .def converm=r22 .def bandera=r24 .def vez=r5 //voy a usar conversion manual .dseg //aqui guardo los datos del producto y division resultado_h: .byte 1 resultado_l: .byte 1 resultado_hl: .byte 1 resultado_ll: .byte 1 //aqui guardo los datos multiplicados, divididos, y listos para la conversion dig0: .byte 1 dig1: .byte 1 dig2: .byte 1 dig3: .byte 1

.cseg .org rjmp .org rjmp

0x00 inicio 0x02 cambio

//incio configuracion de puertos

inicio: //puerto A ldi tempo,0b0000_1111 // a7 a6 es entrada y se usa para la conversion, a0-a3 son para controlar los displays out ddra,tempo ldi tempo,0b0011_0000 out porta,tempo//aunque el a7 es entrada, se desactiva el pull up, por que se va a usar para conversion //conversion a-d en este micro no es necesario, pero acostumbrarse a hacerlo, en otros micros si lo es //puerto B ldi tempo,255//todo el portb es salida digito menos isgnificativo de la conversion out ddrb,tempo ldi tempo,0 out portb,tempo //puerto C ldi tempo,0b1111_1111//todo el portc son salidas, por que voy a necesitar el punto out ddrc,tempo ldi tempo,0 out portc,tempo //puerto D ldi tempo,0b1000_0011//las d0 d1 son los ultimos bits mas significativos de la conversion y d2 int0 es para la interrupcion out ddrd,tempo ldi tempo,0b0111_1100 out portd,tempo //configuracion PUD in tempo,mcucr andi tempo,0b1110_1111 out mcucr,tempo //fin de configuracion de puertos //configurar interrupcion, para que coexistan voltimetro y termometro

ldi sts ldi out out clr

tempo,0b0000_0010 EICRA,tempo tempo,0b0000_0001 EIMSK,tempo EIFR,tempo bandera

sei

ldi out ldi out

tempo,HIGH(RAMEND) sph,tempo tempo,LOW(RAMEND) spl,tempo

principal: ldi tempo,0b1100_0110 sts ADCSRA,tempo //fin configuracion de conversion analoga digital ldi tempo,0b1100_0000 sts DIDR0,tempo

//analizo la bandera sbrs bandera,0 // si esta en 0 ES VOLTIMETRO rjmp voltimetro //como termometro SI EL BIT0 DE BANDERA esta en 1 ldi tempo,0b1000_0110 sts ADMUX,tempo

espera: lds tempo,ADCSRA sbrc tempo,6 rjmp espera //salta alli hasta que el dato este disponible, es decir adsc se ponga en 0 lds aux2,ADCL //siempre leo el menos significativo lds tempo,ADCH //solo si el valor obtenido es menor a 930 lo muestro, caso contrario ignoro todo mov r9,aux2 cpi aux2,low(930) ldi aux2,3 mov r5,aux2 cpc tempo,r5 brcc ignorar

mov aux2,r9 ori tempo,0b0000_0100 out portd,tempo out portb,aux2 rcall multiplicacion rcall ajuste //aqui mismo voy a multiplicar y dividir, convertir de bin a bcd y finalmente mostrar en el display y los 10 led mostrar: ldi tempo,1 mov vez,tempo rcall bin_to_bcd ldi tempo,2 mov vez,tempo rcall bin_to_bcd ignorar: rcall barrido rjmp principal voltimetro: ldi tempo,0b0100_0111 sts ADMUX,tempo espera1: lds tempo,ADCSRA sbrc tempo,6 rjmp espera1 //salta alli hasta que el dato este disponible, es decir adsc se ponga en 0 lds tempo,ADCL //siempre leo el menos significativo out portb,tempo lds tempo,ADCH ori tempo,0b0000_0100 out portd,tempo rcall multiplicacion rcall ajuste

rjmp mostrar barrido: push tempo in tempo,sreg push tempo push conta push barrer //en este punto del programa simplemente, me limitare a barrer el display // todo segun los datos obtenidos y almacenados en marcador1 hasta marcador4 // del valor de estos datos dependera si muestro E,P,G en cada display ldi xh,HIGH(dig0)//apunto a la localidad de dig0 ldi xl,LOW(dig0) ldi barrer,0b0000_1110 ldi conta,4//va a barrer 4 veces, dig 0 - 1 - 2 - 3 seguir_barriendo: //primero apago los displays ldi tempo,0b0000_0000 out portc,tempo ldi tempo,0b0011_1111 out porta,tempo //barrido general, primero leo los datos en los marcadores ldi zh,HIGH(tabla