Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Вопрос по адресации к ячейкам памяти МК pic в асм

Чт дек 17, 2020 11:57:12

Учусь писать программу на asm, возник вопрос - у меня есть циклы считывания 50 временных интервалов сигнала и время каждого интервала нужно записать в свою ячейку оперативной памяти для дальнейшего вывода на индикацию - вопрос: как численно и коротко адресоваться к массиву ячеек для сохранения в них результата счета? Я пока придумал такой вариант - приращение значения регистра по счетчику команд с каждым переполнением счетчика таймера.
Пример:
REG1 equ 20h ;объявление регистров
REG2
и т.д.
REG50 equ 52h
Chet equ 53h ; счетчик интервалов
******************
тело программы
******************
;приращение результатов
movlw .1 ; первая ячейка
subwf Chet,0
btfss STATUS,C
incf REG1,1 ; если в счетчике значение 1 - то приращение идет в первой ячейке памяти
movlw .2
subwf Chet,0
btfss STATUS,C
incf REG2,1 ;если 2 - то во второй
и т.д.
movlw .50
subwf Chet,0
btfss STATUS,C
incf REG50,1 ;если 50 - то в 50-й

только получается очень много кода - только на счет 200 строк

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Чт дек 17, 2020 12:39:47

меньше чем 200
Код:
; сдвигаем значение Chet  (нумерация ячеек с 0) влево умножая на 2 записываем его в W далее:

      addwf   PCL,f         ;W + PC -> PC
      incf REG1,1 ;      
      goto   exit_Off      
      incf REG2,1      
      goto   exit_Off
..

либо
Код:
; в W записываем Chet
      addwf   PCL,f         ;W + PC -> PC
      goto   obrabotka1      
      goto   obrabotka2      
      goto   obrabotka3      
      goto   obrabotka4

в обоих вариантах это будет, как минимум, в 50 раз быстрее чем ваш код :)
На какой странице работаем так же надо не забыть.
Последний раз редактировалось RoboC Чт дек 17, 2020 12:58:55, всего редактировалось 1 раз.

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Чт дек 17, 2020 12:58:35

что за МК (10,12,16 или 18-я серии, энхансед среднемладшие)?
что откуда читаем и куда пишем (таблица из ПЗУ в ОЗУ или чтение/запись массива данных в пределах ОЗУ)?
:roll:

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Чт дек 17, 2020 13:02:36

Код:
[code]REG1 equ 20h ;объявление регистров
Chet equ 53h ;[/code]
..
movlw .1 ; первая ячейка
subwf Chet,0
btfss STATUS,C
incf REG1,1 ; если в счетчике значение 1 - то приращение идет в первой ячейке памяти


Явно не ПЗУ

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Чт дек 17, 2020 13:04:21

MK Pic16F648A - Считаем количество переполнений таймера TMR0 - в регистре оперативной памяти "К" - а далее нужно выгрузить это значение в регистр ОП с 1 по 50.
А нельзя обратиться к оперативной памяти по номеру ячейки (плюс Сhet)?

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Чт дек 17, 2020 13:09:14

Вообще-то есть косвенная адресация к ОЗУ...
Код:
movwf INDF
incf FSR,f

:roll:

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Чт дек 17, 2020 16:16:10

addwf PCL,f ;W + PC -> PC
incf REG1,1 ;
goto exit_Off
incf REG2,1
goto exit_Off

Супер! Спасибо! Это в 2 раза меньше моего кода! Со 100 строками уже можно уложиться и с индикацией на первые 256 строк.

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Чт дек 17, 2020 16:55:51

Шозабред? Зачем для упорядоченного массива данных писать табличный код непосредственной адресации?
BOB51 всё объяснил.
Обращение к массивам данных реализуют через индексы или указатели (что в общем одно и тоже по сути).
Для этих целей в обсуждаемой архитектуре есть специальный регистр-указатель (FSR) и виртуальное "окно" доступа (INDF) по этому указателю.
ЗЫ. Даже если массив и неупорядочен, то таблица может пересчитывать адрес для FSR, но реализовывать кучу вариантов кода путем непосредственной адресации (адрес данных в инструкции) - это идиотизм.

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пт дек 18, 2020 04:34:26

