Расскажу про грабли, на которые сегодня наступил, чтоб другие не наступали.
Я пока начинающий, по этому профи это все может быть давно известно, а вот новичкам как я пригодится.
Значит так:
Девайс at90s2313, но думаю справедливо для любого с 16-битным счетчиком.
Завожу я 16-битный каунтер, он начинает тикать. Выгребаю постоянно его значения из TCNT1H, сравниваю, не натикало ли столько сколько мне нужно, если да, переключаю одну из ног в противоположное положение и записываю нули в TCNT1H и TCNT1L, чтоб заново считал....
В симуляторе в AVR Studio все пашет. Заливаю в МК - шиш!
Полдня парился, пока не залез в даташит и не прочитал, что при записи в TCNT1H и TCNT1L сначала нужно обязательно писать в TCNT1H, а при чтении наоборот, первым читать TCNT1L. Причем TCNT1L вообще не пишется, пока не запишешь че-нить в TCNT1H, то есть нельзя в него по отдельности писать. С чтением наверное то-же, не проверял.
Сделал, как написано - воркает!!! А симулятор молчал паразит!
Мораль: не пологаться на 100% на симулятор, и побольше читать даташиты...
eXeC001er
Sep 20 2005, 12:00
это делается не выгребанием значением натиканного а записью в регистр сравнения значения которое вам надо и установкой флага чтобы при сравнении генерировалось прерывание, в обработчике которого и передергивайте ноги.
Но это так не по делу но для информации.
Цитата(eXeC001er @ Sep 20 2005, 12:00)
это делается не выгребанием значением натиканного а записью в регистр сравнения значения которое вам надо и установкой флага чтобы при сравнении генерировалось прерывание, в обработчике которого и передергивайте ноги.
Но это так не по делу но для информации.
Я уже и сам так подумал, спасибо за потдверждение правильности моей мысли
Я пока начинающий, до прерываний еще не добрался...
prottoss
Sep 20 2005, 20:24
Цитата(eXeC001er @ Sep 20 2005, 20:00)
это делается не выгребанием значением натиканного а записью в регистр сравнения значения которое вам надо и установкой флага чтобы при сравнении генерировалось прерывание, в обработчике которого и передергивайте ноги.
Но это так не по делу но для информации.
Это тоже не по делу, но можно прерывание вообще не писать, если оно нужно только для изменения уровня сигнала на выводе, а переключать уровень на выводе (ОС1А или ОС1В) аппаратно, если TCNT1 перевести в ШИМ режим fast PWM mode. Правда я не знаю точно, поддерживает ли at90s2313 такой режим. По совпадению с OCR1A(или OCR1B, надо смотреть даташит), TCNT1 будет обнулятся, при этом лог. уровень на соответствующем выводе (ОС1А или ОС1В) будет инвертироваться.
Цитата(prottoss @ Sep 20 2005, 20:24)
Это тоже не по делу, но можно прерывание вообще не писать, если оно нужно только для изменения уровня сигнала на выводе, а переключать уровень на выводе (ОС1А или ОС1В) аппаратно, если TCNT1 перевести в ШИМ режим fast PWM mode. Правда я не знаю точно, поддерживает ли at90s2313 такой режим. По совпадению с OCR1A(или OCR1B, надо смотреть даташит), TCNT1 будет обнулятся, при этом лог. уровень на соответствующем выводе (ОС1А или ОС1В) будет инвертироваться.
Да, at90s2313 такое умеет, просто это я для начала вывел на дрыганье ногой, для наглядности, вообще то мне значения счетчика нужны в программе.