• Viernes 19 de Abril de 2024, 16:55

Autor Tema:  Problema con I2C de Atmega32 y DS1307  (Leído 2497 veces)

The_Chosen

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problema con I2C de Atmega32 y DS1307
« en: Jueves 17 de Julio de 2008, 04:39 »
0
Hola amigos, tengo un gran problema con el protocolo de comunicación I2C de un Atmega 16, sencillamente... NO FUNCIONA  :brickwall:  Prácticamente me he estado dando contra una pared durante todo el día. Les doy  el código que escribí para que puedan verlo bien y así ayudarme  :ouch:  (estoy programando en lenguaje C, en el Avrstudio4 y usando un Jtag, además lo he simulado en proteus con idénticos resultados :( ):

Código: Text
  1. #define F_CPU 8000000UL
  2. #define SCL_CLOCK 100000L
  3. #include <avr/io.h>
  4. #include <util/delay.h>
  5. #include <avr/interrupt.h>
  6.  
  7.  
  8. #define I2C_WRITE   0
  9. #define I2C_READ    1      
  10. #define START 0x08
  11. #define MT_SLA_ACK 0x18
  12. #define MT_DATA_ACK 0x28
  13.  
  14. #define esclavo 0xD0
  15.  
  16.  
  17.  
  18. void i2c_inicio(void);
  19. unsigned char i2c_start(unsigned char address);
  20. unsigned char rep_i2c_start(unsigned char address);
  21. unsigned char i2c_escr(unsigned char dato);
  22. unsigned char i2c_leerAck(void);
  23. unsigned char i2c_leerNack(void);
  24.  
  25.  
  26. void i2c_inicio(void)
  27. {
  28.  
  29. /*inicializar TWPS = 0 => prescaler =1 */
  30.  
  31. TWSR = 0;
  32. TWBR = ((F_CPU/SCL_CLOCK)-16)/2 ;
  33.  
  34. }
  35.  
  36. unsigned char i2c_start (unsigned char address)
  37. {
  38.  
  39. /*ENVIAR CONDICIÓN START*/
  40.  
  41. TWCR = /**/ (1<<TWSTA) | (1<<TWEN)| (1<<TWINT);
  42.  
  43. PORTC = 0x03;
  44.  
  45.  
  46. /*ESPERAR SETEO POR WARDWARE DEL FLAG TWINT*/
  47. while (!(TWCR & (1<<TWINT)));
  48.  
  49. if ((TWSR&0xF8) != START) return 1;
  50.  
  51.  
  52. /*mandar dirección de esclavo*/
  53.  
  54. TWDR = address;
  55. TWCR = (1<<TWINT)|(1<<TWEN);
  56.  
  57. /*ESPERAR SETEO POR WARDWARE DEL FLAG TWINT*/
  58. while (!(TWCR & (1<<TWINT)));
  59.  
  60. if ((TWSR&0xF8) != MT_SLA_ACK) return 1;
  61.  
  62. return 0;
  63.  
  64.  
  65. }
  66.  
  67. /*repetición START*/
  68.  
  69. unsigned char rep_i2c_start (unsigned char address)
  70. {
  71. return i2c_start(address);
  72. }
  73.  
  74.  
  75. unsigned char i2c_escr (unsigned char dato)
  76. {
  77.  
  78. /*escribir dato después de haber mandado la dirección del esclavo*/
  79.  
  80. TWDR = dato;
  81. TWCR = (1<<TWINT)|(1<<TWEN);
  82.  
  83. /*asegurarse del seteo de TWINT*/
  84.  
  85. while (!(TWCR & (1<<TWINT)));
  86.  
  87. /* enmascarar y comparar TWSR */
  88.  
  89. if ((TWSR&0xF8) != MT_DATA_ACK) return 1;
  90.  
  91. return 0;
  92.  
  93. }
  94.  
  95.  
  96. unsigned char i2c_leerAck(void)
  97. {
  98.     TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
  99.     while(!(TWCR & (1<<TWINT)));    
  100.  
  101.     return TWDR;
  102.  
  103. }
  104.  
  105. unsigned char i2c_leerNack(void)
  106. {
  107.     TWCR = (1<<TWINT) | (1<<TWEN) ;
  108.     while(!(TWCR & (1<<TWINT)));    
  109.  
  110.     return TWDR;
  111.  
  112. }
  113.  
  114. void i2c_stop(void)
  115. {
  116. TWCR = (1<<TWINT)|(1<<TWEN)|(1<TWSTO);
  117. }
  118.  
  119. void main (void)
  120. {
  121.  
  122. i2c_inicio();
  123. i2c_start(esclavo+I2C_WRITE);
  124. i2c_escr(0x00);/*envío dirección o puntero*/
  125. i2c_escr(0x59); /*segundo*/
  126. i2c_escr(0x35);/*minutos*/
  127. i2c_escr(0x22);/*horas*/
  128. i2c_escr(0x05);/*dia*/
  129. i2c_escr(0x19);/*fecha*/
  130. i2c_escr(0x11);/*mes*/
  131. i2c_escr(0x09);/*año*/
  132. i2c_escr(0x10);/*confuguracion*/
  133. i2c_stop();
  134. }
  135.  

fernan69k

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Problema con I2C de Atmega32 y DS1307
« Respuesta #1 en: Martes 27 de Octubre de 2009, 20:09 »
0
Hola buenas! no se si sigues viendo el foro pero si es asi me gustaria saber si conseguiste arreglar el problema con el I2C... yo estoy con el mismo problema y no se si tngo algo mal conectado o que porque cuando ejecuta la intruccion para generar el START, no llega a ponerse a 1 el TWINT y se queda ahi el programa pillado..

Aver si me puedes ayudar...

Un saludo