Перейти к содержанию

Atmega16. Проблема С Портами


X-shadow

Рекомендуемые сообщения

Всем здравствуйте. Ничего не пойму. МК atmega16, кварц 7,37 мегагерца.

Вот такой код:

void main(void)

{

PORTA=0x00;

DDRA=0xFF;

PORTC=0x00;

DDRC=0x00;

while (1)

{

// Place your code here

PORTA.0 = PINC.0;

};

}

Поидее при подаче +5 вольт на ножку PC0 +5 вольт должно появиться на PA0. Однако такая странность.

Во первых на ноге 0 а порта А уже +5 вольт хотя еще ничего не подавал. Потом при подаче +5 вольт через резистор 470 ом реакции не происходит. Как было +5 так и осталось. Однако если через тот же резистор подключить к земле то напряжение на ноге 0 порта А уходит. Однако при отключении ноги порта С от 0 напряжение на порте А идет как то странно. Сначала оно секунд 7 равно 0. Потом медленно начинает расти где-то до 3 вольт. Помогает только перезагрузка МК. Несколько раз перепрограмировал. Ситуация такаяже. Из фьюзов включен только SUT0. С чем это может быть связано??

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Все правильно, висящие в воздухе входы логики имеют положительный потенциал, поэтому все неиспользуемые входы логических микросхем рекомендуется сажать на землю. В мелкой логике - напрямую, в контроллерах - через сопротивление порядка 1-5 кОм (чтобы контроллер не сгорел в случае ошибочного включения этого входа в режим выхода). В данном случае нужно посадить пин 0 порта А на землю через 10 кОм и подавать на него +5 вольт через 1 кОм (или наоборот - через 10 кОм на питание, а через 1 кОм подовать землю, или регистрами подключить внутренние подтягивающие резисторы и не использовать внешние 10 кОм). Мерять напряжение на висящем в воздухе входе совершенно бессмысленно.

И непонятно - "... при отключении ноги порта С от 0 ..." - ты ВЫХОД сажаешь на землю? Или это описка и порт не С, а А?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

На самом деле код выглядит так:

void Init()

{

PORTA=0x00;

DDRA=0xFF;

PORTB=0x00;

DDRB=0x00;

PORTC=0x00;

DDRC=0x00;

PORTD=0x00;

DDRD=0xFF;

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

TCCR1A=0xA3;

TCCR1B=0x09;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

MCUCR=0x00;

MCUCSR=0x00;

TIMSK=0x00;

ACSR=0x80;

SFIOR=0x00;

}

int PWM;

void main(void)

{

// Declare your local variables here

Init();

while (1)

{

// Place your code here

if(PINC.7)

{

PWM = 815;

PORTD.2 = 0;

PORTD.3 = 0;

OCR1AH = (char)(PWM>>8);

OCR1AL = (char)PWM;

OCR1BH = (char)(PWM>>8);

OCR1BL = (char)PWM;

} else

if(PINC.5)

{

PWM = 815;

PORTD.2 = 1;

PORTD.3 = 1;

OCR1AH = (char)(PWM>>8);

OCR1AL = (char)PWM;

OCR1BH = (char)(PWM>>8);

OCR1BL = (char)PWM;

} else

if(PINC.6)

{

PWM = 407;

PORTD.2 = 1;

PORTD.3 = 0;

OCR1AH = (char)(PWM>>8);

OCR1AL = (char)PWM;

OCR1BH = (char)(PWM>>8);

OCR1BL = (char)PWM;

} else

if(PINC.4)

{

PWM = 407;

PORTD.2 = 0;

PORTD.3 = 1;

OCR1AH = (char)(PWM>>8);

OCR1AL = (char)PWM;

OCR1BH = (char)(PWM>>8);

OCR1BL = (char)PWM;

} else

if(PINC.2)

{

PWM = 203;

PORTD.2 = 0;

OCR1AH = (char)(PWM>>8);

OCR1AL = (char)PWM;

OCR1BH = 0;

OCR1BL = 0;

} else

if(PINC.1)

{

PWM = 203;

PORTD.3 = 0;

OCR1BH = (char)(PWM>>8);

OCR1BL = (char)PWM;

OCR1AH = 0;

OCR1AL = 0;

} else

if(PINC.3)

{

PWM = 203;

PORTD.2 = 1;

OCR1AH = (char)(PWM>>8);

OCR1AL = (char)PWM;

OCR1BH = 0;

OCR1BL = 0;

} else

if(PINC.0)

{

PWM = 203;

PORTD.3 = 1;

OCR1BH = (char)(PWM>>8);

OCR1BL = (char)PWM;

OCR1AH = 0;

OCR1AL = 0;

}else {

PWM = 0;

PORTD.2 = 0;

PORTD.3 = 0;

OCR1AH = (char)(PWM>>8);

OCR1AL = (char)PWM;

OCR1BH = (char)(PWM>>8);

OCR1BL = (char)PWM;

}

};

}

Причем странна еще одна вещь. Когда я эмулирую этот код в VMLAB она ругается "SBIS instruction: bit in I/O = X (unknown)" если порт С установлен как вход т.е так как в коде. Проект эмуляции в VMLAB выглядит так:

.MICRO "ATmega16"

.PROGRAM "robo.hex"

.TRACE ; Activate micro trace

.POWER VDD=5 VSS=0 ; Power nodes

.CLOCK 7.37meg ; Micro clock

.STORE 2000m ; Trace (micro+signals) storage time

D1 VDD PD2

D2 VDD PD3

.PLOT V(PD4) V(PD5)

K0 PC7 VDD

K1 PC5 VDD

K2 PC6 VDD

K3 PC4 VDD

K4 PC1 VDD

K5 PC2 VDD

Причем он нормально работает если DDRC = 0xFF. Ничего не понимаю

Кнопка одним выводом соеденина с +5 вольтами а другим через резистор в 470 ом с ногой порта С.

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

Упс... Прошу прощения, не выспавшись вчера был, перепутал биты DDR :(

По идее первый пример должен работать. Схему посмотреть не могу - я с наладонника хожу в инет. Вообще, схемы лучше выкладывать в каких-то общих форматах - gif, pdf и т.п., т.к. программ схематики множество и не факт что все пользуются той же программой, что и ты :)

Что у тебя сидит на порту С? Кнопки? Входы порта С подтянуты к земле внутренними или внешними резисторами? Попробуй в инициализации вместо:

PORTC = 0x00;

DDRC = 0x00;

написать:

DDRC = 0x00;

PORTC = 0xFF;

И выложи схему в pdf или в графике :).

Ссылка на комментарий
Поделиться на другие сайты

Пробовал щас в разных вариациях. Ничего не помгает. Поменял микросхему контроллера - тоже самое. Вот схема кнопки

cxe.JPG

Лучше сорок раз по разу чем ни разу сорок раз..

Ссылка на комментарий
Поделиться на другие сайты

На самом деле все очень просто. Я сталкивался с подобной проблемой. Решил след. образом - все входы сделал входами с поддтяжкой, и через резистор подавал VSS, напряжение падало до логического нуля. Таким образом, в регистре PINA.0 == 1 - кнопка не нажата, PINA.0 == 0 - нажата. на практике не проверял, но в симуляторе работало.

Но чтобы было наоборот - т.е. чтобы на ноге был 0, а при подключении VCC стало 1, у меня не получалось =).

Ссылка на комментарий
Поделиться на другие сайты

эээм, смысл в том чтобы привязать ногу куда-либо, кроме воздуха... есл нажатое состояние 1 то притягиваем ногу к земле и напрямую через кнопку подаем + на нее через кнопку, если нажатое 0 - наоборот, резюком на = а через кнопку на землю ..

«Как сердцу выразить себя? … Мысль изреченная есть ложь!»

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...