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

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

1 2 5

Сергей К:
Пытался моделировать в Протеусе работу с DS1307
Моделировал DS1820. Всё работает безукоризнено.
I2C пока делал только програмный слейв из МК. Но, насколько помню, в папке с примерами есть девайс с записью-чтением данных в связке МК-последовательная память, по I2C.

 

AleksBak: а какой у Вас процессор на компе?
дома Core2Duo E6400, На работе Атлон 3800+.

AlexAlcoa: Попробуйте, у себя, мой проект с DS1307
Спасибо, сейчас попробую.
.....
Ваш пример работает как часы

Gregory: Моделировал DS1820. Всё работает безукоризнено.
это у меня впереди. На плате предусмотрен разъем для 2х датчиков

Gregory: Но, насколько помню, в папке с примерами
запускал я его, но так и не понял, как оно должно работать

AlexAlcoa: В протеусе есть монитор шины I2C "I2C Debugger"
погонял проект с ним. Он показывает то, что принимает МК, но не то, что отправляет память.

З.Ы. Вчера добрался до радиорынка, но поздно. Палатка с RTC закрылась, удалось купить только память 24LC32, более емкую раскупили
Вчера пытался записать (через МК) и прочитать данные. Не вышло, но я сегодня нашел у себя ошибку в процедуре записи данных (я забыл указать адрес и все мои данные воспринимались как адрес, за которым следовала команда СТОП). Сегодня вечером попытаюсь снова.
Моделировал схему с памятью сегодня. В 40% случаев данные и адресс записывались в память правильно. Но практически ничего правильно не читалось.

 

Сергей К: дома E6400, На работе Атлон 3800+.
Попробуйте проверить следующее - в "Диспетчере задач" Windows, в закладке "Процессы", найдите приложение Протеуса в списке и щелкните по нему правой кнопкой, в открывшемся меню, внизу, выберите "Задать соответствие..."(это для процессора Core2Duo касается) и отключите(убрать галочку) второе ядро процессора(CPU1 например) и "Ок". Затем проверьте свой пример в протеусе. Есть сомнения и по крайней мере отладчик у меня из-за этого неверно работал.

 

На работе с одним ядром работает так же

Вчера пробовал на реальной железке с I2C памятью. Пока не знаю, но первые 20 символов считались (записались?) нормально, но затем остальные читались через один. Буду еще смотреть код, т.к. я записывал и читал это все через этот МК (нету внешнего программатора для I2C памяти ). Грешу на функцию чтения, т.к. когда МК по кругу прочитал всю память, то первые 20 байт тоже пошли через один (т.е. один символ считывается нормально, а следующий 0xFF):

#define DISPLAY_COL_MAX 20
unsigned int16 SI_pointer;
unsigned char SI_buffer[DISPLAY_COL_MAX];
unsigned int16 SI_Refresh;
.....
i2c_start(); // Restart
delay_us(90);
i2c_write(0xA7); // Адресс устройства

while(i<DISPLAY_COL_MAX) { // Загружаем данные в буфер до его заполнения
delay_us(90);
SI_buffer[i]=i2c_read(); // Чтение
i++;
}

delay_us(90);
i2c_stop();</i> После первого запуска i=0 и в этой функции загружается 20 байт. При последующих вызовах этой функции (раз в 1 секунду) i=19 (указывает на последнюю ячейку буфера). Перед этим кодом стоит функция сдвига содержимого буфера на еденицу. Моделировал в Протеусе - нормально сдвигает и записывает. На дисплее текст из буфера тоже нормально прокручивается. Содержимое всей памяти прокручивается по кольцу.

Проверял с DS1307. После запуска того примера и у меня, вроди, начало правильно считываться img src="/smile/fun.gif" width="15" height="15" alt="">

 

А соберите себе вот этот отладчик:
http://www.microchip.su/showthread.php?t=3531
возня конечно и пр., но сразу и намного легче станет.

Добавлю - мост USB-RS232, что там стоит, можно взять из готового покупного в комп. магазинах(подойдет любой нормальный).

Еще - конечно Протеус это хорошо и даже очень, но вот смотрю как у Вас получается и думаю - "Я в течение получаса(пусть часа) разобрался с примером работы с DS1307, переписал его для себя и в готовой схеме(!) получил результат, а здесь..." и далее "... но это пойдет на пользу(работа с Протеусом) и очень поможет в дальнейшем, так что не мешало бы и мне попробывать...". Решать Вам конечно. Просто этот отладчик тоже неплохая вещь по-моему.

 

AleksBak: А соберите себе вот этот отладчик
без регистрации не дает схему посмотреть

Я позавчера на радиорынке уже был готов купить PicKit 2. Но у моего продавца его не оказалось в наличии, а клон ICD2 я не захотел брать, т.к. насколько я понял, ему на смену плавно приходит PicKit 2.
Конечно - внутрисхемный отладчик это вещь! А если он еще и оснащен логическим анализатором и программатором флэш-памяти....

Поправил код. Теперь читаю блоками по 5 байт. В результате на реальной железке нормально читается 5 байт, затем не читается 5 байт. Дальше снова 5 байт читается. Еще раз поковырялся в протеусе. Затетил точно такое же свойство.

 

Когда я с си файле дописываю в директиву #use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3) ключ SMBUS, то шина начинает моделироватся заметно лучше. Большая часть данных правильно считывается.
Но вот ключ FORCE_HW (использование аппаратного модуля i2c шины) приводит к тому, что программа зависает на первой команде i2c_start() . В железе тоже.
........
Добавил после своей функции чтения следующий код:
i2c_start(); // Restart
delay_us(90);
i2c_write(0xA7); // Адресс устройства
delay_us(90);
i2c_stop();

т.е. СТАРТ/СТОП с указания адресса. Теперь у меня бегущая строка побежала нормально, но теряется 1 байт на этих СТАРТ/СТОП. Кривая программная реализация протокола i2c у компилятора CСS?
Протеус через раз пишет предупреждение: "Обнаружена команда СТОП во время передачи байта."

 

Сергей К: Кривая программная реализация протокола i2c у компилятора CСS?
Я и в версии 3.249 вначале написал программу и затем, в версии 4.065 скомпилировал, и с ключом HW, и с ключом SW(по умолчанию он), и в обеих версиях нормально(как часы) работало и работает одна и та же программа. В 4.065 получился меньше размер кода. Может у Вас порты(порт С например) не так настраивались? Хотя вряд ли это повлияет. У меня при хардверным ИИС и при:
set_tris_c(0b0010000);
Т.е. C3, C4 - выход, получилось, что больше потреблял аппаратный, чем софтовый.
Попробуйте следующее проверить:
#include <16F876A.h>
//#device ICD=TRUE
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS
#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)

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

void ds1307_init(void)
{
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_start();
i2c_write(0xD1); // RD from RTC
sec = i2c_read(0); // Read current "seconds" in DS1307
i2c_stop();
delay_us(3);
if (bit_test(sec,7))
{
sec&=0x7f;
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_write(sec); // Start oscillator with current "seconds value
}
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x07); // Control Register
i2c_write(0x90); // Enable squarewave output pin
i2c_stop();
}

void main()
{
set_tris_c(0x18); //С3, С4 - входы, остальное - выходы
ds1307_init(); //Инициализация DS1307
i2c_start(); //Начало процедуры чтения DS1307
i2c_write(0xD0); // I2C write address
i2c_write(0x00); //Start at REG 0 - Seconds
i2c_start();
i2c_write(0xD1);
sec = i2c_read() & 0x7f; // REG 0
min = i2c_read() & 0x7f; // REG 1
hour= i2c_read() & 0x3f; // REG 2
dow = i2c_read() & 0x07; // REG 3
day = i2c_read() & 0x3f; // REG 4
month = i2c_read() & 0x1f; // REG 5
year= i2c_read(0); // REG 6
i2c_stop(); //Конец чтения DS1307
}

Проверьте и с хардварным и со софтовым. Версии у меня те, что упоминал. Может из-за:
#use fast_io (C)
у меня работает? Хотя вряд ли.

 

Сергей К: без регистрации не дает схему посмотреть
Не знал. А почему так? Попробую здесь ее поместить потом. А вообще-то это ICD1 один к одному со своей прошивкой и кварцем и если увидите его(ICD1) в продаже - возьмите, не пожалеете. А если в нем, кроме прошивки, поменять чип на PIC18F252(если на колодке, то вообще вытащил PIC16F876 и вставил 252-й), то работает в несколько раз быстрее
Сергей К: Я позавчера на радиорынке уже был готов купить PicKit 2. Но у моего продавца его не оказалось в наличии,
Я бы купил, если был и обязательно. Правда - этот отладчик под МПЛАБ работает, а тот, что ссылку привел, работает именно в среде CCS.
Сергей К: а клон ICD2 я не захотел брать, т.к. насколько я понял, ему на смену плавно приходит PicKit 2.
Ну ICD2 тоже вещь и именно его клон легче собрать. Хотя у него нет:
Сергей К: А если он еще и оснащен логическим анализатором и программатором флэш-памяти....

 

Попробовал Ваш пример. Работает. хм... у меня, если выбрать HW, сразу перед тем, как перейти на начало функции main() указатель перескакивает на директиву i2c и по логам видно выполнение команд СТАРТ, СТОП по шине i2c. С Вашим примером это не происходит.

AleksBak: set_tris_c(0b0010000);
у меня SET_TRIS_C(0b10011110); По документации на МК ножки I2C должны быть входами.

AleksBak: #use fast_io (C)
у меня тоже такое есть

AleksBak: Правда - этот отладчик под МПЛАБ работает
я под MPLABs в основном и работаю.
......
нашел у себя в разделе инициализации строчку:
setup_spi(FALSE);
закоментировал ее. Начала работать отладки и при активации аппаратного I2C, правда команды СТАРТ/СТОП в самом начале так и остались и принимаемые от памяти данные не совпадают (принятые данные совпадают с I2C Debuger). Попробую в железе....
....
попробовал. Один раз содержимое мамяти считалось нормально. Про повторном чтении произошло зависание.