 |
|
|
|
| Автор |
Сообщение |
day177 Знатный посетитель (>20)


Зарегистрирован: 25.12.2006 Сообщения: 51 Откуда: Тула
|
Добавлено: 09 Май 2007, 18:23 Заголовок сообщения: |
|
|
| Цитата: | | Почти не считается - Убирайте полностью - это можно сделать. |
убрал полностью за счет:
1. полной переписи стандартной библиотеки PCF
2. Регенерации индикации при чтении времени
3. Чтения времени без перекодировки BCD to BIN
| Цитата: | | старайтесь не затачивать программу под конкретную задачу |
сам понимаю что так надо делать, но по неопытности возникают сложности с реализацией
| Цитата: | | поставьте ниббл под значение точки - по биту на знакоместо и анализируйте при выдаче - что же здесь сложного ? |
сложность в выводе Так как используется одна функция для вывода и часов и минут
| Код: | void displ(unsigned char x, unsigned char catodten, unsigned char catodunit)
{
bufer=zg7[(x>>4) & 0x0f]; //получаем десятки
sdvig(bufer,catodten); //выводим десятки
bufer=zg7[x & 0x0f]; //получаем единицы
sdvig(bufer,catodunit); //выводим единицы
} |
| Цитата: | | с самого начала предусматривайте возможность того, что точка может пойти куда угодно. |
осознаю эту необходимость, но как реализовать вывод в нужное место никак не пойму
|
|
| Вернуться к началу |
|
 |
urry Живет здесь... (>100)


Зарегистрирован: 23.10.2006 Сообщения: 243
|
Добавлено: 10 Май 2007, 9:17 Заголовок сообщения: |
|
|
Решительно не понимаю проблему вывода точки.
Вот грубое, неправильное решение "в лоб" - только для иллюстрации ----
В реале не применять !!!! Для 2 разрядов -
| Код: |
static bit r_1,r_2; // бит на знакоместо
void analiz_toshki(unsigned char temp) //анализ места точки - в темп - анализ числа
{
r_1=0;
r_2=0;
if ( temp >= 10 )r_2=1;
else r_1=1;
}
И в дисплее
void displ(unsigned char x, unsigned char catodten, unsigned char catodunit)
{
bufer=zg7[(x>>4) & 0x0f]; //получаем десятки
if(r_2==1) bufer|=0x80;
sdvig(bufer,catodten); //выводим десятки
bufer=zg7[x & 0x0f]; //получаем единицы
if(r_1==1) bufer|=0x80;
sdvig(bufer,catodunit); //выводим единицы
}
|
Анализ точки можно делать раз в пол-секунды - полсекунды выставлять точку, полсекунды - обнулять ее, стобы было мигание.
_________________ меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн) |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 10 Май 2007, 11:09 Заголовок сообщения: |
|
|
Эх, блин, точки, моргания ... ХВОСТ!
Если программу нельзя просто модифицировать иизменять, то, скорее всего, она имеет изначально кривую архитектуру... мы приходим к вопросу, который мало освещается на форумах ... везде учатся работать с разными датчиками и узлами .. и мало кто задумывается ... как эти куски кода между собой объединять ... как выстраивать скелет программы.
Если Вы не можете избавится от моргания .. то давайте посмотрим на код в общем ...
Итак ... делаем часики .. у нас есть:
микросхема часов, которая ведет непрерывный отсчет времени;
индикатор, требующий динамическую индикацию;
клавиатура для управления часиками;
пищалка для подачи звукового сигнала;
ну и контроллер.
Что требуется:
индикация текущего времени
изменение текущего времени
изменение времени будильника
включение/отключение будильника
Все вытекающие из сего задачи можно разделить на два уровня:
- "уровень железа" - задачи. которые не зависят от действий юзера и направлены на обеспечение функционирования основных узлов устройства.
Организация дин. индикации, сканирование клавиатуры, генерация звуковых сигналов, опрос/запись RTC
- "пользовательские задачи" - высокоуровневые задачи, которые направлены на реализацию основных алгоритмов работы устройства.
Установка текущего времени, изменение времени и включение/отключение будильника.
Можно заметить, что задачи "железного уровня" привязываются к имеющемуся железу ... а "пользовательские" - к логике работы устройства. Таким образом, при изменении железа (тип индикатора, например) изменения затронут лишь часть пограммы и не будет необходимости изменять частьс высокоуровневой логикой.
Во накатал .. продолжаем... возникает вопрос .. как организовать взаимодействие двух частей программы, при этом иметь возможность их независимого модифицирования? В голову приходит два варианта:
- глобальные переменные (одна часть изменяет их, а вторая "смотрит" на эти перменные)
- заранее стандартизированный набор функций. (содержимое функций сожно изменять, но определения трогать нельзя)
Переходим к практике:
Так-как блок индикации требует периодичного вызова, то "выдаем" ему прерывание таймера ... в прерывании будем генерить индикацию. Теперь встает вопрос интерфейса - как организовать взаимодействие этого куска кода с остальной программой ... далеко ходить за примерами не нужно - "видеопамять"
Выделяем массивчик
| Код: | | unsigned char video[4] |
Теперь основная программа будет скидывать сюда значения, а блок индикации их выводить ... теперь менять можно что угодно - главное, дабы видеопамять осталась Точки ... давайте заведем еще "регистр управления индикацией" - в нем каждый бит будет отвечать за отображение точек, моргание индикатора и т.д. ... например:
| Код: |
unsigned char video_cntr; //Регистр управления видеодрайвером :)
// биты 0-3 -- если единичка, то зажигаем точку в указанном разряде
// биты 4-7 -- если единичка, моргаем указанным разрядом
|
Что нам это дает ... попробуем
video_cntr |= 0x02 -- зажгли точку посередке
video_cntr |=0x80 -- моргаем десятками часов ... удобно в режиме изменения показывать, что изменяем
Каждые 0,5 сек video_cntr ^= 0x02 -- моргание точки - часики идут.
Теперь прикинем реализацию ...
Для подсчета тактов заведем переменную ТАКТ, которой делаем +1 каждое прерывание ... так она будет "по кругу" крутится ... и ее биты будут нам указывать на всякие нужные нам моменты ... Если таймер будет на 4 мс, то ТАКТ будет равен нулю раз в секунду, старший бит ТАКТ будет половину секунды 0 и половину 1 ... и т.д.
| Код: |
В ПРЕРЫВАНИИ ПО ТАЙМЕРУ.
получение текущего байта видеопамяти БУФЕР = (ТАКТ & 0х03) - два младших бита
если нужно, то поднять бит точки -- смотрим бит регитсра управления (БУФЕР |= бит точки)
смотрим на моргания ... если нужно моргать (бит регистра контроля) и ТАКТ & 0x80 , то БУФЕР = 0 (выводим "пробел") ...
|
Вот примерно так по каждому блоку .... а потом надстраиваем верхний уровень .. при этом нам уже неплевать, как там индикатор работает - видеопамять есть и всё!
Уф! Вот понесло писаку ... продолжать?
_________________ AndryG |
|
| Вернуться к началу |
|
 |
