Salta la barra di navigazione [1] - Vai alla barra di navigazione [3] - Scrivimi una mail [4]

PIC18: macro

Assembly PIC18 - PIC18 in C - Sommario - Novità - Tutorial - Progetti - Risorse - Non solo elettronica

PIC18: macro

In fase di sviluppo Stesura preliminare In fase di sviluppo

Una macro è un pezzo di codice generato in fase di compilazione che permette di eseguire parti ripetitive in modo compatto e semplice da comprendere

In questa pagina ho raccolto alcune macro che mi è capitato di usare in alcuni esempi.

Per utilizzare quanto qui descritto è necessario copiare il file riportato a fondo pagina nel progetto ed includerlo nel file sorgente (#include "Vv_macro.inc")

Un semplice esempio

Questo primo esempio mostra come scrivere una macro che configura gli otto pin di PORTC come uscita. Ovviamente è sufficiente azzerare il corrispondente registro TRIS (e quindi in questo caso l'uso delle macro non rende più compatto il numero di righe da scrivere...)

Innanzitutto occorre scrivere il codice sorgente della la macro, compreso tra le parole chiave macro ed endm, assegnando un nome:

PORTC_OUT macro
          clrf TRISC
          endm

Per utilizzarla, occorre semplicemente scrivere all'interno del codice, come fosse una normale istruzione:

Programma CODE 0
  PORTC_OUT
here
  bra here

Il codice eseguibile generato ignora la presenza della macro in corrispondenza della sua definizione e, quando utilizzata all'interno del programma, la sostituisce il codice corrispondente:

Macro disassemblata

Il seguente esempio mostra una macro per configurare PORTB come ingresso con pull-up. In questo caso il codice sorgente appare, oltre che più chiaro, anche più compatto.

PORTB_IN macro
  movlw 0xFF
  movwf TRISB
  movwf WPUB
  bcf INTCON2, 7
  endm

Programma CODE 0
  PORTB_IN
here
  bra here

Di seguito il codice eseguibile generato dall'assemblatore. Tra le righe 17 e 20, la cosiddetta espansione della macro.

Codice di ritardo

Vogliamo scrivere il codice che introduce un ritardo significativo, utile per esempio nel far lampeggiare i LED su scala "umana".

L'idea potrebbe essere quella di utilizzare una variabile che, da un valore elevato, viene decrementata fino a zero all'interno di un loop, senza fare nulla di utile se non aspettare il passare del tempo. Per esempio potete fare riferimento a quanto descritto nella pagina Subroutines e stack

Questa idea è implementata dalla macro DELAY_ms_Vv xxx, dove xxx è un numero compreso tra 1 e 255 che indica il ritardo introdotto in millesimi di secondo. A fondo pagina un esempio, funzionante esclusivamente con clock del processore pari a 1 MHz (nota 1)

Stack

Prima di cominciare potrebbe essere utile leggere una breve descrizione intuitiva di cosa è uno stack. La gestione dello stack software nel PIC18 può essere facilitata da alcune macro:

PUSH_Vv macro registro
Salva nello stack un qualunque registro

POP_Vv macro registro
Recupera dallo stack un qualunque registro

INIT_STACK macro
Inizializza lo stack. Macro da usare prima di qualunque operazione con lo stack

Un esempio d'uso completo:

primo UDATA ; variabili generiche
a res 1 ; prima variabile, 1 byte
b res 1 ; seconda variabile, 1 byte
c res 1 ; terza variabile, 1 byte

demo CODE

  INIT_STACK ; prima di usare lo stack, occorre inizializzarlo
  banksel a

  movlw 0x51 ; memorizzo alcuni numeri nelle variabili
  movwf a
  movlw 0x52
  movwf b
  movlw 0x53
  movwf c
  movlw 0x50

  PUSH_Vv WREG ; il registro W è salvato nello stack
  PUSH_Vv a    ; tre variabili sono salvate nello stack
  PUSH_Vv b
  PUSH_Vv c

  clrf a ; le variabili vengono modificate (azzerate)
  clrf b
  clrf c
  movlw 0x0

  POP_Vv c ; le variabili vengono recuperate dalla stack
  POP_Vv b ; si noti l'ordine con cui sono recuperate
  POP_Vv a
  POP_Vv WREG

Note

  1. Il PIC18 può utilizzare un'enorme varietà nella frequenza del suo clock, da 32 KHz (o anche meno) a 64 MHz. 1 MHz è, per molti modelli, la frequenza predefinita

Il codice e gli esempi

Ultima modifica di questa pagina: 18 maggio 2016


Assembly PIC18

Licenza Creative Commons Attribuzione 4.0 Internazionale


EN - Pagina principale - Sommario - Accessibilità - Note legali e privacy policy - Posta elettronica

XHTML 1.0 Strict - CSS 3