РАДИОСХЕМЫ



СТАРЫЙ ФОРУМ

Форум на ЭЛВО


РАДИОФОРУМЫ


СХЕМЫ И СТАТЬИ



  • Страница 3 из 8
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 7
  • 8
  • »
Архив - только для чтения
Бортовой компьютер на мотоцикл
Сообщение # 21        
msmmmm
аватар
  Постов: 891   Друзья 
Цитата [)еНиС ()
прога быстро с прерывания выйдет, а если условие мутить
Вообще-то в прерывании нужно только секунды (1 байт) инкрементировать. Остальное в майне. Кстати, инкремент с проверкой 3-х char-ов по времени будет как 1 лонг.
Цитата [)еНиС ()
10секунд копим прерывания потом делим на 10
Эх, сишники... smile Не 10 с нужно брать, а 8 или 16. Это принципиально. Очень тяжело не зная как работает АЛУ писать эффективные программы. Конечно так никакого процессора не хватит.
А измерения ставить в очередь (все контролируемые величины изменяются медленно) и выполнять, например, после очередного прерывания секунд и/или такта ДИ. Тогда не будет ни одного действительно внезапного прерывания - просто ожидание окончания измерения. Причем в обработчике прерывания только флаг выбрасывать - измерение выполнено . Измерил, данные записал, если времени прорва (посчитать заранее) - запустил следующее, если впритык - лучше в следующую секунду.
Это мое видение. Конечно делай как знаешь и умеешь. Но систему команд контроллера знать надо бы.
Сообщение # 22        
[)еНиС
аватар
  Постов: 3074   Друзья 
Так я и не умею и знаний не хватает, поэтому пишу догадки как бы я реальзовал biggrin
Вообще если честно я не догоняю как вышесказанное тобой в коде реализовать.

Цитата msmmmm ()
ще-то в прерывании нужно только секунды (1 байт) инкрементировать. Остальное в майне. Кстати, инкремент с проверкой 3-х char-ов по времени будет как 1 лонг.


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

В случае же с чистым счетом секунд - даж без вывода на дисплей и без обработки этих часов ничего не куда не денется (т.к. секунды не обнуляются по достижении 60), по необходимости просто эти секунды обработаются и выведутся на дисплей в виде часов и минут
Сообщение # 23        
[)еНиС
аватар
  Постов: 3074   Друзья 
Кстати по какому принципу выбирать какие фюзбиты ставить?
Сообщение # 24        
msmmmm
аватар
  Постов: 891   Друзья 
Цитата [)еНиС ()
Кстати по какому принципу выбирать какие фюзбиты ставить?
А это как барин пожелают biggrin . У меня принцип простой - открыл в даташите вкладку Fuse Bits, там все расписано. Потерял минут 15, почитал, выставил. Только не путать: 0 - запрограммировано и наоборот. Держать в голове все это не получается уже, да и не нужно.
Цитата [)еНиС ()
А в моем случае такое можно реализовать только в самом прерывании
Все это (кроме счета импульсов емкостного датчика) легко делается вообще без прерываний. Просто проверкой флагов в главном цикле. Я за время изучения программирования МК написал с десяток программ часов, секундомеров и таймеров в т.ч. и с тактовой частотой 32768Гц с ДИ. Ни разу в часах прерывания не использовал. Ты только не говори никому biggrin . Часы, как это ни странно - очень медленно работающая штука, особенно если тактовая частота 8-16 МГц. Что поменяется, если индикация секунд задержится на 1000 тактов генератора? Катастрофа!! На целых 0,125 мс задержится смена циферки. И это при том, что сам счет идет правильно. И период динамической индикации 10 мс. То же самое - таймер выбросил флаг, а когда обработается зависит от приоритета, который в данном случае не жесткий, как в прерываниях (по номеру в таблице), а зависит от программиста. Как написал, то и получил.
Применительно к обсуждаемому subject-у: в прерывании увеличились секунды, а в майне проверка - если меньше 60-ти, так и индицировать, если 60 - сбросить в 0 и инкрементировать минуты, а если нужно и часы. И по времени это будет тактов 8. Еще проще, я так и делаю, выделить под часы 5 char-ов: полусекунды, единицы минут, десятки минут, единицы часов, десятки часов. Полусекунды нужны для мигания точек и изменяются в прерывании (если без них не спится спокойно), остальные простыми инкрементами в главном цикле щелкают и никакой математики не нужно. Времени занимает вообще ничего.
Об очереди, если интересно, потом напишу, тоже ничего сложного.

