Вопросы начинающих PIC ASM

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
yor
Мудрый кот
Сообщения: 1710
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Я так и подумал, но этот вариант работает только с этим значением, а если будет другое, 01хххххх, или 0000011хх?

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

; 001xxxxx
rrf Rx,f  ; 0001xxxx
swapf  Rx,w ; хххх0001
andlw  b'00000111' : W=xxxxx001
movwf  OPTION
Да даже с этим не работает, или я не понимаю. По-моему, Вы не вникли в глубину проблемы))
Кстати, ещё "когтисто" забыли. Колючелапо - это не визуальный признак))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25560
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Если нужно предельно быстро, то это таблица на 255 значений.
Реклама
yor
Мудрый кот
Сообщения: 1710
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

У 648 всего 256 памяти, или можно в программной разместить?
Предельно быстро не надо, я согласен на 100 тактов))
Друг Кота
Аватара пользователя
Сообщения: 25560
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="yor",url="/forum/viewtopic.php?p=4596869#p4596869"]в программной разместить?[/uquote]
Таблицы и размещают в программной.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15693
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Я ж уже выше про RETLW намякивал.
И про прямой доступ к PCL как к обычному регистру в командах, работающих с регистрами ОЗУ.
:wink:
Реклама
abc
Друг Кота
Аватара пользователя
Сообщения: 3688
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

Сообщение abc »

BOB51, не, я только теперь понял.
Там из произвольного байта нужно получить три бита, первый из которых - первая слева единица в исходном байте, а вторые два следуют за ним.
В общем, надо сдвигать байт влево, пока в старшем не будет "1" (или не сдвигать, если там уже 1), а потом можно использовать тот кусок кода, что я приводил.
Как это сделать еще проще - нет времени разбираться, задача вообще не из тривиальных (да и сформулирована была просто охрененно).
Последний раз редактировалось abc Вс июн 30, 2024 15:12:53, всего редактировалось 1 раз.
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15693
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Записать возможные состояния в таблице.
И работать как с обычным табличным кодером/декодером.
Максимум добавить маску для удаления неиспользуемых бит.
8)
yor
Мудрый кот
Сообщения: 1710
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Кто скажет, что я не решил эту задачу без табличного чтения и прочих извращений с непрямой адресацией и вычисляемыми переходами, пусть первый бросит в меня камень))

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

; Вычисление Rtmp2  >^2, веса бита, следующего за старшим единичным, 7bit=128->256 ... 3bit=8->16 ... 0bit=1->2
<------>movlw<->9h<----><------>; кол-во циклов сдвига * 2
<------>movwf<->Rtmp1
srchHbit: decf<>Rtmp1,F
<------>rlf<--->Rtmp2,F
<------>btfss<->STATUS,C
<------>goto<-->srchHbit
<------>clrw<--><------><------>; Rtmp1 = вес старшего знач бита * 2, иначе вес следующего за старшим знач бита
wght2nmb: addlw>1
<------>decf<-->Rtmp1,F
<------>btfss<->STATUS,C
<------>goto<-->wght2nmb
<------>movwf<->pTMRon<><------>; W = OPTION:00000:PS[2:0]
И даже меньше чем за 20 циклов. Что скажете?
Друг Кота
Аватара пользователя
Сообщения: 15693
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Можно всё, что угодно, если результат устраивает и формулировка задачи верно указана.
8)
Чего в данном случае хотелось автору - сложно сказать...
:dont_know:
Могу лишь гадать...
Вероятно на кой то спортивный интерес ищем весовой коэффициент (EXP2) битика с 1, который будет следующим за первым встречным битом с 1 в анализируемом байте...
Т. е. сначала находим крайний левый бит с 1, затем следующий за ним со значением 1 и уже для него весовой коэффициент из ряда 128-64-32-16-8-4-2-1...
Или я не угадал?
:roll:
yor
Мудрый кот
Сообщения: 1710
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Ну дак я талдычу об этом, со второго раза доходчиво вроде объяснил, чего гадать-то)) Всё так. А теперь скажите тогда для общего развития, во сколько тактов обошлось бы табличное чтение в этом случае? И зачем таблица в 256 ячеек, если я правильно понимаю, то в таблице прописаны значения для OPTION:00000:PS[2:0], и по весу (или вернее, месту) бита в байте читаем из ячеек? То есть таблица тоже 8 байт, и тактов около того же?
Друг Кота
Аватара пользователя
Сообщения: 15693
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ежли я таки угадал...
То у "спортивной задачи" совершенно иное решение напрашивается.
Только вот нафига оная задача нужна, кроме "чистого спорту"?
Ни с точки зрения алгоритма, ни для практики ничего нового она не даёт.
:dont_know: :sleep:
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