С FSR я пока не знаком, пойду курить FSR.

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пт дек 18, 2020 11:00:39

ШПОРА_PIC10_12_16.pdf
(648.72 KiB) Скачиваний: 167

и ссыль на учебно -практическую документацию на русском:
http://www.microchip.ru/lit/?mid=1x0
там на выбор изучающего.
PIC16F62X как раз про 627 - 628 (более ранние версии 648го)
8)

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пт дек 18, 2020 16:12:08

Разобрался! Все на первый взгляд очень просто устроено - если записать в регистр FSR номер ячейки памяти - то в регистре INDF будет значение этой ячейки, с которым можно работать как с самой ячейкой.
И код тогда нужен примерно такой:
Код:
REG1 equ 20h ;объявление регистров
REG2
и т.д.
REG50 equ 52h
Chet equ 53h ; счетчик интервалов
******************
тело программы
******************
 movlw   .19
 addwf   Chet,0 ; теперь в аккумул номер нужной ячейки упорядоченного блока памяти (а можно вообще убежать в ОП четвертого банка памяти!)
 movwf   FSR ; записали номер ячейки в FSR - теперь INDF - это виртуально она же
 movf      TINTERVALA,0 ; переслали значение n-го интервала времени в аккум
 movwf    INCF ; все - в ячейке 20h (и далее) сохранено значение времени

Всего 5 строк!

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пт дек 18, 2020 19:51:16

profradio Разобрался!

Такому форумчанину и помогать приятно! :)
У дачи вам profradio в освоении программирования. :beer:

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пн дек 28, 2020 11:13:03

Продолжу тему.
Заглянул в Proteus7,7 sp2 - SAMPLES\VSM for PIC16\PIC Doorbell\
Увидел там вот такие команды
... movlw tune0 / 0x100 ; как это понимать?
movwf tptrh
movlw tune0 % 0x100 ; как это понимать?
movwf tptrl
...
Полный текст программы.
Спойлер
Код:
              LIST    p=16F84 ; PIC16F844 is the target processor

              #include "P16F84.INC" ; Include header file

              CBLOCK 0x10   ; Temporary storage
              tempo
              tptrl
              tptrh
              note
              length
              pitch
              temp             
              dl1
              dl2             
              ENDC


              ORG   0
entrypoint    goto  initialise

              ORG   4
intvector     goto    toggle

initialise    ; Register set up:
              clrw                    ; Zero.
              movwf   PORTA         ; Ensure PORTB is zero before we enable it.      
              movwf   PORTB           ; Ensure PORTB is zero before we enable it.
              bsf     STATUS,RP0      ; Select Bank 1
              clrf    TRISB         ; Port B is outputs             

         ; Set up timer 0 for tone generation
         movlw   0x02            ; Prescaler on, internal clocking, divide by 4           
         movwf   OPTION_REG
              bcf     STATUS,RP0      ; Back to bank 0                             
             
                               
         ; Poll for a button
wait         clrf    PORTB
wloop         btfss   PORTA,0
         goto    playtune0
         btfss   PORTA,1
         goto    playtune1
         goto    wloop                                   

;Routines to play the tunes
playtune0     movlw   0x13
         movwf   PORTB
         movlw   0x50
             movwf   tempo
         movlw   tune0 / 0x100
         movwf   tptrh
         movlw   tune0 % 0x100
         movwf   tptrl
         goto    playtune

playtune1     movlw   0x23
         movwf   PORTB
         movlw   0xA0
             movwf   tempo
         movlw   tune1 / 0x100
         movwf   tptrh
         movlw   tune1 % 0x100
         movwf   tptrl
         goto    playtune
                 
;Subroutine to play a tune
playtune      call    gettunedata       ; Lookup note from tune table
         movwf   note              ; Store the note code
         btfsc   note,7      ; Bit 7 set => end of tune
         goto    wait      ; Back to waiting for a button press
          incf    tptrl,F           ; Increment the tune pointer
         call    gettunedata       ; Get the note length
         movwf   length            ; Store it
                                                                             
; Play the stored note
; The tune table supports two octaves and 8 note lengths.
playnote      btfsc   note,6       ; Bit 6 set => rest
              goto    playwait          ; Silence ensues...     
         movf    note,W      ; Retrieve the note        
              andlw   0x3F              ; Mask off the pitch index
         call    pitchtable        ; and look it up in the pitchtable
          movwf   pitch             ; Transfer the value to Timer 0
          movwf   TMR0
          bcf     INTCON,T0IF       ; Clear Timer Interrupt
         bsf     INTCON,T0IE       ; Enable interrupts for Timer 0
         bsf     INTCON,GIE
playwait      movf    length,W          ; Retrieve the note length
         movwf   dl1               ; and store it in delay counter 1
loop1         movf    tempo,W             ; This value sets the timing resolution
         movwf   dl2
loop2         nop                       ; Inner delay loop delay
         nop     
         decfsz  dl2,F             
              goto    loop2
              decfsz  dl1,F             ; Outer delay loop
              goto    loop1
              bcf     INTCON,T0IE       ; Timer interrupts off           

;Fetch next note/length pair:
            incf    tptrl,F           ; Increment tune ptr           
          btfsc   STATUS,Z        ; Test for low byte rollover
          incf    tptrh,F           ; Inc high byte
              goto    playtune           ; Loop for next note

; Routine to fetch data from the tune tables
gettunedata   movf    tptrh,W         ; Set up PCLATH for the jump
              movwf   PCLATH                     
         movf    tptrl,W         ; Get low address of tptr
         movwf   PCL         ; Jump off to the table entry                                   

; Pitch lookup function                                   
pitchtable    clrf    PCLATH           ; Clear PCLATH for zero page
         addwf PCL,F
         retlw 0x11               ;C5  // Midi Code 60
         retlw 0x1F               ;C#
         retlw 0x2B               ;D
         retlw 0x37               ;D#
         retlw 0x42               ;E
         retlw 0x4D               ;F
         retlw 0x57               ;F#
         retlw 0x61               ;G
         retlw 0x6A          ;G#
         retlw 0x72               ;A (440)
         retlw 0x7A               ;Bb
         retlw 0x81               ;B
         retlw 0x89               ;C6 // Midi Code 72
         retlw 0x8F               ;Db
         retlw 0x96               ;D
         retlw 0x9C               ;Eb
         retlw 0xA1               ;E
         retlw 0xA7               ;F
         retlw 0xAC               ;F#
         retlw 0xB0               ;G
         retlw 0xB5               ;Ab
         retlw 0xB9               ;A (880)
         retlw 0xBD               ;Bb
         retlw 0xC1               ;B
         retlw 0xC4               ;C7 // Midi Code 84
         retlw 0xC8               ;Db
         retlw 0xCB               ;D
         retlw 0xCE               ;Eb
         retlw 0xD1               ;E
         retlw 0xD3               ;F
         retlw 0xD6               ;F#
         retlw 0xD8               ;G
         retlw 0xDA               ;Ab
         retlw 0xDC               ;A (1760)
               retlw 0xDE          ;Bb
         retlw 0xE0               ;
         retlw 0xE2               ;C8 // Midi Code 96

                                                                   
             

;Interrupt service - toggle the drive polarity to the sounder
;Note that this does not preserve the status bits - be careful,
;and that there is an assumption we are addressing bank 0.
toggle        movwf   temp
              movf    pitch,W
              movwf   TMR0
         movf    PORTB,W
              xorlw   0x0F
              movwf   PORTB
         bcf     INTCON,T0IF
         movf    temp,w
         retfie

;Tune Tables             
;Must be on even byte boundary                       
                       
         org 0x0080

