![]() |
|
|
Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники. |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#26 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Рак и сброс 500 мс?
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#28 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
В принципе нормально, только если единственный уарт в этом мк не занят)
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#29 | |
Senior Member
Регистрация: 10.06.2008
Возраст: 58
Сообщений: 2,837
Вес репутации: 3992/109 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
На СТМ8 можно полухардварно на таймере... с прерываниями... На ПИКах проще ногодрыгом с контрольной суммой... или через UART...
__________________
"Я не даю готовых решений, я заставляю думать!"(С) |
|
![]() |
![]() |
![]() |
#30 | |
Senior Member
Регистрация: 10.06.2008
Возраст: 58
Сообщений: 2,837
Вес репутации: 3992/109 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Неудобство UART в том... что времянками здорово не поиграешься... и присутствует привязка к определённым ногам...
__________________
"Я не даю готовых решений, я заставляю думать!"(С) |
|
![]() |
![]() |
![]() |
#31 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
а что не так с CAPTURE/COMPARE (CCP) MODULES
из того что сходу вижу - не переводит вывод в высокоимпедансное состояние, но это решаемо
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#32 | |
Senior Member
Регистрация: 10.06.2008
Возраст: 58
Сообщений: 2,837
Вес репутации: 3992/109 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Да всё не так... Это видно даже по отсутствию данного решения в инете...
В СТМ8 таймер имеет 3-4 канала ССР и режим предзагрузки... Пока выводится текущий слот... данные следующего слота уже в таймере... При 3-ёх прерываниях таймера и частичной обработке данных в прерывании получаем при приёме/передаче байта ~17% потерь времени МК... В прерывании же выставляется и флаг готовности данных... остаётся только в майне проверить КС и передать данные на дисплей... Т.к. в СТМ8 можно программно рулить приоритетами прерываний... а прерывания таймера 1-wire последовательные и короткие... то на динамической индикации это никак не отражается... нет даже смысла запрещать прерывания... даже если добавить ещё и приём с IR-пульта на другом таймере... Цитата:
На СТМ можно просто выставить open drain... хоть на выводе...хоть на порту...
__________________
"Я не даю готовых решений, я заставляю думать!"(С) |
|
![]() |
![]() |
![]() |
#33 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
отсуствие готовых решений выглядит подозрительно, вот и сомневался.
но в стандартных примерах выдержка времени сделана на цикле задержки, что сразу накладывает ограничения на прерывания.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#34 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
если через прерывания по таймеру, то получается, что через каждый кусок времени программа должна бросать то что делает и выполнять функцию обновления 7-сегментного индикатора. А если в это время идёт чтение градусника?! Я не засекал сколько времени точно работает функция чтения градусника DS18B20, но включаю на это время светодиод - и на глаз это третья часть секунды. И на это время 7-сегментник будет погашен, что будет заметно пользователю - моргания...
|
![]() |
![]() |
![]() |
#35 |
Senior Member
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/85 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
1-wire оговаривает минимальное время между битами в посылке. Но не оговаривает максимального. Так что критичным по времени будет только время передачи одного бита. Между бит можно индикатор обновлять.
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её. |
![]() |
![]() |
![]() |
#36 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
влазить между чтением данных с градусника не хочется как-то - т.к. надёжность работы градусника - критично в моей задаче, а вот моргание 7-сегментного индикатора - просто не эстетично ). т.е. если взвешивать риски - то градусник лучше не трогать. Может как-то меньшими рисками можно индикатор заставить светиться без морганий?
На персоналке использовал бы потоки, в ПИКах как я понимаю никак... |
![]() |
![]() |
![]() |
#37 | |
Senior Member
Регистрация: 10.06.2008
Возраст: 58
Сообщений: 2,837
Вес репутации: 3992/109 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Потом перешёл на полухардварное/хардварное решение TIM/TIM+DMA... В простейшем случае... всё сводится к передаче/прёме массива... что легко обеспечивается даже в прерывании/DMA... типа... const uint8_t OW_data_out[] = {0x00, 0xCC, 0x44, 0x00, 0xCC, 0xBE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; где 0x00 ничего не означает... это проверка наличия датчика и существует только для упрощения подсчёта байтов... Между 0x44, 0x00 задержка 1сек. тоже формируется аппаратно...
__________________
"Я не даю готовых решений, я заставляю думать!"(С) |
|
![]() |
![]() |
![]() |
#38 |
Senior Member
Регистрация: 10.06.2008
Возраст: 58
Сообщений: 2,837
Вес репутации: 3992/109 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Смотря что понимать под "критично"... Запуск преобразования раз в секунду, большая температурная инерция датчика...
__________________
"Я не даю готовых решений, я заставляю думать!"(С) |
![]() |
![]() |
![]() |
#39 |
Senior Member
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/85 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Это не "грязный хак", а нормальная работа алгоритма 1-wire. Вы читаете очередной бит, и до следующего бита обязаны сделать паузу не менее (не помню скольки) мкс. Не менее. Больше - можно, и на логику работы это не влияет.
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её. |
![]() |
![]() |
![]() |
#40 | |
Senior Member
Регистрация: 10.06.2008
Возраст: 58
Сообщений: 2,837
Вес репутации: 3992/109 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Даже при частоте обновления дисплея в 200Гц на трёх разрядах... это 5мС времени между прерываниями... Т.е. если само прерывание, вместе с сохранением контекста, обслуживанием дисплея, работой с 1-wire и выходом из прерывания, по времени не превышает 5мС... то никакого мерцания дисплея не будет...
__________________
"Я не даю готовых решений, я заставляю думать!"(С) |
|
![]() |
![]() |
![]() |
#41 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
хочу установленную (контрольную) пользователем температуру записывать в EEPROM чтоб при выключении-включении прибора считывать установки из EEPROM.
Написал функции чтения и записи в EEPROM. Если я по адресу 0x00 записываю значение 0xAA и ТУТ-ЖЕ его читаю с проверкой правильности (т.е. проверяю чтоб прочиталось 0xAA) то успешно чтение. Я решил проверить чтение после выключения питания таким образом: 1) читаю данные с проверкой, что прочиталось 0xAA - ошибка т.к. ещё не было записано ничего - это ожидаемо 2) записываю 0xAA 3) выключаю питание и включаю - и срабатывает пункт 1) т.е. должно прочитаться то что было записано в п.2). Однако проверка того, что считанное значение равно 0xAA НЕ успешная. Код:
void test_EEPROM2() //тест с откл. питания { unsigned char uc_address; unsigned char uc_data_wr; unsigned char uc_data_rd; uc_address = 0x00; //------------------------------------------- //1) прочитать uc_data_rd = 0; uc_data_rd = ee_read(uc_address); if (uc_data_rd == 0xAA) //проверка правильных данных при чтении { MYPIN1=1;//вкл.светодиод } //----------------------------------------------- uc_data_wr = 0xAA; // 2) записать ee_write(uc_address, uc_data_wr); MYPIN3=1;//вкл.светодиод } Код:
unsigned char ee_read(unsigned char address) { //while(WR) continue; // пока идёт цикл записи, читать из EEPROM нельзя! EEADR=address; // адрес считываемого регистра //SetBit(EECON1,0); // разрешаем чтение EEPGD=0; //bcf EECON1, EEPGD ; выбрать EEPROM память данных RD=1; //bsf EECON1, RD; чтение return EEDATA; } ////////////////////////////////////////////////////////// void ee_write(unsigned char address, unsigned char data) { //while(WR) continue; // ожидаем пока завершится предыдущий цикл записи EEADR=address; // адрес EEDATA=data; // данные EEPGD=0; //bcf EECON1, EEPGD ; выбрать EEPROM память данных WREN=1; //разрешить запись GIE=0; //запретить прерывания EECON2=0x55; // обязательная последовательность EECON2=0xAA; WR=1; // bsf EECON1, WR; установить бит WR для начала записи //GIE=1; //разрешить прерывания //asm("SLEEP"); while(WR==1);//пока не станет 0 т.е. цикл записи завершён WREN=0; //запретить запись } Код:
void test_EEPROM() { unsigned char uc_address; unsigned char uc_data_wr; unsigned char uc_data_rd; uc_address = 0x00; uc_data_wr = 0xAA; MYPIN0=1; //вкл.светодиод //----------------------------------------------- //записать ee_write(uc_address, uc_data_wr); MYPIN3=1;//вкл.светодиод //----------------------------------------------- //прочитать uc_data_rd = 0; uc_data_rd = ee_read(uc_address); MYPIN2=1;//вкл.светодиод if (uc_data_rd == uc_data_wr) //проверка правильных данных при чтении { MYPIN1=1;//вкл.светодиод } } Заранее благодарю! |
![]() |
![]() |
![]() |
#42 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
...есть мысль, что описанная в даташите "обязательная последовательность" должна быть написана не на Си, а на asm.
пытаюсь в программу на Си "обязательную последовательность" для записи EEPROM написать так: Код:
asm("MOVLW 55h"); asm("MOVWF EECON2"); asm("MOVLW AAh"); asm("MOVWF EECON2"); asm("BSF EECON1,WR"); Может элементарщину спрашиваю, прошу не судить строго... |
![]() |
![]() |
![]() |
#43 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Руслан, а как выглядитт этот кусок в асме после компиляции?
Код:
EECON2=0x55; // обязательная последовательность EECON2=0xAA; WR=1; // bsf EECON1, WR; установить бит WR для начала записи
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#44 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
вечером посмотрю ассемблерный листинг (View - Dissambly Listing) сейчас нет возможности.
Судя по Вашему вопросу, могу предположить, что эти команды идут одна за другой по порядку и здесь не нежен asm. Кроме этого, я в инете нашёл несколько примеров работы с EEPROM на Си БЕЗ асемблерных вставок. Значит у людей работает?! Почему тогда у меня не работает (( Опять где-то хомутнул на элементарном, скорее всего... |
![]() |
![]() |
![]() |
#45 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
это на Си:
Код:
EECON2=0x55; // обязательная последовательность EECON2=0xAA; WR=1; // bsf EECON1, WR; установить бит WR для начала записи Код:
24: EECON2=0x55; // обязательная последовательность 000A 0E55 MOVLW 0x55 000C 6EA7 MOVWF 0xfa7, ACCESS 25: EECON2=0xAA; 000E 0EAA MOVLW 0xaa 0010 6EA7 MOVWF 0xfa7, ACCESS 26: WR=1; // bsf EECON1, WR; установить бит WR для начала записи 0012 82A6 BSF 0xfa6, 0x1, ACCESS Последний раз редактировалось Руслан; 07.07.2015 в 23:05. |
![]() |
![]() |
![]() |
#46 | |
Senior Member
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,731
Вес репутации: 4545/132 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Достал старенькую плату с PIC18F452, кварц 10 MHz. Создал простой проект в CCS 4.110, воспользовался встроенными функциями для записи EEPROM. Прошил микроконтроллер с помощью PICKit2, прочитал EEPROM, убедился, что функции пишут (записать по адресу 0 значение 0x11). Открыл каталог проекта и посмотрел ассемблерный листинг встроенной функции. Что-то там побольше кода, чем у вас.
Цитата:
__________________
Прогресс неизбежен. |
|
![]() |
![]() |
![]() |
#47 | |
Senior Member
Регистрация: 27.02.2007
Адрес: г. Баку
Сообщений: 3,124
Вес репутации: 2885/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#48 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
помница, у меня тоже не сразу заработало. а проблема была в сбросе какихто битов ошибки
вот рабочий код на асм18: Код:
WriteEE movwf EEADR movff POSTINC0, EEDATA movlw b'00000100' ; Setup for EEData movwf EECON1 StartWrite ; Unlock and start the write . movlw 0x55 ; Unlock movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR ; Start the write btfsc EECON1, WR ; Write and wait bra $ - 2
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#49 |
Senior Member
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,731
Вес репутации: 4545/132 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
У нас было 0:02, это на форуме время на час вперед показывает 1:02. Может форум на сервере в другом часовом поясе.
А ответил вот из-за этого сообщения. А то и правда люди ушли на другие форумы. Кто-то зюзьку кода написал, а остальные обсуждают на десятки страниц (один делает, а пятьдесят человек обсуждают, как на базарной площади, толпа шумит), все хотят быть причастными к STM32, а здесь и ответить некому. PS: Кто-то время перевел или мне показалось, теперь оно совпадает.
__________________
Прогресс неизбежен. |
![]() |
![]() |
![]() |
#50 | |
Senior Member
Регистрация: 27.02.2007
Адрес: г. Баку
Сообщений: 3,124
Вес репутации: 2885/106 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
датчик ds18b20 | IE14 | Общетехнические вопросы | 10 | 24.02.2012 15:30 |
Цифровой датчик температуры DS18B20 | JimmiKorn | Общетехнические вопросы | 70 | 29.05.2011 04:45 |
Датчик влажности на DS18B20 | Vovka | Общетехнические вопросы | 23 | 23.03.2011 19:47 |
DS18B20, вроде бы такой проблемы еще не обсуждали | Berkytxt | Общетехнические вопросы | 12 | 08.10.2010 22:45 |
Проблема с DS18B20 на си | Den_GF5 | Вопросы начинающих | 6 | 07.05.2010 00:36 |