табличное решение фиксированно по времени выполнения.
Контактная информация:
yor
Мудрый кот
Сообщения: 1710
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

В данном случае быстрее оно или нет?
Друг Кота
Аватара пользователя
Сообщения: 15693
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

DDS по другому алгоритму считается...
:dont_know:
А для "спортивной задачи" табличка лишь одна из составляющих будет...
:roll:
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

yor, там выше в твоем коде если Rtmp2 будет ноль, то до clrw не доберешься ... возможно и ниже есть проблемы, но я не смотрел
насколько я понял (пришлось несколько раз перечитать) суть задачи в том, чтобы просто преобразовать номер старшего бита в соответствующее ему число ?
почему бы тогда просто не взять сразу крайнее число и уменьшая/увеличивая его синхронно проверять биты? или я так и не понял суть задачи...

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

ip1
	movlw	07h
	movwf	reg
	;
ip1.it1	
	btfsc	val,7
	goto	ip1.rez
	rlf	val,f
	decfsz	reg,f
	goto	ip1.it1
	;
ip1.rez
	movf	reg,w
	movwf	OPTION_REG
Контактная информация:
yor
Мудрый кот
Сообщения: 1710
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4597034#p4597034"]yor, там выше в твоем коде если Rtmp2 будет ноль, то до clrw не доберешься ... возможно и ниже есть проблемы, но я не смотрел[/uquote]
Не, он ноль никогда не будет. Испытаем насчёт проблем, когда придёт время.

[uquote="Родэрик",url="/forum/viewtopic.php?p=4597034#p4597034"]насколько я понял (пришлось несколько раз перечитать) суть задачи в том, чтобы просто преобразовать номер старшего бита в соответствующее ему число?[/uquote]Удвоенный номер старшего бита в число, и не номер, а удвоенный вес номера
Вычисление веса бита, следующего за старшим единичным, 7bit=128->256 ... 3bit=8->16 ... 0bit=1->2. А потом этот вес преобразовать в триаду для

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

PS<2:0>: Prescaler Rate Select bits Bit Value TMR0
 000 1:2
 001 1:4
 010 1:8
 011 1:16
 100 1:32
 101 1:64
 110 1:128
 111 1:256
[uquote="Родэрик",url="/forum/viewtopic.php?p=4597034#p4597034"]почему бы тогда просто не взять сразу крайнее число и уменьшая/увеличивая его синхронно проверять биты? или я так и не понял суть задачи...
[/code][/uquote]Похоже, не понял. Как тут говорят, задача нетипичная, объяснить сложно))
Друг Кота
Аватара пользователя
Сообщения: 15693
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Насчет вычисления весового коэффициента следующего за первым слева битом, равным 1...
Вот такая "лесенка-чудесенка" (сделано на МПЛАБЕ 8.92) без лишней свертки повторов в циклы:
Спойлер

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

;******************************************************************************
;   This file is a basic code template for object module code                 *
;   generation on the PIC12F629. This file contains the                       *
;   basic code building blocks to build upon.                                 *
;                                                                             *
;   Refer to the MPASM User's Guide for additional information on             *
;   features of the assembler and linker (Document DS33014).                  *
;                                                                             *
;   Refer to the respective PIC data sheet for additional                     *
;   information on the instruction set.                                       *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Filename:      xxx.asm                                                   *
;    Date:                                                                    *
;    File Version:                                                            *
;                                                                             *
;    Author:                                                                  *
;    Company:                                                                 *
;                                                                             *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Files required: P12F629.INC                                              *
;                                                                             *
;                                                                             *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Notes:                                                                   *
;                                                                             *
;******************************************************************************