; Tune 0 Data
; Bach 'Badinerie' from Suite No 2
tune0   retlw 0x17   ;B
   retlw 0x78   ;240
   retlw 0x1A   ;D
   retlw 0x3C   ;120
   retlw 0x17   ;B
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x78   ;240
   retlw 0x17   ;B
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x0E   ;D
   retlw 0x78   ;240
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x0E   ;D
   retlw 0x3C   ;120
   retlw 0x0B   ;B
   retlw 0xF0   ;480
   retlw 0x06   ;F#
   retlw 0x3C   ;120
   retlw 0x0B   ;B
   retlw 0x3C   ;120
   retlw 0x0E   ;D
   retlw 0x3C   ;120
   retlw 0x0B   ;B
   retlw 0x3C   ;120
   retlw 0x0D   ;C#
   retlw 0x3C   ;120
   retlw 0x0B   ;B
   retlw 0x3C   ;120
   retlw 0x0D   ;C#
   retlw 0x3C   ;120
   retlw 0x0B   ;B
   retlw 0x3C   ;120
   retlw 0x0A   ;A#
   retlw 0x3C   ;120
   retlw 0x0D   ;C#
   retlw 0x3C   ;120
   retlw 0x10   ;E
   retlw 0x3C   ;120
   retlw 0x0D   ;C#
   retlw 0x3C   ;120
   retlw 0x0E   ;D
   retlw 0x78   ;240
   retlw 0x0B   ;B
   retlw 0x78   ;240
   retlw 0x17   ;B
   retlw 0x78   ;240
   retlw 0x1A   ;D
   retlw 0x3C   ;120
   retlw 0x17   ;B
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x78   ;240
   retlw 0x17   ;B
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x0E   ;D
   retlw 0x78   ;240
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x0E   ;D
   retlw 0x3C   ;120
   retlw 0x0B   ;B
   retlw 0xF0   ;480
   retlw 0x0E   ;D
   retlw 0x78   ;240
   retlw 0x0E   ;D
   retlw 0x78   ;240
   retlw 0x0E   ;D
   retlw 0x78   ;240
   retlw 0x0E   ;D
   retlw 0x78   ;240
   retlw 0x17   ;B
   retlw 0x78   ;240
   retlw 0x0E   ;D
   retlw 0x78   ;240
    retlw 0x10   ;E
   retlw 0x3C   ;60
   retlw 0x0E   ;D
   retlw 0x3C   ;30
   retlw 0x0D   ;C#
   retlw 0x78   ;240
   retlw 0x12   ;F#
   retlw 0x78   ;240
   retlw 0x12   ;F#
   retlw 0x78   ;240
   retlw 0x12   ;F#
   retlw 0x78   ;240
   retlw 0x12   ;F#
   retlw 0x78   ;240
   retlw 0x1A   ;D
   retlw 0x78   ;240
   retlw 0x12   ;F#
   retlw 0x78   ;220
   retlw 0x12   ;F#
   retlw 0x3C   ;30
   retlw 0x14   ;G#
   retlw 0x3C   ;65
   retlw 0x11   ;F
   retlw 0x78   ;270
   retlw 0x0D   ;C#
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x15   ;A
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x14   ;G#
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x14   ;G#
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x11   ;F
   retlw 0x3C   ;120
   retlw 0x14   ;G#
   retlw 0x3C   ;120
   retlw 0x17   ;B
   retlw 0x3C   ;120
   retlw 0x14   ;G#
   retlw 0x3C   ;120
   retlw 0x15   ;A
   retlw 0x3C   ;120
   retlw 0x14   ;G#
   retlw 0x3C   ;120
   retlw 0x15   ;A
   retlw 0x3C   ;120
   retlw 0x14   ;G#
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x15   ;A
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x11   ;F
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x17   ;B
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x11   ;F
   retlw 0x39   ;115
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x19   ;C#
   retlw 0x3E   ;125
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x11   ;F
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x39   ;115
   retlw 0x1A   ;D
   retlw 0x3E   ;125
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x11   ;F
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;120
   retlw 0x1A   ;D
   retlw 0x3C   ;120
   retlw 0x19   ;C#
   retlw 0x3C   ;120
   retlw 0x17   ;B
   retlw 0x3C   ;120
   retlw 0x19   ;C#
   retlw 0x3C   ;120
   retlw 0x15   ;A
   retlw 0x3C   ;120
   retlw 0x14   ;G#
   retlw 0x3C   ;120
   retlw 0x12   ;F#
   retlw 0x3C   ;130
   retlw 0x15   ;A
   retlw 0x78   ;210
   retlw 0x14   ;G#
   retlw 0x3C
   retlw 0x12   ;F#
   retlw 0x3C   ;
   retlw 0x12   ;F#
   retlw 0xE0   ;480
   retlw 0xFF   
   retlw 0

