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

Поклонники продукции Microchip Technology Inc тусуются тут.
profradio
Встал на лапы
Сообщения: 105
Зарегистрирован: Чт фев 11, 2016 16:59:20
Откуда: Иркутск

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

Сообщение profradio »

Учусь писать программу на 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 строк
Реклама
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

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

Сообщение RoboC »

меньше чем 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 раз.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

что за МК (10,12,16 или 18-я серии, энхансед среднемладшие)?
что откуда читаем и куда пишем (таблица из ПЗУ в ОЗУ или чтение/запись массива данных в пределах ОЗУ)?
:roll:
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

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

Сообщение RoboC »

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

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

Явно не ПЗУ
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Реклама
Эиком - электронные компоненты и радиодетали
profradio
Встал на лапы
Сообщения: 105
Зарегистрирован: Чт фев 11, 2016 16:59:20
Откуда: Иркутск

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

Сообщение profradio »

MK Pic16F648A - Считаем количество переполнений таймера TMR0 - в регистре оперативной памяти "К" - а далее нужно выгрузить это значение в регистр ОП с 1 по 50.
А нельзя обратиться к оперативной памяти по номеру ячейки (плюс Сhet)?
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Вообще-то есть косвенная адресация к ОЗУ...

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

movwf INDF
incf FSR,f
:roll:
Реклама
profradio
Встал на лапы
Сообщения: 105
Зарегистрирован: Чт фев 11, 2016 16:59:20
Откуда: Иркутск

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

Сообщение profradio »

[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 строк.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25391
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

Шозабред? Зачем для упорядоченного массива данных писать табличный код непосредственной адресации?
BOB51 всё объяснил.
Обращение к массивам данных реализуют через индексы или указатели (что в общем одно и тоже по сути).
Для этих целей в обсуждаемой архитектуре есть специальный регистр-указатель (FSR) и виртуальное "окно" доступа (INDF) по этому указателю.
ЗЫ. Даже если массив и неупорядочен, то таблица может пересчитывать адрес для FSR, но реализовывать кучу вариантов кода путем непосредственной адресации (адрес данных в инструкции) - это идиотизм.
profradio
Встал на лапы
Сообщения: 105
Зарегистрирован: Чт фев 11, 2016 16:59:20
Откуда: Иркутск

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

Сообщение profradio »

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

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

Сообщение BOB51 »

ШПОРА_PIC10_12_16.pdf
(648.72 КБ) 224 скачивания
и ссыль на учебно -практическую документацию на русском:
http://www.microchip.ru/lit/?mid=1x0
там на выбор изучающего.
PIC16F62X как раз про 627 - 628 (более ранние версии 648го)
8)
profradio
Встал на лапы
Сообщения: 105
Зарегистрирован: Чт фев 11, 2016 16:59:20
Откуда: Иркутск

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

Сообщение profradio »

Разобрался! Все на первый взгляд очень просто устроено - если записать в регистр 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 строк!
Аватара пользователя
valentinovich
Электрический кот
Сообщения: 1004
Зарегистрирован: Ср окт 04, 2017 20:47:40

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

Сообщение valentinovich »

profradio Разобрался!
Такому форумчанину и помогать приятно! :)
У дачи вам profradio в освоении программирования. :beer:
otest
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

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

Сообщение otest »

Продолжу тему.
Заглянул в 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 - это МЕТКА, то есть по факту АДРЕС, то значение адреса и будет константой.
otest
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

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

Сообщение otest »

Не догоняю. Как это можно прокоментировать?
Вложения
mov1.gif
(14.94 КБ) 198 скачиваний
mov.gif
(14.06 КБ) 198 скачиваний
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25391
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

В коде 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) и смещения в странице (остаток от деления) препроцессором.
Посмотрите содержимое флеша (дизасм), там нет никаких делений и подставлены уже результирующие константы.
ЗЫ. Вообще метод расчета констант из меток - плохая идея. При перемещаемом коде (линкер определяет позицию метки) всё это перестает работать. Патамушта препроцессор работает ДО линкера и он не может получить значение метки.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Похоже там еще и "прыжки по указателю" задействованы...
А это уже в комплекте с PCLATH пойдет (вычисляемый переход)... в зависимости от садизма автора исходника.
:wink:
Последний раз редактировалось BOB51 Пн дек 28, 2020 17:01:11, всего редактировалось 1 раз.
otest
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

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

Сообщение otest »

Я думал это полезный финт которого я не знал. Оказалось это не так. Спасибо.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение otest »

Может быть Вы правы. Вот такое обращение с 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
Ответить

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