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

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 пользователей онлайн

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

    • Cкорее всего, при 31,5 В на выходе драйвер не выдаст 300 мА.  Хотя, раз заявлено входное от 100 В, то при 230 В может что-то и получится. Но это уже за заявленными пределами работы.  Можно подключить проволочный резистор 100 Ом и померить напряжение, но лучше использовать как заявлено: в диапазоне 12-20 В.  
    • @MisterAnderson , напряжение на выходе светодиодного драйвера зависит от нагрузки, и определяется оно напряжением на светодиодах, а не самим драйвером. Светодиоды имеют характеристику близкую к стабилитрону, напряжение на них от тока зависит мало. Белые светодиоды имеют это напряжение примерно 3...3,4 В. Четыре последовательно включённых - примерно 12...14 В. На подключение таких "трёхвольтовых" белых светодиодов и расчитан ваш драйвер. Драйвер напряжением не управляет, есть только ограничение по максимальному, больше которого он выдать не может. Драйвер светодиодов стабилизирует ток. Ваш драйвер стабилизирует его на уровне 0,3 А. И выдать больше 20 В при этом не может. Измеренные вами 31,5 В на холостом ходу - это напряжение его внутреннего питания. Под нагрузкой 0,3 А напряжение на его выходе тут же "просядет", выше 20 В не поднимется. Мощность на одном трёхвольтовом 300-миллиамперном светодиоде будет (примерно, для светодиодов точность никогда особо не обеспечивают) 0,3 А * 3,3 В = 1 Вт. Трёхвольтовый белый светодиод на ток 300 мА - это и есть одноваттный светодиод. На четырёх будет 4 ватта. Следующие по напряжению в линейке белых осветительных светодиодов - шестивольтовые. У них в одном корпусе последовательно соединённые два светодиодных кристалла. Четыре таких светодиода, включённых последовательно, ваш драйвер не потянет, потому что им нужно минимум 6*4=24 В, а ваш драйвер может выдать не больше 20. Впрочем, можно бы было поставить вместо четырёх трёхвольтовых четыре шестивольтовых на 150 мА, две группы параллельно по два последовательно, но вряд ли справитесь с переделкой платы под светодиоды. Поэтому этот вариант вам и не предлагали. Проще, дешевле и с наименьшими затратами собственного времени, без переделки драйвера, платы и т.п., с которой вы точно не справитесь, поставить четыре одноваттных трёхвольтовых, на которые ваш драйвер расчитан. Тем более, что купить их - проблем нет. Именно этот оптимальнейший совет вам и дали. Всё вам правильно уже много людей много раз разными словами рассказали. Что вас ещё смущает?
    • Предусилители-корректоры на полевых транзисторах. Радио №9,   №10/2010.  А.Гурский.
    • Тоже самое в подсветках фирменных телеках даже 10 летней давности. Ток можно уменьшить на треть без потери качества легко. Потребитель должен потреблять и всё тут.
    • Естественно после 7 вольт то. Или аккум сам по себе хлам и садит в себя или ибп. Тут вариантов не много.
    • Попробуйте зарядить, а потом погонять ее  в полный цикл несколько раз. Это если акум нормальный а у ТС 100% давно не нормальный.
×
×
  • Создать...