collapse

* Links de Robótica

* Posts Recentes

RN42 e TP-Link MR3020 por doiga
[Ontem às 19:22]


Ajuda Projecto IR / RF por senso
[Ontem às 13:15]


Recomendação de um opamp para um DAC r2r por Njay
[Ontem às 12:33]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]


Amplificador audio por beirao
[12 de Novembro de 2017, 23:43]


Power_OK Enermax por edeweld
[12 de Novembro de 2017, 17:15]

Autor Tópico: Atmega 32 +ds1302  (Lida 2280 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline retep

  • Mini Robot
  • *
  • Mensagens: 7
Atmega 32 +ds1302
« 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

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re:Atmega 32 +ds1302
« Responder #1 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.

Offline retep

  • Mini Robot
  • *
  • Mensagens: 7
Re:Atmega 32 +ds1302
« Responder #2 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

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.141
    • Tróniquices
Re:Atmega 32 +ds1302
« Responder #3 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).

Offline retep

  • Mini Robot
  • *
  • Mensagens: 7
Re:Atmega 32 +ds1302
« Responder #4 em: 01 de Junho de 2009, 12:13 »
Boas pessoal, se enviar o código voces podem ver onde é qeu está errado?


Obrigado

Offline Fifas

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 2.060
  • El RoboSapiens
Re:Atmega 32 +ds1302
« Responder #5 em: 01 de Junho de 2009, 12:51 »
manda ;)

Offline retep

  • Mini Robot
  • *
  • Mensagens: 7
Re:Atmega 32 +ds1302
« Responder #6 em: 01 de Junho de 2009, 17:58 »
Já te mando Fifas,

estou em aula e nao estou como portatil comigo. obrigado pela disponibilidade

Offline Fifas

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 2.060
  • El RoboSapiens
Re:Atmega 32 +ds1302
« Responder #7 em: 01 de Junho de 2009, 21:05 »
podes meter aqui mesmo ;) assim todos te podem dar uma ajuda :)

Offline retep

  • Mini Robot
  • *
  • Mensagens: 7
Re:Atmega 32 +ds1302
« Responder #8 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[]);
}

« Última modificação: 02 de Junho de 2009, 12:03 por TigPT »

Offline retep

  • Mini Robot
  • *
  • Mensagens: 7
Re:Atmega 32 +ds1302
« Responder #9 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