vit007 писал(а):Здрасть
Здрасть. Без комментариев вряд ли кто-то будет пытаться вникнуть в ваш код.
vit007 писал(а):Здрасть
vit007 писал(а):Подскажите, как собрать единицу или ноль с порта (in...?)
Код: Выделить всё
in R16,PINAКод: Выделить всё
set
sbis PINA,0
cltpyzh_man писал(а):Приобретаем или скачиваем
Код: Выделить всё
// чтение порта D
START:
in temp, PinD ; чтение порта В
subi temp,0b00010000 ; вычитаем из ttemp значение 0b00010000 (PD4)
breq dekrement ; если нажата переходим на инкремент
Код: Выделить всё
sbis PIND, PIND4
rjmp dekrement
Gudd-Head писал(а):Не очень понятно, зачем вы разрешаете/запрещаете прерывания, если у вас код всё равно с нулевого адреса начинается.
пока накидал первое что пришло в голову. Потом бы все равно до чего нибудь подобного дошел. Спасибо за подсказку. Защита от дребезга у меня там есть временная задержка. А шпротеус, для оперативной отлажки. Не всегда охота МК программировать после каждого мелкого изменения программы.Rimsky писал(а):
Чтение из порта, точнее с кнопки, следует реализовывать след. образом:Код: Выделить всё
sbis PIND, PIND4
rjmp dekrement
этот код избавит Вас от лишнего гемороя с состоянием остальных пинов МК, и тем самым избавит от ошибок.
Код: Выделить всё
.include "tn2313def.inc"
.def ZERO = R15
.cseg
.org 0
BEGIN:
clr ZERO
ldi r16, 0xFF ; настройка всего порта B на вывод
out DDRB, r16
ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
ldi r16, RAMEND ; Инициализация стека
out SPL, r16
; инициализируем таймер
; Compare Output Mode, Fast PWM Mode
; Clear OC0A on Compare Match, set OC0A at TOP
ldi r16, (1<<COM0A1)|(1<<WGM01)|(1<<WGM00)
out TCCR0A, r16
ldi r16, (1<<CS00) ; clkI/O/(No prescaling)
out TCCR0B, r16
out OCR1AH, ZERO
out OCR1AL, ZERO
PROG:
; прочитать 1-ю ячейку из EEPROM
clr r17
rcall EEPROM_read
; запуск шим со значением из temp_eeprom
;значение для сравнения (те данные из eeprom)
out OCR0A, r16
PROG_LOOP:
sbis PIND, PIND4
rjmp DECREMENT_VALUE
sbis PIND, PIND6
rjmp INCREMENT_VALUE
rjmp PROG_LOOP
DECREMENT_VALUE:
;............... Здесь нужна ПП для предотвращения дребезга
clr r17
rcall EEPROM_read
dec r16
rcall EEPROM_write
rjmp PROG
INCREMENT_VALUE:
;............... Здесь нужна ПП для предотвращения дребезга
clr r17
rcall EEPROM_read
inc r16
rcall EEPROM_write
rjmp PROG
EEPROM_write:
; Wait for completion of previous write
sbic EECR, EEPE
rjmp EEPROM_write
; Set up address (r17) in address register
out EEAR, r17
; Write data (r16) to data register
out EEDR, r16
; Write logical one to EEMPE
sbi EECR, EEMPE
; Start eeprom write by setting EEPE
sbi EECR, EEPE
ret
EEPROM_read:
; Wait for completion of previous write
sbic EECR, EEPE
rjmp EEPROM_read
; Set up address (r17) in address register
out EEAR, r17
; Start eeprom read by writing EERE
sbi EECR, EERE
; Read data from data register
in r16, EEDR
ret
Вам огромный респект и спасибо есть чего покурить. Прога почти работает вот тока почему то только в одну сторону (проверено в железе). и вместо sbis нужен sbic.Rimsky писал(а):Код: Выделить всё
ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
Код: Выделить всё
ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16 Код: Выделить всё
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16 В тех обучалках по которым я учился небыло ни слова про написания типа: ldi r16, ~((1<<PD4)|(1<<PD6)). Смысл этого в общем та понятен кроме ~ можно в двух словах про все это.
и еще вопрос вместо
нельзя просто написать?:
Код:
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
Код: Выделить всё
sbis PIND, PIND4
rjmp DECREMENT_VALUE
sbis PIND, PIND6
rjmp INCREMENT_VALUEКод: Выделить всё
out OCR1AH, ZERO
out OCR1AL, ZEROqmix писал(а):кроме ~ можно в двух словах про все это.
Rimsky писал(а):знак ~ означает логическое отрицание (НЕ)
qmix писал(а):На что подтягивают внутренние резисторы? управление идет низким уровнем, значит логично предположить что подтягиваются к высокому уровню.
Просто в моем понимании нажатая кнопка это подача высокого уровня на вход. Поэтому и подумал что sbic. Соответственно подтягивать нужно к низкому уровню. можно их подтянуть к 0?
Код: Выделить всё
ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16 Код: Выделить всё
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out PortD, r16qmix писал(а):не мог понять вроде обе строчки настраивают портт да и не подтягивалось ничего на железе. может правильно сначала настраиваем порт на вход, но потом ему выводим высокий уровень, и он тогда подтягивается к высокому уровню....
Код: Выделить всё
ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6.
out PORTD, r16
ldi r16, (0<<PD4)|(0<<PD6) ; настройка порта PD4, PD6 на вход.
out DDRD, r16