TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: lybuendia en 17 de Junio de 2008, 22:32:29
-
hola estoy haciendo un programa que tengo q terminar para la otra semana y es con el pic 18f452 lo que tengo q hacer es leer un sensor de temperatura 80 veces almacenarlo en la eeprom y luego mostrarlo en la hyperterminal bueno el programa me almacena y me lee los datos pero ene la posicion 65 hasta la 80 me salen unos datos que no concuerdan yo creo que es porque la memoria es de 63 bytes pero no se como arreglarlo
el codigo que hice es este
#include "24lc256.h"
#include "terminal.h"
#use I2C (MASTER, SDA=PIN_C4, SCL=PIN_C3, RESTART_WDT, FAST)
// Makron för minnet
#define EEROM_ADDR 0xa0 // I2C adress för EEPROM
#define EEPROM_ADRESS_LO 0x00 // Låg Adressbyte för EEPROM
#define EEPROM_ADRESS_HI 0x00 // Hög Adressbyte för EEPROM. Max (0-63)
#define EEPROM_BYTES 10 // EEPROM-bytes +1 som skrivs/läses
#define READ_DATA 1 // Läs data
#define TEMP_P1 0x0
#define TEMP_MASK 0x80
#define SENSOR_ADDR 0x9e
#define Thyst_High 23
#define Thyst_Low 128
#define Thyst_POINTER 0x2
#define ACK 1
#define NO_ACK 0
#define READ_BIT 1
#define WRITE_BIT 0
#define ZERO_DATA 0
#define GRAD0 '0'
#define GRAD5 '5'
// Globala variabler
BYTE bTemplo;
BYTE bTempThyst; // Tempvärde 1/2- grader
signed int iTemphi; // Tempvärde grader
signed int iTempThyst;
char cGrad=GRAD0;
// Funktionsprototyper
void storage_eeprom(void); // Spara i EEPROM
void las_eeprom(void); // Läs ur EEPROM
void get_temperature(void);
void set_thyst(void);
void get_thyst(void);
//Funktioner
/* Lagra i EEPROM, max 63 bytes */
void storage_eeprom(void)
{
int iCounter;
i2c_start();
i2c_write(EEROM_ADDR); // Hårdvaruadressen för minneskapseln
i2c_write(EEPROM_ADRESS_HI); // Startadress i minnet hög
i2c_write(EEPROM_ADRESS_LO); // Startadress i minnet låg
for(iCounter=0; iCounter <= 80;iCounter++)
{
i2c_write(iTempThyst); // Skriv data till eeprom
}
i2c_stop();
}
/* Läs från EEPROM, max 63 bytes */
void las_eeprom(void)
{
int iCounter;
byte bData;
BOOLEAN EndOfMemoryFlag = 1; // För att växla så att sista minnesläsningen är utan ACK
i2c_start();
i2c_write(EEROM_ADDR);
i2c_write(EEPROM_ADRESS_HI);
i2c_write(EEPROM_ADRESS_LO);
i2c_start();
i2c_write(EEROM_ADDR | READ_DATA); // Bitvis OR med 1 ger att den minst signifikanta biten blir 1 (0xA1)
// vilket betyder läs data frånEEPROM
for(iCounter =0; iCounter <= 80;iCounter++)
{
if(iCounter == 80) EndOfMemoryFlag = 0;
bData= i2c_read(EndOfMemoryFlag); // Läs 0, 1, 2... osv ur eeprom
delay_ms(300);
printf("Adress %X %2d Data %d %c \n\r",EEPROM_ADRESS_HI,iCounter,bData,cGrad,);
}
i2c_stop();
}
void get_temperature(void)
{
i2c_start();
i2c_write(SENSOR_ADDR | READ_BIT); // Bitvis OR med 1 ger att den minst signifikanta biten blir 1 (0x9F)
// vilket betyder läs data från LM75.
iTemphi = i2c_read(ACK); // Läs mest signifikanta byten, svara med en ack till LM75 när byten är läst.
bTemplo = i2c_read(NO_ACK); // Läs minst signifikanta byten, svara inte med en ack till LM75 när byten är läst.
i2c_stop();
if(bTemplo & TEMP_MASK) cGrad = GRAD5; // Lägg till 0.5 grader om LM75 byte2 är hög
else cGrad = GRAD0;
}
void set_thyst(void)
{
i2c_start();
i2c_write(SENSOR_ADDR | 0);
i2c_write(Thyst_POINTER);
i2c_write(Thyst_High);
i2c_write(Thyst_Low);
i2c_stop();
}
void get_thyst(void)
{
i2c_start();
i2c_write(SENSOR_ADDR | 0);
i2c_write(Thyst_POINTER);
i2c_start();
i2c_write(SENSOR_ADDR | READ_BIT);
iTempThyst = i2c_read(ACK);
bTempThyst = i2c_read(NO_ACK);
i2c_stop();
if(bTempThyst & TEMP_MASK) cGrad = GRAD5;
else cGrad = GRAD0;
}
void main(void)
{
int count;
startup();
set_thyst();
printf(CLR_SCR); // Rensa skärmen
do{
puts("\n\n\rI2C minneshantering");
output_bit(PIN_C2,~input(PIN_C2));
get_temperature();
delay_ms(100);
get_thyst();
for (count=0;count<80;count++){
storage_eeprom();
}
delay_ms(WAIT_500_MS);
las_eeprom(); // Läs i serieminnet
}while(TRUE);
-
Hola lybuendia. Bienvenido al foro y te recomiendo que pases a leerte las reglas del mismo lo mas "urgente" posible, ya que aqui tratamos de evitar colocar "urgente" en los titulos de los post :mrgreen:.
pero ene la posicion 65 hasta la 80 me salen unos datos que no concuerdan yo creo que es porque la memoria es de 63 bytes pero no se como arreglarlo
La forma de arreglarlo es leer el datasheet del 18F452 y comprobar realmente la EEPROM disponible. Si no te alcanzan la memoria para almacenar todos los datos me temo que tendrás que optar por una EEPROM externa.
0x01 Saludo.
-
bueno es que la eeprom es externa y el enunciado me lo dio el profesor pero es que no entiendo muy bien esto porque apenas llevo unas semnaas trabajando con pics
en el enunciado del problema el profesor da un
Tip:
Total 160 sitios de memorias deben ser usados en la memoria del i2c
si usas "page write mode" nota que el maximo es de 64 bytes para ser escritos en la memoria
-
y ya cambie el titulo =) ... no sabia eso pero ya lei las reglas!! gracias!
-
Saludos lybuendia, bienvenido al foro!
Pues sería bueno que tomes en cuenta las observaciones del dr. Gonzalo.
Ahora bien Gonzalo, en cuanto a esto:
La forma de arreglarlo es leer el datasheet del 18F452 y comprobar realmente la EEPROM disponible. Si no te alcanzan la memoria para almacenar todos los datos me temo que tendrás que optar por una EEPROM externa.
No termino de entender bien... no está usando él una eeprom externa?
Porque en el código veo que tiene:
Y luego también tiene rutinas con i2c y demás... entonces me has dejado medio confundido :?
En caso de que yo tenga razón y el esté usando una memoria externa, entonces no entiendo tampoco por qué no usa los comandos write_ext_eeprom y read_ext_eeprom... no funcionan perfectamente de esta forma?
Bueno esperemos que él nos aclare un poco la cosa...
Ok nos leemos! :mrgreen:
EDITO: ya había escrito el post y resulta que se me ha adelantado lybuendia con los otros dos posts... :D
-
jajaja no hay problema bueno pero no soy el soy ella.. el problema tbn es que practicamente estoy aprendiendo esto sola porque yo estoy de intercambio en suecia y los libros estan en sueco entonces me toca leer como pueda de foros y asi
por eso digo que no se mucho sobre memorias y eso
yo creo que el problema es por lo de los 63 bytes de la memoria que es una 24c256 de 32kx8 pero no se como escribir los 80 datos correctamente los curioso del programa es que en la posicion 65 me escribe algo incoherente pero en la 66 me escribe la temperature osea apartir de la posicion 65 de impar a impar sale algo raro pero las posiciones pares no hay problema
-
jajaja no hay problema bueno pero no soy el soy ella..
Mil disculpas sta. lybuendia... es que como no está especificado su género en el perfil supuse que era usted chico, ya veo que me equivoqué :(
Varias preguntas:
1- estás montando el circuito en físico o simulándolo en proteus?
2- has probado con las instrucciones "init_ext_eeprom", "write_ext_eeprom" que te mencioné?
3- has intentado cambiando, en la declaración #i2c, usar "SLOW" en vez de "FAST"? Leí por ahí que el ccs a veces da problemas con FAST.
4- estoy fastidiando mucho con tantas preguntas? :D
Yo estoy haciendo un proyecto con algo similar y no me funcionaba inicialmente y el problema estaba en que usaba "FORCE_HW", cuando quité esa opción funcionó de lujo. :)
Ok saludos, nos leemos! :mrgreen:
-
gracias por responder tan rapido
bueno ya le cambie por slow pero sigue el error
es un circuito una tarjeta de esas para materias que trae un sensor la memoria el pic y otras cosillas mas pero todo esta en la misma tarjeta por lo que el i2c esta conectado a todo y la direccion es donde esta el dispositivo
disculpa mi ignorancia pero que es el force_hw?
y lo de las funciones write_ext no se porque la manera de escribir en la memoria las saque de un ejemplo que me envio el profesor y el usaba esas funciones
-
estoy usando MPLAB bueno esto es lo que me sale en hyperterminal
2C minneshantering
Adress 00 0 Data 23 5
Adress 00 1 Data 23 5
Adress 00 2 Data 23 5
Adress 00 3 Data 23 5
Adress 00 4 Data 23 5
Adress 00 5 Data 23 5
Adress 00 6 Data 23 5
Adress 00 7 Data 23 5
Adress 00 8 Data 23 5
Adress 00 9 Data 23 5
Adress 00 10 Data 23 5
Adress 00 11 Data 23 5
Adress 00 12 Data 23 5
Adress 00 13 Data 23 5
Adress 00 14 Data 23 5
Adress 00 15 Data 23 5
Adress 00 16 Data 23 5
Adress 00 17 Data 23 5
Adress 00 18 Data 23 5
Adress 00 19 Data 23 5
Adress 00 20 Data 23 5
Adress 00 21 Data 23 5
Adress 00 22 Data 23 5
Adress 00 23 Data 23 5
Adress 00 24 Data 23 5
Adress 00 25 Data 23 5
Adress 00 26 Data 23 5
Adress 00 27 Data 23 5
Adress 00 28 Data 23 5
Adress 00 29 Data 23 5
Adress 00 30 Data 23 5
Adress 00 31 Data 23 5
Adress 00 32 Data 23 5
Adress 00 33 Data 23 5
Adress 00 34 Data 23 5
Adress 00 35 Data 23 5
Adress 00 36 Data 23 5
Adress 00 37 Data 23 5
Adress 00 38 Data 23 5
Adress 00 39 Data 23 5
Adress 00 40 Data 23 5
Adress 00 41 Data 23 5
Adress 00 42 Data 23 5
Adress 00 43 Data 23 5
Adress 00 44 Data 23 5
Adress 00 45 Data 23 5
Adress 00 46 Data 23 5
Adress 00 47 Data 23 5
Adress 00 48 Data 23 5
Adress 00 49 Data 23 5
Adress 00 50 Data 23 5
Adress 00 51 Data 23 5
Adress 00 52 Data 23 5
Adress 00 53 Data 23 5
Adress 00 54 Data 23 5
Adress 00 55 Data 23 5
Adress 00 56 Data 23 5
Adress 00 57 Data 23 5
Adress 00 58 Data 23 5
Adress 00 59 Data 23 5
Adress 00 60 Data 23 5
Adress 00 61 Data 23 5
Adress 00 62 Data 23 5
Adress 00 63 Data 23 5
Adress 00 64 Data 23 5
Adress 00 65 Data -128 5
Adress 00 66 Data 23 5
Adress 00 67 Data -128 5
Adress 00 68 Data 23 5
Adress 00 69 Data -128 5
Adress 00 70 Data 23 5
Adress 00 71 Data -128 5
Adress 00 72 Data 23 5
Adress 00 73 Data -128 5
Adress 00 74 Data 23 5
-
Saludos lybuendia!
Mira el FORCE_HW es una opción que le dice a CCS que use únicamente el módulo i2c (MSSP) que trae el microcontrolador para la interfaz serial.
En cuanto a init_ext_eeprom, write_ext_eeprom, read_ext_eeprom... esas son funciones deben estar definidas en el archivo que estás adjuntando, el "24LC256"...
Digo "deben" porque no estoy seguro, pues acabo de revisar y el CCS que tengo instalado no trae ese archivo, tiene es uno llamado "24256", me imagino que es el equivalente...
Bueno pues si estás incluyendo ese archivo, puedes usar esas funciones para escribir y leer en la eeprom... no tienes que hacerlo tu manualmente con el i2c, aunque hay quienes prefieren hacerlo así. Es decisión personal.
Si quieres saber más acerca de estas funciones, puedes echarte una ojeada por este hilo:
http://www.todopic.com.ar/foros/index.php?topic=4530.msg38929#msg38929 (http://www.todopic.com.ar/foros/index.php?topic=4530.msg38929#msg38929)
Allí el maestro vszener publicó un ejemplo de cómo escribir y leer en una eeprom externa, justamente esa que tú estás usando, la 24LC256.
Si lo quieres hacer a pie usando las funciones i2c, entonces puedes leerte este otro hilo:
http://www.todopic.com.ar/foros/index.php?topic=4783.0 (http://www.todopic.com.ar/foros/index.php?topic=4783.0)
Donde el gran maestro redpic da ejemplos de cómo hacerlo correctamente.
Estoy seguro te serán de utilidad.
Ok nos leemos! :mrgreen:
-
La forma de arreglarlo es leer el datasheet del 18F452 y comprobar realmente la EEPROM disponible. Si no te alcanzan la memoria para almacenar todos los datos me temo que tendrás que optar por una EEPROM externa.
Si les digo que no lei el código, solo el enunciado del mensaje de lybuendia me creen?!? De ahi mi incorrecta suposición de que estaba usando un eeprom interna. Mil disculpas, ya saben, el tiempo es tirano ... inclusive cuando uno trata de ahorrarlo leyendo solo una parte de un post :D.
Saludos.
-
Dr. Gonzalo, tú cómo que estás enamorado... :D
Bueno sea verdad o no, no te preocupes... errar es de humanos... :lol:
Lybuendia, espero que hayas podido resolver tu problema. Ya nos contarás...
Ok saludos, nos leemos! :mrgreen: