|
Бортовой компьютер на мотоцикл
| |
| Вт, 21.02.2017, 23:13 | Сообщение # 21
|
msmmmm
Постов: 891
Друзья |
Цитата [)еНиС ( ) прога быстро с прерывания выйдет, а если условие мутить Вообще-то в прерывании нужно только секунды (1 байт) инкрементировать. Остальное в майне. Кстати, инкремент с проверкой 3-х char-ов по времени будет как 1 лонг.
Цитата [)еНиС ( ) 10секунд копим прерывания потом делим на 10 Эх, сишники... Не 10 с нужно брать, а 8 или 16. Это принципиально. Очень тяжело не зная как работает АЛУ писать эффективные программы. Конечно так никакого процессора не хватит. А измерения ставить в очередь (все контролируемые величины изменяются медленно) и выполнять, например, после очередного прерывания секунд и/или такта ДИ. Тогда не будет ни одного действительно внезапного прерывания - просто ожидание окончания измерения. Причем в обработчике прерывания только флаг выбрасывать - измерение выполнено . Измерил, данные записал, если времени прорва (посчитать заранее) - запустил следующее, если впритык - лучше в следующую секунду. Это мое видение. Конечно делай как знаешь и умеешь. Но систему команд контроллера знать надо бы.
|
|
| Ср, 22.02.2017, 18:40 | Сообщение # 22
|
[)еНиС
Постов: 3074
Друзья |
Так я и не умею и знаний не хватает, поэтому пишу догадки как бы я реальзовал Вообще если честно я не догоняю как вышесказанное тобой в коде реализовать.
Цитата msmmmm ( ) ще-то в прерывании нужно только секунды (1 байт) инкрементировать. Остальное в майне. Кстати, инкремент с проверкой 3-х char-ов по времени будет как 1 лонг.
понимаешь в чем дело, если у меня часы на дисплей не вызваны - онии вообще никак не обрабатываются в майне (обработка есть только при выводе на дисплей), а для условий нужно постоянно их проверять каждый новый цикл программы. А в моем случае такое можно реализовать только в самом прерывании. В случае же с чистым счетом секунд - даж без вывода на дисплей и без обработки этих часов ничего не куда не денется (т.к. секунды не обнуляются по достижении 60), по необходимости просто эти секунды обработаются и выведутся на дисплей в виде часов и минут
|
|
| Ср, 22.02.2017, 18:42 | Сообщение # 23
|
[)еНиС
Постов: 3074
Друзья |
Кстати по какому принципу выбирать какие фюзбиты ставить?
|
|
| Ср, 22.02.2017, 23:07 | Сообщение # 24
|
msmmmm
Постов: 891
Друзья |
Цитата [)еНиС ( ) Кстати по какому принципу выбирать какие фюзбиты ставить? А это как барин пожелают . У меня принцип простой - открыл в даташите вкладку Fuse Bits, там все расписано. Потерял минут 15, почитал, выставил. Только не путать: 0 - запрограммировано и наоборот. Держать в голове все это не получается уже, да и не нужно.
Цитата [)еНиС ( ) А в моем случае такое можно реализовать только в самом прерывании Все это (кроме счета импульсов емкостного датчика) легко делается вообще без прерываний. Просто проверкой флагов в главном цикле. Я за время изучения программирования МК написал с десяток программ часов, секундомеров и таймеров в т.ч. и с тактовой частотой 32768Гц с ДИ. Ни разу в часах прерывания не использовал. Ты только не говори никому . Часы, как это ни странно - очень медленно работающая штука, особенно если тактовая частота 8-16 МГц. Что поменяется, если индикация секунд задержится на 1000 тактов генератора? Катастрофа!! На целых 0,125 мс задержится смена циферки. И это при том, что сам счет идет правильно. И период динамической индикации 10 мс. То же самое - таймер выбросил флаг, а когда обработается зависит от приоритета, который в данном случае не жесткий, как в прерываниях (по номеру в таблице), а зависит от программиста. Как написал, то и получил. Применительно к обсуждаемому subject-у: в прерывании увеличились секунды, а в майне проверка - если меньше 60-ти, так и индицировать, если 60 - сбросить в 0 и инкрементировать минуты, а если нужно и часы. И по времени это будет тактов 8. Еще проще, я так и делаю, выделить под часы 5 char-ов: полусекунды, единицы минут, десятки минут, единицы часов, десятки часов. Полусекунды нужны для мигания точек и изменяются в прерывании (если без них не спится спокойно), остальные простыми инкрементами в главном цикле щелкают и никакой математики не нужно. Времени занимает вообще ничего. Об очереди, если интересно, потом напишу, тоже ничего сложного.
Цитата msmmmm ( ) Не 10 с нужно брать, а 8 или 16. Это принципиально. Это понял почему?
|
|
| Ср, 22.02.2017, 23:26 | Сообщение # 25
|
[)еНиС
Постов: 3074
Друзья |
Цитата msmmmm ( ) Это понял почему?
Честно, нет. Вот если это аппаратное было, то да там понятно. Но тут все программно, не вижу разницы если не 8 а 7 сделать)
Я понял про часы, аналогично в моем случае, ну потрачу я на обработку лонга 0.5мс роли не сыграет, зато код не придется переписывать. (хотя наверно всего пару строчек передвинуть)
Обработка часов у меня в свитч кейс, поэтому если не совпадает переменная этого свитч кейса (select) то просто не обрабатывются часы
|
|
| Чт, 23.02.2017, 09:15 | Сообщение # 26
|
msmmmm
Постов: 891
Друзья |
Цитата [)еНиС ( ) не вижу разницы если не 8 а 7 сделать А разница колоссальная. В этом процессоре есть аппаратное умножение, но только байта на байт, поэтому в случае больших аргументов приходится городить циклами, а деления нет вообще. Алгоритм деления точно такой же как в школе в столбик - отнял, сдвинул и по циклу. Даже байт на байт разделить занимает уже какое-то существенное время, а уж инт или лонг тем более. А теперь смотри:d(b) 14(1110)/2 = 7(111) 26(11010)/2 = 13(1101) Как видишь, операция деления на 2 сводится к сдвигу делимого вправо. Соответственно деление на 4, это Х>>2, а на 8, это Х>>3 и т.д. Сдвиг - это элементарная операция, и в случае лонга должен занимать 4 такта. Вот и разница.
|
|
| Чт, 23.02.2017, 13:59 | Сообщение # 27
|
[)еНиС
Постов: 3074
Друзья |
msmmmm, понятно теперь я сам до такого не допер бы
|
|
| Сб, 25.02.2017, 15:01 | Сообщение # 28
|
Тёмыч
Постов: 759
Друзья |
Цитата msmmmm ( ) В этом процессоре есть аппаратное умножение, но только байта на байт, поэтому в случае больших аргументов приходится городить циклами, а деления нет вообще.
msmmmm, это ты конкретно про Атмега169 говоришь?
|
|
| Сб, 25.02.2017, 21:54 | Сообщение # 29
|
msmmmm
Постов: 891
Друзья |
Цитата Тёмыч ( ) это ты конкретно про Атмега169 говоришь? Система команд у всех мег практически одинаковая. Честно, в разницу особо не вникал, т.к. когда пишу на ассемблере, листки с командами и регистрами лежат на столе. А на С это нужно только тогда, когда просматриваешь после компиляции листинг дизассемблера - не навертел ли чего? Тиньки аппаратного умножения не имеют.
|
|
| Чт, 02.03.2017, 20:58 | Сообщение # 30
|
Тёмыч
Постов: 759
Друзья |
Есть такой вопросик, не по теме правда, но по поводу программирования. Написал кое-какую программку, и в ней необходимо переводить контроллер в режим выключения. Почитал даташит, выяснил, что для перевода в режим сна надо прописать нужные биты в регистре MCUCR и выполнить инструкцию #asm("SLEEP") Для пробуждения используется внешнее прерывание INT0 и INT1. Вся проблема в том, что в режим сна то он уходит, а из него не возвращается Вот кусок кода за всё это отвечающий, может кто что подскажет дельное?
Добавлено (02.03.2017, 21:58) --------------------------------------------- Симулировал правда только в протеусе, в железе ещё не собирал.
|
|
Внимание! Форум переехал на Tehnodium.ru
|
|