Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Управление аудиопроцессором TDA7449.


Управление аудиопроцессором TDA7449.

Сообщений 31 страница 37 из 37

31

Необходимо понять, что порты AVR это не просто "ножки" процессора, а сложная система состоящая из следующего:
Для каждого порта ввода-вывода в памяти ввода-вывода зарезервировано три ячейки: одна под регистр данных – PORTx, другая под регистр направления данных – DDRx и третья под состояние входов порта – PINx.
Ячейка, хранящая состояние на входах портов, доступна только для чтения, а регистры данных и направления данных имеют двунаправленный доступ.
Кроме того, установка бита выключения подтягивающих резисторов PUD регистра SFIOR отключает функцию подтягивания на всех выводах всех портов.
Настройка выводов
Режим и состояние для каждого вывода определяется значением соответствующих разрядов трех регистров: DDxn, PORTxn и PINxn. Как показано в “Описании регистров портов ввода-вывода” доступ к битам DDxn возможен по адресу DDRx в пространстве ввода-вывода и, соответственно, к битам PORTxn по адресу PORTx, а к битам PINxn по адресу PINx.
Биты DDxn регистра DDRx определяют направленность линии ввода-вывода. Если DDxn = 1, то Pxn конфигурируется на вывод. Если DDxn=0, то Pxn конфигурируется на ввод.
Если PORTxn = 1 при конфигурации линии порта на ввод, то разрешается подключение подтягивающего резистора. Для выключения данного резистора необходимо записать в PORTxn лог. 0 или настроить линию порта на вывод. Во время сброса все линии портов находятся в третьем (высокоимпедансном) состоянии, даже если не работает синхронизация.
Если PORTxn = 1 при конфигурации линии порта на вывод, то состояние выхода будет определяться значением PORTxn.
Поскольку одновременная запись в регистры DDRx и PORTx невозможна, то при переключении между третьим состоянием ({DDxn, PORTxn} = 0b00) и выводом лог. 1 ({DDxn, PORTxn} = 0b11) должно возникнуть промежуточное состояние или с подключенным подтягивающим резистором ({DDxn, PORTxn} = 0b01) или с выводом лог. 0 ({DDxn, PORTxn} = 0b10). Как правило, переход через состояние с подключением подтягивающего резистора эквивалентно состоянию вывода лог.1, если вывод микроконтроллера связан с высокоимпедансным входом. В противном случае, необходимо установить бит PUD регистра SFIOR для выключения всех подтягивающих резисторов на всех портах
Переключение между вводом с подтягивающими резисторами и выводом низкого уровня связано с аналогичной проблемой. Поэтому, пользователь вынужден использовать или третье состояние ({DDxn, PORTxn} = 0b00) или вывод лог. 1 ({DDxn, PORTxn} = 0b11) в качестве промежуточного шага.
(Краткий перевод Маркса) :crazyfun:

Отредактировано sva-don (2018-08-06 09:31:38)

0

32

Andrusha написал(а):

Ну может хватит уже меня запутывать. Я и так уже весь такой запутанный.

На самом деле, Марк сделал компилятор с частичной "защитой от дурака", да, можно пытаться на алиасах всё ставить как пин, но потом неизвестно в какой версии (будущей) он эту поддержку может убрать. Это не офф функционал без поддержки.

0

33

Енто всё понятно из датащей и переписывать по многу раз нет необходимости. Для примере закодим простое условие:
if a>50 then set portb.1 else reset portb.1
И ТО-же самое на ассемблере (только для примера)
if a>50 then !sbi b,1 else !cbi b,1

Первый код работает "непонятнокак" , второй работает уже около года.
Разница???

0

34

Борьба с ветряными мельницами.  :D

0

35

А ты попробуй!!!  :crazyfun:
Как-то раз мне понадобился "медленный" ШИМ с уставкой от 0 до 100 "чего-то" , пусть будут проценты. Управлял я ТЭНом в баке водогрейном. Ну, как всегда, сделал процедуру в входным параметром от 0 до 100 и выходным - счётчик "тиков"  НЕповеришь, я думал, что у меня реле твердотельное глючное с али... заказал новое, поставил... то-же самое  :rofl:
Ну, думаю, чОто нетак в коде... полез, сделал ассемблерные вставки SBI и CBI , как писал выше... и О чудо... работает!  :D

0

36

Спасибо ВСЕМ огромное. Теперь я окончательно все понял (шутка). Сконфигурировал так:

Код:
Config PORTC.X = Input : Set PORTC.X : Plus Alias PINC.X

Все заработало в железе. Протеусом пользуюсь постоянно. Но все знают, какой он глючный. Проглатывает и Config PORTC.X = Input и Config PINC.X. = Input.

0

37

Ну шо... красаУчег!  :cool:

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Управление аудиопроцессором TDA7449.