Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
I2C AVR ejemplos, en esta seccin se realizarn algunos ejemplos realizados con el
ATMEL STUDIO sobre la utilizacin del mdulo TWI para la comunicacin serial I2C AVR,
esta es la parte prctica de lo que se vio aqu, por lo que se recomienda antes de
continuar visitar el enlace indicado. Se utilizar el archivo de cabecera i2c.h que se
obtuvo para la transmisin y recepcin de datos con el I2C AVR, el microcontrolador
AVR para realizar el I2C AVR ejemplos ser el ATMEGA88 en un inicio, luego se
complementar con otros AVRS.
El archivo de cabecera i2c.h que se obtuvo para ser utilizado con el ATMEGA88 en el
que la Fosc=8Mhz, la velocidad de comunicacin de 400Khz con un prescaler de 1 es el
siguiente, con algunas pequeas modificaciones se puede utilizar en cualquier otro
ATMEGAxxx, si se utiliza otra Fosc y/o otra velocidad de comunicacin hay que hacer
los clculos con TWBR=((Fosc/Velocidad)-16)/(2*prescaler) para el nuevo valor a
cargar en TWBR.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//Archivo de cabecera para el uso del mdulo TWI I2C AVR con el ATMEL STUIDO///
//para el ATMEGA88 como maestro, la comunicacin ser a 400Khz/////
//la frecuencia de trabajo del ATMEGA88 es de 8Mhz, el archivo /////
//puede ser utilizado en otros AVR fcilmente realizandole pequeos///
//cambios como los pines SCL y SDA, la Fosc, siempre revisar la hoja//
//de datos del AVR utilizado para comprobar los registros/////////////
///////////////////////////////////////////////////////////////////////
#ifndef I2C_H_
#define I2C_H_
void i2c_iniciar();
void i2c_espera();
void i2c_inicia_com();
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
void i2c_detener();
//funcin que detiene la comunicacin I2C AVR
void i2c_envia_dato(unsigned char ); //funcin para enviar o escribir
//datos en el esclavo
unsigned char i2c_recibe_dato_ack(); //funcin para recibir o leer datos del esclavo
//enviando el bit ACK si se quiere leer mas datos
//despus del ltimo ledo
unsigned char i2c_recibe_dato_nack(); //funcin para recibir o leer datos del esclavo
//sin enviar el bit ACK si no se quiere leer mas datos
//despus del ltimo leido
uint8_t i2c_estado_com(); //funcin para averiguar el estado de la comunicacin I2C AVR
//til para detectar errores
///////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//inicializacin del mdulo TWI I2C AVR en el ATMEL STUDIO en una funcin////
//para el ATMEGA88 como maestro
//a 400KHz con un oscilador de 8Mhz
void i2c_iniciar(){
PORTC|=((1<<4)|(1<<5)); //activa resistencias pull upp para SCL y SDA
TWBR=2;
//velocidad 400Khz, Fosc 8Mhz, prescaler de 1
TWCR|=(1<<TWEN);
//mdulo TWI iniciado
}
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
// Funcin de espera: mientras el bit7 o bit TWINT del registro
// TWCR sea 0, el IC2 AVR se esperar
// antes de realizar algn trabajo
MICROCONTROLADORES
void i2c_espera(){
while ((TWCR & (1<<TWINT)) == 0);//espera mientras el bit de interrupcion sea 0
}
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
// Funcin de inicio de la comunicacin I2C AVR
void i2c_inicia_com() {
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//bandera de interrupcin a 1, start, habilita I2C A
i2c_espera();
//espera mientras el bit TWINT sea 0
}
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
// Funcin de parada de la comunicacin I2C I2C
void i2c_detener() {
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);//bandera de interrupcin a 1, detener, habilita I2C
}
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//Funcin de transmisin de datos del maestro al esclavo
void i2c_envia_dato(unsigned char dato) {
TWDR = dato;
TWCR = (1<<TWINT)|(1<<TWEN);//para empezar a enviar el dato
i2c_espera();//cuando TWINT se ponga a 1 se habr terminado de enviar el dato
}
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//Funcin de recepcin de datos enviados por el esclavo al maestro
//esta funcin es para leer los datos que estn en el esclavo
//en forma continua, esto es tras leer uno se volver a leer otro
unsigned char i2c_recibe_dato_ack(){//maestro envia ack para seguir recibiendo
//mas datos
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
i2c_espera();
return TWDR;
}
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
//Funcin de recepcin de datos enviados por el esclavo al maestro
//esta funcin es para leer solo un dato desde el esclavo
//esto es tras leer uno ya no se volver a leer otro
unsigned char i2c_recibe_dato_nack(){//maestro no envia ack para no seguir recibiendo
//mas datos
TWCR = (1<<TWINT)|(1<<TWEN);
i2c_espera();
return TWDR;
}
/////////////////////////////////////////////////////////////////
//funcin para averiguar el estado de la comPoltica
unicaci
I2C AVR de Cookies
ynprivacidad
//til para detectar errores, el valor que retorna esta funcin
//se compara con el estado que deberan indicar los bits del 7 al 3
//del registro TWSR segn tabla, durante la comunicacin I2C AVR,
uint8_t i2c_estado_com(){
uint8_t estado;
//variable donde se almacena el estado de la comunicacin
//I2C AVR
estado = TWSR & 0xf8; //en la variable estado se guarda el valor de los 5 bits de
//mas peso del registro TWSR seguidos de 3 ceros,
//el nmero obtenido indica
//el estado en que se encuentra la comunicacin I2C AVR
return estado;
}
#endif /* I2C_H_ */
I2C AVREJEMPLOS
I2C AVR ejemplos 1 En este primer ejemplo se realizar la comunicacin serial I2C
AVR entre el ATMEGA88, y la memoria EEPROM 24LC256 (revisar su hoja de datos) la
que est fabricada para ser utilizada como esclavo en la comunicacin I2C, este
integrado trae una direccin de fbrica para ser utilizado como esclavo de 7 bits, que es
1010(A2)(A1)(A0) los primeros 4 bits son fijos los siguientes 3 se pueden elegir
poniendo los pines A2, A1 y A0 a 0 o a 1, si se utiliza una sola de estas memorias
normalmente estos pines se ponen a 0 para que su direccin sea 1010000, aunque se
puede elegir otra combinacin.
El pin 8 es para la alimentacin, el pin 4 es para el negativo, el pin 7 es para bloquear la
escritura en la eeprom si se pone a 1, se el pin 7 no se conecta o se pone a 0 se podr
escribir en la eeprom.
A partir de este momento ya se puede utilizar el archivo de cabecera i2c.h para realizar
la comunicacin serial con el mdulo TWI I2C AVR
El circuito utilizado para el I2C AVR ejemplos 1 es el siguiente:
En el cdigo para el ATMEGA88 que ser el maestro se tiene que crear una funcin para
la escritura y otra funcin para la lectura de la memoria EEPROM, hay que seguir un
orden en cuanto a la lectura y escritura en la comunicacin serial I2C AVR, eso se puede
ver aqu, ser realizado en el ATMEL STUDIO, los pasos que se siguen estarn
comentados en el cdigo, en caso de utilizar otro dispositivo como esclavo se seguirn
los mismos pasos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/////////////////////////////////////////////
///////*********************************///////
///*** microcontroladores-mrelberni.com ***////
///////*****************************//////////
//* I2C AVR ejemplos 1 cdigo para el maestro ATMEGA88* //
///////********************************///////
#define F_CPU 8000000ul
#include <avr/io.h>
#include <util/delay.h>
#include "i2c.h"
//incluye el archivo de cabecera el que se ha creado
//en Header Files para utilizar la funciones necesarias,
//para el uso del mdulo SSP en modo I2C PIC
void escribe_eeprom(uint16_t dir_men_eep, unsigned char dato); //prototipo de funcin
//para escribir o enviar datos a la memoria EEPROM 24LC256
unsigned char leer_eeprom(uint16_t dir_men_eep); //prototipo de funcin para leer
//o recibir datos de la memoria EEPROM 24LC256
int main(void)
{
DDRD=0b11111111; //todos los pines de puerto D como salidas para conectar los leds
//que permitirn ver el dato leido desde la EEPROM en forma binaria
PORTD=0x00;
//Los leds inician apagados
i2c_iniciar();
while(1)
{
for(uint8_t i=0;i<=100;i++){ //en las direccienes que van desde 0 a 100
escribe_eeprom(i,i);
//de la EEPROM se enviarn o escribirn sus
//mismas direcciones
_delay_ms(20);
//pausa de 20ms para darle tiempo a la eeprom
}
//a que reciba bien los datos
for(uint8_t i=0;i<=100;i++){ //para las direcciones de memoria de la EEPROM
//de la 0 a la 100
PORTD=leer_eeprom(i);
//menvia al puerto D el valor leido en la
//posicin de memoria, ser visto en forma
//binaria con leds
_delay_ms(1000);
}
}
}
//Funcin para enviar o escribir datos en la memoria EEPROM 24LC256
//creada con las funciones que estn en el archivo de cabecera i2c.h
//la funcin se le ha llamado leer_eeprom, hay que darle dos parmetros
//uno ser la direccin del registro de la memoria EEPROM que se desea leer
//o de donde se quiere recibir el dato y el otro el dato a enviar
void escribe_eeprom(uint16_t dir_men_eep, unsigned char dato){
i2c_inicia_com();
//inicia la comunicacin serial i2C AVR
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
i2c_envia_dato(0xa0);
//lo que sigue es enviar la direccin del registro de la memoria EEPROM donde se
//escribir el dato enviado por el maestro ATMEGA88, como estas direcciones en
//la EEPROM 24LC256 son de 2 bytes, se enva primero la parte alta de esta direccin
//y luego la parte baja de esta direccin
i2c_envia_dato(dir_men_eep>>8); //envia parte alta de la direccion del registro
//de la EEPROM donde se guardar el dato
i2c_envia_dato(dir_men_eep);
//envia parte baja de la direccion del registro
//de la EEPROM donde se guardar el dato
//Lo que sigue es enviar el dato a la direccin del registro de la memoria EEPROM
//donde se guardar el dato.
i2c_envia_dato(dato); //envia o escribe el dato en la direccin del registro
//elegido de la memoria EEPROM
//una vez que el esclavo recibe el dato se terminar la comunicacin I2C AVR
i2c_detener(); //finaliza la comunicacin I2C AVR
}
//Funcin para recibir o leer datos desde la memoria EEPROM 24LC256
//creada con las funciones que estn en el archivo de cabecera i2c.h
//la funcin se le ha llamado leer_eeprom, hay que darle un parmetro
//que ser la direccin del registro de la memoria EEPROM que se desea leer
//o de donde se quiere recibir el dato
unsigned char leer_eeprom(uint16_t dir_men_eep){
unsigned char dato;//variable donde se guardar el dato ledo desde la EEPROM
i2c_inicia_com();
i2c_envia_dato(0xa0);
//lo que sigue es enviar la direccin del registro de la memoria EEPROM de donde
//el maestro AATMEGA88 leer o recibir el dato, como estas direcciones en
//la EEPROM 24LC256 son de 2 bytes, se enva primero la parte alta de esta direccin
//y luego la parte baja de esta direccin
i2c_envia_dato(dir_men_eep>>8); //envia la parte alta de la direccion del registro
//de la EEPROM de donde se leer el dato
i2c_envia_dato(dir_men_eep);
//envia la parte baja de la direccion del registro
//de la EEPROM de donde se leer el dato
//lo que sigue una vez que ya se le dijo al esclavo donde se leer es reiniciar la
//comunicacin serial I2C PIC se hace con la misma funcin
//i2c_inicia_com(); el mdulo TWI reconoce que se reiniciar la comunicacin I2C AVR
i2c_inicia_com(); //para reiciar la comunicacin I2C AVR
//a continuacin se vuelve a enviar la direccin del esclavo con el que el maestro se
//est comunicanco, en este cado de la EEPROM de quien su direccin es de 7 bits (1010000)
//pero esta vez junto con el bit 1 que es el que le indica al esclavo que el maestro
//quiere leer o recibir un dato de la EEPROM, por lo que se envia 10100001
//que en hexadecimal es 0xa1
i2c_envia_dato(0xa1); //direccin de la eeprom junto con el 1 para lectura
122
123
124
125
126
127
128
129
130
131
132
133 }
Buscar
mrelbernitutoriales.com
Lista de Reproduccin Microcontroladores PIC
Microcontroladores ...
Google Maps
Compartir
0
MrElberni El...
333 Me gusta
MrElberni
Electrnica
Electricidad
30 de noviembre de
2015
Amplificador operacional
funcionamiento:
https://t.co/vJEEigBedd va
@YouTube
2016 MIC ROC ONTROLADORES Designed by Press C ustomizr Powered by