Прошу прощения, можно за комментировать

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Прошу прощения, можно за комментировать

Сообщение avreal »

testerplus писал(а):Кстати, работая со scenix'ами и pic'ами избегал lcall'ов и прочих макросов. Неаккуратно поставленный sb/snb (или btfss/btfsc) мог привести к редким неуловимым сбоям)
Агга!!! © Двое из ларца из мульткика.
С пиками я работал очень мало и очень-очень давно, но это помню :-)
Но я макросы люблю.
И там макросов хватало всяких, включая внесение битового поля с маской и так далее, хоть бы и двухбайтовая арифметика.
Поэтому skip-ающие команды сами по себе не применялись -- были завёрнуты в макросы, которые специальной переменной времени ассемблирования присваивали адрес этой команды.
А многословные макросы проверяли, не начинаются ли они по следующему адресу и грязно ругались.

Хотя, конечно, если бы кто полез редактировать программу, не глянув комментарий в шапке рядом с включением файла с макросами, то мог бы и что-то не то сделать.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Реклама
Masredis
Родился
Сообщения: 12
Зарегистрирован: Пн май 02, 2011 23:13:32

Re: Прошу прощения, можно за комментировать

Сообщение Masredis »

Код: Выделить всё

;EQU заставляют компилятор записать кое-что в таблицу подстановочных терминов.Equivalent (равно).
.equ portb = 0x05;Записываю в регистр данных порта b = X
.equ ddrb = 0x04; DDRB-Записываю в регистр направления данных порта b = X
.equ pinb = 0x03;Выводы порта b = X

.equ portc = 0x08
.equ ddrc = 0x07
.equ pinc = 0x06

.equ portd = 0x0b
.equ ddrd = 0x0a
.equ pind = 0x09


    SER R16  ;Задаю в регистр все 1 ( еденицы )
	OUT ddrd,R16 ;Например команда "out $1D,r5" запишет число из регистра №5 в служебный регистр номер $1D. Пересылает содержимое общего регистра общего назначения R16 в регистр ввода/вывода ddrd
	LDI R16,0xC7   ;загружает в указанный регистр указанное число – мы указали регистр №16 и число 0xC7  (konf portov)
	OUT ddrb,R16
	LDI R16,0x30
	OUT ddrc,R16


start:
        LDI R16, 0xfe ;(кнопка) (11111110) 0 - кнопка
 	OUT portd, R16 ; Отправить информацию в регистр r16 из порта D
	IN R17,pinc ;Из входа c в регистр r17
	ANDI R17, 0x02  ;действие с информацией, проверяет нажата или нет кнопка, если нажата то перепрыгивает на led
	BREQ led  ; - ?
   
rjmp start

led:

call led0
call w1s ;

call led1
call w1s

call led2
call w1s

call led3
call w1s

call led4
call w1s



led0:

ldi r16, 0b11000110
out portd,r16    
sbi portb, 0   ; Устанавливает 1 бит по адрессу   portb
cbi portb, 0	;Сбрасывает разряд 0 регистра ввода/вывода по адрессу portb
ret             ; Возвращение к месту откуда вызвали

w1s:

	PUSH R16;Поместить регист, точнее его содержимое в стэк( задвигаем r16 в стэк )
	LDI R16,50 ; записываем в R16 число
    V4:
	RCALL w20ms ;Relative Subroutine Call урезанная команда вызова подпрограммы w20ms
	DEC R16 ;Decrement ! Уменьшить содержимое(R16) на 1
	BRNE V4 ;Условный относительный переход, (" сравнение" R16 с нулями ) совершающающий переход если флаг нуля сброшен (числа не равны) называется BRNE (Branch if Not Equal).
	POP R16 ;Pop Register from Stack Извлечь содержимое из стэка регистра R16 взад
	RET
Реклама
Masredis
Родился
Сообщения: 12
Зарегистрирован: Пн май 02, 2011 23:13:32

Re: Прошу прощения, можно за комментировать

Сообщение Masredis »

