|
|
|
|
Вот работающий черновик вывода на экран числа value. Сделал его в формате long, на самом деле экран восьмиразрядный. 178775.zip |
|
|
Альфа версия часов на том же тике. Вроде работают неплохо, надо на точность проверить с кварцем, с RC врут. Настоящие радиолюбительские часы - кишки наружу 179088.zip |
|
|
Нашёл ошибку в моих часах. Железо, блин. Запрет счёта таймера после записи в него числа. Причём на сях тяжело это дело поправить при делителе равном 4. Сделал чуть иначе. Делитель таймера =1.
void RTCC_isr(void) { TMR0 = TMR0 + 9; if(++delitel>3) { delitel=0; if(++schetAntidrebezg1==100) { flag01sec=1; schetAntidrebezg1=0; } if(mode==0) { if(++cl[0]==10)//единицы msek { cl[0]=0; //razresh_vyvoda=1;//разрешить вывод на экран if(++cl[1]==100)//десятки msek { cl[1]=0; if(++cl[2]==60)//sek { cl[2]=0; if(++cl[3]==60)//min { cl[3]=0; if(++cl[4]==24)cl[4]=0;//chas } } } } } } } Сейчас часы идут. Выставлял по компу, вечером сравню. Может кто эти грабли уже как-то обходил иначе(частота кварца 4МГц)? |
|
|
Вот построено по алгоритму Секундный таймер с нулевой погрешностью для тактовой 4МГц. Главные его достоинства, что если и есть ошибка, то она не накапливается. Обратить внимание на запись декремента.
int bres_hi = 0x0F; // старший байт int bres_mid = 0x42+1; // средний.... int bres_lo = 0x40; // младший... #int_TIMER0 void TIMER0_isr(void) { if(--bres_mid == 0){ // декремент среднего байта, сначала вычитаем, потом проверка if(bres_hi-- == 0){ // декремент старшего байта, сначала проверка, потом вычитаем bres_hi = 0x0F; // сброс значения старшего байта bres_mid = 0x42; // сброс значения среднего байта bres_lo = bres_lo + 0x40; // прибавление к текущему состоянию младшего байта if(bres_lo ==0 )bres_mid++; // если младший байт переполнился инкремент среднего байта USER CODE! //Код для счетчика секунд, или односек. событие. } } }
Уже примерно сутки проработало, вроде не сбилось. При симуляции видно, что код работает как и описано в ссылке. |
|
|
Сделал чуть иначе. #TYPE LONG=32 long value=1000000; #byte h_value=0x54//у каждого свои адреса получатся #byte m_value=0x53 #byte l_value=0x52#int_timer0 void RTCC_isr(void) { value=value-256; if(!h_value) if(!m_value) { value=value+1000000; if(++cl[2]==60)//sek { cl[2]=0; if(++cl[3]==60)//min { cl[3]=0; if(++cl[4]==24) cl[4]=0;//chas } } } } ps Тип LONG тут не нужен, байт теряется, достаточно 24бит. |
|
|
Привет всем. Ребят, кто-нибудь работал с dspic30? Нужен пример работы с UАRT. Никто не поможет? |
|
|
shemmer: Нужен пример работы с UАRT Есть такой пример в книге: Хадлстон К. Проектирование интеллектуальных датчиков с помощью Microchip dsPIC. Книга эта в инете мне попадалась. |
|
|
С UАRT разобрался. А книгу интересно почитать, интересно ни где не нашел ее в свободном электронном виде. Никто не встречал? |
|
|
оригинал на английском, если поможет http://ifolder.ru/6935271 |
|
|
pomidor: оригинал на английском, если поможет Спасибо, скачал для коллекции |
|
|
|
|