; Tune 1
; Mozart Eine Klein Nachtmusik

   
tune1            

   retlw 0x13   ;G
   retlw 0x43   ;538
   retlw 0x40   ;REST
   retlw 0x4D   ;617
   retlw 0x0E   ;D
   retlw 0x18   ;193
   retlw 0x40   ;REST
   retlw 0x1D   ;232
   retlw 0x13   ;G
   retlw 0x3E   ;498
   retlw 0x40   ;REST
   retlw 0x48   ;582
   retlw 0x0E   ;D
   retlw 0x1B   ;218
   retlw 0x40   ;REST
   retlw 0x18   ;192
   retlw 0x13   ;G
   retlw 0x15   ;168
   retlw 0x40   ;REST
   retlw 0x19   ;207
   retlw 0x0E   ;D
   retlw 0x15   ;168
   retlw 0x40   ;REST
   retlw 0x15   ;172
   retlw 0x13   ;G
   retlw 0x17   ;188
   retlw 0x40   ;REST
   retlw 0x18   ;197
   retlw 0x17   ;B
   retlw 0x17   ;188
   retlw 0x40   ;REST
   retlw 0x1B   ;222
   retlw 0x1A   ;D
   retlw 0x3B   ;478
   retlw 0x40   ;REST
   retlw 0x83   ;1052
   retlw 0x18   ;C
   retlw 0x47   ;568
   retlw 0x40   ;REST
   retlw 0x4A   ;597
   retlw 0x15   ;A
   retlw 0x15   ;168
   retlw 0x40   ;REST
   retlw 0x1D   ;237
   retlw 0x18   ;C
   retlw 0x3C   ;483
   retlw 0x40   ;REST
   retlw 0x52   ;657
   retlw 0x15   ;A
   retlw 0x16   ;183
   retlw 0x40   ;REST
   retlw 0x16   ;177
   retlw 0x18   ;C
   retlw 0x1C   ;228
   retlw 0x40   ;REST
   retlw 0x12   ;147
   retlw 0x15   ;A
   retlw 0x16   ;183
   retlw 0x40   ;REST
   retlw 0x18   ;197
   retlw 0x12   ;F#
   retlw 0x18   ;198
   retlw 0x40   ;REST
   retlw 0x14   ;167
   retlw 0x15   ;A
   retlw 0x1D   ;238
   retlw 0x40   ;REST
   retlw 0x18   ;192
   retlw 0x0E   ;D
   retlw 0x39   ;458
   retlw 0x40   ;REST
   retlw 0x82   ;1042
   retlw 0x13   ;G
   retlw 0x27   ;313
   retlw 0x40   ;REST
   retlw 0x3E   ;497
   retlw 0x13   ;G
   retlw 0x6B   ;858
   retlw 0x40   ;REST
   retlw 0x1E   ;242
   retlw 0x17   ;B
   retlw 0x31   ;395
   retlw 0x15   ;A
   retlw 0x21   ;268
   retlw 0x40   ;REST
   retlw 0x07   ;57
   retlw 0x13   ;G
   retlw 0x16   ;183
   retlw 0x40   ;REST
   retlw 0x18   ;197
   retlw 0x13   ;G
   retlw 0x16   ;180
   retlw 0x15   ;A
   retlw 0x13   ;155
   retlw 0x13   ;G
   retlw 0x12   ;145
   retlw 0x12   ;F#
   retlw 0x10   ;133
   retlw 0x40   ;REST
   retlw 0x22   ;272
   retlw 0x12   ;F#
   retlw 0x68   ;833
   retlw 0x40   ;REST
   retlw 0x1F   ;252
   retlw 0x15   ;A
   retlw 0x2C   ;355
   retlw 0x18   ;C
   retlw 0x1B   ;218
   retlw 0x40   ;REST
   retlw 0x14   ;162
   retlw 0x12   ;F#
   retlw 0x13   ;158
   retlw 0x40   ;REST
   retlw 0x19   ;202
   retlw 0x15   ;A
   retlw 0x2F   ;380
   retlw 0x13   ;G
   retlw 0x13   ;158
   retlw 0x40   ;REST
   retlw 0x22   ;272
   retlw 0x13   ;G
   retlw 0x78   ;963
   retlw 0x40   ;REST
   retlw 0x1D   ;237
   retlw 0x17   ;B
   retlw 0x2A   ;343
   retlw 0x40   ;REST
   retlw 0x03   ;27
   retlw 0x15   ;A
   retlw 0x22   ;278
   retlw 0x40   ;REST
   retlw 0x0C   ;102
   retlw 0x13   ;G
   retlw 0x16   ;183
   retlw 0x40   ;REST
   retlw 0x1A   ;212
   retlw 0x13   ;G
   retlw 0x19   ;205
   retlw 0x15   ;A
   retlw 0x12   ;150
   retlw 0x13   ;G
   retlw 0x11   ;140
   retlw 0x12   ;F#
   retlw 0x12   ;148
   retlw 0x40   ;REST
   retlw 0x1F   ;252
   retlw 0x12   ;F#
   retlw 0x5B   ;728
   retlw 0x40   ;REST
   retlw 0x27   ;317
   retlw 0x15   ;A
   retlw 0x2D   ;365
   retlw 0x18   ;C
   retlw 0x1A   ;208
   retlw 0x40   ;REST
   retlw 0x13   ;152
   retlw 0x12   ;F#
   retlw 0x14   ;163
   retlw 0x40   ;REST
   retlw 0x19   ;207
   retlw 0x13   ;G
   retlw 0x14   ;163
   retlw 0x40   ;REST
   retlw 0x19   ;207
   retlw 0x13   ;G
   retlw 0x13   ;153
   retlw 0x40   ;REST
   retlw 0x1A   ;212
   retlw 0x13   ;G
   retlw 0x1C   ;225
   retlw 0x12   ;F#
   retlw 0x15   ;175
   retlw 0x10   ;E
   retlw 0x1E   ;240
   retlw 0x12   ;F#
   retlw 0x12   ;150
   retlw 0x13   ;G
   retlw 0x18   ;198
   retlw 0x40   ;REST
   retlw 0x16   ;177
   retlw 0x13   ;G
   retlw 0x10   ;128
   retlw 0x40   ;REST
   retlw 0x23   ;287
   retlw 0x17   ;B
   retlw 0x17   ;190
   retlw 0x15   ;A
   retlw 0x0D   ;105
   retlw 0x13   ;G
   retlw 0x1F   ;255
   retlw 0x15   ;A
   retlw 0x0F   ;125
   retlw 0x17   ;B
   retlw 0x18   ;193
   retlw 0x40   ;REST
   retlw 0x1A   ;212
   retlw 0x17   ;B
   retlw 0x10   ;128
   retlw 0x40   ;REST
   retlw 0x20   ;257
   retlw 0x1A   ;D
   retlw 0x19   ;200
   retlw 0x18   ;C
   retlw 0x0F   ;125
   retlw 0x17   ;B
   retlw 0x1F   ;250
   retlw 0x18   ;C
   retlw 0x10   ;135
   retlw 0x1A   ;D
   retlw 0x59   ;713
   retlw 0x40   ;REST
   retlw 0x7B   ;987
   retlw 0x0E   ;D
   retlw 0xBA   ;1495
   retlw 0x10   ;E
   retlw 0x7C   ;998
   retlw 0x40   ;REST
   retlw 0x48   ;577
   retlw 0x0E   ;D
   retlw 0x19   ;205
   retlw 0x0C   ;C
   retlw 0x16   ;183
   retlw 0x40   ;REST
   retlw 0x31   ;397
   retlw 0x0C   ;C
   retlw 0x14   ;163
   retlw 0x40   ;REST
   retlw 0x4C   ;612
   retlw 0x0C   ;C
   retlw 0x17   ;190
   retlw 0x0B   ;B
   retlw 0x12   ;148
   retlw 0x40   ;REST
   retlw 0x39   ;457
   retlw 0x0B   ;B
   retlw 0x13   ;153
   retlw 0x40   ;REST
   retlw 0x43   ;537
   retlw 0x0B   ;B
   retlw 0x17   ;190
   retlw 0x09   ;A
   retlw 0x13   ;153
   retlw 0x40   ;REST
   retlw 0x37   ;447
   retlw 0x09   ;A
   retlw 0x16   ;178
   retlw 0x40   ;REST
   retlw 0x41   ;522
   retlw 0x07   ;G
   retlw 0x2E   ;375
   retlw 0x06   ;F#
   retlw 0x33   ;410
   retlw 0x04   ;E
   retlw 0x2D   ;363
   retlw 0x40   ;REST
   retlw 0x01   ;12
   retlw 0x06   ;F#
   retlw 0x35   ;428
   retlw 0x40   ;REST
   retlw 0x02   ;22
   retlw 0x07   ;G
   retlw 0x16   ;178
   retlw 0x40   ;REST
   retlw 0x50   ;642
   retlw 0x09   ;A
   retlw 0x10   ;133
   retlw 0x40   ;REST
   retlw 0x4C   ;612
   retlw 0x0B   ;B
   retlw 0x0E   ;113
   retlw 0x40   ;REST
   retlw 0xB4   ;1442
   retlw 0x0E   ;D
   retlw 0xBA   ;1495
   retlw 0x10   ;E
   retlw 0x82   ;1043
   retlw 0x40   ;REST
   retlw 0x39   ;462
   retlw 0x0E   ;D
   retlw 0x2D   ;360
   retlw 0x0C   ;C
   retlw 0x16   ;178
   retlw 0x40   ;REST
   retlw 0x1E   ;242
   retlw 0x0C   ;C
   retlw 0x10   ;128
   retlw 0x40   ;REST
   retlw 0x1F   ;252
   retlw 0x0C   ;C
   retlw 0x10   ;133
   retlw 0x40   ;REST
   retlw 0x1C   ;227
   retlw 0x0C   ;C
   retlw 0x2C   ;355
   retlw 0x0B   ;B
   retlw 0x13   ;153
   retlw 0x40   ;REST
   retlw 0x1E   ;247
   retlw 0x0B   ;B
   retlw 0x0D   ;108
   retlw 0x40   ;REST
   retlw 0x23   ;282
   retlw 0x0B   ;B
   retlw 0x10   ;133
   retlw 0x40   ;REST
   retlw 0x1E   ;247
   retlw 0x0B   ;B
   retlw 0x2F   ;380
   retlw 0x09   ;A
   retlw 0x13   ;158
   retlw 0x40   ;REST
   retlw 0x1B   ;222
   retlw 0x09   ;A
   retlw 0x13   ;153
   retlw 0x40   ;REST
   retlw 0x1E   ;242
   retlw 0x09   ;A
   retlw 0x10   ;128
   retlw 0x40   ;REST
   retlw 0x23   ;282
   retlw 0x07   ;G
   retlw 0x2B   ;350
   retlw 0x06   ;F#
   retlw 0x2F   ;380
   retlw 0x04   ;E
   retlw 0x31   ;395
   retlw 0x06   ;F#
   retlw 0x35   ;428
   retlw 0x40   ;REST
   retlw 0x05   ;47
   retlw 0x07   ;G
   retlw 0xB4   ;468
   retlw 0xFF
   

              END

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пн дек 28, 2020 11:23:37

