home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


PIC midrange enhanced, muovere dati con indicizzazione.
     
Autore Messaggio opzioni
picmicro675




una ogni 10 livelli


postato il:
17.02.2019, alle ore 13:56
PIC midrange enhanced, muovere dati con indicizzazione. 

Ciao forum,
il titolo da una figura di cosa sarei curioso di sapere a livello di assembly.
Stavo studiando una situazione di ottimizzazione per un 16F1826, che usa il codice avanzato di assembly. Ora visto che si tratta(va) di muovere dei dati dalla memoria programma (la flash) ad un buffer di trasmissione, ho notato solo questa pagina
http://microchipdeveloper.com/mcu1102:indirect-addressing
Io vorrei fare questa operazione
    LIST  P = 16F1826, F = INHX32, W = 2, X = ON, R = DEC, MM = ON, N = 0, C = 255
    #include <p16f1826.inc>
    cblock 0x20
    txbuffer:8, count
    endc
cmpi16      macro   Y,CONST,FAR
            local       NEAR
            clrc
            movf        Y+1,W
            sublw       high (CONST)
            bnc         FAR
            bnz         NEAR
            movf        Y,W
            sublw       low (CONST)
            bc         FAR
NEAR
            endm


    movlw (high txmtdata) | 0x80
    movwf FSR0+1
    movlw low txmtdata
    movwf FSR0
repeat
    movlw txmtdata & b'0011111'
    bsf WREG,5
    movwf FSR1+1
    movlw low txbuffer
    movwf FSR1
    call copy
    cmpi16 FSR0, enddata, endloop
    goto repeat
endloop
    goto $

copy
    movlw 8
    movwf count
loop
    moviw FSR0++
    movwi FSR1++
    decfsz count
    goto loop
    call senddata
    return

senddata
    return

txmtdata
    dt 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 109,235, 0,0,1, 109,235
    dt 0,0,1, 109,235
    dt 0,0,1, 109,235, 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 114,188
    dt 0,0,1, 114,188, 8,1,1, 114,153, 8,2,1, 114,98, 8,3,1, 114,218
    dt 8,4,1, 114,167, 8,5,1, 114,31, 8,6,1, 109,179, 8,7,1, 114,92
    dt 8,8,1, 99,72, 8,9,1, 114,166, 8,10,1, 114,93, 8,11,1, 109,178, 8,12,1
    dt 114,152, 8,13,1, 99,118, 8,14,1, 109,140, 8,15,1, 114,99, 8,16,1, 109,8
    dt 8,17,1, 109,176, 8,18,1, 109,75, 8,19,1, 114,164, 8,20,1, 114,217, 8,21,1
    dt 109,54, 8,22,1, 109,205, 8,23,1, 114,34, 0,0,1, 114,188, 0,0,1, 114,188
    dt 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 109,235, 0,0,1
    dt 114,188, 0,0,1, 109,235, 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 114,188
    dt 0,0,1, 114,188, 0,0,1, 109,235, 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1
    dt 114,188, 0,0,1, 109,235, 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 114,188
    dt 0,0,1, 109,235, 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 109,235
    dt 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 109,235
    dt 0,0,1, 109,235, 0,0,1, 109,235, 0,0,1, 109,235, 0,0,1, 114,188, 0,0,1
    dt 114,188, 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 114,188, 0,0,1, 114,188
enddata
    end

Siccome non ho ancora il micro, stavo facendo delle prove con il simulatore di MPLAB 8.60, ma il byte va in una posizione diversa da txbuffer.
Dove trovo l' errore ?



Anno nuovo, forum nuovo.
Mi sa che lascio.
picmicro675




una ogni 10 livelli


postato il:
18.02.2019, alle ore 13:12
Credo di aver capito come funzione. Scrivo a beneficio di chi potrebbe incorrere in una simile situazione.
Magari marsram ha la risposta.
Ho letto anche questo documento
https://www.microchip.com/stellent/groups/SiteComm_sg/docume…
Che comunque non spiega come funziona il metodi di puntatori con (in|de)cremento.

Assumendo di fare nel metodo consueto, la RAM inizia alla locazione 0x20 per ogni banco. Questo ci permette di caricare FSRxHL con l' indirizzo del blocco di RAM puntato, per fare la copia da flash a RAM. Ovviamente il bit 7 di FSRxH rimane a 0 per la RAM e bisogna tenere conto dei salti di banco. Questo modo lo si fa con diversi micro della famiglia midrange.

Nel metodo enhanced, si può far vedere la RAM in modo contiguo, l' indirizzo di base della RAM è 0x00. Questo per prendere l' indirizzo del blocco RAM bisogna fare il calcolo di sottrarre 32 all'indirizzo del blocco voluto (tipo il txibuffer).

Nell'esempio succitato, allora si dovrà impostare FSRxH a 0x001xxxxx e caricare FSRxHL con txbuffer -20, che risulta 0x2000. Il secondo byte sarà 0x20 - 32 = 0.



Anno nuovo, forum nuovo.
Mi sa che lascio.
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale