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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2011, 13:12   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию AVR Atmega 128: сигнализация не срабатывает на ключи

Добрый день!
Я не очень сильна в ассемблере, но такой эффект поразил даже меня.
Написана простренькая программа сигнализации, а сверху предоставлены ключи, которые запускают ту или иную подрограмму. А сигнализация тикает себе в мэйне и на ключи не срабатывает. ноль реакции... Я уже даже начинаю сомневаться, может я ключами неправильно пользуюсь.

Не могли бы посмотреть и проконсультировать?

Код:
.include"C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m128def.inc"
.def tmp=r16


//////////////////////Ключи///////////////////////////
.equ 	door=PD2 ; дверь
.equ 	code=PD3 ;кодовый замок 
.equ 	open=PD4 ;открытие
.equ 	lock=PB2 ;блокировкка замка
.equ 	alarm=PB2;срабатывание сигнализации
.equ 	hl=PD0;


.cseg
.org 0

rjmp RESET

nop
nop
nop
nop
nop
nop
nop

nop
nop
nop

RESET:

ldi tmp, low (RAMEND) ;Определяем начало стека
out	SPL, tmp
clr tmp
out DDRD, tmp ; Конфигурируем линии порта D как входы
out PORTB, tmp ;Устанавливаем на линиях порта B низкий уровень

ser tmp ;Устанавливаем все 11111111(=$ff) в переменную   tmp    
out PORTD, tmp ; Устанавливаем на линиях порта D высокий логический уровень 

out DDRB, tmp //Линии порта В - выходы
out PIND, tmp

ldi tmp,15 // инициализаций сторожевого таймера 
out WDTCR, tmp //- сброс  wdr через 2 секунды и переход на              //прерывание  RESET

clt

main: 
wdr
sbis PIND, code //пропуск следующей команды если на линии code //высокий уровень

rcall OpenLock // Вызыв команды OpenLock (открытие двери)
sbis PIND, open  //пропуск следующей команды если на линии open (PD4)  //высокий уровень

rcall OpenLock //Вызыв команды OpenLock (открытие двери)
sbis PIND, door  //пропуск следующей команды если на линии door (PD4)  //высокий уровень

rcall DoorIsOpen //вызыв подпрограммы DoorIsOpen
clt // очисткам регистров флага
rjmp main //возврат к метке main

/////////////////////////Попрограмма управления замком
OpenLock:

sbi PORTB, lock//ustonavlivaem 1 v registr PB2   - eto visokiy uroven
/////////////////////Visov Zaderzka na 500 ms , 4 


rcall d500ms
rcall d500ms
rcall d500ms
rcall d500ms

cbi  PORTB, lock// Ustanavlivaem niskiy uroven v registr PB2 porta B - nizkiy //uroven

ldi tmp, 10//Zagruzka konstanti 10
dal: rcall d500ms// Pereimwnovt    vizov programmi zaderzki na 500 ms
dec tmp// Umenshaem tmp na 1
brne dal // esli net perepolnenija (Z ne raven 0 )

set
reti
///////////////////////////////////////DoorIsOpen - управляем сиреной и //светодиодом


DoorIsOpen:

brts Nclose /// если в регистре флагов флаг Т установлен, то переход на //метку Nclose
sbi PORTB, hl // ustanavlivaem visokiy uroven na linii  hl, PB0
ldi XL, low (500) // Zagruzaem v registr starshie snachenija
ldi XL, high (500) // Zagruzaem v registr mladshie snachenija




Watch: wdr // sbrasivaem timer
sbi PORTB, alarm // Ustanovka visokogo urovnja na linii alarm PB1

rcall d05ms
cbi PORTB, alarm //Ustanovka Nizkogo urovnja na linii alarm
rcall d05ms

sbiw XL,1 //Vichitanie 1 iz znachenija registrov XH: XL
brne Watch // esli flag Z ne raven 0  - t.e soderzimoe registrov XH: XL ne ravno 0 

rcall d500ms // vivov saderzki na 0,5 sek

rjmp  DoorIsOpen

Nclose: 
sbis PIND, door // Propustit sl comandu, esli door (PD2) Visokiy uroven

rjmp Nclose
reti



//////////Podprogramma zaderzki 0,5 ms

d05ms: wdr
ldi YL, low (497)
ldi YL, high (497)

d05_1: sbiw YL, 1 // Vichitanie edinitsi
brne d05_1  // Esli Z<> 0(rezultat vipolnenija vishitanija ne raven 0)


reti


//////////////////Podprogramma zaderzki na 500 ms


d500ms: ldi XL, low (1000)
		ldi XL, high (1000)

		d500_1: rcall d05ms

		sbiw XL, 1

		brne d500_1

		reti
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 19.05.2011, 13:51   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

