Страница 1 из 1

схема для Atmega8

Добавлено: Ср июл 24, 2013 18:01:51
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


ошибок нет, но беда в том, что когда собрал схему (рис. приложил), то при подаче питания светодиод сразу загорается.
Два дня бился. так и не смог понять, не то в коде ошибка, не то в схеме.

Re: схема для Atmega8

Добавлено: Ср июл 24, 2013 18:40:55
vem566
Может вход PD0 к земле подтянуть через сопротивление?

Re: схема для Atmega8

Добавлено: Ср июл 24, 2013 19:29:41
Palsanich
vem566 писал(а):Может вход PD0 к земле подтянуть через сопротивление?
У меня в самом начале вход PD0 совсем никак не задействован, ключ разомкнут, а светодиод горит. Получается что на PB0 подается напряжение сразу, а согласно коду, такого не должно быть. PD0 настроен на вход, резисторы подтягивающие тоже подключил.
Попробую твой вариант, может и правда поможет. Чуть позже отпишусь.

Re: схема для Atmega8

Добавлено: Ср июл 24, 2013 19:33:37
a_skr
Ну вот, Вы подключили подтягивающие резисторы к питанию и чего хотите? Замечу, к корпусу нет внутренних подтягивающих резисторов. Оставьте программу как есть и подлючите кнопку на корпус - стандартное решение.

Re: схема для Atmega8

Добавлено: Ср июл 24, 2013 20:22:12
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-ричную систему использовал в настройке портов, тогда это баг программы.

Re: схема для Atmega8

Добавлено: Ср июл 24, 2013 20:26:37
Palsanich
vem566 и a_skr спасибо вам, подтолкнули к действиям, метод проб и ошибок как всегда работает)))
Тему можно считать закрытой.

Re: схема для Atmega8

Добавлено: Ср июл 24, 2013 21:41:04
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

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