day177 Знатный посетитель (>20)


Зарегистрирован: 25.12.2006 Сообщения: 51 Откуда: Тула
|
Добавлено: 10 Май 2007, 15:40 Заголовок сообщения: |
|
|
Рассуждение немного не в тему: а зачем опрашивать часы раз в секунду? Отображаются ведь только часы и минуты! А мигать точкой можно по счетчику
И такой принципиальный вопрос: для alarm будет использоваться прерывание от ПЦФ или делать софтово по совпадению установленных чисел?
|
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 10 Май 2007, 16:06 Заголовок сообщения: |
|
|
Рассуждения в тему "моргает при опросе RTC"
Оправшивать раз в секунду ... "отставать" Ваши часы будут, если опрос тоже делать раз в минуту ... подумайте сами .. время уже прошло, а Вы всё старуую минуту показываете
Вариаты оба хороши!
Только стоит прикинуть, что будет "дешевле" ... самому проверять совпадения или записывать данные о времени прерывания в RTC.
Если не сложно .. посмотрите в симуляторе .. сколько длится ОПРОС RTС .. именно опрос - сама библиотечная функция сколько времени отрабатывает?
Если меньше 5 мс, то можно ее и не переписывать - значит у Вас неверная организация программки в корне. ИМХО.
_________________ AndryG |
|
| Вернуться к началу |
|
 |
day177 Знатный посетитель (>20)


Зарегистрирован: 25.12.2006 Сообщения: 51 Откуда: Тула
|
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 11 Май 2007, 9:40 Заголовок сообщения: |
|
|
Ну раз разобрались, то поздравляю!
_________________ AndryG |
|
| Вернуться к началу |
|
 |
day177 Знатный посетитель (>20)


Зарегистрирован: 25.12.2006 Сообщения: 51 Откуда: Тула
|
Добавлено: 14 Май 2007, 12:28 Заголовок сообщения: |
|
|
подскажите пожалуйста почему не работает такое условие проверки прерывания int0
и для прерывания 8-битного счетчика
ведь это же специальные флаговые регистры. Просто хотелось использовать их для того чтоб не поднимать како-либо флаг внутри прерывания, а просто следить за флагами возникающих прерываний
|
|
| Вернуться к началу |
|
 |
urry Живет здесь... (>100)


Зарегистрирован: 23.10.2006 Сообщения: 243
|
Добавлено: 14 Май 2007, 13:11 Заголовок сообщения: |
|
|
| day177 писал(а): | подскажите пожалуйста почему не работает такое условие проверки прерывания int0
и для прерывания 8-битного счетчика
ведь это же специальные флаговые регистры. Просто хотелось использовать их для того чтоб не поднимать како-либо флаг внутри прерывания, а просто следить за флагами возникающих прерываний |
В каком месте проверяете ?
Цитата ---
Флаг очищается после выполнения обработчика прерывания.
Конец цитаты-----
_________________ меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн) |
|
| Вернуться к началу |
|
 |
day177 Знатный посетитель (>20)


Зарегистрирован: 25.12.2006 Сообщения: 51 Откуда: Тула
|
Добавлено: 14 Май 2007, 14:00 Заголовок сообщения: |
|
|
| Цитата: | | Флаг очищается после выполнения обработчика прерывания. |
тогда как это понимать?
| Цитата: | Кроме того, флаг можно очистить, записав в него логическую единицу.
| Цитата: | | В каком месте проверяете ? |
в основном цикле
Тогда такой вопрос: можно как-нибудь проверять возникновение прерывания без использования переменных? |
| Цитата: |
from AndryG
Если таймер будет на 4 мс... |
только как вот получить такое значение используя 8 битный таймер? долго парился с экселем но так и не смог найти нужного значения для счетчика и клока
|
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять вложения в этом форуме Вы можете просматривать вложения в этом форуме
|
|