схема для Atmega8

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 4
Зарегистрирован: Ср июл 24, 2013 16:52:10

Сообщение Palsanich »

Написал программу в AvrStudio. Программа очень простая, когда на порт PD0 подается сигнал, то он автоматически поключает ножку PB0 и в теории светодиод должен загораться, иначе тухнуть.
Ниже код:

.nolist
.include "m8def.inc"
.list

.def temp=R16

.cseg
.org 0

ldi temp, 0x00
out DDRD, temp

ldi temp, 0xFF
out DDRB, temp
out PORTD, temp
out PORTB, temp

main1:
in temp, PIND
out PORTB, temp
rjmp main1


ошибок нет, но беда в том, что когда собрал схему (рис. приложил), то при подаче питания светодиод сразу загорается.
Два дня бился. так и не смог понять, не то в коде ошибка, не то в схеме.
Вложения
atmega8.jpg
схема подключения
(87.51 КБ) 411 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4751
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Сообщение vem566 »

Может вход PD0 к земле подтянуть через сопротивление?
Реклама
Родился
Сообщения: 4
Зарегистрирован: Ср июл 24, 2013 16:52:10

Сообщение Palsanich »

vem566 писал(а):Может вход PD0 к земле подтянуть через сопротивление?
У меня в самом начале вход PD0 совсем никак не задействован, ключ разомкнут, а светодиод горит. Получается что на PB0 подается напряжение сразу, а согласно коду, такого не должно быть. PD0 настроен на вход, резисторы подтягивающие тоже подключил.
Попробую твой вариант, может и правда поможет. Чуть позже отпишусь.
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

Ну вот, Вы подключили подтягивающие резисторы к питанию и чего хотите? Замечу, к корпусу нет внутренних подтягивающих резисторов. Оставьте программу как есть и подлючите кнопку на корпус - стандартное решение.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 4
Зарегистрирован: Ср июл 24, 2013 16:52:10

Сообщение Palsanich »

a_skr писал(а):Ну вот, Вы подключили подтягивающие резисторы к питанию и чего хотите? Замечу, к корпусу нет внутренних подтягивающих резисторов. Оставьте программу как есть и подлючите кнопку на корпус - стандартное решение.
.nolist
.include "m8def.inc"
.list

.def temp=R16

.cseg
.org 0

//ldi temp, 0x00
//out DDRD, temp
//out PORTB, temp

//ldi temp, 0xFF
//out DDRB, temp
//out PORTD, temp
ldi temp, 0b11111111
out DDRB, temp
ldi temp, 0b00001111
out PORTB, temp

ldi temp, 0b00000000
out DDRD, temp
ldi temp, 0b11111111
out DDRD, temp


main1:
in temp, PIND
out PORTB, temp
rjmp main1


переписал код, сначала только порты B настроил, прошил МК, порты верно заработали, потом порты D добавил, прошил, тоже заработали, потом добавил команды в цикл, прошил в третий раз и все супер, как надо. Так и не понял в чем причина была или МК не прошивался, хотя раз ...надцать прошиввал) Теперь схема работает отлично, ничего переделывать не пришлось.
Может причина была в том, что я 16-ричную систему использовал в настройке портов, тогда это баг программы.
Реклама
Родился
Сообщения: 4
Зарегистрирован: Ср июл 24, 2013 16:52:10

Сообщение Palsanich »

vem566 и a_skr спасибо вам, подтолкнули к действиям, метод проб и ошибок как всегда работает)))
Тему можно считать закрытой.
Реклама
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

0xFF и 0b11111111 - одно и тоже.

вот это:
ldi temp, 0x00
out DDRD, temp
out PORTB, temp - ни на что не влияет, т.к. по включению там нули - лишнее.

ldi temp, 0b11111111
out DDRB, temp - направление всех пинов порта B на выход, правильно.

ldi temp, 0b00001111
out PORTB, temp - ни на что не влияет, т.к. меняется в основном цикле - лишнее.

ldi temp, 0b00000000
out DDRD, temp - ни на что не влияет, т.к. по включению там нули - лишнее.

ldi temp, 0b11111111
out DDRD, temp - зачем настраивать на выход? у Вас там кнопка - не правильно, убрать.

если подтянуть порт D к питанию:
ldi temp, 0b11111111
out PORTD, temp - то будете читать оттуда единицы. если при этом кнопка будет замыкать пин на землю - прочитаете в нем ноль - правильное решение.
если не будете подтягивать - на входе будет Z - неопределено - неправильно. в таком случае подтягиваете внешними резисторами на корпус, кнопку на питание - будете читать нули, а при нажатой копке прочитаете единицу.

main1:
in temp, PIND
out PORTB, temp
rjmp main1

это хоть все понятно?
Ответить

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