Код: Выделить всё

ANDI R17, 0x02  ;действие с информацией, проверяет нажата или нет кнопка, если нажата то перепрыгивает на led
   BREQ led  ; - ?
Что тут BREQ то делает ? )

P.S.

Код: Выделить всё

ANDI R17, 0x02 
Почему именно 0x02 ?
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Прошу прощения, можно за комментировать

Сообщение SubDia »

Прошу прощения, а что это вот тут:

Код: Выделить всё

OUT portd, R16 ; Отправить информацию в регистр r16 из порта D
?
Как раз наоборот - в порт из регистра R16.
А что смущает Вас в строках

Код: Выделить всё

IN R17,pinc ;Из входа c в регистр r17
   ANDI R17, 0x02  ;действие с информацией, проверяет нажата или нет кнопка, если нажата то перепрыгивает на led
   BREQ led  ; - ?
Вы обратите внимание на то, как сконфигурирован регистр состояния Порта С. Там у нас висит 0x30 (0b00110000), то есть кнопка может быть как на PORTC.0 - PORTC3, так и на PORTC.6-PORTC.7. А так как командой ANDI мы сравниваем данные с порта С с числом 0x02, то я и предположил, что кнопка подключена именно к PORTC.1. Использование же команды BREQ вполне логично: кнопка нажата = ветвление.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Masredis
Родился
Сообщения: 12
Зарегистрирован: Пн май 02, 2011 23:13:32

Re: Прошу прощения, можно за комментировать

Сообщение Masredis »

Извини эмм.. я не какой то начальник, а простой студент) Так что, если не сложно, не утруждай себя пожалуйста писать мне " Вы ", "Вас" ) а то как то не красиво...я у вас требую помощи, и вы еще мне " вы-каете", тут на оборот должно быть))

Код: Выделить всё

OUT portd, R16 ; Отправить информацию в порт D из регистрa R16
? а какая там информация ?) то что я задал в самом начале ? :) и зачем он её туда отправляет.. как то запутался :( :cry:
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Прошу прощения, можно за комментировать

Сообщение SubDia »

Masredis писал(а):не утруждай себя пожалуйста писать мне " Вы ", "Вас" )
Хорошо, если тебя это смущает, буду на "ты". =) Просто привычка такая.
а какая там информация ?) то что я задал в самом начале ? :) и зачем он её туда отправляет..
Ну как же "какая информация"? Установка уровней порта D. Вот:

Код: Выделить всё

LDI R16, 0xfe
OUT portd, R16
Вначале пересылаем в РОН (регистр общего назначения) R16 число 0b11111110 (0xFE). Где единички - там высокий уровень, логическая единица; где нолики - там логический ноль :). Потом командой LDI выгружаем оное число из регистра R16 в порт.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Masredis
Родился
Сообщения: 12
Зарегистрирован: Пн май 02, 2011 23:13:32

Re: Прошу прощения, можно за комментировать

Сообщение Masredis »

Код: Выделить всё

      ldi r16, 0xc7
                out ddrb, r16
 
                ldi r16, 0x30
                out ddrc, r16
 
                ldi r16, 0xff
                out ddrd, r16

почему при конфигурации портов используются именно такие константы (c7, 30, ff)? Это я понял :) По схеме там будет порты на 0 - вход и на 1 - выход :)

И как можно выделить одно кнопку из всех ?) - тут никак понять не могу :)

Если в начало вспомогательной команды записывается:

Push r21
Push r19
Push r20
То какие команды будут в конце вспомогательной программы?
Я так понимаю
Pop r20
Pop r19
Pop r21 ?
Masredis
Родился
Сообщения: 12
Зарегистрирован: Пн май 02, 2011 23:13:32

Re: Прошу прощения, можно за комментировать

Сообщение Masredis »

Точнее как вообще понять - выделить одну кнопку ?) И как это можно осуществить )

+ если не сложно, как можно написать кнопку перезагрузки ? что бы цифры сбрасывались на дисплее микроконтроллера )
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»