Está en la página 1de 10

ESCUELA POLITÉCNICA NACIONAL

FACULTAD DE INGENIERÍA ELÉCTRICA


Y ELECTRÓNICA

LABORATORIO DE
CONTROL CON MICROPROCESADORES

TRABAJO PREPARATORIO

Práctica No: 02

Tema: FAMILIARIZACIÓN PROGRAMACIÓN EN


BASCOM Y ATMEL STUDIO EN C

Grupo: GR-6

Realizado por: Sebástian Sánchez

Fecha de Entrega: 18/06/2020


Semestre 2020A
Trabajo preparatorio:

1. Consular como se debe implementar un programa con comunicación serial en los


lenguajes visuales: LabVIEW, Visual Basic, Visual C++, MATLAB, Python.
a. LabVIEW:
Para LabVIEW es necesario utilizar los bloquea Visa como se puede ver a
continuación.

Fig1. Paleta serial de LabVIEW.

Fig2. Implementación comunicación serial LabVIEW.

b. Visual Basic
Para lograr comunicación serial en Visual basic, primero debemos agregar un
componente conocido como Microsoft Comm Control:

Fig3. Selección de componente comunicación serial Visual Basic.


Luego se puede hacer la programación visual como se observa a continuación.

Fig4. Implementación comunicación serial Visual Basic.

c. Visual C++,
Para Visual C++ Utilizamos ficheros de cabecera (.h). Para trabajar sobre este
formulario manteniendo la representación gráfica, necesitaremos la ventana
“Cuadro de herramientas”, que podemos hacer visible a través del menú “Ver”

Fig5. Despliegue de la barra de herramientas Visual C++.

Trabajamos de igual manera que otros programas, armando nuestra propia


estructura de bloques.

Fig6. Implementación comunicación serial Visual C++.


d. MATLAB
En Matlab podemos utilizar simulink para la comunicación serial, utilizando la
librería llamada “Instrument Control Toolbox”:

Fig7. Selección de la librería para comunicación serial en Matlab.

Fig8. Implementación comunicación serial Matlab.

e. Python
Para la comunicación serial en Phyton programamos cada bloque y su función
en código, que luego aparecerán en el HMI correspondiente.

Fig9. Creación de bloques y ubicación de textos mediante programación en Phyton.


Fig10. Implementación comunicación serial Phyton

2. Se desea implementar dos contadores de 8 bits ascendente/descendente, el primer


contador se visualizará en 3 displays de 7 segmentos conectados al microcontrolador,
el modo de funcionamiento (ascendente/descendente) será controlado desde el HMI
mediante comunicación serial; el segundo contador se visualizará en un indicador
digital en el HMI y su modo de funcionamiento se controlará desde un interruptor
conectado al microcontrolador. El intervalo de tiempo de cambio de los contadores se
controlará con un potenciómetro conectado a un canal analógico del
microcontrolador o un control analógico del panel frontal del HMI respectivamente.
El intervalo será de 100 [ms] a 1000 [ms]. El programa para el microcontrolador debe
ser desarrollado en C y el HMI en un lenguaje Visual.

