Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LABORATORIO DE
CONTROL CON MICROPROCESADORES
TRABAJO PREPARATORIO
Práctica No: 02
Grupo: GR-6
b. Visual Basic
Para lograr comunicación serial en Visual basic, primero debemos agregar un
componente conocido como Microsoft Comm Control:
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”
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.
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:
Evidencias:
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.
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/
[3] Cámara Nebreda. J. Desarrollo de interfaces para Arduino en Visual C++. 2016