реклама на сайте
подробности

 
 
> Подпрограмма обработки энкодера на ассемблере
Игoрь
сообщение Jan 12 2014, 08:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 15-05-13
Пользователь №: 76 836



Если вдруг у кого есть кусок кода с антидребезгом, поделитесь кому не жалко. Лениво тратить время на исследования задержек по антидребезгу
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Navovvol
сообщение Jan 30 2014, 10:52
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 9-09-11
Пользователь №: 67 080



CODE

.def count_VERY_HIGHT = R22
.def count_HIGHT= R21
.def count_LOW = R20 //Перменная счётчик

.def temp = R16
.def NewState= R17 ///Сюда записываем новое состояние
///пинов на которых висит энкодер
.def OldState= R18 //Тут хранится состояние пинов
//предыдущего опроса
.def count_encoder = R23

ENCODER_RAM: .byte 6
; FLASH ======================================================
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЙ /////////////////////////////////////
.CSEG
.org $0000 rjmp RESET ; Переход на обработку сброса
.org $0012 jmp TIM2_COMP ; Переход на обработку при выполнении условия сравнения таймера 2
.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////// иницилизация стека/////////////////////////
RESET: ldi r16,low(RAMend)
out SPL,r16
ldi r16,high(RAMend)
out SPH,r16
//
;ENCODER INIT
CLRB DDRE,3,R16 ;DDRE.3 = 0 датчик зенита на вход
CLRB DDRE,4,R16 ;DDRE.4 = 0 датчик зенита на вход
SETB PORTE,3,R16 ;PORTE.3 = 1 Pull-up
SETB PORTE,4,R16 ;PORTE.4 = 1 Pull-up
//
///////////////Инициализация Прерываний//////////////////////
;.......................................................................
.equ XTAL = 16000000
.equ baudrate =115200 /// в реале скорость 115200. т.к. бит удвоенной скорости=1
.equ bauddivider = XTAL/(8*baudrate)-1
.equ frequncy = 1000
.equ encoder_number = (XTAL/(frequncy))/64

outi TCCR2,0<<WGM00|0<<COM01|0<<COM00|1<<WGM01|0<<CS02|1<<CS01|1<<CS00
outi OCR2, encoder_number

//обработка прерывания таймера 2
TIM2_COMP:
PUSHF
PUSH ZL
PUSH ZH
PUSH R17
PUSH R18
PUSH R19
clr R16
clr R17
clr R18
LDS NewState,ENCODER_RAM
LDS OldState,ENCODER_RAM+1
LDS count_LOW,ENCODER_RAM+2
LDS count_HIGHT,ENCODER_RAM+3
LDS count_VERY_HIGHT,ENCODER_RAM+4
LDS count_encoder,ENCODER_RAM+5
;.............................................................
IN NewState,PINE ;Читаем порт к которому подключен энкодер
CBR NewState,0b11100111

LSR NewState
LSR NewState
LSR NewState

cpi OldState,0;OldState,0
brne Cpi1 //Если нет то проверяем другое условие
cpi NewState,2;NewState,2
brne Cpi11
rcall RightShift
;.............................................................
Cpi11:
cpi NewState,1;NewState,1
brne Cpi12
rcall LeftShift
;.............................................................
Cpi12:
mov OldState,NewState;OldState,NewState //То что было новым состоянием энкодера, стало старым...
rjmp EXIT_ENCODER


;.............................................................
Cpi1:
//2) При прошлом опросе Пин А=1 и Пин В=0 ?
cpi OldState,1;OldState,1
brne Cpi2 //Если нет то проверяем другое условие
cpi NewState,0;NewState,0 //
brne Cpi21
rcall RightShift
;.............................................................
Cpi21:
cpi NewState,3;NewState,3
brne Cpi22
rcall LeftShift
;.............................................................
Cpi22:
mov OldState,NewState;OldState,NewState //То что было новым состоянием энкодера, стало старым...
rjmp EXIT_ENCODER

;.............................................................
Cpi2:
//3 ) При прошлом опросе Пин В=1 и Пин А=0 ?
cpi OldState,2;OldState,2
brne Cpi3 //Если нет то проверяем другое условие
cpi NewState,3;NewState,3
brne Cpi31
rcall RightShift
;.............................................................
Cpi31:
cpi NewState,0;NewState,0
brne Cpi12
rcall LeftShift
;.............................................................
Cpi32:
mov OldState,NewState;OldState,NewState //То что было новым состоянием энкодера, стало старым...
rjmp EXIT_ENCODER

;.............................................................
Cpi3:
///4) При прошлом опросе Оба пина=1 ?
cpi OldState,3;OldState,3
brne Cpi4 //Если нет то выходим из процедуры сканирования
cpi NewState,1;NewState,1
brne Cpi41
rcall RightShift
;.............................................................
Cpi41:
cpi NewState,2;NewState,2
brne Cpi42
rcall LeftShift
;.............................................................
Cpi42:
mov OldState,NewState;OldState,NewState //То что было новым состоянием энкодера, стало старым...
;.............................................................
Cpi4:
rjmp EXIT_ENCODER

;.............................................................
RightShift:

clr count_encoder
STS count_Left,count_encoder
LDS count_encoder,count_Right
cpi count_encoder,4;count,4 //Состояние пинов сменилось 4 раза?
brne exitRS
clr count_encoder;count
STS count_Right,count_encoder
ldi R16,1
ADD count_LOW,R16
clr R16
ADC count_HIGHT,R16
ADC count_VERY_HIGHT,R16
rjmp exitRS2

