Ghost in shell писал(а):как записать число непосредственно в память МК?
Не совсем понятен вопрос. Что означает "память МК" и что значит непосредственно ? Ну и для чего это вообще нужно ? Вдруг найдутся альтернативные решения Ваших задумок.
Хочу писать значения в eeprom, чтобы не пропадали при отключении питания. Уверен, что при непоследственном обращении к памяти компилятор работает безглючнее, и прога быстрее идет. P.S. В какой версии MPLAD IDE вы работаете?
urry писал(а):Вопросы - почему часы стоят - это уже не мне, а Тени. Имхо, здесь недопиленная разработчиками модель. Самое время отложить протеус и взять в руки паял0
Юра, да брось ... Все там работает и без танцев с бубном . Шину надо было объявить , см на скрин. А все остальное есть в даташите . И запись соответствует интел шине , и запуск часиков - все в нем расписано .
Ув Dosikus а можно по подробнее? я даж специальную тему создавал с просьбой о помощи, ссылочка на предыдущей странице, и щел не методом тыка а по даташиту, опыта только маловато найти где не так сделал
А что здесь непонятного ? Шину соединяем как на скрине . Задаем пинам порта пЫк AD0 -AD7 - соответственно шине DS12887 , ставим метку на шину AD[0..7] - сие крайне обязательно , причем все это расписано в хелпе к протеус. В модели есть диагностика записи и чтения - НО! корректно работает только для регистров 0x00-0x0D . Хватит для начальном отладки . После вылизывания процедур диагностику отключить ! Часики пускаются записью 0x20 в регистр 0x0A ...
метку на шине поставил, заработала шина, 20 в регистр А отправил пошли часы (кстате почему 20 тоесть 00100000 так и не понял не нашел в описании), ну слава богу, писать в регисты часов получается, а вот читать хоть убей нет (((
программу буржуина не стал пробовать, разбираюсь по своему алгоритму который писал по даташиту, вот что получилось:
unsigned char ReadMemory (unsigned char Addr) { //читаем значение данных по адресу Addr unsigned char temp = 0; TRISD=0b00000000; DS_RD=1;DS_WR=1;DS_AS=1; DS_Data=Addr; DS_AS=0;DelayUs(5); DS_RD=0;DelayUs(5); TRISD=0b11111111; temp = DS_Data; DS_RD=1;DS_AS=1; return temp;}
void WriteMemory (unsigned char Addr, unsigned char Data ) {//записываем значение данных по адресу Addr DS_RD=1;DS_WR=1;DS_AS=1; TRISD=0b00000000; DS_Data=Addr; DS_AS=0; DelayUs(1); DS_Data=Data; DS_WR=0;DelayUs(1); DS_WR=1;DS_AS=0;}
void ClockInit( void ){ TRISC0=0;TRISC1=0;TRISC2=0;PORTC=0; //WriteMemory (0x0A, 0b00100000 ); //Регистр А 0b11110100 //WriteMemory (0x0B, 0b11111111 ); //Регистр В //WriteMemory (0x0C, 0b11111111 ); //Регистр C //WriteMemory (0x0D, 0b11111111 ); //Регистр D }
вот если строки //mem=BCDconv (ReadMemory(0x04)); и еще там две рядом комментированы, то часы получают последовательно три числа которые я назначил,
тоесть процедура записи работает, если комментарий с какойто из трех строк снять то перестает работать и последующая запись в регистр (и часы не получают и в ответе мусор) тоесть косяк гдето в процедуре чтения.... (( никак не разберусь где
OSCILLATOR CONTROL BITS When the DS12887 is shipped from the factory, the internal oscillator is turned off. This feature prevents the lithium energy cell from being used until it is installed in a system. A pattern of 010 in bits 4 through 6 of Register A turns the oscillator on and enables the countdown chain.
Нарывались на сие когда покупали новые чипы , старые с распая - естесно уже включенные. И так дословно - Когда чип поставляется с завода , внутренний генератор выключен . Сие используется для экономии внутренней батареи . Комбинация 010 в битах 4-6 регистра A включает внутренний генератор и разрешает счетную цепочку . 00100000 бинарное и есть 0x20 .
На счет чтения . Не буду тебя мучать, держи исходники под XC8. Накиданы вчера за 5 минут , так что все сырое но рабочее. Заметь так же , что у меня CS дергается ... Спойлер
PS Твои чипы могут быть уже с дохлыми батарейками. В сети есть как восстановить . Обычно высверливают дохлую и припаивают свежак... Да и 12887 это с проблемой 2000 , те что 12С887 c добавленным счетчиком веков ...
Спасибо добрый человек, а я голова два уха думал че там еще за осциллятор появился, думал пока не нужен мне забью нулями регистры ан нет тутто и ошибся, а уже запущенные часы не собъются если им опять 010 впулить? Не надо проверку делать перед инициализацией?
Про батарейку я в курсе, эти и еще одни подобные достаты из теплосчетчика который еще недавно работал и приговорен по причине утери паспорта и невозможности пройти госповерку, так что с большой вероятностью еще жив литий, вообще они меня привлекли чисто экспериментально, а именно возможностью создавать прерывание и будить спящий мк, наверняка и в других часах это есть но в твери с деталями туго. сейчас почитаю что там с кодом мне прислал ) еще раз спасибо
Последний раз редактировалось electronik_tver Вс янв 05, 2014 22:50:52, всего редактировалось 1 раз.
electronik_tver писал(а):Спасибо добрый человек, а я голова два уха думал че там еще за осциллятор появился, думал пока не нужен мне забью нулями регистры ан нет тутто и ошибся, а уже запущенные часы не собъются если им опять 010 впулить? Не надо проверку делать перед инициализацией?
А ХЗ . У меня сейчас живых нет , хотя приобрести не отказался бы . Сам раритетом балуюсь, сейчас повторно, после трехлетней консервации , запускаю свой ZX Phoenix Конечно RTC проще сделать на STM32F0, но уже едет конструктор PROF ПЗУ ...
Легко. (Impulse_Lenght<PR2) даёт логический результат (правда или ложь, да или нет). Вот его и подставляем в выражение RB4 && X (где X - результат (Impulse_Lenght<PR2)).
Здравствуйте извините что так неуместно пишу. Хочу книгу для micro c , на официальном сайте но дорого для студента подскажите мне бы толка синтаксу научится. (и примеры чтоб были)
ANSEL = 0x04; // Configure AN2 pin as analog TRISA = 0xFF; // PORTA is input ANSELH = 0; // Configure other AN pins as digital I/O TRISC = 0x3F; // Pins RC7, RC6 are outputs TRISB = 0; // PORTB is output do { temp_res = ADC_Read(2); // Get 10-bit results of AD conversion PORTB = temp_res; // Send lower 8 bits to PORTB PORTC = temp_res >> 2; // Send 2 most significant bits to RC7, RC6 } while(1); } взял из (http://www.mikroe.com/downloads/get/30/ ... l_v101.pdf) странныца 269 ANSEL, ANSELH выбивает ошыбкый почему