Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/42: Рейтинг темы: голосов - 42, средняя оценка - 4.74
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
1

Проблема с портами ATmega128

26.07.2015, 10:53. Просмотров 7729. Ответов 18
Метки нет (Все метки)

Всем привет! Делаю устройство для прозвонки шлейфов до 40-ка контактов, на обрыв и короткое замыкание. Взял контроллер ATmega128, решил всё промоделировать в протеусе 8, чтоб наверняка. Сначала порты B,C,D,E,F настраиваю на вход с подтяжкой, потом в главном цикле мне нужно их перевести в высокоомное состояние (то есть отключить подтяжку), перевожу а на выходе все равно единица, и это при том выводы подключены к земле через резисторы.
Код
//Настраиваем порты на входы
DDRB &= ~(1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|
(1 << PB4)|(1 << PB5)|(1 << PB6)|(1 << PB7);
DDRC &= ~(1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3)|
(1 << PC4)|(1 << PC5)|(1 << PC6)|(1 << PC7);
DDRD &= ~(1 << PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3)|
(1 << PD4)|(1 << PD5)|(1 << PD6)|(1 << PD7);
DDRE &= ~(1 << PE0)|(1 << PE1)|(1 << PE2)|(1 << PE3)|
(1 << PE4)|(1 << PE5)|(1 << PE6)|(1 << PE7);
DDRF &= ~(1 << PF0)|(1 << PF1)|(1 << PF2)|(1 << PF3)|
(1 << PF4)|(1 << PF5)|(1 << PF6)|(1 << PF7);
Код
//Все выводы подтянуты
void PortPullUp (void)
{
PORTB |=(1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|
(1 << PB4)|(1 << PB5)|(1 << PB6)|(1 << PB7);
PORTC |=(1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3)|
(1 << PC4)|(1 << PC5)|(1 << PC6)|(1 << PC7);
PORTD |=(1 << PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3)|
(1 << PD4)|(1 << PD5)|(1 << PD6)|(1 << PD7);
PORTE |=(1 << PE0)|(1 << PE1)|(1 << PE2)|(1 << PE3)|
(1 << PE4)|(1 << PE5)|(1 << PE6)|(1 << PE7);
PORTF |=(1 << PF0)|(1 << PF1)|(1 << PF2)|(1 << PF3)|
(1 << PF4)|(1 << PF5)|(1 << PF6)|(1 << PF7);
}
Код
//Все в высокоомном состояние
void PortHiZ (void)
{
PORTB &= ~(1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|
(1 << PB4)|(1 << PB5)|(1 << PB6)|(1 << PB7);
PORTC &= ~(1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3)|
(1 << PC4)|(1 << PC5)|(1 << PC6)|(1 << PC7);
PORTD &= ~(1 << PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3)|
(1 << PD4)|(1 << PD5)|(1 << PD6)|(1 << PD7);
PORTE &= ~(1 << PE0)|(1 << PE1)|(1 << PE2)|(1 << PE3)|
(1 << PE4)|(1 << PE5)|(1 << PE6)|(1 << PE7);
PORTF &= ~(1 << PF0)|(1 << PF1)|(1 << PF2)|(1 << PF3)|
(1 << PF4)|(1 << PF5)|(1 << PF6)|(1 << PF7);
}
Где тут ошибка что то не пойму, или это заскоки протеуса?
Подскажите, спасибо!

[148.4 Кб]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2015, 10:53
Ответы с готовыми решениями:

Проблема с UART на Atmega128
Всем доброго времение суток, надеюсь поможете разобраться с проблемой. Предистория: устройство на...

Проблема с прошивкой Atmega128
Здравствуйте. Проблема возникла следующая. Имеется плата для управления игровым автоматом....

Проблема с I2C (ATMEGA128 + DS50PCI401)
Доброго всем дня ! Вот такая проблемка нарисовалась: Имеется atmega128 и усилитель DS50PCI401...

Проблема с третьим таймером-счетчиком на Atmega128
Всем привет. Друзья нужна ваша помощь. Работаю с: Atmega128 в CodeVision AVR (2.04.4a). Запустил...

Проблема с портами ВВ на AVR
Добрый день. Возникла проблема при работе с портами ввода-вывода на модуле AVR Pinboard II. Написал...

18
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
26.07.2015, 12:07 2
Не знаю протеус , но в Вашем случае , уж если все порты в третье состояние , то PUD в SFIOR самое милое дело ибо соблюдается условие DDRx==0 PORTx==1 , осталось PUD установить в 1
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
26.07.2015, 12:41 3
Да, так я то же пытался.
Код
 SFIOR |= (1 << PUD);
Не чего не изменилось, всё таки наверно это протеус.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.07.2015, 23:30 4
На хрена такие конструкции?
Если весь порт, то и пишите в него:
PORTx = 0;
PORTx = 0xFF;

Если часть пинов заняты, а другую часть сбросить или выставить, то соответствующие маски:
Код
#elif (TYPE_KEYS==MATRIX)
//========================================================================
#define COL_DDR            DDRC
#define ROW_DDR            DDRC

#define COL_PIN            PINC
#define ROW_PIN            PINC
//------------------------------------------------------------------------
#define COL_MASK           (1<<COL_1)+(1<<COL_2)+(1<<COL_3)+(1<<COL_4)
#define ROW_MASK           (1<<ROW_1)+(1<<ROW_2)+(1<<ROW_3)+(1<<ROW_4)
//------------------------------------------------------------------------

COL_DDR = COL_MASK;
Пиление одной строки на несколько для более удобного чтения, пример:
Код
//========================================================================
#define MAKE_MENU(Name, Parent, Child, Next, Prev, EnterFunc, MenuFunc, Text) \
extern menu_item __flash Parent;                                              \
extern menu_item __flash Child;                                               \
extern menu_item __flash Next;                                                \
extern menu_item __flash Prev;                                                \
menu_item __flash Name =                                               \
{                                                                             \
(menu_item*)      &Parent,                                              \
(menu_item*)      &Child,                                               \
(menu_item*)      &Next,                                                \
(menu_item*)      &Prev,                                                \
EnterFunc,                                           \
MenuFunc,                                            \
{Text},                                               \
}
//========================================================================
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
27.07.2015, 15:10 5
Цитата Сообщение от dymyurk1978
На хрена такие конструкции?
Если весь порт, то и пишите в него:
PORTx = 0;
PORTx = 0xFF;
Да это понятно так в итоге и сделал, просто проще экспериментировать было когда ошибку искал.
Но проблему это не решает.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
27.07.2015, 17:53 6
Цитата Сообщение от ORV
Но проблему это не решает.
Хорошо, проблема в протеусе или на железе? Сделайте тестовые программы, заливайте и проверяйте. А то взяли моду, в симуляторе что-то не выходит - проблема вселенского масштаба. Симуляторы - программные продукты. И они зачастую не симулируют 100% все нюансы. Взять ту же AVR-Studyo. Казалось бы програмный продукт самого производителя МК. А некоторые нюансы в симуляторе студии не просимулируешь. Посему, изучайте архитектуру МК AVR тщательно, чтобы от зубов отскакивало. Чтобы вы четко знали, что в железе так-то и так-то работать будет. И неважно, что покажет симулятор.
Я не использую Протеус. Вообще. Попробовал как-то и плюнул на эту галиматью. Основные моменты прогоняю в студии. Потом проверяю уже на железе. Если требуется, с осциллографом. И поверьте, такая методика полностью себя оправдывает. На выходе - обкатанные, работоспособные устройства.
0
kytikot
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
27.07.2015, 18:28 7
А с чего бы это настройка порта на вход-выход делается выводом в порт PORT?
А не в регистр DDR ?
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
28.07.2015, 08:11 8
Цитата Сообщение от dymyurk1978
Цитата Сообщение от ORV
Но проблему это не решает.
Хорошо, проблема в протеусе или на железе? Сделайте тестовые программы, заливайте и проверяйте. А то взяли моду, в симуляторе что-то не выходит - проблема вселенского масштаба. Симуляторы - программные продукты. И они зачастую не симулируют 100% все нюансы. Взять ту же AVR-Studyo. Казалось бы програмный продукт самого производителя МК. А некоторые нюансы в симуляторе студии не просимулируешь. Посему, изучайте архитектуру МК AVR тщательно, чтобы от зубов отскакивало. Чтобы вы четко знали, что в железе так-то и так-то работать будет. И неважно, что покажет симулятор.
Я не использую Протеус. Вообще. Попробовал как-то и плюнул на эту галиматью. Основные моменты прогоняю в студии. Потом проверяю уже на железе. Если требуется, с осциллографом. И поверьте, такая методика полностью себя оправдывает. На выходе - обкатанные, работоспособные устройства.

Мне нужно было быстро продемонстрировать модель. И интересно почему так вдруг кто сталкивался.

Цитата Сообщение от kytikot
А с чего бы это настройка порта на вход-выход делается выводом в порт PORT?
А не в регистр DDR ?
Ну всё правильно в DDR и настроено.
0
kytikot
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
28.07.2015, 11:02 9
.... несущественно...
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
28.07.2015, 13:04 10
Он не меняет режим ввод-вывод , он переводит порты в высокоомное состояние. В этом режиме DDR - вход.

ORV - у меня есть 128 на макетке - могу посмотреть в железе
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
29.07.2015, 15:58 11
Цитата Сообщение от YTYOUT
Он не меняет режим ввод-вывод , он переводит порты в высокоомное состояние. В этом режиме DDR - вход.

ORV - у меня есть 128 на макетке - могу посмотреть в железе
Буду очень благодарен!

P.S
Наконец то дошли руки промакетировать правда на атмеги16. Не совсем то что я ожидал напряжение около 1 вольта, но это если выводы в воздухе весят.
Интересно что будет с атмегай128, что бы наверняка знать что всё получится.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
30.07.2015, 02:16 12
Прочитал. Думаю завтра к 12 по МСК сообщу результат
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
30.07.2015, 14:23 13
Цитата Сообщение от ORV
Код:
//Настраиваем порты на входы
DDRB &= ~(1 << PB0)|(1 << PB1)|(1 << PB2)|(1 << PB3)|
(1 << PB4)|(1 << PB5)|(1 << PB6)|(1 << PB7);
DDRC &= ~(1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3)|
(1 << PC4)|(1 << PC5)|(1 << PC6)|(1 << PC7);
DDRD &= ~(1 << PD0)|(1 << PD1)|(1 << PD2)|(1 << PD3)|
(1 << PD4)|(1 << PD5)|(1 << PD6)|(1 << PD7);
DDRE &= ~(1 << PE0)|(1 << PE1)|(1 << PE2)|(1 << PE3)|
(1 << PE4)|(1 << PE5)|(1 << PE6)|(1 << PE7);
DDRF &= ~(1 << PF0)|(1 << PF1)|(1 << PF2)|(1 << PF3)|
(1 << PF4)|(1 << PF5)|(1 << PF6)|(1 << PF7);

Где тут ошибка что то не пойму, или это заскоки протеуса?
Подскажите, спасибо!У вас тут опечатки нет? Если у вас в программе именно так, как вы показали, то непонятно как у вас порты на вход настраиваются.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
30.07.2015, 15:27 14
Цитата Сообщение от Bytt
...
Я ему уже писал об этом, он говорит, что убирал эту странную конструкцию и выводил как положено, DDRx = 0; И все то же самое.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
30.07.2015, 15:45 15
В-общем твердый нуль. И через PUD и через PORTx=0 . Смотрел тестером и осцилом
0
OtVyk
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 10
30.07.2015, 20:18 16
Не доверяйте протеусу... очень глючная софтина. Обзаведитесь макетной платой и тестируйте всё на ней. На железе [на самой атмеге] проверьте, чтобы фьюз совместимости с атмегой 103 был снят !!! (по умолчанию он установлен, что влечет за собой некоторые подводные камни связанные с портами Е и F). Попробуйте проверить работу каждого из портов по отдельности: Берёте порт А и соединяете 0-й пин с 4-м, 1-й с 5 и т.д. А далее просто подайте сигналы отдельно и посмотрите, реагирует ли контроллер на них. Например посылаете на вывод 0 единицу, проверяете, что по мнению контроллера находится на пине 4 спустя ~ 1 мкс.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
30.07.2015, 20:25 17
Да это повальное увлечение протеусом. Паять не надо, лепота...
0
ORV
0 / 0 / 0
Регистрация: 08.01.2012
Сообщений: 151
30.07.2015, 22:48 18
Цитата Сообщение от YTYOUT
В-общем твердый нуль. И через PUD и через PORTx=0 . Смотрел тестером и осцилом
Спасибо, теперь я спокоен.
Ну вот выявлен ещё один глюк протеса, на первый взгляд в простой задачи.
Тему можно считать закрытой, всем спасибо.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
30.07.2015, 23:17 19
Ваша ошибка в данной ситуации - полагаться на сторонний симулятор МК AVR. Если уж продукт ATMEL порой не все симулирует, что тогда говорить о протуесе? И вывод вы должны вынести из этой ситуации - изучать архитектуру МК. Зная архитектуру, вы будете четко знать и понимать чего ожидать от МК. И будете исходить из этой информации, а не информации на основе глюка симулятора.
Купите книгу, Вольфганг Трамперт "AVR-RISC микроконтроллеры фирмы ATMEL", очень хорошая книга, толково расписано. Практически вся информация актуальна и пой сей день. Единственное, что, упоминаются снятые с производства МК. Но, система команд, основа архитектуры - все актуально. Других авторов книги нужно внимательно просматривать, насколько толково написано.
0
30.07.2015, 23:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2015, 23:17

ATMega16 проблема с портами ввода PINx
Хочу подключить к МК несколько кнопок, к порту &quot;D&quot;, и чтобы при нажатии на них светились разные...

ATmega128 PORTF
Не получается настроить PORTF на выход. фуз джитага скинул, режим совместимости с м103 убрал,...

Прошить ATMEGA128
Народ, ни разу не работал со 128 и 256 мегами. Все МК с чем приходилось работать, прошивал STK-500...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru