Форум по разработке и ремонту электронной техники Киевский форум радиолюбителей и электронщиков. Форумы по разработке и ремонту электронной техники
    Схемы электрические принципиальныеГлавная    ФорумФорум    ПоискПоиск по форуму    Личные сообщенияФайлообменник    Личные сообщенияРадиотехнический каталог   

Фотогалерея   <b>Профиль</b>Ваш профиль    Личные сообщенияЛичные сообщения    ГруппыГруппы   

FAQFAQ    РегистрацияРегистрация    ВходВход

Уважаемые посетители! Это старая версия форума. Новая версия находится по адресу: http://www.remexpert.com
Микроконтроллеры начинающим
На страницу Пред.  1, 2, 3 ... 11, 12, 13, 14  След.
 
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Форум по разработке и ремонту электронной техники -> Микроконтроллеры, процессоры, ПЛИС...
 
Автор Сообщение
day177
Знатный посетитель (>20)
Знатный посетитель (>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)
Живет здесь... (>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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
day177
Знатный посетитель (>20)
Знатный посетитель (>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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
day177
Знатный посетитель (>20)
Знатный посетитель (>20)


Зарегистрирован: 25.12.2006
Сообщения: 51
Откуда: Тула

СообщениеДобавлено: 11 Май 2007, 7:40    Заголовок сообщения: Ответить с цитатой

Цитата:
Если не сложно .. посмотрите в симуляторе .. сколько длится ОПРОС RTС .. именно опрос - сама библиотечная функция сколько времени отрабатывает?

давно уже пытался посмотреть, но вмлаб брэкпоинты игнорирует, а в протеусе вообще не ставятся Грусть

Цитата:
Рассуждения в тему "моргает при опросе RTC"

уже ничего не моргает Улыбка при этом опрос часов происходит постоянно.
Моргало из-за того что на выходе PCF-ки когда не включена функция alarm возникают прерывания с периодом 1сек
так вот модель PCF-ки для протеуса корявая (нет прерываний), а в железе были.
Т.е. прерывания происходили по переполнению счетчика и по НЛУ от PCF, вот МК и метался туда-сюда - какая уж тут динамическая индикация



proga_2.rar.txt
 Описание:
исходник, переписанная библиотека, модель протеуса

Файлообменник
 Название файла:  proga_2.rar.txt
 Размер файла:  47.7 KB
 Скачено:  155 раз(а)

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndryG
Модератор


Зарегистрирован: 24.07.2006
Сообщения: 411
Откуда: Helios-3

СообщениеДобавлено: 11 Май 2007, 9:40    Заголовок сообщения: Ответить с цитатой

Ну раз разобрались, то поздравляю!
_________________
AndryG
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
day177
Знатный посетитель (>20)
Знатный посетитель (>20)


Зарегистрирован: 25.12.2006
Сообщения: 51
Откуда: Тула

СообщениеДобавлено: 14 Май 2007, 12:28    Заголовок сообщения: Ответить с цитатой

подскажите пожалуйста почему не работает такое условие проверки прерывания int0
Код:
if(GIFR&0x40)

и для прерывания 8-битного счетчика
Код:
if(TIFR&0x02)

ведь это же специальные флаговые регистры. Просто хотелось использовать их для того чтоб не поднимать како-либо флаг внутри прерывания, а просто следить за флагами возникающих прерываний
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
urry
Живет здесь... (>100)
Живет здесь... (>100)


Зарегистрирован: 23.10.2006
Сообщения: 243

СообщениеДобавлено: 14 Май 2007, 13:11    Заголовок сообщения: Ответить с цитатой

day177 писал(а):
подскажите пожалуйста почему не работает такое условие проверки прерывания int0
Код:
if(GIFR&0x40)

и для прерывания 8-битного счетчика
Код:
if(TIFR&0x02)

ведь это же специальные флаговые регистры. Просто хотелось использовать их для того чтоб не поднимать како-либо флаг внутри прерывания, а просто следить за флагами возникающих прерываний

В каком месте проверяете ?
Цитата ---
Флаг очищается после выполнения обработчика прерывания.
Конец цитаты-----

_________________
меня не интересует мнение людей. которые разбираются в этом вопросе. Только тех, кто сами что-то сделали (А. Энштейн)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
day177
Знатный посетитель (>20)
Знатный посетитель (>20)


Зарегистрирован: 25.12.2006
Сообщения: 51
Откуда: Тула

СообщениеДобавлено: 14 Май 2007, 14:00    Заголовок сообщения: Ответить с цитатой

Цитата:
Флаг очищается после выполнения обработчика прерывания.


тогда как это понимать?
Цитата:
Кроме того, флаг можно очистить, записав в него логическую единицу.

Цитата:
В каком месте проверяете ?

в основном цикле

Тогда такой вопрос: можно как-нибудь проверять возникновение прерывания без использования переменных?

Цитата:

from AndryG
Если таймер будет на 4 мс...

только как вот получить такое значение используя 8 битный таймер? долго парился с экселем но так и не смог найти нужного значения для счетчика и клока Грусть
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Форум по разработке и ремонту электронной техники -> Микроконтроллеры, процессоры, ПЛИС... Часовой пояс: GMT + 2
На страницу Пред.  1, 2, 3 ... 11, 12, 13, 14  След.
Страница 12 из 14

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять вложения в этом форуме
Вы можете просматривать вложения в этом форуме


Rambler's Top100 PageRank Яндекс цитирования
Сайты наших друзей: Гири, все о гирях, Автоматизация магазинов, супермаркетов, ресторанов, кинотеатров,
Весы электронные, Сканеры штрих-кода, Принтеры штрих-кода

Powered by phpBB © 2001, 2005 phpBB Group

Время генерации страницы: 1.0449s (PHP: 84% - SQL: 16%) - SQL запросов: 13 - GZIP enabled - Debug on