Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
Достаточно повысить ток через потенциометр. И да - максимальное сопротивление резистор или потенциометра в цепи АЦП - всего 10 кОм. Средств увеличения времени накопления или периода опроса УВХ в старых атмегах нет. В новых есть. Поэтому там и 100кОм сопротивления вообще не проблема.
- Реклама
для приличия надо бы еще хоть немного программно пофильтровать результаты АЦП
ohmycode!
primuss3.com
primuss3.com
- Сообщения: 430
- Зарегистрирован: Вс апр 18, 2021 15:43:55
Интересно, регистр ICR1 имеет двойную буферизацию в режиме Т1 №8 (ШИМ c точной фазой и частотой)?
а в даташите что на это написано?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 430
- Зарегистрирован: Вс апр 18, 2021 15:43:55
Читал Евстифеева. Там как-то неоднозначно написано по этому вопросу.
Похоже проблема с прерыванием ШИМа обусловлена именно тем, что регистр ICR1 не имеет двойной буферизации. Подключил один порт МК к светодиодам и вывел на него данные ADCH, которые записываются в регистр ICR1. Оказалось, что при плавном вращении потенциометра возникает ситуация, когда данные регистра ADCH начинают скакать. Причем с достаточно большой частотой (светодиоды порта начинают быстро мигать). Вот тогда и начинаются прерывания сигнала ШИМ. Видимо, идет беспорядочная и быстрая запись в регистр ICR1. А поскольку ICR1 не имеет двойной буферизации, то запись в этот регистр происходит в случайный момент времени работы таймера Т1 и он начинает сбоить. Думаю, когда счетный регистр приближается к точке ICR1 и в этот момент регистр ICR1 перезаписывается на меньшее число, которое TCNT1 > ICR1, то счетчик начинает считать до самого упора (0xffff), а потом разворачивается и начинает считать обратно пока не достигнет точки ICR1. Соответственно, пока счетчик наматывает ненужные круги, в неинвертированном режиме выход OC1A будет в 0.
Можно было бы сделать программную защиту (например сделать массив и кидать туда данные ADCH, а потом выводить среднее арифметическое) или поменять потенциометр на кнопку. Но я решил разобраться как работает режим Т1 №9? Я предположил, что в этом режиме регистры ICR1 и OCR1A должны были поменяться местами. Таким образом решилась бы проблема с двойной буферизацией регистра задающего период сигнала. Но... что-то этот режим у меня не работает ))) Светодиод просто горит, ни какого ШИМа нет. В чем моя ошибка?
Добавлено after 17 minutes 33 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Можно, кстати, записывать регистр ICR1 по флагу TOV1 - по даташиту он меняется на нижнем пределе счетчика. Наверно, так и сделаю. Но все равно интересно как работает режим №9 счетчика T1?
Можно было бы сделать программную защиту (например сделать массив и кидать туда данные ADCH, а потом выводить среднее арифметическое) или поменять потенциометр на кнопку. Но я решил разобраться как работает режим Т1 №9? Я предположил, что в этом режиме регистры ICR1 и OCR1A должны были поменяться местами. Таким образом решилась бы проблема с двойной буферизацией регистра задающего период сигнала. Но... что-то этот режим у меня не работает ))) Светодиод просто горит, ни какого ШИМа нет. В чем моя ошибка?
Добавлено after 17 minutes 33 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Можно, кстати, записывать регистр ICR1 по флагу TOV1 - по даташиту он меняется на нижнем пределе счетчика. Наверно, так и сделаю. Но все равно интересно как работает режим №9 счетчика T1?
- Реклама
нужно создать еще одно прерывание - по переполнению таймера1.
это прерывание срабатывает, когда счетчик находится в нуле. и в этом прерывании записывать значение ADCH в ICR1.
тогда не будет подобных конфликтов.
то есть, записывать регистр не в обработке АЦП, а в прерывании по переполнению.
это прерывание срабатывает, когда счетчик находится в нуле. и в этом прерывании записывать значение ADCH в ICR1.
тогда не будет подобных конфликтов.
то есть, записывать регистр не в обработке АЦП, а в прерывании по переполнению.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 430
- Зарегистрирован: Вс апр 18, 2021 15:43:55
Starichok51, да, уже понял )) Спасибо!
Добавлено after 1 minute 33 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Добавлено after 1 minute 33 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
При этом в подпрограмме прерывания АЦП нужно блокировать общее разрешение прерываний в регистре SREG?Starichok51 писал(а):нужно создать еще одно прерывание - по переполнению таймера1.
пока я отправлял свой пост, ты успел отправить дополнение к своему посту.
как я понимаю, в режиме №9 "верхушку" задает регистр OCR1A, а для ШИМ тогда остается только один канал В. а по каналу А в этом режиме ШИМ невозможен.
не надо в обработке АЦП ничего блокировать.
просто в обработке АЦП регистр ADCH где-то сохраняешь. а потом в прерывании по переполнению сохраненное значение записываешь в ICR1.
как я понимаю, в режиме №9 "верхушку" задает регистр OCR1A, а для ШИМ тогда остается только один канал В. а по каналу А в этом режиме ШИМ невозможен.
не надо в обработке АЦП ничего блокировать.
просто в обработке АЦП регистр ADCH где-то сохраняешь. а потом в прерывании по переполнению сохраненное значение записываешь в ICR1.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 430
- Зарегистрирован: Вс апр 18, 2021 15:43:55
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
При входе в подпрограмму обработки прерывания глобальный флаг разрешения прерываний снимается автоматом.
Kalisnik, и по второму потенциометру делаешь точно также - значение АЦП сохраняешь, а в прерывании по переполнению оба сохраненных значения записываешь, соответственно, в регистры ICR1 и OCR1A.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 430
- Зарегистрирован: Вс апр 18, 2021 15:43:55
Starichok51, из каких соображений запись регистра OCR1A лучше перенести в подпрограмму прерывания по переполнению таймера?
для синхронности изменения обоих регистров.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 430
- Зарегистрирован: Вс апр 18, 2021 15:43:55
OCR1A вроде автоматом записывается по нижнему пределу или я чего-то не понял?
Добавлено after 2 minutes 47 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Это и является сутью двойной буферизации.
Добавлено after 2 minutes 47 seconds:
Re: Atmega8, ШИМ - низкий уровень на выводе после остановки ШИМ.
Это и является сутью двойной буферизации.
это не записывается, а обновляется из буфера. Update - это обновление.
а тебе нужно записать новое значение в регистр (буфер).
а тебе нужно записать новое значение в регистр (буфер).
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 430
- Зарегистрирован: Вс апр 18, 2021 15:43:55
OCR1A обновляется из буфера по нижнему пределу счетчика. Буфер обновляется непосредственно в момент записи. Зачем мне синхронизировать запись в буфер? Буфер - это же TEMP. Он начинает выполнять свою функцию только в нижнем пределе счетчика. Или я снова чего-то не понимаю?Starichok51 писал(а):а тебе нужно записать новое значение в регистр (буфер).
ну да, но тогда откуда у тебя проблемы в работе ШИМ?
ты сначала сделай, как я предлагаю. когда заработает нормально, тогда будешь экспериментировать с записью в буфер не в прерывании, а при обработке АЦП.
но я не сторонник подобных экспериментов - лучше делать сразу надежно, чтобы не было сюрпризов, как это сейчас у тебя.
ты сначала сделай, как я предлагаю. когда заработает нормально, тогда будешь экспериментировать с записью в буфер не в прерывании, а при обработке АЦП.
но я не сторонник подобных экспериментов - лучше делать сразу надежно, чтобы не было сюрпризов, как это сейчас у тебя.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
дубовость тоже аргумент
ohmycode!
primuss3.com
primuss3.com
- Сообщения: 430
- Зарегистрирован: Вс апр 18, 2021 15:43:55
умник, давай свой код
ohmycode!
primuss3.com
primuss3.com