Так и понимать:
movlw tune0 / 0x100 => WREG=tune0/0x100, где tune0 - константа, которая должна быть объявлена в коде или в хедере.
Соответственно
movlw tune0 % 0x100 => WREG=остаток от деления (tune0/0x100)
Все это математика препроцессора.
Но так как tune0 - это МЕТКА, то есть по факту АДРЕС, то значение адреса и будет константой.

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пн дек 28, 2020 12:41:08

Не догоняю. Как это можно прокоментировать?
Вложения
mov1.gif
(14.94 KiB) Скачиваний: 161
mov.gif
(14.06 KiB) Скачиваний: 159

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пн дек 28, 2020 12:47:26

В коде tune0 прибит гвоздями к конкретному адресу:
Код:
         org 0x0080

; Tune 0 Data
; Bach 'Badinerie' from Suite No 2
tune0   retlw 0x17   ;B
           retlw 0x78   ;240
           retlw 0x1A   ;D

То есть tune0=0х0080
Но код написан так, что tune0/tune1 могут быть размещены на произвольный адрес. Поэтому, чтобы изменение расположения таблиц не требовало изменения констант в коде, применен расчет страницы (деление на 0х100) и смещения в странице (остаток от деления) препроцессором.
Посмотрите содержимое флеша (дизасм), там нет никаких делений и подставлены уже результирующие константы.
ЗЫ. Вообще метод расчета констант из меток - плохая идея. При перемещаемом коде (линкер определяет позицию метки) всё это перестает работать. Патамушта препроцессор работает ДО линкера и он не может получить значение метки.

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пн дек 28, 2020 12:55:49

