|
|
View previous topic :: View next topic |
Author |
Message |
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
Big error in 12c (HELP URGENT) |
Posted: Tue Jun 23, 2015 6:27 pm |
|
|
I have a problem I have never seen.
I made a plate with 3 peripheral devices connected in communication i2c.
But I'm not getting to use them!
These devices are:
DS 1307
MCP 3424
24LC1025
I'm using pullup of 4.7k
I'm using a pic: 18LF2685
I am using ccs in version: 5,008
In the DS1307 I get an incorrect date, is not so and never changes:
00/02/03
0:00:00
MCP-3424 readings are incorrect, arrive very small and incorrect values even changing configurations.
In 24LC1025 does not respond to my command.
I do not understand what happens, because there was already simulated in Proteus and worked properly!
Already used two different plates to see if the problem was not the board, the two work the same.
I do not know what to do!
It could be the resistors pullup?
FUSES?
COMPILER??
I checked and the call is correct.
The code I'm testing is very simple and has no complications, see below.
Can anyone help me?
already I do not know what to do ...
Code: |
#include "18LF2685.h"
#device ADC=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES BBSIZ1K //1K words Boot Block size
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PROTECT //Code protected from reads
#use delay(crystal=20000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=Modem)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
#include "ds1307.c"
#include "mcp342X.c"
#include "241025.c"
#include "STRING.h"
//DEFINES
#define regulador_modem PIN_C1
#define WATCHDOG PIN_B5
#define CONFIGURA PIN_A5
#Define Buffer_size 100
//VARIAVEIS CONFIG
//LEITURAS
float analogica_1;
float analogica_2;
float analogica_3;
float analogica_4;
int32 hidrometro_1;
int32 hidrometro_2;
int32 hidrometro_3;
//VARIAVEIS RELOGIO
unsigned int8 dia=0;
unsigned int8 mes=0;
unsigned int8 ano=0;
unsigned int8 hora=0;
unsigned int8 min=0;
unsigned int8 seg=0;
int set_dia; //variaveis de SET
int set_mes; //essas variaveis vao ser atribuidas pelo modem
int set_ano;
int set_hora;
int set_min;
int set_seg;
int1 LED=1;
int1 Ativa_Interrupcao_RDA;
unsigned int16 J=0;
unsigned int16 cont_serial=0;
unsigned int32 tempo=0;
char dado_recebido_modem[Buffer_size];
BYTE _dia;
BYTE _mes;
BYTE _ano;
BYTE _dow;
BYTE _hora;
BYTE _min;
BYTE _seg;
void main()
{
setup_adc_ports(AN0_TO_AN3);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); //420 ms overflow
enable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT2);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
output_high(regulador_modem);
adc_init();
ds1307_init();
init_ext_eeprom();
fprintf(Modem, "Inicio:\r\n");
ds1307_set_date_time(16,06,2015,0,20,48,00);
while(TRUE)
{
int a,b;
While(1){
write_ext_eeprom(a,10);
b = read_ext_eeprom(10);
Fprintf(Modem, "\r\n %d",b);
a++;
delay_ms(1000);
}
/*
ds1307_get_date(&_dia,&_mes,&_ano,&_dow);//Ler Data
ds1307_get_time(&_hora,&_min,&_seg);//Ler Hora
Fprintf(Modem,"\r\n%02d/\%02d/\%02d",_dia,_mes,_ano);//Exibir
Fprintf(Modem,"\r\n%02d:\%02d:\%02d",_hora,_min,_seg);//Exibir
delay_ms(1000);
*/
/*
set_adc_channel_mcp(0);
delay_ms(1000);
analogica_1=read_adc_mcp();
Fprintf(Modem,"\r\n 1: %ld",analogica_1);//Exibir
set_adc_channel_mcp(1);
delay_ms(1000);
analogica_2=read_adc_mcp();
Fprintf(Modem,"\r\n 2: %ld",analogica_2);//Exibir
set_adc_channel_mcp(2);
delay_ms(1000);
analogica_3=read_adc_mcp();
Fprintf(Modem,"\r\n 3: %ld",analogica_3);//Exibir
set_adc_channel_mcp(3);
delay_ms(1000);
analogica_4=read_adc_mcp();
Fprintf(Modem,"\r\n 4: %ld",analogica_4);//Exibir
*/
}
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jun 23, 2015 7:37 pm |
|
|
Quote: | enable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT2);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL); |
You have no interrupt routines for any of these interrupts.
Quote: | while(TRUE)
{
int a,b;
While(1){
write_ext_eeprom(a,10);
b = read_ext_eeprom(10); |
The address 'a' is never initialized to a specific address.
Quote: | ds1307_set_date_time(16,06,2015,0,20,48,00); |
The ds1307 driver doesn't support a 4-digit year. Only two digits.
Quote: | write_ext_eeprom(a,10);
b = read_ext_eeprom(10); |
You are writing the value of 10 to address 'a'. Then you read address 10.
But you didn't write to address 10. You wrote to address 'a'.
Basically, you didn't read the manual or the driver specifications, given
in each driver file. |
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
|
Posted: Tue Jun 23, 2015 7:56 pm |
|
|
PCM programmer wrote: | Quote: | enable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_EXT2);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL); |
You have no interrupt routines for any of these interrupts.
Quote: | while(TRUE)
{
int a,b;
While(1){
write_ext_eeprom(a,10);
b = read_ext_eeprom(10); |
The address 'a' is never initialized to a specific address.
Quote: | ds1307_set_date_time(16,06,2015,0,20,48,00); |
The ds1307 driver doesn't support a 4-digit year. Only two digits.
Quote: | write_ext_eeprom(a,10);
b = read_ext_eeprom(10); |
You are writing the value of 10 to address 'a'. Then you read address 10.
But you didn't write to address 10. You wrote to address 'a'.
Basically, you didn't read the manual or the driver specifications, given
in each driver file. |
I removed the functions interrupt because station empty.
This was the last test I did, already tested fixed values in recording and reading memory and did not work!
I had already tested this code before and did not work:
While (1) {
write_ext_eeprom (10,10);
b = read_ext_eeprom (10);
Fprintf (Modem, "\ r \ n% d", b);
delay_ms (1000);
}
As the change in the adjustment handle the DS1307, the date changed to the format below and the same error occurs, time does not increases and nothing works!
00/02/01
0:00:00
I believe that the problem is being in something of communication .. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
|
Posted: Tue Jun 23, 2015 8:27 pm |
|
|
RESULT OF TEST:
*p:▒Utu▒ACK addr: A6
ACK addr: D0
Number of i2c chips found: 2▒hE▒▒▒▒
ACK addr: A6
ACK addr: D0
Number of i2c chips found: 2ACK addr: A6
ACK addr: D0
Number of i2c chips found: 2▒▒hE▒▒▒▒
ACK addr: A6
ACK addr: D0
Number of i2c chips found: 2 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jun 23, 2015 8:50 pm |
|
|
The ds1307 has a slave address of 0xD0. The MCP3424 also has a default
slave address of 0xD0. This will not work. There is an address conflict.
But, it can be fixed.
The MCP3424 can be configured to use a different slave address.
If you connect the Adr0 pin to ground, and leave Adr1 un-connected,
the slave address will be changed to 0xD2. Then you can edit the
MCP342x.c file and change the following line to use 0xD2 as shown below:
Code: | #define MCP342X_DEVICE_CODE 0xD2 |
Make that change to your board and run the i2c bus scanner program
again. |
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
|
Posted: Tue Jun 23, 2015 9:20 pm |
|
|
PCM programmer wrote: | The ds1307 has a slave address of 0xD0. The MCP3424 also has a default
slave address of 0xD0. This will not work. There is an address conflict.
But, it can be fixed.
The MCP3424 can be configured to use a different slave address.
If you connect the Adr0 pin to ground, and leave Adr1 un-connected,
the slave address will be changed to 0xD2. Then you can edit the
MCP342x.c file and change the following line to use 0xD2 as shown below:
Code: | #define MCP342X_DEVICE_CODE 0xD2 |
Make that change to your board and run the i2c bus scanner program
again. |
Result of scanner:
ACK addr: A6
ACK addr: D0
ACK addr: D2
Number of i2c chips found: 3 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jun 23, 2015 9:26 pm |
|
|
Now you can edit the MCP342x.c file and change the following line to use
0xD2 as shown below:
Code: | #define MCP342X_DEVICE_CODE 0xD2 |
Then compile and start testing your program again. |
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
|
Posted: Tue Jun 23, 2015 10:10 pm |
|
|
PCM programmer wrote: | Now you can edit the MCP342x.c file and change the following line to use
0xD2 as shown below:
Code: | #define MCP342X_DEVICE_CODE 0xD2 |
Then compile and start testing your program again. |
UHULLLL
Now ALL work!!
look:
10
16/06/15
20:49:43
1: 2
2: 131071
3: 2
4: 2
TKS man |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|