;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------

     LIST      P=12F629              ; list directive to define processor
     #INCLUDE <P12F629.INC>          ; processor specific variable definitions

;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the 
; .asm file. The lables following the directive are located in the respective 
; .inc file.  See the data sheet for additional information on configuration 
; word settings.
;
;------------------------------------------------------------------------------

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT 

;------------------------------------------------------------------------------
; VARIABLE DEFINITIONS
;------------------------------------------------------------------------------

; example of using Shared Uninitialized Data Section
INT_VAR     UDATA_SHR   0x20   
W_TEMP      RES     1             ; variable used for context saving 
STATUS_TEMP RES     1             ; variable used for context saving

tmp0        RES     1             ; блок временных регистров
datas       RES     1             ; данные к обработке
reg_mask    RES     1             ; скользящая маска


;------------------------------------------------------------------------------
; определение констант
start_mask equ 0x80 ; 10000000 двоичное (1 в старшем бите)


;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 12F629 has 128 bytes of non-volatile EEPROM, starting at address 0x2100
; 
;------------------------------------------------------------------------------

DATAEE    CODE  0x2100
    DE    "MCHP"          ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3

;------------------------------------------------------------------------------
; OSCILLATOR CALIBRATION VALUE
;------------------------------------------------------------------------------

OSC       CODE    0x03FF

; Internal RC calibration value is placed at location 0x3FF by Microchip as
; a 0xADDLW K instruction, where the K is a literal value to be loaded into 
; the OSCCAL register.  

;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------

RESET_VECTOR  CODE      0x0000 ; processor reset vector
        GOTO    START          ; go to beginning of program

;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------

INT_VECTOR    CODE    0x0004  ; interrupt vector location
        MOVWF   W_TEMP        ; save off current W register contents
        MOVF    STATUS,w      ; move status register into W register
        MOVWF   STATUS_TEMP   ; save off contents of STATUS register

; isr code can go here or be located as a call subroutine elsewhere

        MOVF    STATUS_TEMP,w ; retrieve copy of STATUS register
        MOVWF   STATUS        ; restore pre-isr STATUS register contents
        SWAPF   W_TEMP,f
        SWAPF   W_TEMP,w      ; restore pre-isr W register contents
        RETFIE                ; return from interrupt

;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------

MAIN_PROG     CODE

START

;------------------------------------------------------------------------------
; OSCCAL RESTORE (not required if internal OSC is not used)
;------------------------------------------------------------------------------
; -------------- закрыто на время теста --------------
;       errorlevel -302
;       BSF     STATUS,RP0    ; set file register bank to 1 
;       CALL    0x3FF         ; retrieve factory calibration value
;       MOVWF   OSCCAL        ; update register with factory cal value 
;       BCF     STATUS,RP0    ; set file register bank to 0
;       errorlevel +302
        
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------


new_test
 movlw 0x56 ; исходные данные для анализа
rep_test
 movwf datas ; загружены в datas
 movlw start_mask ; стартовая маска анализатора
 movwf reg_mask ; загружена в reg_mask
step1
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 7
 goto step2 ; jnz переходим к второму анализатору
 rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 6/
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 6
 goto step2 ; jnz переходим к второму анализатору
 rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 5/
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 5
 goto step2 ; jnz переходим к второму анализатору
 rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 4/
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 4
 goto step2 ; jnz переходим к второму анализатору
 rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 3/
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 3
 goto step2 ; jnz переходим к второму анализатору
 rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 2/
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 2
 goto step2 ; jnz переходим к второму анализатору
 rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 1/
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 1
 goto step2 ; jnz переходим к второму анализатору
 rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 0/
; анализ младшего значащего бита на первой ступени лишен смысла так как
; за ним нет больше бит для второй ступени анализа
 goto error_test ; обработчик ошибки
