Вопрос по адресации к ячейкам памяти МК pic в асм
Вопрос по адресации к ячейкам памяти МК pic в асм
Учусь писать программу на 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 строк
Пример:
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 строк
- Реклама
- RoboC
- Мудрый кот
- Сообщения: 1795
- Зарегистрирован: Ср апр 04, 2012 09:55:53
- Откуда: Северодонецк
- Контактная информация:
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
меньше чем 200
либо
в обоих вариантах это будет, как минимум, в 50 раз быстрее чем ваш код 
На какой странице работаем так же надо не забыть.
Код: Выделить всё
; сдвигаем значение 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На какой странице работаем так же надо не забыть.
Последний раз редактировалось RoboC Чт дек 17, 2020 12:58:55, всего редактировалось 1 раз.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
что за МК (10,12,16 или 18-я серии, энхансед среднемладшие)?
что откуда читаем и куда пишем (таблица из ПЗУ в ОЗУ или чтение/запись массива данных в пределах ОЗУ)?

что откуда читаем и куда пишем (таблица из ПЗУ в ОЗУ или чтение/запись массива данных в пределах ОЗУ)?
- RoboC
- Мудрый кот
- Сообщения: 1795
- Зарегистрирован: Ср апр 04, 2012 09:55:53
- Откуда: Северодонецк
- Контактная информация:
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Код: Выделить всё
[code]REG1 equ 20h ;объявление регистров
Chet equ 53h ;movlw .1 ; первая ячейка
subwf Chet,0
btfss STATUS,C
incf REG1,1 ; если в счетчике значение 1 - то приращение идет в первой ячейке памяти[/code]
Явно не ПЗУ
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
MK Pic16F648A - Считаем количество переполнений таймера TMR0 - в регистре оперативной памяти "К" - а далее нужно выгрузить это значение в регистр ОП с 1 по 50.
А нельзя обратиться к оперативной памяти по номеру ячейки (плюс Сhet)?
А нельзя обратиться к оперативной памяти по номеру ячейки (плюс Сhet)?
- Реклама
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Вообще-то есть косвенная адресация к ОЗУ...

Код: Выделить всё
movwf INDF
incf FSR,fRe: Вопрос по адресации к ячейкам памяти МК pic в асм
[uquote="RoboC",url="/forum/viewtopic.php?p=3942806#p3942806"]addwf PCL,f ;W + PC -> PC
incf REG1,1 ;
goto exit_Off
incf REG2,1
goto exit_Off[/uquote]
Супер! Спасибо! Это в 2 раза меньше моего кода! Со 100 строками уже можно уложиться и с индикацией на первые 256 строк.
incf REG1,1 ;
goto exit_Off
incf REG2,1
goto exit_Off[/uquote]
Супер! Спасибо! Это в 2 раза меньше моего кода! Со 100 строками уже можно уложиться и с индикацией на первые 256 строк.
- КРАМ
- Друг Кота
- Сообщения: 25391
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Шозабред? Зачем для упорядоченного массива данных писать табличный код непосредственной адресации?
BOB51 всё объяснил.
Обращение к массивам данных реализуют через индексы или указатели (что в общем одно и тоже по сути).
Для этих целей в обсуждаемой архитектуре есть специальный регистр-указатель (FSR) и виртуальное "окно" доступа (INDF) по этому указателю.
ЗЫ. Даже если массив и неупорядочен, то таблица может пересчитывать адрес для FSR, но реализовывать кучу вариантов кода путем непосредственной адресации (адрес данных в инструкции) - это идиотизм.
BOB51 всё объяснил.
Обращение к массивам данных реализуют через индексы или указатели (что в общем одно и тоже по сути).
Для этих целей в обсуждаемой архитектуре есть специальный регистр-указатель (FSR) и виртуальное "окно" доступа (INDF) по этому указателю.
ЗЫ. Даже если массив и неупорядочен, то таблица может пересчитывать адрес для FSR, но реализовывать кучу вариантов кода путем непосредственной адресации (адрес данных в инструкции) - это идиотизм.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
С FSR я пока не знаком, пойду курить FSR.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
и ссыль на учебно -практическую документацию на русском:
http://www.microchip.ru/lit/?mid=1x0
там на выбор изучающего.
PIC16F62X как раз про 627 - 628 (более ранние версии 648го)

