jueves, 6 de diciembre de 2018

30 PROYECTOS CON MICROCONTROLADORES, DESCARGAR GRATIS


Hoy les traigo una miscelania de proyectos con microcontroladores, estos proyectos los pueden usar como referencia para desarrollar sus propios proyectos, o si quieren empezar desde cero en la programación de microcontroladores. Los microcontroladores utilizados son de la familia AVR, en específico el Atmega164p, Atmega328 y Atmega8. 
El entorno de programación es Atmel y casi todos los proyectos contienen un archivo en Proteus, para la simulación de los diferentes programas. 
Estos programas estan disponibles en mi Drive, y la descarga es totalmente gratuita.

2 pwm tope fijo Freloj 8Mhz de 25 y 50 ancho de pulso

Barrido de display

Contador 0 a 9

Contador de 0 a 9 con dipswiitch y barrido de display

Control de 2 motores con 3 sensores de nivel

Control de motor dc mediante Labview

Control de un motor dc

Control PID

Cronometro 

Enviar datos Labview

Formato de programa 

Inicio LCD

Interrupción por cambio de estado

Interrupciones externa

Intextcontde 0 9 y 9 0 .

Jugadores con int LED gira de arriba abajo de 1 en 1 y de 2 en 2

Librería led

Medir velocidad con encoder

Onda cuadrada de l Khz

Pwm de 3 khz a 8 MHz delta 75

Reloj con led e igualación

Alarma reloj con modo ctc 250 ms

Reloj en tiempo real 

Respaldo de alimentación

Servomotor con pulsadores

Sistema de seguridad y teclado 

Variador de frecuencia 

Uso CBI y SBI

martes, 4 de diciembre de 2018

MANUAL TUTORIAL STM32F0 STM32F4

Hola amigos, hoy les traigo un manual de programación básica con la tarjeta embebida STMF0 pero puede funcionar para versiones como la F4, espero que les sirva de mucha ayuda.
En este enlace pueden descargar los ejemplos ---- Ejemplos-descargar


sábado, 2 de junio de 2018

CRONOMETRO AVR ATMEGA

Este es el programa de un cronómetro, con reinicio y pausa, implementado en un Atmega164p, los el tiempo se muestra en un display de 8 segmentos x4.
Circuito


/*
 * cronometro.c
 *
 * Created: 10/03/2016 8:43:06
 *  Author: Toshiba Satellite
 */ 


#include 
#define F_CPU 1000000UL
#include 
#include 

unsigned char u,d,c,m;
int contador,segundo;   //por q va hasta 9999
unsigned char display[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b000000111,0b01111111,0b01101111};

void configurar(void);

int main(void)
{
 configurar();
 while(1)
 {
  u=segundo%10;
  m=segundo/1000;
  c=(segundo-m*1000)/100;
  d=(segundo-m*1000-c*100)/10;
  
  PORTA=display[u];
  PORTC=0b11111110;
  _delay_ms(5);
  PORTC=255;   //apagar
  PORTA=display[d];
  PORTC=0b11111101;
  _delay_ms(5);
  PORTC=255;
  PORTA=display[c];
  PORTC=0b11111011;
  _delay_ms(5);
  PORTC=255;
  PORTA=display[m];
  PORTC=0b11110111;
  _delay_ms(5);
  PORTC=255;
  
 }
}

void configurar(void)
{
 //configuracion de puertos
 DDRA=255;//salida
 DDRC=255;
 
 //configuracion de timer
 TCCR0A=0b00000010;
 OCR0A=38;
 TCCR0B=0b00000000;
 TIMSK0=0b00000010;
 TIFR0=TIMSK0;     //bajando banderas
 
 //configuracionde interrupciones externas
 EICRA=0b00101010;
 EIMSK=0b00000111;
 
 EIFR=0b00000111;//solo para simulacion
 
 sei();
}

//interrupcion por comparacion del timer 0
ISR(TIMER0_COMPA_vect)
{
 contador++;
 if (contador>100)
 {
  segundo++;
  contador=0;
 }
 
}

//INTERRUPCIONES EXTERNAS
//pausa
ISR(INT0_vect)
{
 TCCR0B=0b00000000;
}

//arrancar
ISR(INT1_vect)
{
 TCCR0B=0b00000100;
}

//reinicio
ISR(INT2_vect)
{
 segundo=0;
}


//

Medir velocidad con encoder, atmega AVR