step2
 rrf reg_mask,f ; сдвиг маски в следующий бит 6 или 0
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 6 или 0
 goto test_ends ; jnz выход с результатом в start_mask
 movf reg_mask,f ; (TSTF) анализ на маску не равную 0
 btfsc STATUS,Z
 goto error_test ; обработчик ошибки
 rrf reg_mask,f ; сдвиг маски в следующий бит 5 или 0
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 5 или 0
 goto test_ends ; jnz выход с результатом в start_mask
 movf reg_mask,f ; (TSTF) анализ на маску не равную 0
 btfsc STATUS,Z
 goto error_test ; обработчик ошибки
 rrf reg_mask,f ; сдвиг маски в следующий бит 4 или 0
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 4 или 0
 goto test_ends ; jnz выход с результатом в start_mask
 movf reg_mask,f ; (TSTF) анализ на маску не равную 0
 btfsc STATUS,Z
 goto error_test ; обработчик ошибки
 rrf reg_mask,f ; сдвиг маски в следующий бит 3 или 0
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 3 или 0
 goto test_ends ; jnz выход с результатом в start_mask
 movf reg_mask,f ; (TSTF) анализ на маску не равную 0
 btfsc STATUS,Z
 goto error_test ; обработчик ошибки
 rrf reg_mask,f ; сдвиг маски в следующий бит 2 или 0
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 2 или 0
 goto test_ends ; jnz выход с результатом в start_mask
 movf reg_mask,f ; (TSTF) анализ на маску не равную 0
 btfsc STATUS,Z
 goto error_test ; обработчик ошибки
 rrf reg_mask,f ; сдвиг маски в следующий бит 1 или 0
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 1 или 0
 goto test_ends ; jnz выход с результатом в start_mask
 movf reg_mask,f ; (TSTF) анализ на маску не равную 0
 btfsc STATUS,Z
 goto error_test ; обработчик ошибки
 rrf reg_mask,f ; сдвиг маски в следующий бит 0
 movf datas,w
 andwf reg_mask,w
 btfss STATUS,Z ; контроль результата теста бита 0
 goto test_ends ; jnz выход с результатом в start_mask
 ;movf reg_mask,f ; (TSTF) анализ на маску не равную 0
 ;btfsc STATUS,Z
error_test ; обработчик ошибки
 nop
 goto $ ; аварийный останов (желательно с разбором ошибок)

test_ends ; завершение программы в start_mask результат
 nop ; для тест прогона в дебаггере - тут при останове
 nop ; вводим в W новое значение данных
 nop
 goto rep_test 



        END                       ; directive 'end of program'

К сожалению весь архив проекта приложить не получается (сообщение "закачан пустой файл")...
Но первая ступень вполне ясна.
Вылавливаем первую встречную единицу, затем (во второй ступени) следующую за ней. Ну и учитываем некорректности всякие -
а - пустой байт данных
б - нет второй 1
в - первая единица в бите 0 данных
воть...
Это уже готово... А третью перекодировку уже табличкой можно сделать (еще одно "нежданно всплывшее условие" :twisted: )
А уже дальше можно и таблицу вставить.
:tea:
yor
Мудрый кот
Сообщения: 1710
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Ничего себе! Понятно, что тут проверки аварийных случаев, но по именно актуальным для задачи командам, думаю, что так же выходит. От двух-трёх, если единица близко к левому борту, или больше, если дальше.
Друг Кота
Аватара пользователя
Сообщения: 15693
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Допустим такие входные данные:
0x81
0x80
0x03
0x01
0x00
Надо чтобы любое возможное значение из 0x00 - 0xFF чётко отрабатывалось.
8)
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 162
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

Сообщение Родэрик »

ну так и в чем же суть это самой "отработки", кто-нибудь может объяснить простыми словами?
если, скажем, входное значение 0х81, что будет на выходе ?
или, например, на входе 0хС0 ?
Контактная информация:
Ответить

Вернуться в «PIC»