exitRS:
inc count_encoder;count
STS count_Right,count_encoder
exitRS2:
RET
;.............................................................
LeftShift:

clr count_encoder
STS count_Right,count_encoder
LDS count_encoder,count_Left
cpi count_encoder,4;count,4 //Состояние пинов сменилось 4 раза?
brne exitLS
clr count_encoder;count
STS count_Left,count_encoder
LDI R16,1
SUB count_LOW,R16
clr R16
SBC count_HIGHT,R16
SBC count_VERY_HIGHT,R16

rjmp exitLS2
exitLS:
inc count_encoder;count
STS count_Left,count_encoder
exitLS2:

RET

;.............................................................
/// подпрограммы для энкодера
EXIT_ENCODER:
STS ENCODER_RAM,NewState
STS ENCODER_RAM+1,OldState
STS ENCODER_RAM+2,count_LOW
STS ENCODER_RAM+3,count_HIGHT
STS ENCODER_RAM+4,count_VERY_HIGHT
STS ENCODER_RAM+5,count_encoder
POP R19
POP R18
POP R17 ; Корректный выход из прерывания.
POP ZH
POP ZL
POPF
RETI

Идеальная программа для энкодера на АСМе. Разбирайтесь.
P.S. к сожалению, при копировании накрылась медным тазом табуляция.

Сообщение отредактировал Navovvol - Jan 30 2014, 10:57
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Feb 2 2014, 10:29
Сообщение #3


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Navovvol @ Jan 30 2014, 14:52) *
CODE

.def temp = R16
.def NewState= R17 ///Сюда записываем новое состояние
///пинов на которых висит энкодер
....
.org $0000 rjmp RESET ; Переход на обработку сброса
.org $0012 jmp TIM2_COMP ; Переход на обработку при выполнении условия сравнения таймера 2
.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний

... PUSH ZL
PUSH ZH
PUSH R17
PUSH R18
PUSH R19
clr R16
clr R17
clr R18
LDS NewState,ENCODER_RAM
LDS OldState,ENCODER_RAM+1
...

Идеальная программа...


при указании фиксированного смещения орг - лучше использовать константы из деф файла для конкретного мк.
сохраняете и очищаете регистры, хотя дали им символические имена и потом эти имена и юзаете...
ну и т.д..

до идеала Вам есть куда рости...это хорошо...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Игoрь   Подпрограмма обработки энкодера на ассемблере   Jan 12 2014, 08:02
- - A. Fig Lee   Цитата(Игoрь @ Jan 12 2014, 03:02) Если в...   Jan 12 2014, 17:06
- - Игoрь   да вот начитался теории, даже рисунки кто-то приво...   Jan 12 2014, 18:11
- - rx3apf   Обсуждалось уже, неоднократно. Воспользуйтесь поис...   Jan 12 2014, 18:14
|- - A. Fig Lee   Цитата(rx3apf @ Jan 12 2014, 13:14) Для м...   Jan 12 2014, 19:19
|- - rx3apf   Цитата(A. Fig Lee @ Jan 12 2014, 23:19) П...   Jan 12 2014, 19:45
- - Игoрь   попробую пояснить, чего я хочу- мне нужен не алгор...   Jan 12 2014, 18:34
- - Игoрь   без дребезга при наличии сглаживающих емкостей? Ил...   Jan 12 2014, 19:26
|- - A. Fig Lee   Цитата(Игoрь @ Jan 12 2014, 14:26) без др...   Jan 13 2014, 01:12
- - Abell   Еще когда начинал практически работать с AVR, ввел...   Jan 13 2014, 04:29
- - Игoрь   мысль не нова и безусловно интересна. Но на мой вз...   Jan 13 2014, 08:21
|- - Abell   Цитата(Игoрь @ Jan 13 2014, 12:21) Схема ...   Jan 13 2014, 09:20
- - A. Fig Lee   Какое отношение к енкодеру имеют последние 3 ответ...   Jan 13 2014, 13:45
- - Игoрь   косвенное Раз нет желающих помочь мне с кодом для...   Jan 13 2014, 15:56
|- - ILYAUL   Цитата(Игoрь @ Jan 13 2014, 19:56) косвен...   Jan 13 2014, 18:08
- - Игoрь   я же не просил тыкать меня носом в поисковик. Тема...   Jan 13 2014, 18:38
- - ILYAUL   Вы представляете , а там есть код и не один. Ну жд...   Jan 13 2014, 18:45
- - Игoрь   вы представляете, а я и до вашего совета искал, и ...   Jan 14 2014, 05:05
- - rx3apf   Эта тема неоднократно обсуждалась на форуме. Вам л...   Jan 14 2014, 09:55
- - ILYAUL   ЦитатаНо они меня не устроили своей громоздкостью,...   Jan 14 2014, 10:11
|- - Игoрь   Цитата(ILYAUL @ Jan 14 2014, 14:11) А что...   Jan 14 2014, 11:09
- - ViKo   Опрашиваю периодически (часто) по таймеру состояни...   Jan 14 2014, 11:37
|- - A. Fig Lee   Цитата(ViKo @ Jan 14 2014, 06:37) Опрашив...   Jan 14 2014, 12:47
|- - ViKo   Цитата(ViKo @ Jan 14 2014, 14:37) Сравнив...   Feb 3 2014, 09:20
|- - Maik-vs   Код так код. Вот: Код; ;==========================...   Mar 20 2014, 03:55
- - Игoрь   спасибо. Именно такого ответа я и ожидал!   Feb 2 2014, 05:28


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 06:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016