En este programa se mide la velocidad con un encoder el primer microcontrolador simula los pulsos del encoder een el segundo se implementa el medidor de velocidad, deben tener la libreria del LCD Esta programado en el Atmega164p en lenguaje c

/*
 * medir_velocidad_con_encoder.c
 *
 * Created: 17/03/2016 12:31:58
 *  Author: Toshiba Satellite
 */ 


#include 
#define F_CPU 8000000UL
#include 
#include 
#include "lcd.h"
#include 

uint8_t EEMEM   dir_distancia;

int pulsosv,velocidad;
int danterior;
unsigned int pulsosd;
unsigned int distancia;
unsigned int msm[16];

void configurar(void);

int main(void)
{
 configurar();
    while(1)
    {
        //TODO:: Please write your application code 
  //calculo de la disttancia
  distancia=(pulsosd*0.0261666*0.001)+danterior;
  
  lcd_gotorc(1,1);
  sprintf(msm,"%d   ",distancia);
  lcd_puts(msm);
  lcd_gotorc(1,7);
  lcd_puts("Km");
  
  lcd_gotorc(2,1);
  sprintf(msm,"%d   ",velocidad);
  lcd_puts(msm);
  lcd_gotorc(2,5);
  lcd_puts("Km/h");
    }
}

void configurar(void)
{
 DDRD=0b00000000;   //entrada para int0 sin pull up porq viene de un sensor
 DDRA=255;
 PORTD=0b00001000;
 
 //configuracion de la interruptions
 EICRA=0b00001011;
 EIMSK=0b00000011;
 EIFR=0b00000011;
 
 //inicializar lcd
 lcd_init();
 
 //
 
 //configurar eeprom
 danterior=eeprom_read_byte(&dir_distancia);
 
 //configuracion del timer
 TCCR1A=0;
 OCR1A=31249;
 TCCR1B=0b00001100;
 TIMSK1=2;
 TIFR1=2;
 
 sei();
 
}

ISR(INT0_vect)

{
 pulsosd++;
 pulsosv++;
}

ISR(TIMER1_COMPA_vect)
{
 
 
 if (pulsosv>36)
 {
  velocidad=pulsosv*0.08333*6.28*0.05*3.6;
  pulsosv=0;
 }
 
}

ISR(INT1_vect)
{
 eeprom_write_byte(&dir_distancia,distancia);
 sbi(PORTB,0);
}

//
Aqui esta el programa que genera los pulsos del encoder
/*
 * variador_de_frecuencia.c
 *
 * Created: 18/03/2016 11:47:32
 *  Author: Toshiba Satellite
 */ 


#include 
#define F_CPU 8000000UL
#include 
#include 

void configurar(void);

int main(void)
{
 configurar();
    while(1)
    {
        //TODO:: Please write your application code 
  
  ADCSRA=0b11000110;
  _delay_ms(2);
  OCR0A=ADCH;
    }
}

void configurar(void)
{
 DDRB=0b00001000;  //salida de OC0A
 
 //configuracion del timer
 TCCR0A=0b01000010;
 TCCR0B=0b00000100;
 
 
 //configuracion del ADC
 ADMUX=0b01100000;
 DIDR0=0b00000000;
 
}
//

MANEJO DE LCD ASSEMBLER

Para los que están aprendiendo lenguaje ensamblador y quieren manejar un LCD 16x2 les traigo el siguiente código espero que les ayude para sus trabajos o proyectos.
Está implementado en el microcontrolador Atmega164P.



/*
/*
 * LCD.asm
 *
 *  Created: 30/05/2016 10:34:05
 *   Author: CRIS
 */ 

.INCLUDE "m164pdef.inc"

; ASIGNACIÓN DE ETIQUETAS A REGISTROS
.DEF AUX1 = R16 ; REGISTRO AUX1
.DEF AUX2 = R17 ; REGISTRO AUX2
.DEF AUX3 = R18 ; REGISTRO AUX3

.DSEG
BUFFER: .BYTE 10
COLUM: .BYTE 4
; SEGMENTO DE PROGRAMA o MEMORIA FLASH
.CSEG
; ASIGNACIÓN DE ETIQUETAS PARA EL MANEJO DEL DISPLAY
.EQU BUSSAL = PORTC ; BUS PARA ESCRITURA
.EQU BUSINP = PINC ; BUS PARA LECTURA
.EQU CONTROL = PORTD ; LÍNEAS DE CONTROL
.EQU ENABLE = PD7 ; HABILITACIÓN
.EQU RW = PD6 ; LEER=1 ESCRIBIR=0
.EQU RS = PD5 ; DATOS=1 COMANDO=0