Цитата msmmmm ()
Не 10 с нужно брать, а 8 или 16. Это принципиально.

Это понял почему?
Сообщение # 25        
[)еНиС
аватар
  Постов: 3074   Друзья 
Цитата msmmmm ()
Это понял почему?


Честно, нет. Вот если это аппаратное было, то да там понятно. Но тут все программно, не вижу разницы если не 8 а 7 сделать)

Я понял про часы, аналогично в моем случае, ну потрачу я на обработку лонга 0.5мс роли не сыграет, зато код не придется переписывать. (хотя наверно всего пару строчек передвинуть)

Обработка часов у меня в свитч кейс, поэтому если не совпадает переменная этого свитч кейса (select) то просто не обрабатывются часы
Сообщение # 26        
msmmmm
аватар
  Постов: 891   Друзья 
Цитата [)еНиС ()
не вижу разницы если не 8 а 7 сделать
А разница колоссальная. В этом процессоре есть аппаратное умножение, но только байта на байт, поэтому в случае больших аргументов приходится городить циклами, а деления нет вообще. Алгоритм деления точно такой же как в школе в столбик - отнял, сдвинул и по циклу. Даже байт на байт разделить занимает уже какое-то существенное время, а уж инт или лонг тем более. А теперь смотри:d(b)
14(1110)/2 = 7(111)
26(11010)/2 = 13(1101)
Как видишь, операция деления на 2 сводится к сдвигу делимого вправо. Соответственно деление на 4, это Х>>2, а на 8, это Х>>3 и т.д. Сдвиг - это элементарная операция, и в случае лонга должен занимать 4 такта. Вот и разница.
Сообщение # 27        
[)еНиС
аватар
  Постов: 3074   Друзья 
msmmmm, понятно теперь biggrin я сам до такого не допер бы
Сообщение # 28        
Тёмыч
аватар
  Постов: 759   Друзья 
Цитата msmmmm ()
В этом процессоре есть аппаратное умножение, но только байта на байт, поэтому в случае больших аргументов приходится городить циклами, а деления нет вообще.


msmmmm, это ты конкретно про Атмега169 говоришь?
Сообщение # 29        
msmmmm
аватар
  Постов: 891   Друзья 
Цитата Тёмыч ()
это ты конкретно про Атмега169 говоришь?
Система команд у всех мег практически одинаковая. Честно, в разницу особо не вникал, т.к. когда пишу на ассемблере, листки с командами и регистрами лежат на столе. А на С это нужно только тогда, когда просматриваешь после компиляции листинг дизассемблера - не навертел ли чего? smile
Тиньки аппаратного умножения не имеют.
Сообщение # 30        
Тёмыч
аватар
  Постов: 759   Друзья 
Есть такой вопросик, не по теме правда, но по поводу программирования.
Написал кое-какую программку, и в ней необходимо переводить контроллер в режим выключения.
Почитал даташит, выяснил, что для перевода в режим сна надо прописать нужные биты в регистре MCUCR и выполнить инструкцию #asm("SLEEP")
Для пробуждения используется внешнее прерывание INT0 и INT1. Вся проблема в том, что в режим сна то он уходит, а из него не возвращается wacko
Вот кусок кода за всё это отвечающий, может кто что подскажет дельное?

Добавлено (02.03.2017, 21:58)
---------------------------------------------
Симулировал правда только в протеусе, в железе ещё не собирал.

  • Страница 3 из 8
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 7
  • 8
  • »
Поиск:

Внимание! Форум переехал на Tehnodium.ru



© 2010-2022 "Форум Радиосхемы". All Rights Reserved  Почта  PDA