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

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 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]Похоже, не понял. Как тут говорят, задача нетипичная, объяснить сложно))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15808
Зарегистрирован: Вт мар 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
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

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

Сообщение BOB51 »

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

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

ну так и в чем же суть это самой "отработки", кто-нибудь может объяснить простыми словами?
если, скажем, входное значение 0х81, что будет на выходе ?
или, например, на входе 0хС0 ?
Контактная информация:
Реклама
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Попытка скомпилировать gpasm

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

 $ gpasm -i bob51-pos-starsh-bit.asm 
bob51-pos-starsh-bit.asm:40:Warning[231] Found lower case match for include filename.
bob51-pos-starsh-bit.asm:59:Error[149]   Directive only allowed when generating an object file: "UDATA_SHR"
bob51-pos-starsh-bit.asm:80:Error[149]   Directive only allowed when generating an object file: "CODE"
bob51-pos-starsh-bit.asm:87:Error[149]   Directive only allowed when generating an object file: "CODE"
bob51-pos-starsh-bit.asm:97:Error[149]   Directive only allowed when generating an object file: "CODE"
bob51-pos-starsh-bit.asm:104:Error[149]   Directive only allowed when generating an object file: "CODE"
bob51-pos-starsh-bit.asm:107:Message[1302] RAM Bank undefined in this chunk of code. Ensure that bank bits are correct. Assuming bank 0 from now on.
bob51-pos-starsh-bit.asm:121:Error[149]   Directive only allowed when generating an object file: "CODE"
Error[181]   Error generating hex file.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15808
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

[uquote="Родэрик",url="/forum/viewtopic.php?p=4597226#p4597226"]ну так и в чем же суть ...
если, скажем, входное значение 0х81, что будет на выходе ?
или, например, на входе 0хС0 ?[/uquote]
0x81 выдаст 0x01
0xC0 - 0x40
а,вот для чего та задача Х/З...
Я просто очередной разок потренировался...
:sleep:
Насчёт gpasm не ведаю...
Листик исходника то для мплабовского проекта - ессно 1:1 использовать может и не получится.
Тем более, что использовался режим для относительной адресации...
Будет возможность скину полный исходник проекта (пока сайт "не пускает" Вложения)
Алгоритм остаётся в любом случае - переписываем по правилам того компилятора, которым пользуемся.
8)
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

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

по этим двум примерам я вижу лишь откидывание старшего бита ... а если на входе будет 0х77?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15808
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

01110111 ->> 00100000
8)
Маска представляет собой "бегущую 1", она же и конечный результат.
8)
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

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

ну и как 0х20 соотносится с предделителем в option_reg, о котором вроде как речь шла раньше? или это уже другая задача?
Как всё-таки, если на словах, звучит последовательность преобразования? Допустим, обнаружился первый слева единичный бит, и что дальше?
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15808
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

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

ну ладно, допустим существует следующий бит ... всё остальное получается зануляем в любом случае (включая тот старший бит)?
А если следующего так и не будет (например 0х10)?
Контактная информация:
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Ладно, хватит мучать мою задачу, а то сглазите, это совсем не то)) Уже не знаю как и объяснить.
[uquote="BOB51",url="/forum/viewtopic.php?p=4597232#p4597232"]0x81 выдаст 0x01
0xC0 - 0x40[/uquote]
81h должно быть 8h -> вес 8-го бита 256
C0h ---||---- 8h
77h ---||---- 7h -> вес 7-го бита 128
03h ---||---- 2h -> вес 2-го бита 4
И преобразование в триаду PS[2:0]
Друг Кота
Аватара пользователя
Сообщения: 15808
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

А это уже как заблагорассудится табличкой перекручиваем по полученным данным.
Первичный результат
Бит0=1
1=2
2=4
3=8
4=16
5=32
6=64
7=127
Но бит 7 никогда не появится (всегда будет отброшен), если старшим битом будет нулевой - также ошибка(за ним просто уже ничего не будет. Третья ситуация - исходно данные равны 0.
Итогом всего возможны 7 указателей к табличке перекодировки.
8)
Или "снова не так".
Вопрос гаданий.
:sleep:
Последний раз редактировалось BOB51 Пн июл 01, 2024 15:01:16, всего редактировалось 1 раз.
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

А, ну может Вы другим алгоритмом придёте к PS[2:0], тогда ладно))
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

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

[uquote="yor",url="/forum/viewtopic.php?p=4597252#p4597252"]81h должно быть 8h -> вес 8-го бита 256
C0h ---||---- 8h
77h ---||---- 7h -> вес 7-го бита 128
03h ---||---- 2h -> вес 2-го бита 4
И преобразование в триаду PS[2:0][/uquote]

Ну так мой код это и делает
Возьми любое значение, помести его в "val" и посмотри что окажется в option_reg
Контактная информация:
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Поверю на слово. Возьму на заметку. Скомпилил, но работы не добился, ещё надо gpsim настраивать, возможно. Ладно, всё, отстаньте от меня, надо программу писать, а не тут с вами))
А ты сам свой фрагмент испытывал?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

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

нет ... я его тупо в блокноте написал (как только мне показалось что я понял задачу), скопировал и сюда вставил
что там испытывать то особо ...
допустим в исходном числе 7-й бит единичный (val>127), проверив это, сразу попадаешь в конец и копируешь 07h (0b111) из reg в option_reg ... разве ты не это хотел?
если единица будет в 6-ом бите, то один раз пройдёшь через сдвиг, эта единица станет седьмой, reg уменьшится на единицу ... и в итоге в option_reg упадет 06h (0b110)
и так далее...
Контактная информация:
yor
Мудрый кот
Сообщения: 1738
Зарегистрирован: Сб янв 19, 2008 23:57:27

Сообщение yor »

Да, прошёл по нему мысленно, работает в общих чертах. И команд у тебя меньше, и циклов вдвое меньше, за один проход делается, у меня за два. Присуждаю первое место! Я на втором. Беру на заметку)) Спасибо.

Добавлено after 3 hours 26 minutes 33 seconds:
Надо было мне просто сказать, что вес позиции искомого бита умножить на 2, и понимание упрощается. Сам только додумался до этого, что это то же самое))
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 164
Зарегистрирован: Чт ноя 26, 2015 23:22:35
Откуда: не с Уфы

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

[uquote="yor",url="/forum/viewtopic.php?p=4597329#p4597329"]Надо было мне просто сказать...[/uquote]
- в смысле надо было чтоб кто-то тебе сказал, или ты ему?
как минимум вот здесь https://radiokot.ru/forum/viewtopic.php ... 3#p4596783 ты уже "говорил" про умножение (32*2) ...

кстати, чисто для сравнения, эта же функция на си:

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

uint8_t PS(int8_t val) {
    uint8_t reg=0x07;
        for(;(val>-1)&®reg--) val<<=1;
    return reg;
    }
и уже где-то в коде используем функцию PS:

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

 OPTION_REG=PS(REG);
Контактная информация:
Ответить

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