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

Título: Atmega 32 +ds1302
Enviado 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
Título: Re:Atmega 32 +ds1302
Enviado por: Njay em 30 de Maio de 2009, 19:12
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.
Título: Re:Atmega 32 +ds1302
Enviado por: retep em 30 de Maio de 2009, 19:47
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
Título: Re:Atmega 32 +ds1302
Enviado por: Njay em 31 de Maio de 2009, 01:16
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).
Título: Re:Atmega 32 +ds1302
Enviado por: retep em 01 de Junho de 2009, 12:13
Boas pessoal, se enviar o código voces podem ver onde é qeu está errado?


Obrigado
Título: Re:Atmega 32 +ds1302
Enviado por: Fifas em 01 de Junho de 2009, 12:51
manda ;)
Título: Re:Atmega 32 +ds1302
Enviado por: retep em 01 de Junho de 2009, 17:58
Já te mando Fifas,

estou em aula e nao estou como portatil comigo. obrigado pela disponibilidade
Título: Re:Atmega 32 +ds1302
Enviado por: Fifas em 01 de Junho de 2009, 21:05
podes meter aqui mesmo ;) assim todos te podem dar uma ajuda :)
Título: Re:Atmega 32 +ds1302
Enviado por: retep em 02 de Junho de 2009, 08:46
Código: [Seleccione]
#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[]);
}

Título: Re:Atmega 32 +ds1302
Enviado por: retep em 04 de Junho de 2009, 16:48
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