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

Ликбез по С для микроконтроллеров PIC

1 59 64

Вот работающий черновик вывода на экран числа 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: оригинал на английском, если поможет
Спасибо, скачал для коллекции