Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
13.07.2011, 23:42
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Помогите разобраться с таймером в Atmega8
Сообщение от AndryG
|
Автору топика могу посоветовать устроить отладку в Proteus.
Вместо пульта использовать второй контроллер.
Или VMLAB - там можно устроить нужный входной поток. (проект есть в моем архиве выше по тексту)
|
Я знаю этот трюк ![Улыбка](images/smilies/icon_smile.gif) пробовал когдато, но я сейчас тестирую в железе, у меня есть самопальная отладка, так вот в ней код не работает... таймер настроен вроди бы правильно. Посмотрите пожалуйста на первой странице мой исходник, у меня таймер правильно настроен???
|
|
|
|
13.07.2011, 23:56
|
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Re: Помогите разобраться с таймером в Atmega8
Я давно с контроллерами не возился - толку от меня в просмотре чужого кода мало (тут свой еле вспомнил ![Улыбка](images/smilies/icon_smile.gif) )
Посему и советую симулятор - сразу всё увидите (хотя бы VMLAB)
|
|
|
|
14.07.2011, 00:08
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Помогите разобраться с таймером в Atmega8
Сообщение от AndryG
|
(хотя бы VMLAB)
|
Его я к сожалению вообще не знаю... а протеус кое как, очень полезный симулятор для основной отловки глюков в коде ![Улыбка](images/smilies/icon_smile.gif) чтоб не насиловать МК использую сначала симулятор
|
|
|
|
14.07.2011, 12:26
|
|
Прописка
Регистрация: 25.09.2009
Адрес: Ivanovo
Сообщений: 156
Сказал спасибо: 3
Сказали Спасибо 67 раз(а) в 60 сообщении(ях)
|
Re: Помогите разобраться с таймером в Atmega8
Сообщение от artyomugr
|
а протеус кое как, очень полезный симулятор для основной отловки глюков в коде
|
Шпротеус конечно еще тот симулятор... Но для проверки работы таймера сойдет. Чтото пока никакой конкретики не видно. На данный момент с чем затыка? Частота таймера не та?
Или обработка прерываний от IR? Попробуйте в программе обработки прерывания от таймера менять состояние какого нибудь порта. В протеусе на осциле будет видно с какой частотой происходит обработка прер. таймера. На МК проверте fuses, может от внутр. генератора работает.
Последний раз редактировалось heady69; 14.07.2011 в 12:31.
|
|
|
|
14.07.2011, 12:48
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Помогите пожалуйста разобраться :(
Сообщение от MisterDi
|
Кроме того, я не увидел присваивания начального значения переменной data_code, а надеяться на компилятор - ИМХО не очень хорошая практика.
|
Работа компилятора должна соответствовать принятому стандарту. Инициализация - чётко расписана. А именно: если переменная глобальная, то она буде проинициализирована. Ели не указано инициирующее значение при объявлении, то эта переменная будет инициализирована 0. Кроме того будут инициализированы временные переменные объявленные как static.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо SasaVitebsk за это сообщение:
|
|
|
14.07.2011, 13:03
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Помогите разобраться с таймером в Atmega8
Сообщение от artyomugr
|
if (TCNT0›40 && TCNT0‹80) { PORTB.0 = ~PORTB.0;}
тут мы читаем значение счетчика
|
В целом - такой подход неверен. Правильнее сначала считать значение таймера в промежуточную переменную, а потом её обрабатывать. В противном случае ухудшается точность, по понятным причинам. И чем выше частота таймера, тем больше.
Таймер 88 меги позволяет захватывать на лету (здесь описано), считать от и до. Почитайте внимательно даташит (раздел таймера). Он очень внятный и простой. Намного удобнее будет работать.
Рекомендую константы (определяющие интервалы) вынести в отдельный хидер. Для простоты инициализации и наглядности можно пользоваться такой записью:
TCNT0 = (uint8_t) - WAIT_STRT // где WAIT_STRT например 15. Таким образом вы задаёте интервал таймера до переполнения 15 тактов, что очень удобно. Если у вас ещё будут константы определяющие длительность такта процессора (частоту), то можно все задержки привести к реальным цифрам и записывать их в формулах. Я обычно так и делаю. Таким образом переход на другой кварц у меня приводит только к изменению одной константы - частоты процессора.
|
|
|
|
15.07.2011, 01:04
|
|
Вид на жительство
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
|
Re: Помогите разобраться с таймером в Atmega8
Такс ... ну, давайте нчнем с начала - с алгоритма ![Улыбка](images/smilies/icon_smile.gif)
Опишите, как Вы видите решение задачи. Не используя куски кода - на простом человеческом.
|
|
|
|
15.07.2011, 15:35
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Помогите разобраться с таймером в Atmega8
Сообщение от heady69
|
На МК проверте fuses, может от внутр. генератора работает.
|
так у меня на внутренний генератор и настроена работа МК. Частота 8мегагерц так на внутренний ген. работать будет? Много декодеров самопальных видел, большинство работают на внутренний ген.
|
|
|
|
15.07.2011, 15:38
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Помогите пожалуйста разобраться :(
Сообщение от SasaVitebsk
|
Работа компилятора должна соответствовать принятому стандарту. Инициализация - чётко расписана. А именно: если переменная глобальная, то она буде проинициализирована. Ели не указано инициирующее значение при объявлении, то эта переменная будет инициализирована 0. Кроме того будут инициализированы временные переменные объявленные как static.
|
Вот я так и представлял работу компилятора, и честно был удивлен тем что компиль может не присвоить ей значения...
|
|
|
|
15.07.2011, 15:51
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Помогите разобраться с таймером в Atmega8
Сообщение от AndryG
|
Такс ... ну, давайте нчнем с начала - с алгоритма ![Улыбка](images/smilies/icon_smile.gif)
Опишите, как Вы видите решение задачи. Не используя куски кода - на простом человеческом.
|
Здравствуйте! Давайте
Алгоритм вижу такой.
Настраиваем прерывание на спад.
При срабатывании прерывания запускаем таймер.
При следующем останавливаем и считываем, ставим флаг если попали в интервал, и запускаем снова таймер...
дальше читаем и если попали в интервал 1200мкс ставим еденицу, если попали в интервал 600мкс. ставим ноль если не попали ни в один из этих интервалов останавливаем таймер сбрасываем таймер и обнуляем все флаги и переменные.
Повторяю, пробовал 100 тыщ мильенов раз разные способы, нихрена не работает код.....
потом начал уже пробовать сам стартовый импульс ловить для индикации использовал поджигание светодиода я знаю отчетливо что старт бит сони равен 2400мкс. настроил и таймер правильно и тактовую правильно, нифига не работает, я думал что с ума сойду....
так когда старт бит ловил светодиод поджигался и от сони пульта и от других пультов, делаю уже интервал, не фиксируется никакой пульт..
Что мне нужно (самое минимальное!) Это кусок кода который будет фиксировать стартовое условие и игнорировать остальные импульсы, у меня просто такое предчувствие что прерывание не справляется с обработкой данных....
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:38.
|
|