Código:
#include <avr/io.h> // CONFIGURACION unsigned char
#include COMUNICACION SERIAL usart_getchar(void)
<avr/interrupt.h> void {
#include <util/delay.h> USART_Init(unsigned int while(!(UCSR0A&(
ubrr) 1<<RXC0)));// espera,
{ mientras no este limpio
#define F_CPU 8000000UL UBRR0=0; el buffer
#define FOSC 8000000 // UCSR0B|=(1<<RXCI return UDR0;
velocidad del reloj E0)|(1<<RXEN0)|(1<<TXEN //Retornar dato
#define BAUD 9600 0); }
// baudios UCSR0C|=(3<<1); // CONFIGURACION
UBRR0=ubrr; GENERAL
// VARIABLES sei(); void
int conta; configuracion(void)
int conta1; } {
int aux; void usart_putchar(char //
int modo; data) CONFIGURACION PUERTOS
//VARIABLES { DDRB=255;
COMUNICACION while(!(UCSR0A&( //
unsigned char dato; 1<<UDRE0))); //Espero, SALIDA PUERTO B
uint16_t valor_adc; que este limpio el
char buffer DDRA=0b11111101;
displays[10]={0xC0,0xF9 UDR0=data;
,0xA4,0xB0,0x99,0x92,0x PORTA=0b00000010;
82,0xF8,0x80,0x90}; //transmisión PORTB=PORTC=0;
void barrido (int de dato DDRD=0;
numero); }
PORTD=255; void barrido(int
// OCR1A=(21*valor_ numero)
ENTRADA adc)+2450; {
// unsigned short
CONFIGURACION barrido(conta); U; //Variable para
INTERRUPCION EXTERNA guardar las unidades.
cli(); //barrido(valor_ unsigned short
// adc); D; //Variable para
deshabilito } guardar las decenas.
interrupciones } unsigned short
EICRA= // INTERRUPCION ADC C; //Variable para
0b00001010; // flanco ISR(ADC_vect) guardar las centenas.
de bajada { unsigned short
EIMSK= valor_adc=ADC; UM; //Variable para
0b00000011; // INT0, } guardar las unidades de
INT1 // INTERRUPCION POR mil
EIFR= COMUNICACION UM =
0b00000000; ISR(USART0_RX_vect) numero/1000; //Cálculo
// { de las unidades de mil.
detectar interrupciones C = (numero-
// dato=usart_getch UM*1000)/100; //Cálculo
CONFIGURACION CONVERSOR ar(); de las centenas.
ADMUX= PORTA=dato; D = (numero-
0b01000001; } UM*1000-C*100)/10;
// ADCSRA= // INTERRUPCION POR //Cálculo de las
0b11001110; CAMBIO DE ESTADO EN EL decenas.
//CONFIGURACION MICRO U = (numero-
TIMER1 ISR(INT0_vect) UM*1000-C*100-D*10);
TCCR1A=0; // rutina cuando //Cálculo de las
se produzca una unidades.
TCCR1B=0b00001100; interrupcion INT0
//OCR1A=20000; { PORTC=0;
TIMSK1=2; conta=conta+50; PORTB=displays[U
TIFR1=2; } ];
sei(); ISR(INT1_vect) PORTC=0b00000001
// habilito // rutina cuando ;
interrupciones se produzca una _delay_us(10000)
} interrupcion INT0 ;
{ PORTC=0;
// PROGRAMA PRINCIPAL conta--;
int main(void) } PORTB=displays[D
{ // INTERRUPCION POR ];
configuracion(); TIMER PORTC=0b00000010
USART_Init(51); ISR(TIMER1_COMPA_vect) ;
{ _delay_us(10000)
while (1) if (dato==1) ;
{ { PORTC=0;
conta--;
if((PIND&(1<<PD4 } PORTB=displays[C
))==0) else ];
{ { PORTC=0b00000100
conta++; ;
modo=0; } _delay_us(10000)
} if (modo==1) ;
else { PORTC=0;
{ conta1--;
} //PORTB=displays
modo=1; else [UM];
} { //PORTC=0b000010
conta1++; 00;
UDR0=conta1; } //_delay_us(1000
ADCSRA= } 0);
0b11001111; //PORTC=0;

// BARRIDO }
Diagrama de flujo:

Fig11. Diagrama de flujo del programa.


LABVIEW:

Fig12. Diagrama en LabView.

Evidencias:

Fig13. Evidencia Funcionamiento.

En las imágenes se puede ver primero a la izquierda el funcionamiento del programa, ambos
contadores están en modo ASCENDENTE a una velocidad de 1s, en la imagen de la derecha se
ve el mismo circuito 2 segundos después, evidenciando que el contador esta subiendo, como se
puede ver en ambos contadores el tiempo es el mismo.
Fig14. Evidencia Funcionamiento.

En estas imágenes se puede ver en la izquierda que el CONTADOR 1 paso a modo DESCENDENTE,
mientras que el CONTADOR 2 permaneció en modo ASCENDENTE, en el HMI se puede ver que
el interruptor correspondiente al contador 1 subió a modo descendiente, además se puede ver
en los números de los contadores que están desfasados debido al cambio de modo en uno de
los contadores, para ver el funcionamiento se tomo dos capturas, en la primera se ve que el
contador 1 esta en 32s y el contador 2 esta en 34s, seguidamente en la imagen 2 tomada 1s
después se ve que el contador 1 esta en 31s y el contador 2 esta en 35s, verificando que el
contador 1 esta descendiendo y el contador 2 ascendiendo.

Fig15. Evidencia Funcionamiento.

En estas imágenes se puede ver que el CONTADOR 2 paso a modo DESCENDIENTE, el contador
1 permanece descendiente también, para poner al contador 2 en modo descendiente se
levanto el SW ubicado en PD4, en la primera imagen el contador 1 esta en 21s, mientas que el
contador 2 está en 37s, 1 segundo después en la imagen de la derecha se ve que el contador 1
esta en 20s y el contador 2 esta en 36s, evidenciando que ambos contadores están en modo
descendiente.
Fig16. Evidencia Funcionamiento.

Finalmente se puede ver en las 2 imágenes que el CONTADOR 1 esta en modo ASCENDENTE,
mientras que el CONTADOR 2 esta en modo DESCENDENTE, en la primera imagen el contador
1 esta en 21s y el contador 2 esta en 31s, 1s después el contador 1 pasa a 22s y el contador 2
pasa a 30s.

Referencias:

[1] MrElberni. (16 de junio de 2020). Convertidor analógico digital AVR. Microcontroladores:
http://microcontroladores-mrelberni.com/convertidor-analogico-digital-avr/

[2] Atmel. Datasheet ATmega164P.

[3] Cámara Nebreda. J. Desarrollo de interfaces para Arduino en Visual C++. 2016

[4] Rosado Medina. J. Realización de drivers para LabVIEW. Leganés, 2011

También podría gustarte