TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: denos2000 en 16 de Julio de 2005, 14:41:00
-
Buenas:
Escribía para preguntar si alguien tiene algun manual de c para usar con el atmel atmega8.
P.D.
Si alguien sabe en c como usar el LCD por favo r que me lo diga.
Gracias.
-
Hola, te puedo recomendar lo siguiente:
1. Documentación en inglés de la libc del GNU C para AVR (distribución WinAVR):
http://www.xior.org/Doc/ThirdParty/avr-libc-user-manual-1.0.4.pdf.
Incluye librerías de floating point, strings, enteros largos, etc., etc..
2. Compilador WinAVR (con la libc mencionada arriba): http://www.xior.org/Soft/AVRDevTools_Win32/WinAVR-20050214-install.exe
3. Entorno integrado en Español con manejo de proyecto, compilación con una sóla tecla y coloreo de sintaxis: http://www.xior.org/Soft/AVRDevTools_Win32/AvrSide_esp.zip
Antes tenés que bajarte el entorno con el instalador en inglés y pisar el exe. El instalador de la versión base es: http://www.xior.org/Soft/AVRDevTools_Win32/setup_en.exe
Para programar LCDs, FAT, I2C, etc. te recomiendo buscar las librerías AVRLib Procyon, no recuerdo el link pero aparecen el Google. Son muy completas y están bajo licencia GNU.
Un programa incial en C para el ATMega8 que inicializa un LED y manda un string por la UART lo podés bajar de: http://www.xior.org/Soft/AVRFirmware/XiOR.0107.Test.20050620.zip
Firmware preeliminar de PID y control de motores con PWM para ATMega8, todo en C (WinAVR): http://www.xior.org/Soft/DocRelatedSoftware/XiOR.N-Platform.SpeedControlIntro.Soft.20050324.zip
Y ¡el tutorial en Español de este último firmware con toda la parte matemática está en: http://www.xior.org/Doc/PapersAndWorks/XiOR.N-Platform.SpeedControlIntro.ESP.20050324.pdf!
Saludos,
Julián
www.xior.org
-
Hola, espero ya tengas resuelto tu problema..
Te comento que yo tengo un programa para manejo de LCD ya que fui a un curso y me lo proporcionaron aunque no se casi nada de estos micros pero lo comparto para quien le sirva.
Saludos y tengo mas programas si los quieren escriban al foro y con gusto los comparto.
-
Aqui el programa que mencione anteriormente
#include <./lcd.h>
#include <./timers.h>
#include <avr/io.h>
extern unsigned int bf;//busy flag
/****************************************************
Rutina de encendido/apagado de la linea de control E
****************************************************/
void toggle(void){
sbi(PORTB,PB7);
//delay(2);no requerido
cbi(PORTB,PB7);
}
/****************************************************
Rutina de inicializacion del LCD
****************************************************/
void LCDini(void){
delay(30);
PORTD=0x30;
toggle();
delay(10);
PORTD=0x30;
toggle();
delay(10);
PORTD=0x20;//bus 4 bits
toggle();//***** 1 ****
delay(10);
PORTD=0x20;//bus 4bits
toggle();//***** 2 ****
//delay(10);
PORTD=0x80;// 2 LINEAS, 5X7 PUNTOS
toggle();
LCDbusy();//delay(10);
PORTD=0x00;//display on, cursor off
toggle();//***** 3 ****
//delay(10);
PORTD=0xC0;//blink off 0x0E
toggle();
LCDbusy();//delay(10);
PORTD=0x00;
toggle();//***** 4 ****
//delay(10);
PORTD=0x10;// display clear
toggle();
LCDbusy();//delay(10);
PORTD=0x00;
toggle();//***** 5 *****
//delay(10);
PORTD=0x60;// display entry
toggle();//funciona co LCDhome()
LCDbusy();//delay(10);//y no con LCDclear()
}
/****************************************************
Escribe un caracter en el display
****************************************************/
void LCDwrite(unsigned char dato){//escribe un caracter al lcd
volatile unsigned char tmp2;
tmp2=dato;
tmp2=tmp2&0xF0;//nibble alto
dato=(dato&0x0F)<<4;//nibble bajo
sbi(PORTB,PB6);
PORTD=tmp2;
toggle();
PORTD=dato;
toggle();
bf=LCDbusy();//delay(8);
cbi(PORTB,PB6);
}
/****************************************************
Escribe una cadena de tamaño size con retardo de
milisegundos entre la escritura de cada caracter
****************************************************/
void LCDputs(unsigned const char *msg, unsigned char size,unsigned int ms){
volatile unsigned char i;
for(i=0;i<size;i++){
LCDwrite(*(msg+i));
delay(ms);
}
}
/****************************************************
Fija la direccion de escritura en el display
****************************************************/
void LCDaddr(unsigned char addr){
volatile unsigned char tmp2;
tmp2=addr;
tmp2=tmp2&0xF0;//nibble alto
addr=(addr&0x0F)<<4;//nibble bajo
PORTD=tmp2|0x80;
toggle();
//delay(8);
PORTD=addr;
toggle();
LCDbusy();//delay(8);
}
/****************************************************
Limpieza del display, y regresa a la posicion cero de
memoria, de manera manual encender el cursor y el
display mediante LCDcontrol();
****************************************************/
void LCDclear(void){
PORTD=0x00;
toggle();
//delay(8);
PORTD=0x10;
toggle();
LCDbusy();//delay(8);
}
/****************************************************
Cursor en posicion home
****************************************************/
void LCDhome(void){
//manda cursor a home, la ram no se afecta,
//endender el display, cursor manualmente
PORTD=0x00;
toggle();
//delay(8);
PORTD=0x20;
toggle();
LCDbusy();//delay(8);
}
/****************************************************
lee busy flag, regresa el valor de la direccion RAM
del display
****************************************************/
unsigned char LCDbusy(void){
unsigned char busy,tmp;
sbi(PORTB,PB0); //enciende R/W
cbi(PORTB,PB6); //apaga RS
DDRD = 0x0F;//cambia las salidas por entradas
do{
cbi(PORTB,PB7);
delay(2);
sbi(PORTB,PB7);
busy = PIND;//lee puerto
delay(2);
cbi(PORTB,PB7);
busy = busy&0xF0;//parte alta
sbi(PORTB,PB7);
delay(2);
tmp = PIND;//lee puerto
cbi(PORTB,PB7);
tmp = (tmp&0xF0)>>4;//parte baja
busy=busy||tmp;//byte completo
tmp=busy&0x80;//enmascara BF
}while((tmp&0x80)==0x80);
bf=busy&0x7F;//limpia bf de direccion
cbi(PORTB,PB0); //apaga R/W
DDRD = 0xF0; //cambia las entradas por salidas
return(busy);
-
hola a todos soy nuevo en esto y ando buscando ejemplos de como leer sensores en una placa XiOR 0107 (atmega8) programada en C
salu2 y gracias.
les cuento q estoy usando el AVRSide y el Megaload