Написал программу в 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
ошибок нет, но беда в том, что когда собрал схему (рис. приложил), то при подаче питания светодиод сразу загорается.
Два дня бился. так и не смог понять, не то в коде ошибка, не то в схеме.
vem566 писал(а):Может вход PD0 к земле подтянуть через сопротивление?
У меня в самом начале вход PD0 совсем никак не задействован, ключ разомкнут, а светодиод горит. Получается что на PB0 подается напряжение сразу, а согласно коду, такого не должно быть. PD0 настроен на вход, резисторы подтягивающие тоже подключил.
Попробую твой вариант, может и правда поможет. Чуть позже отпишусь.
Ну вот, Вы подключили подтягивающие резисторы к питанию и чего хотите? Замечу, к корпусу нет внутренних подтягивающих резисторов. Оставьте программу как есть и подлючите кнопку на корпус - стандартное решение.
a_skr писал(а):Ну вот, Вы подключили подтягивающие резисторы к питанию и чего хотите? Замечу, к корпусу нет внутренних подтягивающих резисторов. Оставьте программу как есть и подлючите кнопку на корпус - стандартное решение.
ldi temp, 0b00000000
out DDRD, temp
ldi temp, 0b11111111
out DDRD, temp
main1:
in temp, PIND
out PORTB, temp
rjmp main1
переписал код, сначала только порты B настроил, прошил МК, порты верно заработали, потом порты D добавил, прошил, тоже заработали, потом добавил команды в цикл, прошил в третий раз и все супер, как надо. Так и не понял в чем причина была или МК не прошивался, хотя раз ...надцать прошиввал) Теперь схема работает отлично, ничего переделывать не пришлось.
Может причина была в том, что я 16-ричную систему использовал в настройке портов, тогда это баг программы.
вот это:
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 - неопределено - неправильно. в таком случае подтягиваете внешними резисторами на корпус, кнопку на питание - будете читать нули, а при нажатой копке прочитаете единицу.