Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2016, 18:31   #1
alexandrasm
Новичок
Джуниор
 
Регистрация: 19.05.2016
Сообщений: 2
По умолчанию Зажигание светодиодов по нажатию кнопки

Есть такое задание: при подаче питания должен загореться красный светодиод. При нажатии кнопки S1 загореться зеленый светодиод, а красный потухнуть, при нажатии на кнопку S2 – загореться красный, зеленый потухнуть и т.д.
Написал вот такую программу, при включении работает неправильно (горит красный, а при нажатии кнопки ничего не происходит). Помогите пожалуйста найти и исправить ошибку
Программа написана для микроконтроллера ATTiny26

.include "tn26def.inc"

.dseg
clok: .byte 1 ; счетчик 1мс для ПП задержки
timer: .byte 2 ; счетчики для делителей частоты в таймере
S1: .byte 1 ; 1->S1 нажата 0-> S1 не нажата
S2: .byte 1 ; 1->S2 нажата 0-> S2 не нажата
Regim: .byte 1 ; горит красный
Regim0: .byte 1 ; номер подрежима 0-Зеленый выкл 1-вкл
Regim1: .byte 1 ; номер подрежима 0-зел- кр+ 1 зел+ кр-

.cseg

; Вектора прерываний
rjmp RESET ; Reset handler
rjmp INT_ALL ; IRQ0 handler
rjmp INT_ALL ; Pin change handler
rjmp INT_ALL ; Timer1 compare match 1A
rjmp INT_ALL ; Timer1 compare match 1B
rjmp INT_ALL ; Timer1 overflow handler
rjmp TIM0 ; Timer0 overflow handler
rjmp INT_ALL ; USI Start handler
rjmp INT_ALL ; USI Overflow handler
rjmp INT_ALL ; EEPROM Ready handler
rjmp INT_ALL ; Analog Comparator handler
rjmp INT_ALL ; ADC Conversion Handler

INT_ALL:
reti

RESET:
; Все настроить
ldi r16,RAMEND ;стек
out SP,r16 ;

ldi r16,0b11100000 ;порты ввода
out DDRA,r16 ;
ldi r16,0b00000000 ;
out DDRB,r16 ;

ldi r16,0b01100000 ;порты вывода
out PORTB,r16 ;
ldi r16,0b00000000 ;
out PORTA,r16 ;


ldi r16,(256-125) ; 8000000/64/125=1000
out TCNT0,r16 ;
ldi r16,0b00000011 ; ck/64
out TCCR0,r16 ;
ldi r16,0b00000010 ;
out TIMSK,r16 ;
sei ;

ldi r16,0
sts Regim,r16

; Главный цикл
CIKL:
; Проверка режима
lds r16,Regim
cpi r16,0
breq CIKL_R0_S
rjmp CIKL_R1_S


; Тут режим 0
CIKL_R0_S:
; Проверка подрежима
lds r16,Regim0
cpi r16,0
breq CIKL_R0_0

; Тут подрежим 0 режима 0
CIKL_R0_0:
sbi PORTA,5
rjmp CIKL_R0_W
; Проверка выдержки времени
lds r16,clok
cpi r16,2
brlo CIKL_R0_TW

CIKL_R0_W:
; Проверка выдержки времени
lds r16,clok
cpi r16,5
brlo CIKL_R0_TW

; Тут время вышло
CIKL_R0_T0:
clr r16
sts clok,r16

lds r16,Regim0
cpi r16,0
breq CIKL_R0_T01
clr r16
sts Regim0,r16
rjmp CIKL_R0_T02
CIKL_R0_T01:
ldi r16,1
sts Regim0,r16
CIKL_R0_T02:
; Тут время невышло
CIKL_R0_TW:

; Проверка кнопки S1
lds r16,S1
cpi r16,0
breq CIKL_R0_SW

; Проверка кнопки S2
lds r16,S2
cpi r16,0
breq CIKL_R0_SW2

; Тут кнопка нажата
CIKL_R0_S0:
ldi r16,1
sts Regim,r16
clr r16
sts Regim0,r16
sts Regim1,r16
sts clok,r16
cbi PORTA,7
; Тут кнопка не нажата

CIKL_R0_SW:

CIKL_R0_SW2:

CIKL_R0_WW:
rjmp CIKL_W

CIKL_R1_S:
; Проверка подрежима
lds r16,Regim1
cpi r16,0
breq CIKL_R1_0
; Тут подрежим 0 режима 1
CIKL_R1_0:
sbi PORTA,7
rjmp CIKL_R1_W



CIKL_R1_W:
; Проверка выдержки времени
lds r16,clok
cpi r16,2
brlo CIKL_R1_TW
; Тут время вышло
CIKL_R1_T0:
clr r16
sts clok,r16

lds r16,Regim1
cpi r16,0
breq CIKL_R1_T01
clr r16
sts Regim1,r16
rjmp CIKL_R1_T02
CIKL_R1_T01:
ldi r16,1
sts Regim1,r16
CIKL_R1_T02:
; Тут время невышло
CIKL_R1_TW:

; Проверка кнопки S1
lds r16,S2
cpi r16,0
breq CIKL_R1_SW
; Тут кнопка нажата
CIKL_R1_S0:
ldi r16,0
sts Regim,r16
clr r16
sts Regim0,r16
sts Regim1,r16
sts clok,r16
cbi PORTA,7
cbi PORTA,5

; Тут кнопка не нажата
CIKL_R1_SW:
CIKL_R1_WW:



rjmp CIKL_W




CIKL_W:
rjmp CIKL






; Прерывание
TIM0:
push r16
in r16,SREG
push r16

ldi r16,(256-125) ; 8000000/64/125=1000
out TCNT0,r16 ;

; 1000 Гц 1мс

; Проверка кнопки S1
clr r16 ;
sbis PINB,5 ; пропуск сл комманды если PB5=1
ldi r16,1 ; то есть кнопка не нажата
sts S1,r16 ; S1=1 если S1 нажата

; Проверка кнопки S2
clr r16 ;
sbis PINB,6 ; пропуск сл комманды если PB6=1
ldi r16,1 ; то есть кнопка не нажата
sts S2,r16 ; S2=1 если S2 нажата


; формирование частоты 10Гц
lds r16,(timer+0) ;
inc r16 ;
sts (timer+0),r16 ;
cpi r16,100 ;
brlo TIM0_W ;
clr r16 ;
sts (timer+0),r16 ;

; 10Гц 100мс

lds r16,clok ; увеличение счетчика на 1
inc r16 ;
sts clok,r16 ;





TIM0_W:
pop r16
out SREG,r16
pop r16
reti
alexandrasm вне форума Ответить с цитированием
Старый 19.05.2016, 19:50   #2
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Покажите скрин работы программы в AVRStudio в режиме запуска.
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 20.05.2016, 16:37   #3
alexandrasm
Новичок
Джуниор
 
Регистрация: 19.05.2016
Сообщений: 2
По умолчанию

alexandrasm вне форума Ответить с цитированием
Старый 20.05.2016, 18:24   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от zvygin1964 Посмотреть сообщение
Покажите скрин работы программы в AVRStudio в режиме запуска.
Ага. Пусть ещё покажет обстановку комнаты и слайды сцен в туалете т.
ТС! Да - блин!
У Вас ЕГЭ, вообще мозги отшибло? Или это реклама так влияет?
Тиньков-банк, квитанция о штрафах приходит раньше, чем совершено правонарушение .
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 20.05.2016, 20:02   #5
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

В задании ничего не сказано про таймер.
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 20.05.2016, 20:33   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
при подаче питания должен загореться красный светодиод. При нажатии кнопки S1 загореться зеленый светодиод, а красный потухнуть, при нажатии на кнопку S2 – загореться красный, зеленый потухнуть и т.д.
Смущает и т.д.
Анекдот: Бются на дороге два мерса. Выскакивает из одного качёк: - Ты чё!, я сейчас тебя застрелю. Второй, осматривая бампер : - И т.д и т.п...... Качёк в непонятках. Что такое и.т.д? Иди ты домой. А что такое и.т.п.? Придёшь домой, Потом мне расскажешь.... .
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зажигание светодиодов от кнопки Faton 11 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 22.06.2012 10:35
FormCloseQuery по нажатию кнопки bulldog5293 Общие вопросы Delphi 3 17.10.2011 15:37
осуществить поиск по нажатию кнопки morindos Общие вопросы C/C++ 13 23.06.2010 02:47
Сортировка по нажатию кнопки Nate-p Microsoft Office Access 2 25.06.2008 08:35
Картинка появляется по нажатию кнопки! MAKEDON Общие вопросы Delphi 3 12.12.2007 22:49