; INICIALIZACIÓN DEL STACK
LDI AUX1,LOW(RAMEND)
OUT SPL,AUX1
LDI AUX1,HIGH(RAMEND)
OUT SPH,AUX1
RCALL LCDRST

ESCRIBIR:
LDI ZL,LOW(TEXT1<< 1)
LDI ZH,HIGH(TEXT1<< 1)
RCALL WRTMSJ
RJMP ESCRIBIR

; SUBRUTINA DE INICIALIZACIÓN DEL LCD CON BUS DE 8 BITS

LCDRST: 

LDI AUX1,0xFF ; BUS DEL LCD COMO SALIDA
OUT DDRC,AUX1
LDI AUX1,0xE0 ; LINEAS DE CONTROL DEL LCD
OUT DDRD,AUX1

LDI ZL,LOW(TBLLCD<< 1)
LDI ZH,HIGH(TBLLCD<< 1)
LDI AUX2,5

LCDRST1:
LPM AUX1,Z+
RCALL WRTCMD
DEC AUX2
BRNE LCDRST1
RET
TBLLCD: 
.DB 0x33,0x32,0x38,0x06,0x0E,0x00

; SUBRUTINA PARA ESCRIBIR UN MENSAJE EN EL LCD
WRTMSJ: LDI AUX1,0x80
RCALL WRTCMD
RCALL WRTLIN
LDI AUX1,0xC0
RCALL WRTCMD
RCALL WRTLIN
LDI AUX1,0x94
RCALL WRTCMD
RCALL WRTLIN
LDI AUX1,0xD4
RCALL WRTCMD
RCALL WRTLIN
RET

; SUBRUTINA PARA ESCRIBIR UNA LINEA DE 20 CARACTERES
WRTLIN: LDI AUX2,20
WRTLIN1:LPM AUX1,Z+
RCALL WRTDAT
DEC AUX2
BRNE WRTLIN1
RET
; SUBRUTINA PARA ESCRIBIR UN NÚMERO DESDE EL BUFFER
WRTNUM: RCALL POSCUR
LDI XL,LOW(BUFFER)
LDI XH,HIGH(BUFFER)
CLR AUX3
WRTNUM1:LD AUX1,X+
CPI AUX1,0
BRNE WRTNUM2
CPI AUX3,0
BREQ WRTNUM3
WRTNUM2:INC AUX3
RCALL WRTDIG
WRTNUM3:CPI XL,LOW(BUFFER)+10
BRNE WRTNUM1
CPI AUX3,0
BRNE WRTNUM4
RCALL WRTDIG
WRTNUM4:RET

; SUBRUTINA PARA ESCRIBIR UN CARACTER
WRTCHR: RJMP WRTDAT
; SUBRUTINA PARA ESCRIBIR UN BYTE
WRTBYT: PUSH AUX1
SWAP AUX1
RCALL WRTDIG
POP AUX1
RCALL WRTDIG
RET
; SUBRUTINA PARA ESCRIBIR UN DIGITO
WRTDIG: ANDI AUX1,0x0F
ORI AUX1,0x30
CPI AUX1,0x3A
BRCS WRTDAT
LDI AUX2,7
ADD AUX1,AUX2

