Tutorials - PIC18

 

Passare da PIC16 a PIC18

 


Indirizzi assoluti e simboli

Sempre in questo ambito, va stigmatizzato l' uso dissennato che alcuni fanno degli indirizzi assoluti. 
I PIC ricevono da MPASM un particolare aiuto sotto forma di numerosi automatismi che semplificano il lavoro del programmatore, a patto, però , che si scriva con la buona norma di utilizzare mnemonici e simboli piuttosto che valori assoluti. 
La pessima e stupidissima abitudine di usare indirizzi assoluti e non simbolici fa si che , a parte l' illeggibilità del sorgente, esso sia portabile solo con grandissima fatica quando le risorse del chip sono differenti.

Ad esempio, è comune trovare nei sorgenti dei PIC righe tipo:

   btfsc  3,0
    goto   $-1

    

Una cosa del genere, sarà anche carina, ma non spiega per niente quello che sta accadendo !
Questo è un palese, e purtroppo comune, esempio di "mala programmazione" , che rende il sorgente per niente trasferibile da PIC16 a 18 (oltre che praticamente illeggibile) !!
Le ragioni di una simile mala scrittura derivano dalla disponibilità, all'inizio delle programmazione Assembly, di strumenti di sviluppo primitivi e dalle prestazioni limitate. Sfortunatamente, nel campo hobbistico, la presenza di esempio basati su questi sistemi primitivi e obsoleti ha fatto proliferare esempi come quello presentato.

Alla luce dello stato dell'arte dell'Assembly, le due righe contengono tre gravissime scorrettezze :
 
- non viene usato lo mnemonico per il registro di STATUS, sostituito dal suo indirizzo assoluto (03 ) , il che rende impossibile trasferire l' istruzione ad un processore il cui STATUS non si trovi all' indirizzo 03, oltre che richiede al lettore di sapere che all' indirizzo 03h si trova il registro di STATUS. Scrivendo la label STATUS tutto sarebbe stato immediatamente chiaro.
 
- similmente non viene usato lo mnemonico per il flag carry, sostituito con la sua posizione come bit nel registro di status, il che rende estremamente difficoltoso capire di cosa si tratti , oltre a ritrovarsi nella condizione di cui sopra. Sarebbe bastato scrivere la lettera C per avere tutto immediatamente chiaro.
 
- viene usato $ al posto di una label, il che rende impossibile  trasferire la riga ad un processore il cui "passo" delle istruzioni sia differente

La non-portabilità di una simile scrittura è immediata. Infatti :
-  nei PIC18F lo STATUS non si trova a 0x03. 
-  come visto prima,  la scorretta abitudine di utilizzare il simbolo $ porta al completo fallimento del goto in ambiente PIC18.

Scrivendola in modo decente come:

test btfsc  STATUS, C
      goto  test   

le cose cambiano parecchio : non si è sicuramente fatto alcuna fatica in più rispetto a prima, nè il listato sorgente resta appesantito, ma, a parte che ora si capisce al primo colpo cosa si sta chiedendo di fare al processore, la prima barbara e analfabeta scrittura deve essere per forza modificata per la portabilità, mentre la seconda non richiede alcuna modifica per essere eseguita identicamente su un PIC16 o un PIC18.

 


Azione

La soluzione ideale è quella di utilizzare le label del file .INC relativo al processore usato e, in generale, abolire ogni riferimento assoluto e sostituirlo con label.

 


 

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 05/06/19.