А у меня срабатывают.
Как проверяете, в эмуляторе, на железе?
По замечаниям, у вас вроде reti в конце процедур а не прерываний. Криминала в данном случае нет, но лучше заменить на ret.

Добавлено, по мелочам:
1.
стек неправильно настроен:
Код:
ldi	tmp, low (RAMEND)
out	SPL, tmp
ldi	tmp,high(RAMEND)
out	SPH,tmp
2.
процедуры задержки, здесь опечатка:
Код:
d05ms: 
wdr
ldi YL, low (497)
ldi YH, high (497)
d05_1: 
sbiw YL, 1
brne d05_1
ret
И ещё, если вы хотите, чтобы вам отвечали, то поддерживайте диалог. Если вам задают встречные вопросы, то наверное это неспроста. Если вам указывают на какие-то ошибки в программе, то это не означает, что вас поднимают насмех. А то потом начинается - "я тут задала вопрос, а в ответ мне тишина".
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось Ulex; 19.05.2011 в 14:27.
Ulex вне форума Ответить с цитированием
Старый 19.05.2011, 14:57   #3
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Спасибо))
Я проверяю на эмуляторе (потому как железа боюсь как огня, мне пытались подсунуть плату с лампочками, я еле открестилась, мне с эмулятором проще)
Сейчас я перекомпилирую.

А у меня наивный вопрос - я просто боюсь, что я что-то не то делаю: чтобы сработала подпрограмма открытия двери OpenLock мы должны поставить "черный кубик" в 3-ю ячейку порта В (так как PB2), да? Просто в этом случае у меня ничего не происходит....
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 19.05.2011, 15:13   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
А у меня наивный вопрос - я просто боюсь, что я что-то не то делаю: чтобы сработала подпрограмма открытия двери OpenLock мы должны поставить "черный кубик" в 3-ю ячейку порта В (так как PB2), да?
Нет. Порт B настроен на выход. Это реакция сигнализации на взлом либо открытие двери, либо ещё на что-то. На вход работает порт D. Чтобы сработала подпрограмма OpenLock нужно убрать чёрный квадратик на пинах порта D (code или open) PD3, PD4.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 19.05.2011, 15:35   #5
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

А как вы используете команды rcall, reti, rjmp для mega128?
С.М.С вне форума Ответить с цитированием
Старый 19.05.2011, 15:44   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
А как вы используете команды rcall, reti, rjmp для mega128?
А что, там на 128 какие-то особенности?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 19.05.2011, 15:50   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

- УДАЛИТЬ -
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 19.05.2011 в 15:55.
raxp вне форума Ответить с цитированием
Старый 19.05.2011, 15:59   #8
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Из всех отличий нас интересует размер памяти программ. Если объём памяти меньше или равен 8 кбайт-ам, то используется rjmp, rcall и.т.д и занимает 2 байта. Если же объём памяти больше 8 кбайт, то используют команды jmp, call и.т.д которые занимаю 4 байта. К примеру команда rjmp состоит - 4 старшие бита код команды, остальные 12 бит адрес, куда переходим. Вот и получается, что выполняя команду компилятор обращается не к той ячейки памяти, ну а дальше вы сами понимаете.

Да и использовать мегу под такой код неведомая роскошь.

Последний раз редактировалось С.М.С; 19.05.2011 в 16:12.
С.М.С вне форума Ответить с цитированием
Старый 19.05.2011, 16:14   #9
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
Вот и получается, что выполняя команду компилятор обращается не к той ячейки памяти, ну а дальше вы сами понимаете.
Ой ли. А команды то разные, или это разве ничего не значит?

RJMP k - Relative Jump - PC< PC + k + 1
JMP k - Jump- PC< k
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 19.05.2011, 16:27   #10
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Цитата:
Ой ли. А команды то разные, или это разве ничего не значит?

RJMP k - Relative Jump - PC< PC + k + 1
JMP k - Jump- PC< k
Команды разные и это много значит, повторюсь к примеру для команды rjmp адрес 12бит это 4096 адресов, а если метка подпрограммы располагается за этим диапазоном куда перейдёт компилятор? И что будет при прерываниях, сброс может произойдёт и правильно, а все остальные прерывания нет.

Пересмотрел задержку. В принципе в данном случае и rjmp покатит, хотя это извращение.

Последний раз редактировалось С.М.С; 19.05.2011 в 16:37.
С.М.С вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AVR ATmega 128: почему не происходит переход? Blondy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 06.05.2011 01:28
надо программу на Atmega sers88 Помощь студентам 6 26.09.2010 16:28
сигнализация работы от ups alenkov Общие вопросы Delphi 1 16.09.2010 01:26
Atmega AT90CAN128 Требуется программист Simok Фриланс 3 31.03.2010 12:29
Сигнализация в Листе valerij Microsoft Office Excel 3 02.04.2009 02:57