RJMP WRTDAT
; SUBRUTINA PARA MOSTRAR EL CURSOR
ONCUR: LDI AUX1,0x0E
RJMP WRTCMD
; SUBRUTINA PARA APAGAR EL CURSOR
OFFCUR: LDI AUX1,0x0C
RJMP WRTCMD
; SUBRUTINA PARA QUE PARPADEE EL CARACTER Y MOSTRAR EL CURSOR
TITCHR: LDI AUX1,0x0F
RJMP WRTCMD
; SUBRUTINA PARA QUE PARPADEE EL CARACTER
TITCUR: LDI AUX1,0x0D
RJMP WRTCMD
; SUBRUTINA PARA MOVER EL CURSOR EN 80 CARACTERES
POSCUR: CPI AUX1,20
BRCS POSCUR4
SUBI AUX1,20
CPI AUX1,20
BRCS POSCUR3
SUBI AUX1,20
CPI AUX1,20
BRCS POSCUR2
SUBI AUX1,20
CPI AUX1,20
BRCS POSCUR1
RET
POSCUR1:LDI AUX2,0xD4
RJMP POSCUR5
POSCUR2:LDI AUX2,0x94
RJMP POSCUR5
POSCUR3:LDI AUX2,0xC0
RJMP POSCUR5
POSCUR4:LDI AUX2,0x80
POSCUR5:ADD AUX1,AUX2
RJMP WRTCMD
; SUBRUTINA PARA ESCRIBIR UN COMANDO
WRTCMD: CBI CONTROL,RS
RJMP WRTDAT1
; SUBRUTINA PARA ESCRIBIR UN DATO
WRTDAT: SBI CONTROL,RS
WRTDAT1:CBI CONTROL,RW
OUT BUSSAL,AUX1
SBI CONTROL,ENABLE
CBI CONTROL,ENABLE
RCALL BUSY
RET
; SUBRUTINA QUE ESPERA MIENTRAS EL LCD ESTÁ OCUPADO
BUSY: LDI AUX1,0x00
OUT DDRC,AUX1
CBI CONTROL,RS
SBI CONTROL,RW
BUSY1: SBI CONTROL,ENABLE
NOP
IN AUX1,BUSINP

CBI CONTROL,ENABLE
SBRC AUX1,7
RJMP BUSY1
LDI AUX1,0xFF
OUT DDRC,AUX1
RET

TEXT1: 
.DB "Hola "
.DB "              Cristian "
.DB "Ponce "
.DB "         "

domingo, 13 de mayo de 2018

Control en Lazo Cerrado de una Máquina DC Operación en 4 Cuadrantes

.
El motivo del presente proyecto es realizar la implementación del control en cascada de la maquina DC para demostrar las ventajas que nos proporciona realizar dicho control frente a perturbaciones mecánicas de valor significativo
El programa se implemento en la tarje TEXAS C 2000 DELIFINO para más información clic en el siguiente enlace:  

http://prograyec.blogspot.com/2018/04/manual-de-programacion-texas-launchpad.html



sábado, 12 de mayo de 2018

Robot Péndulo Invertido Mindstorms NXT - Control de equilibrio


Este articulo trata de la aplicación de un controlador por estructura variable al péndulo invertido de dos ruedas Lego Mindstroms. Un modelo no lineal es tomado para su análisis y es validado con el modelo real, también se realizara la sintonización de las variables de control mediante la implementación de algoritmos genéticos y así lograr obtener una respuesta optima en la planta. Aplicación de algoritmos genéticos con diferentes funciones de costo para LQR y aplicación de algoritmos genéticos para un VSC, para los parámetros de la parte discontinua. Keywords: Robot Lego, Péndulo invertido, Control VSC, LQR, Algoritmos Genéticos.



jueves, 12 de abril de 2018

MANUAL DE PROGRAMACION TEXAS LAUNCHPAD DELFINO C2000

Hola amigos, les traigo un manual simple de como programar la tarjeta Texas launchpad c2000 Delfino, es posible usarlo para otras tarjetas de similares características. El manueal está enfocado en el control de máquinas, espero que les sea de ayuda.
La programación se la hace en VisSim, y usa Code Composer Studio


miércoles, 7 de marzo de 2018

MANUAL DE USO DE PANTALLA LCD 128X64

Pantalla LCD gráfica monocromo de 128x64 píxeles con interfaz serie. Permite controlar todas las funcionalidades de la pantalla de un modo muy sencillo utilizando comandos serie.
Además de escribir texto, esta pantalla LCD gráfica serie permite  dibujar líneas, círculos, rectángulos y establecer los píxeles individuales, borrar bloques específicos de la pantalla, control de la luz de fondo y ajustar la velocidad de transmisión. Además, todo el código fuente para el procesador ATMega168 se compila utilizando el compilador WinAVR libre y es gratuito para descargar. Es ideal para utilizarla con cualquier modelo de Arduino, PIC o AVR en general.

EAGLE 7.6, manual de uso

EAGLE 7.6
Contents
1.   INSTALACIÓN 1
2.   MANUAL DE USO 8
2.1 Abrir Eagle 8
2.2 Crear nuevo Proyecto 9
2.3 Añadir un nuevo elemento 10
2.4 Realizar conexiones entre elementos 15
2.5 Etiquetar conexiones 17
2.6 Generar PBC 18
2.7 Desplazar o mover elementos 19
2.7 Reemplazar un elemento 22
2.8 Routear pistas 22
2.9 Para imprimir 27