-
Notifications
You must be signed in to change notification settings - Fork 0
/
principal.c
127 lines (106 loc) · 5.42 KB
/
principal.c
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
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
122
123
124
125
126
127
/*
* File: principal.c
* Author: HP
*
* Created on 4 de abril de 2020, 11:39 PM
*/
#include <xc.h>
#include "Config.h"
#include "I2C.h"
#include <stdint.h>
#include <pic16f877a.h>
#include "Usart.h"
char Mensaje_De_Envio[] = "HOLA";
void main(void) {
int Variable_De_Conteo = 0;
/*
* Inicializamos el USART para la terminal SERIAL
*/
Confi_Blue(32); /*Librería propia del ingiero Torres que configura el terminal serial*/
/*************************************************************************************************/
/*
*EN LA LIBRERÍA SE MODIFICÓ EL SPBRG a un VALOR DE 32 para cumplir con el datasheet al poner un cristal de 20mhz
* /
// /*
// * Para configurar las salidas análogas como digitales quitar de comentario la siguiente line de codigo:
// * ADCON1 = 0x06;
// */
I2C_Inicializar(); /*Iniciamos y configuramos los bits necesarios del protocolo de comunicación I2C*/
//
// /*
// * Para la memoria 24C32 el fabricante nos dice que para iniciar tenemos que dar el comando de START
// * y luego indicar a que esclavo nos queremos dirigir y el modo en el que va a esta (LECTURA O ESCRITURA) (R/W)
// */
//
// I2C_Inicio(); /*Damos el comando de START para iniciar la transmisión*/
//
// I2C_Escribir(0b10100000);
// /*
// * Del apartado anteior cabe resaltar que los primeros 4 bits son dados por defecto con la memoria 24C32
// * Los siguientes 3 bits son relativos a A3-A2-A1 que son la dirección propia del sclavo pues pueden haber muchas memorias del mismo tipo dentro del
// * grupo de esclavos, los bits mencionados (A3-A2-A1) se definen de manera física dentro del circuito como se verá en el proteus
// * Para finalizar, el ultimo bit es el bit relativo al comado de (R/W) es decir en 0 está en modo escritura para poder escribir dentro de la memoria EEPROM
// * en 1 podremos leer los datos que contenga
// */
//
// /*ENVIAMOS LAS DIRECCIONES EN DONDE DE ESCRIBIRAN LOS DATOS CORRESPONDIENTES*/
//
// I2C_Escribir(0x00); /*ELEGIMOS LAS PRIMERAS DIRECCIONES DEL ESCLAVO PARA ESTE CASO EN PARTICULAR*/
// I2C_Escribir(0x00);
//
// /*
// * Cabe mencionar que la dirección de la memoria en cuestión se divide en 2 registros de 1 byte
// * se los llama como FIRST ADDRESS Y SECOND ADRESS
// */
//
// /*ENVIAMOS EL DATO A ESCRIBIR*/
//
// I2C_Escribir(0XAA);
//
// /*Damos el comando de parada de la comunicación*/
//
// I2C_Detener();
//
//
// /*
// * LA ETAPA ANTERIOR ES PARA EL GUARDADO DE UN SOLO CARACTER EN LA EEPROM
// * ACONTINUACION GUARDAREMOS EL MENSAJE DE "HOLA"
// */
I2C_Inicio(); /*Se inicializa la transferencia de datos*/
I2C_Escribir(0b10100000); /*Se pone el ADRES propio de la EEPROM, se toma en cuenta los pines A3-A2-A1 y se coloca en modo escritura*/
I2C_Escribir(0x00); /*Ubicamos la primera dirección a escribir*/
I2C_Escribir(0x00);
/*
* En el modo de escritura recuencial solo hace falta dar la primera dirección, pues los demás datos se guardaran en la dirección siguiente a la misma
*/
for (Variable_De_Conteo = 0; Variable_De_Conteo < 4; Variable_De_Conteo++) { /*Creamos una función de conteo para poder sacar y escribir los datos guardados en la matriz "Mensaje_De_Envio"*/
I2C_Escribir(Mensaje_De_Envio[Variable_De_Conteo]);
}
I2C_Detener(); /*Detenemos la transmisión con el comando de parada*/
__delay_ms(50); /*Damos un tiempo para el guardado de los datos en la EEPROM*/
/*
* Esta etapa consitió en la escritura del mensaje
*/
I2C_Inicio(); /*Damos el comando de START del protocolo de comunicación*/
I2C_Escribir(0b10100000); /*Se pone el ADRES propio de la EEPROM, se toma en cuenta los pines A3-A2-A1 y se coloca en modo escritura*/
I2C_Escribir(0); /*Este paso es importante para poder ubicar la posición inicial desde la cual se procederá a leer los datos en la EEPROM es importante ponerlo*/
I2C_Escribir(0);
I2C_Reinicio(); /*Damos un comando de parada y uno de inicio para dar pase a la lectura*/
I2C_Escribir(0b10100001); /*Se pone el ADRES propio de la EEPROM, se toma en cuenta los pines A3-A2-A1 y se coloca en modo lectura*/
/*
* A diferencia del modo de escritura el ultimo bit del DEVICE ADDRESS es 1 lo que indica que los datos se leeran
*/
for (Variable_De_Conteo = 1; Variable_De_Conteo < 5; Variable_De_Conteo++) { /*Función de conteo para contavilizar los datos que van a ser leídos*/
Tx_str(I2C_Leer()); /*Motramos por el terminar SERIAL el dato que se está leyendo*/
if (Variable_De_Conteo == 4) { /*Preguntamos si la variable llegó a 4 que corresponde al número de caracteres que componen el mensaje a guardar "HOLA"*/
I2C_nack(); /*Si se cumple datos el dato de No ack para terminar el proceso de lectura*/
} else {
I2C_ack(); /*Si no se cumple damos el dato ACK para seguir con el proceso de lectura*/
__delay_ms(100); /*Damos un tiempo, que no es necesario, solo para ver como los caracteres llegan de 1 en 1 */
}
}
I2C_Detener();
while (1) {
}
return;
}