LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: retep em 30 de Maio de 2009, 18:14
-
Boas pessoal,
inicio este tópico a conselho do tr3s,ele já me mandou uma ajuda mas toda a que poder ter é muito bem vinda. tenho um projecto entre mãos que envolve uma tmega32 e um rtc ds1302 da maxim. tenho de conseguir ter no atmega a data e hora proveniente do rtc, para postriormete apresenta-la num glcd ks0108. No que toca ao lcd já consegui desenvolver o código pretendido estou comsérias dificuldades é no que diz respeito ao rtc, o protocolo de comunicação que tenho de usar é o i2c.
Desde já o meu obrigado por qualquer ajuda,
Cumpts,
reteP
-
Provavelmente encontras código já feito para esse chip... ou para outro da maxim que tenha interface i2c. Começa por procurar código para i2c no mega32.
-
pessoal, reformulo a minha duvida, em principio só alterará os registos mas tenho de usar um atmega128 uma vez que nao vou ter portos suficientes no atmega 32
-
No avrfreaks (avrfreaks.net) tens uma base enorme de projectos só para AVR, certamente há por lá código i2c e se calhar até para esse DS. A ATMEL (atmel.com) também tem montes de "notas de aplicação" (application notes) que ensinam a programar os vários periféricos (e normalmente trazem código).
-
Boas pessoal, se enviar o código voces podem ver onde é qeu está errado?
Obrigado
-
manda ;)
-
Já te mando Fifas,
estou em aula e nao estou como portatil comigo. obrigado pela disponibilidade
-
podes meter aqui mesmo ;) assim todos te podem dar uma ajuda :)
-
#include<stdio.h>
#include<util\twi.h>
#include<ks0108.h>
/* definicao da frequencia do cpu em Mhz*/
#ifndef F_CPU
#define F_CPU 4000000UL
#endif
unsigned char buffer[];
/* I2C clock in Hz */
#define SCL_CLOCK 100000L
void i2c_init(void)
{
/* inicia o clock twi: 100 kHz clock, TWPS = 0 => prescaler = 1 */
TWSR = 0; /* sem prescaler */
TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* tem de ser > 10 para operação estável */
}
/*********************************************************************
***********************i2c_rep_start**********************************
*********************************************************************/
unsigned char i2c_start(unsigned char address)
{
int twst;
// envia a condicao de start
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// espera ate ao final da transmissao
while(!(TWCR & (1<<TWINT)));
// verifica o valor do registo TWI.mascara de bits do prescaler
twst = TW_STATUS & 0xF8;
if ( (twst != TW_START) && (twst != TW_REP_START))
return 1;
// encvio do endereço do dispositivo
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
// espera ate a transissao estar completa e recebe o ackonlage ou o non acknolage
while(!(TWCR & (1<<TWINT)));
//verifica o valor do registo TWI.mascara de bits do prescaler
twst = TW_STATUS & 0xF8;
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) )
{
return 1;
}
return 0;
}
/*********************************************************************
***********************i2c_start_wait*********************************
*********************************************************************/
void i2c_start_wait(unsigned char address)
{
uint8_t twst;
while ( 1 )
{
// envia a condicao de start
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
// send device address
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
// espera ate ao fim da transimssao
while(!(TWCR & (1<<TWINT)));
// verifica o valor do regidto TWI. bits de mascara do prescaler.
twst = TW_STATUS & 0xF8;
if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
{
/* dispositivo ocupado, enviada condicao de stop para parar a execucao*/
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
// esperar ate que a condicao esteja terminada, e libertacao do bus
while(TWCR & (1<<TWSTO));
continue;
}
//if( twst != TW_MT_SLA_ACK) return 1;
break;
}
}
/*********************************************************************
***********************i2c_rep_start**********************************
*********************************************************************/
unsigned char i2c_rep_start(unsigned char address)
{
return i2c_start( address );
}
/*********************************************************************
***********************i2c_stop***************************************
*********************************************************************/
void i2c_stop(void)
{
//envio da condição de stop
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
// espera ate que a condição de stop seja efectuada e o bus esteja livre
while(TWCR & (1<<TWSTO));
}
/*********************************************************************
***********************i2c_write**************************************
*********************************************************************/
unsigned char i2c_write( unsigned char data )
{
uint8_t twst;
// envio da data para o previo endereco do dispositivo
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);
// espera ate o envio tar concluido
while(!(TWCR & (1<<TWINT)));
// verifica o valor do registo TWI.bits de mascara do prescaler
twst = TW_STATUS & 0xF8;
if( twst != TW_MT_DATA_ACK)
{
return 1;
}
return 0;
}
/*********************************************************************
***********************i2c_readAck************************************
*********************************************************************/
unsigned char i2c_readAck(void)
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
while(!(TWCR & (1<<TWINT)));
return TWDR;
}
void main (void)
{
i2c_init();
i2c_start(0x82);
i2c_start_wait(0x82);
//buffer[5]=i2c_start(0x82);
i2c_stop();
//ks0108Puts(buffer[]);
}
-
Boas pessoal :),
vinha pedir-vos ajuda uma vez que arranjei uns exemplos que me arranjaram vindos juntamente com um kit com um atmega128, mas aquilo nao funciona uma vez que mesmo com as bibliotecas e todos os ficheiros, tem imensos erros, ninguem tem por ai algo feito em i2c para um atmega para eu dar uma vista de olhos?
Cumprimentos,
reteP