От @whilemay
всем привет, есть проблемка..
Вот не рабочая часть кода:((atmega328p) светодиод светит вечно без нажатия, хз в чем проблема)
.equ PORTD, 0x0A
.equ DDRD, 0x0B
.equ LEDPIN5, 5
.equ BUTTON, 2
.equ PIND, 0x09
.section .text
.globl _start
_start:
ldi r16,0xFF
out DDRD,r16
sbi PORTD, BUTTON
ldi r16, 0x00
loop:
sbic PIND, BUTTON
rjmp off
sbi PORTD,LEDPIN5
rjmp on
on:
sbis PIND,BUTTON
rjmp loop
rjmp off
off:
cbi PORTD,LEDPIN5
rjmp loop
.equ PORTD, 0x0A
.equ DDRD, 0x0B
.equ LEDPIN5, 5
.equ BUTTON, 2
.equ PIND, 0x09
.section .text
.globl _start
_start:
ldi r16,0xFF
out DDRD,r16 ; Устанавливаешь все биты на выход. Неправильно
sbi PORTD, BUTTON ; Зачем трогаешь кнопку?
ldi r16, 0x00 ; Это зачем?
loop:
sbic PIND, BUTTON
rjmp off
sbi PORTD,LEDPIN5
rjmp on ; Нет, тебе надо прыгать на ещё одну проверку состояния кнопки, если хочешь чтобы диод горела ПОКА нажата кнопка
; rjmp loop ; Вот так, например
on: ; Убирай
sbis PIND,BUTTON ; Убирай, бред
rjmp loop ; Убирай
rjmp off ; Убирай
off:
cbi PORTD,LEDPIN5
rjmp loop
Поясню про установку DDR и PORT:
В DDR тебе нужно установить на пин своего порта его тип работы (принимает\выводит), в PORT уже устанавливаешь, если надо. Или читаешь оттуда.
Бит кнопки ты трогаешь только на DDRx - чтобы установить её в 0 (но она, скорее всего, уже в 0). Больше туда НИЧЕГО не надо писать (PORTx).
Бит диода уже ставишь в 1 (DDRx), и далее по алгоритму в 0 (откл.), 1 (вкл.).
Если работает наоборот (горит пока кнопка отжата, а не пока нажата) - инвертируешь значения, или настраиваешь порты (читай про pull-up, pull-down и т.д.).
Если ничего не забыл. Давно на AVR не писал, но там разбираться делов на 5 минут, крайне простая архитектура программирования.