Свежие обсуждения
Микроконтроллеры

I2C + PIC + CСS + Prоteus= Проблема?

1 3 5

не дано мне осилить i2c. Взял Ваш пример. Убрал оттуда функцию работы с DS1307. Написал функцию передачи 10 байт с памяти в СОМ порт после получения байта по этому порту.
Запускаю в Протеусе. Работает. Жму "пробел" через виртуальный терминал и каждый раз получаю порцию 10 байт. Обрадовался.
Зашиваю в железку. Жму пробел. Есть 10 байт! Жму пробел второй раз... тишина... тишина...тишина....
В общем, считывает только один раз, после чего впадает в стопор (наверное на команде СТАРТ).
Перезапуск МК по ножке MCLR помогает в одном случае из 20. В остальных случаях, МК не реагирует на команды по СОМ порту

Вот исходник:

#include <16F876A.h>
//#device ICD=TRUE
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT
#FUSES NOBROWNOUT
#FUSES NOLVP
#FUSES PUT

#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use delay(clock=4000000)

#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3,force_hw)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)

unsigned char sec,min,hour,dow,day,month,year;

void ShowInfo(void);
void Read10bytesFlash(void);

void main()
{
SET_TRIS_C(0b10011110);

while(1)
{//delay_ms(255);
getch();
Read10bytesFlash();
}
}

void Read10bytesFlash(void)
{
unsigned char i;

i2c_start(); // Старт
i2c_write(0xA7); // Адресс устройства
i=1;
while(i<10) {putc(i2c_read());
i++;
}

i2c_stop();
} /i>
Во вложении весь проект.

P/S/ Это только у меня сплошные проблемы. МК PIC16F628A с внутреним генерамтором работает у меня на чатоте 32 (толи 64) кГц вместо 4 МГц. Это только у меня, когда мне нужно было, математические функцыи выдавали совершенно неправильные значения, тогда как этот же код у других работал нормально. Про I2C я молчу .
Си компилятор у меня уже 3й (разные версии), МРЛаб тоже обновлял. Программатор (софт) тоже. Даже на работе резульатат не меняется

159457.zip

 

Сергей К: P/S/ Это только у меня сплошные проблемы.
Через тернии к звездам....

 

Сергей К: P/S/ Это только у меня сплошные проблемы.
Это у вас аура плохая Может с АВР будет лучше? Или там моторолы...

 


Откомпилируйте, пожалуйста, у себя приведенный выше исходник ;) . Может у меня таки компилятор виноват? У меня почти все чудеса случались, когда я на Си писал, а не на асме.

 

Какая версия мплаб? Моя 7.52 не открывает
---------------
Создал новый проект
Clean: Deleting intermediary and output files.
Clean: Deleted file "D:\1\159457\i2c_test.mcs".
Clean: Done.
Executing: "C:\Program Files\Microchip\Third Party\PICC\CCSC.EXE" "i2c ds1307.c" +FM +DF +LN +T -A +M +Z +Y=9 +EA
>>> Warning 203 "D:\1\159457\i2c ds1307.c" Line 31(1,1): Condition always TRUE
>>> Warning 202 "D:\1\159457\i2c ds1307.c" Line 16(5,8): Variable never used: rs232_errors
>>> Warning 202 "D:\1\159457\i2c ds1307.c" Line 18(15,18): Variable never used: sec
>>> Warning 202 "D:\1\159457\i2c ds1307.c" Line 18(19,22): Variable never used: min
>>> Warning 202 "D:\1\159457\i2c ds1307.c" Line 18(23,27): Variable never used: hour
>>> Warning 202 "D:\1\159457\i2c ds1307.c" Line 18(28,31): Variable never used: dow
>>> Warning 202 "D:\1\159457\i2c ds1307.c" Line 18(32,35): Variable never used: day
>>> Warning 202 "D:\1\159457\i2c ds1307.c" Line 18(36,41): Variable never used: month
>>> Warning 202 "D:\1\159457\i2c ds1307.c" Line 18(42,46): Variable never used: year
Memory usage: ROM=1% RAM=4% - 4%
0 Errors, 9 Warnings.
Loaded D:\1\159457\i2c ds1307.cof.
BUILD SUCCEEDED: Sun Aug 03 17:14:51 2008

 

Vladikas: Какая версия мплаб?
8.10..
P.S. А можно .hex? ;)
P.P.S. Пробовал у себя в железе этот же пример с "программной эмуляцией i2c". Программа не зависает, но кажая вторая попытка чтения из памяти выдает 10 байт 0xFF и сдвигает адресс ячейки памяти в 24lc64 на 1 позицию.

 

Сергей К: А можно
Можно

159545.zip

 

Также, как и у меня. Один раз нормально прочитало, а на втором цикле зависает. Уже даже и не знаю, куда копать
Мучаюсь уже с маленьким кусочком кода:
while(1)
{
i2c_start();
i2c_write(0xA7);
k=0;
while(k < 10)
sec = i2c_read(); // REG 0
//printf("%c",sec);
k++;
}
i2c_stop();
}

если закоментировать while(k10), то в Протеусе код в цикле нормально работает. Но с этой командой оно либо на первом либо на втором проходе игнорирует команду i2c_stop(); (в пошаговом режиме она вроди как исполняется, но в логе памяти и i2c отладчика это не отображается и дальше, на следующем цикле, программа останавливается на первой команде записи в шину).

Даже не знаю. Может самому написать команды управления аппаратным модулем i2c?

 

Сергей, попробуйте после i2c_stop добавить в цикл задержку.

 

попробовал. Не помогает.
До этого я пробовал на примере, где следующая попытка чтения происходит после прихода байта через UART. Там задержка исчислялась секундами, но это не помогает