BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Сообщение radio-kot »

Даташит засекречен ?
Будете проходить мимо- проходите!
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

radio-kot писал(а):Даташит засекречен ?
Жаль что не засекречен, правда? :)) А то можно было бы купить. У известно кого. :tea:
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Сообщение radio-kot »

edm2007 писал(а): можно было бы купить. У известно кого. :tea:
даташит Семенов Михаил вам бесплатно пришлет, даже на русском есть на некоторые.
Будете проходить мимо- проходите!
Мучитель микросхем
Аватара пользователя
Сообщения: 442
Зарегистрирован: Пт авг 29, 2008 09:22:37

Сообщение dimon-790 »

Разобрался с таймером/счётчиком . Оказывается нельзя напрямую считывать значение из счётчика , вот так var=counter0 а вот так можно var=makeint(th0,tl0). Возможно данное утверждение справедливо только для баскома 51 (в баском авр пока не проверял).
Все мы работаем по методу Робинзона Крузо – ждем пятницу.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Нет, в AVR можно содержимое регистра копировать в переменную.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 442
Зарегистрирован: Пт авг 29, 2008 09:22:37

Сообщение dimon-790 »

Так и в 51-ом можно , я-ж не говорю что нельзя его вообще считать , МОЖНО но только как-то через ж.....
edm2007, а про какие регистры ты говориш про РОН ? если про них то тут помоему у баском51 тоже проблем никаких , а я про регистры таймера/счётчика TH0&TL0 в режиме счётчика . А как в авр , с этим дело обстоит ? кто в курсе просветите если не трудно.
Все мы работаем по методу Робинзона Крузо – ждем пятницу.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Да почему про РОН, про РВВ. Я не в том смысле что в 51 вообще нельзя, я говорю о том что в AVR без склейки через makeint пишется. Неправильно выразился, просто.

Код: Выделить всё

Timercounter = Counter1    

Timercounter = Capture1

Temp1 = Timer1  


Ну и все в этом духе.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Встал на лапы
Сообщения: 84
Зарегистрирован: Пт апр 16, 2010 12:30:03

Сообщение dhouse »

Уважаемые коты! Столкнулся с банальной проблемой - опрос кнопки по прерыванию на Attiny13. Перечитал все, что мог, но работает не так, как ожидалось

Код: Выделить всё

Dim Tmp As Byte   'временая переменная
Config Portb.1 = Input     'Кнопка
Set Portb.1

Config Int0 = Falling
On Int0 Knopka
Enable Interrupts
Enable Int0

Do
'основной цикл
Loop
End    'end program

Knopka:
Portb.2 = 0 ' выключаем светодиод
Wait 1
N_blink = N_blink + 1 'увеличиваем счетчик на 1
  If N_blink > 3 Then  'если счетчик вышел за пределы 3-х, приравнять к 1
     N_blink = 1
  End If
For Tmp = 1 To N_blink                                      'поморгали N_blink раз
   Portb.2 = 1
   Wait 1
   Portb.2 = 0
   Wait 1
Next
Portb.2 = 1
Return
После нажатия на кнопку должен увеличиться счетчик N_blink от 1 до 3 и так по кругу. После чего светодиод должен мигнуть столько же раз. Но светодиод почему-то мигает 4-6 раз. В чем проблема - не пойму, хотя написано об этом много. Подскажите, где же собака порылась?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Флаг внешнего прерывания при выходе из оного сбрасывать все же нужно. Бит 6 регистра GIFR. GIFR = 64.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Встал на лапы
Сообщения: 84
Зарегистрирован: Пт апр 16, 2010 12:30:03

Сообщение dhouse »

Я программированием занимаюсь недавно, и если честно, не очень понял сказанного.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Не смотря на то, что при обработке внешнего прерывания оно запрещается, флаг его срабатывания все равно выставляется в регистре GIFR. Из-за дребезга контактов оно наверняка отметится не один раз. Потому если не очистить флаг перед выходом из прерывания - оно тут же будет выполнено снова, как только выйдет по return. Очистить флаг можно записью в него единицы. У Attiny13 это INTF0. 6 бит регистра GIFR. Потому, так:

Код: Выделить всё

Knopka:
..................
Portb.2 = 1
GIFR = 64
Return
P.S. А еще у Вас пин светодиода не настроен на выход. :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Встал на лапы
Сообщения: 84
Зарегистрирован: Пт апр 16, 2010 12:30:03

Сообщение dhouse »

Спасибо, теперь немного понял. А пин диода на выход я случайно задел, когда удалял лишнее для помещения на сайт.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

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

Код: Выделить всё

knopka:
..................
Portb.2 = 1

While Pind.2 = 0  ' если кнопка удерживается.
Waitms 150
Wend                  ' крутимся здесь

GIFR = 64              ' очищаем флаг прерывания 
Return
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Встал на лапы
Сообщения: 84
Зарегистрирован: Пт апр 16, 2010 12:30:03

Сообщение dhouse »

Еще раз большое спасибо. Уже проверил в железе, все отлично работает. Давно хотел сделать себе светосинхронизатор для второй фотовспышки, но конструкций на МК в инете не нашел. Пришлось скомпилировать из существующих схем, прикрутив МК. Теперь могу выбирать, на какой пых ведущей вспышки (от 1 до 3) должна сработать ведомая.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

edm2007 писал(а):Очистить флаг можно записью в него единицы. У Attiny13 это INTF0. 6 бит регистра GIFR.
Вот тут я что-то не пойму (цитата из даташита):
When an edge or logic change on the INT0 pin triggers an interrupt request, INTF0 becomes set (one). If the I-bit in SREG and the INT0 bit in GICR are set (one), the MCU will jump to the corresponding Interrupt Vector. The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it.
Т.е. там написано следующее: при появлении прерывания на INT0 флаг GIFR.6 устанавливается в единицу. А для его сброса предлагается записать туда опять же единицу. Или опечатка, или что-то не стыкуется.
Даже остановленные часы два раза в сутки показывают правильное время.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Секретный кот писал(а):Т.е. там написано следующее: при появлении прерывания на INT0 флаг GIFR.6 устанавливается в единицу. А для его сброса предлагается записать туда опять же единицу. Или опечатка, или что-то не стыкуется.
Нет, все верно. Именно так, для его сброса необходимо записать туда единицу. :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

В таком случае как проц определит, что означает эта единица – наличие необработанного прерывания или вручную сброшенный флаг? :shock:
Даже остановленные часы два раза в сутки показывают правильное время.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Секретный кот писал(а):В таком случае как проц определит, что означает эта единица – наличие необработанного прерывания или вручную сброшенный флаг? :shock:
Дело в том, что несмотря на один и тот же адрес, данные "туда" и "оттуда" идут разными путями. Типичный пример - UDR в UART - когда в него записываем, содержимое уходит "во внешний мир" по TxD, когда читаем - то, что из него пришло по RxD. А адрес один.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

Jack_A писал(а):Типичный пример - UDR в UART - когда в него записываем, содержимое уходит "во внешний мир" по TxD, когда читаем - то, что из него пришло по RxD. А адрес один.
Однако если вместо считывания UDR мы запишем в него некий байт, мы всё-таки навсегда потеряем принятую информацию, не так ли?..
Даже остановленные часы два раза в сутки показывают правильное время.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6323
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Секретный кот писал(а): Однако если вместо считывания UDR мы запишем в него некий байт, мы всё-таки навсегда потеряем принятую информацию, не так ли?..
Нет. В приемный буфер мы ничего не можем записать, только в передающий, хотя адрес у них один ( приблизительно как на рисунке ) - иначе мы не смогли бы работать в дуплексном режиме.
http://photo.qip.ru/users/gaev/2123653/ ... ull_image/
Ответить

Вернуться в «AVR»