http://www.microchip.ru/lit/?mid=1x0
там на выбор изучающего.
PIC16F62X как раз про 627 - 628 (более ранние версии 648го)
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Разобрался! Все на первый взгляд очень просто устроено - если записать в регистр FSR номер ячейки памяти - то в регистре INDF будет значение этой ячейки, с которым можно работать как с самой ячейкой.
И код тогда нужен примерно такой:
Всего 5 строк!
И код тогда нужен примерно такой:
Код: Выделить всё
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 (и далее) сохранено значение времени
- valentinovich
- Электрический кот
- Сообщения: 1004
- Зарегистрирован: Ср окт 04, 2017 20:47:40
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Такому форумчанину и помогать приятно!profradio Разобрался!
У дачи вам profradio в освоении программирования.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Продолжу тему.
Заглянул в Proteus7,7 sp2 - SAMPLES\VSM for PIC16\PIC Doorbell\
Увидел там вот такие команды
... movlw tune0 / 0x100 ; как это понимать?
movwf tptrh
movlw tune0 % 0x100 ; как это понимать?
movwf tptrl
...
Полный текст программы.
Заглянул в 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
- КРАМ
- Друг Кота
- Сообщения: 25391
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Так и понимать:
movlw tune0 / 0x100 => WREG=tune0/0x100, где tune0 - константа, которая должна быть объявлена в коде или в хедере.
Соответственно
movlw tune0 % 0x100 => WREG=остаток от деления (tune0/0x100)
Все это математика препроцессора.
Но так как tune0 - это МЕТКА, то есть по факту АДРЕС, то значение адреса и будет константой.
movlw tune0 / 0x100 => WREG=tune0/0x100, где tune0 - константа, которая должна быть объявлена в коде или в хедере.
Соответственно
movlw tune0 % 0x100 => WREG=остаток от деления (tune0/0x100)
Все это математика препроцессора.
Но так как tune0 - это МЕТКА, то есть по факту АДРЕС, то значение адреса и будет константой.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Не догоняю. Как это можно прокоментировать?
- КРАМ
- Друг Кота
- Сообщения: 25391
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
В коде tune0 прибит гвоздями к конкретному адресу:
То есть tune0=0х0080
Но код написан так, что tune0/tune1 могут быть размещены на произвольный адрес. Поэтому, чтобы изменение расположения таблиц не требовало изменения констант в коде, применен расчет страницы (деление на 0х100) и смещения в странице (остаток от деления) препроцессором.
Посмотрите содержимое флеша (дизасм), там нет никаких делений и подставлены уже результирующие константы.
ЗЫ. Вообще метод расчета констант из меток - плохая идея. При перемещаемом коде (линкер определяет позицию метки) всё это перестает работать. Патамушта препроцессор работает ДО линкера и он не может получить значение метки.
Код: Выделить всё
org 0x0080
; Tune 0 Data
; Bach 'Badinerie' from Suite No 2
tune0 retlw 0x17 ;B
retlw 0x78 ;240
retlw 0x1A ;D
Но код написан так, что tune0/tune1 могут быть размещены на произвольный адрес. Поэтому, чтобы изменение расположения таблиц не требовало изменения констант в коде, применен расчет страницы (деление на 0х100) и смещения в странице (остаток от деления) препроцессором.
Посмотрите содержимое флеша (дизасм), там нет никаких делений и подставлены уже результирующие константы.
ЗЫ. Вообще метод расчета констант из меток - плохая идея. При перемещаемом коде (линкер определяет позицию метки) всё это перестает работать. Патамушта препроцессор работает ДО линкера и он не может получить значение метки.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Похоже там еще и "прыжки по указателю" задействованы...
А это уже в комплекте с PCLATH пойдет (вычисляемый переход)... в зависимости от садизма автора исходника.

А это уже в комплекте с PCLATH пойдет (вычисляемый переход)... в зависимости от садизма автора исходника.
Последний раз редактировалось BOB51 Пн дек 28, 2020 17:01:11, всего редактировалось 1 раз.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Я думал это полезный финт которого я не знал. Оказалось это не так. Спасибо.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Очень полезный, но требует весьма много внимания и аккуратности.
Поскольку во многих случаях надо где-то хранить предшествующее значение PCLATH, а у среднемладших прямое помещение в аппаратный стек... проблематично - надо делать программный стек. Второе - нет переноса из PCL (при операциях, где результат операции размещается в PCL) при переполнении в PCH.
В то же время прием "вычислительного перехода" по адресу, формируемому содержимым
"PCLATH:результат операции с PCL",
специфичный именно для среднемладших ПИКов, весьма удобная штука.

Поскольку во многих случаях надо где-то хранить предшествующее значение PCLATH, а у среднемладших прямое помещение в аппаратный стек... проблематично - надо делать программный стек. Второе - нет переноса из PCL (при операциях, где результат операции размещается в PCL) при переполнении в PCH.
В то же время прием "вычислительного перехода" по адресу, формируемому содержимым
"PCLATH:результат операции с PCL",
специфичный именно для среднемладших ПИКов, весьма удобная штука.
Re: Вопрос по адресации к ячейкам памяти МК pic в асм
Может быть Вы правы. Вот такое обращение с 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