Похоже там еще и "прыжки по указателю" задействованы...
А это уже в комплекте с PCLATH пойдет (вычисляемый переход)... в зависимости от садизма автора исходника.
:wink:
Последний раз редактировалось BOB51 Пн дек 28, 2020 17:01:11, всего редактировалось 1 раз.

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пн дек 28, 2020 13:01:16

Я думал это полезный финт которого я не знал. Оказалось это не так. Спасибо.

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пн дек 28, 2020 16:59:14

Очень полезный, но требует весьма много внимания и аккуратности.
Поскольку во многих случаях надо где-то хранить предшествующее значение PCLATH, а у среднемладших прямое помещение в аппаратный стек... проблематично - надо делать программный стек. Второе - нет переноса из PCL (при операциях, где результат операции размещается в PCL) при переполнении в PCH.
В то же время прием "вычислительного перехода" по адресу, формируемому содержимым
"PCLATH:результат операции с PCL",
специфичный именно для среднемладших ПИКов, весьма удобная штука.
:hunger:

Re: Вопрос по адресации к ячейкам памяти МК pic в асм

Пн дек 28, 2020 17:22:24

Может быть Вы правы. Вот такое обращение с PCLATH тоже решает все проблемы.
Спойлер
Код:
;----------
TABLE       movlw       high PC_ADR ; Установка (через W), в PCH (посредством PCLATH), числового
                movwf       PCLATH      ; значения старшего байта адреса той команды, которая помечена
                                    ; меткой PC_ADR.
;----------
; Будем “прыгать” в текущий PC-блок или в следующий?
;----------
            movf        Reg,W       ; “Прыжковое” число копируется в W.
            addlw       low PC_ADR  ; Суммирование "прыжкового" числа и числового значения младшего
                                              ; байта адреса той команды, которая помечена меткой PC_ADR.
            btfsc       STATUS,C    ; Перенос был или нет?
            incf        PCLATH,F    ; Если перенос был (соответствует работе в следующем PC-блоке),
                                            ; то PCLATH+1=... (то есть, PCH+1=...).
                                           ; Если переноса не было (соответствует работе в текущем
                                           ; PC-блоке), то команда инкремента не исполняется.
            movf        Reg,W       ; “Прыжковое” число копируется в W.
;----------
; Таблица вычисляемого перехода.
;----------
                  addwf       PCL,F       ; PCL + W = ...
PC_ADR      retlw       b'00111111' ; ..FEDCBA -> символ “0”     3Fh
                  retlw       b'00000110' ; .....CB. -> символ “1”     06h
Ответить