Utente:Camillo/Sand2
Da Wikipedia, l'enciclopedia libera.
IN PREPARAZIONE ________________________________________________________________ ________________________________________________________________
[B]Introduzione[/B]
In questo mini corso tratteremo l'[URL="http://it.wikipedia.org/wiki/Assembly"]assembly[/URL] per [URL="http://it.wikipedia.org/wiki/PIC"]PIC[/URL] utilizzando l'[URL="http://it.wikipedia.org/wiki/Assembler"]assemblatore[/URL] MPASM che Š fornito dalla Microchip assieme a MPLAB per 3 ragioni: Š completo, Š gratuito ed Š quello ufficiale della casa produttrice dei PIC. Ci limiteremo a trattare l'assembly dei PIC serie 16 con qualche accenno a quello della serie 18. O meglio tratteremo l'assembly a 14 BIT e non quello a 12 o 16 BIT. Per informazione; l'assembly a 14 BIT ha solo 4 istruzioni in pi— di quello a 12 BIT mentre il 16 BIT ha pi— del doppio di istruzioni.
Questo corso non pretende di sostituire, neppure parzialmente, il manuale ufficiale dello MPASM (33014j.pdf 270 pagine) ne di esserene una traduzione. Un documento di 8 pagine comodo per consultazione Š il [I]Quick Chart[/I] (30400g.pdf).
L'assembly, in definitiva, Š l'insieme delle convenzioni (sintassi) utilizzate da un certo assemblatore per tradurre un linguaggio umano in un liguaggio capibile dalla macchina.
L'assemblatore Š quel programma che serve per tradurre il programma sorgente scritto con un editor di testi in un file col quale Š possibile programmare fisicamente il nostro PIC per fargli fare quello che desideriamo. Il file sorgente deve essere scritto con un editor che non inserisca caratteri speciali (o di formattazione) nel testo. In genere la sua sottoestensione Š "*.asm". Mentre la sottoestensione del programma generato Š "*.hex". L'assemblatore pu• anche creare dei file intermedi o di supporto ad esempio il file che contiene l'elenco degli errori "*.err".
Vengono enunciate delle linee guida a cui non Š obbligatorio attenersi. Per• se tutti si attenessere verrebbe facilitata una futura lettura del programma anche se scritto da altri.
Non vengono trattate le possibilit… di MPASM di generare del codice rilocabile e quindi poter creare delle librerie riutilizzabili senza ulteriore compilazione. La possibilit… di utilizzare un macro linguaggio verr… trattata in maniera non approfondita.
[B]Il PIC in breve[/B] Tutti i PIC sono dei [URL="http://it.wikipedia.org/wiki/Microcontrollore"]microcontrollori[/URL]
perch‚ diversamente dai
[URL="http://it.wikipedia.org/wiki/Microprocessore"]microprocessori [/URL] possiedono internamente tutto quanto necessario a farli funzionare: ROM, RAM, generatore di clock, di reset e quant'alto atto a svolgere determinate funzioni.
Il PIC ha un'[URL="http://it.wikipedia.org/wiki/Architettura_%28hardware%29"]architettura[/URL]
interna detta di Harvard dove i vari BUS (programma,
RAM, stack) sono separati in contrapposizione a quella di [URL="http://it.wikipedia.org/wiki/Architettura_von_Neumann"]von Neumann[/URL] dove il BUS Š uno solo. A causa di ci• il programma pu• vedere solo la RAM dove risiedono tutte le variabili dette [I]file[/I] (f) e i registri attraverso i quali Š possibile agire sulle funzionalit… interne del microcontrollore. Il registro principale e designato [I]working[/I] (W) ed Š quello attraverso il quale si svolgono tutte o quasi le operazioni da farsi. E' quello che di solito viene chiamato accumulatore.
[B]Sorgente[/B]
Ogni riga del sorgente pu• contenere fino a 4 dei seguenti tipi di informazione: etichette, codice operativo, operandi e commenti. Il loro ordine e posizione Š importante. L'etichetta deve iniziare in prima colonna, il codice operativo dalla seconda colonna in avanti, gli operandi (se presenti) seguono quest'ultimo e il commento pu• iniziare in qualunque colonna. La larghezza massima di ogni riga Š di 255 caratteri.
[I]Etichetta.[/I] inizia in prima colonna e pu• essere lunga fino a 32 caratteri. Di default Š sensibile al segno grafico (case sensitive), caratteri maiuscoli o minuscoli hanno significato diverso (pippo e Pippo sono 2 etichette diverse). La case sensitivity Š disattivabile da linea di comando, ma nessuno lo fa. Deve iniziare con un carattere alfabetico o con un sottolineato (_pippo) gli altri caratteri possono essere alfanumerici, sono validi sia il sottolineato che il punto interrogativo (a_1?2?3 Š un'etichetta accettata). Per chiarezza la riga contenente l'etichetta sarebbe meglio che non contenesse nessun codice operativo. Come indicatore di etichetta e per facilitare la ricerca Š meglio (ma non indispensabile) che l'etichetta finisse con il "due punti" (pippo:).
[I]Codice operativo.[/I] Š l'istruzione nmemonica che da all'assemblatore la direttiva per generare il codice che sar… poi eseguita dal processore. Non pu• iniziare in prima colonna ma in qualunque delle altre, di norma lo si fa iniziare dopo una tabulazione (ottava colonna). Non Š sensibile al segno grafico (nop e NOP sono lo stesso codice).
[I]Operando.[/I] Ogni istruzione Š composta da un codice operativo seguito dai suoi eventuali operandi. Gli operandi seguono il codice operativo sulla stessa riga separati da esso almeno da uno spazio o meglio da una tabulazione. Per separare gli operandi quando sono pi— di uno si deve utilizzare la virgola.
[I]Commento.[/I] inizia con il carattere "punto virgola" in qualunque punto della riga e finisce con essa. Tutti i caratteri all'interno del commento sono ignorati dall'assemblatore. Quando va messo il commento? sempre. Soprattutto in assembly si consiglia di commentare parecchio, al limite ad ogni riga. Il commento di spiegazione in testa alle routine Š sempre necessario, ma anche prima di un blocco di istruzioni finalizzate allo svolgimento di un certo compito. Una bella spiegazione non fa mai male.
[B]Costruzione di un sorgente[/B]
Un programma sorgente assembly (ma anche con quasi tutti i linguaggi) Š costituito da 2 parti principali: una parte dichiarativa e una parte di programma vero e proprio (corpo). La parte dichiarativa contiene tutte le direttive di linguaggio che vengono recepite dall'assembler per poter poi assemblare correttamente il sorgente. In questa parte si devono inserire tutte le costanti (in genere scritte totalmente in maiuscolo) e le variabili (in genere scritte totalmente in minuscolo) utilizzate nel corpo del programma. Le direttive accettate da MPASM sono una sessantina, non vengono utilizzate tutte ma solo quelle che occorrono. Alcune vengono anche utilizzate nel corpo del programma.
Il corpo del programma Š costituito a sua volta di altre 2 parti: una parte di inizializzazione ed una parte che contiene il nucleo vero e proprio del programma. L'inizializzazione viene svolta una volta sola e contiene tutto quanto serve al processore per ben funzionare, settaggi porte, registri, variabili ecc. Il nucleo del programma in genere Š strutturato come giro (loop) infinito.
[B]Numeri[/B]
Quando si deve inserire un numero Š possibile esprimerlo utilizzando la base numerica pi— consona. Le basi utilizzabili sono 4: in base 2 (binaria), 8 (ottale), 10 (decimale) e 16 (esadecimale). L'ottale Š caduto in disuso ma le altre 3 sono comunemente utilizzate. La base di default Š l'esadecimale ma per umana comodit… si usa cambiarla in quella decimale utilizzando la direttiva di linguaggio RADIX o la direttiva LIST con il parametro opportuno. Esiste un'ulteriore modo di inserire un numero ed Š l'inserimento di un carattere secondo la tabella ASCII. Quando si inserisce un numero puro e semplice questo viene espresso con la radice scelta, rimane comunque la possibilit… di utilizzare le altre radici esprimendole in maniera opportuna secondo la seguente tabellina: ASCII A'6' '6' Binario B'00110110' 00110110b Decimale D'54' 54d Esadecimale H'36' 36h 0x36 Ottale O'66' 66o
Il carattere specifico di radice numerica pu• essere scritto sia maiuscolo che minuscolo (case insensitive). Quelli pi— usati non sono quelli della prima serie rappresentata.
Con questo assembly Š possibile utilizzare gli operatori aritmetici tipici del linguaggio "C" retaggio del fatto che per l'implementazione dell'assemblatore Š stato utilizzato questo linguaggio. Questa particolarit… viene parecchio utile in alcuni casi.
[B]Istruzioni[/B]
Lo mnemonico dell'istruzione Š formato da un codice operativo e da zero o pi— operandi. La categorizzazione delle istruzioni pu• essere fatta in diverse maniere quello che segue Š quello adottato: carico o movimento, logico aritmetiche, salto, controllo e istruzioni speciali.
Convenzioni: w, Š il working register (accumulatore). f, byte di RAM o registro (file). bit, numero indicante il bit interessato. destinazione, pu• essere il file se 1 o W se 0. numero, pu• valere da 0 a 255 (byte). indirizzo, Š l'indirizzo (etichetta) in cui si desidera saltare.
[U]Carico o movimento[/U] [I]bcf file,bit[/I] azzera il bit (clear). [I]bsf file,bit[/I] mette a 1 il bit (set). [I]clrf file[/I] azzera totalmente il file o il registro. [I]clrw azzera il working register. [I]comf file,destinazione[/I] complementa il file, 1<-->0. [I]decf file,destinazione[/I] decrementa il file. [I]incf file,destinazione[/I] incrementa il file. [I]movf file,destinazione[/I] mette il file in... normalmente W. [I]movlw numero[/I] mette in W un numero (byte). [I]movwf file[/I] mette il contenuto di W in file [I]swapf file,destinazione[/I] i 4 bit bassi in quelli alti e viceversa.
[U]Logico aritmetiche[/U] [I]addlw numero[/I] [I]addwf file,destinazione[/I] [I]andlw numero[/I] [I]andwf file,destinazione[/I] [I]iorlw numero[/I] [I]iorwf file,destinazione[/I] [I]rlf file,destinazione[/I] [I]rrf file,destinazione[/I] [I]sublw numero[/I] [I]subwf file,destinazione[/I] [I]xorlw numero[/I] [I]xorwf file,destinazione[/I]
[U]Salto[/U] [I]btfsc file,bit[/I] [I]btfss file,bit[/I] [I]call indirizzo[/I] [I]decfsz file,destinazione[/I] [I]goto indirizzo[/I] [I]incfsz file,destinazione[/I] [I]retfie[/I] [I]retlw numero[/I] [I]return[/I]
[U]Controllo[/U] [I]clrwdt[/I] [I]nop[/I] [I]sleep[/I]
[U]Istruzioni speciali[/U]
Sono delle istruzioni di comodo (pseudo istruzioni) non facenti parte del set normale ma gestite dall'assemblatore come fossero delle vere istruzioni. La Microchip sconsiglia il loro uso nei nuovi progetti (pag.242 del manuale). Sono una trentina, per ora non verranno spiegate. Le pi— usate sono: [I]movfw file[/I] mette il file in W. [I]tstf file[/I] test dello zero del file. [I]clrc[/I] azzera il flag di carry. E poi le istruzioni di salto o di skip condizionato sopratutto con zero e con carry.
[B]Flag[/B]
Sono dei BIT nel registro STATUS che intervengono dopo aver eseguito delle operazioni logico aritmetiche. Sono: [I]zero[/I] quando il risultato dell'operazione Š zero. [I]carry[/I] quando il risultato dell'operazione ha un riporto. [I]digit carry[/I] come il carry ma sui primi 4 BIT.
promemoria --------------------------------
E per finire; dopo aver commentato per bene il sorgente; commentate ancora e poi ancora.
[URL="http://it.wikipedia.org/wiki/___"]___[/URL]
________________________________________________________________ ________________________________________________________________ PIC è una famiglia di circuiti integrati a semiconduttore con funzioni di microcontrollore. Microchip technology non usa il termine PIC come un'acronimo; il suo nome aziendale è: "PICmicro". Anche se generalmente sta per "Peripheral Interface Controller", originariamente la "General Instrument" usava l'acronimo di "Programmable Intelligent Computer".
Originariamente sviluppato nel 1975 è in grado di svolgere un set di istruzioni ridotto (RISC).
[modifica] Versioni
Nell'arco del tempo di PIC ne sono state fatte una miriade di versioni sia come tecnologia costruttiva, come forma fisica (numero di piedini) e come quantità e tipo delle memorie e delle funzioni di ingresso uscita.
Ne sono state fatte versioni con programma su ROM mascherata quindi non riprogrammabili, versioni CMOS non riprogrammabili OTP, versioni EPROM con finestra e versioni con memoria flash.
Le versioni CMOS hanno all'interno del nome del componente una 'C' (es.PIC16C505), le versioni ROM hanno 'CR' (es.PIC16CR57A) e le versioni flash hanno una 'F' (es.PIC18F452).
[modifica] Istruzioni
Il set di istruzioni del PIC ne comprende 33 nelle versioni di bassa potenza e fino a 70 in quelli più performanti. Ogni istruzione per essere eseguita impiega 4 cicli dell'oscillatore. Tranne le istruzioni che comportano un salto all'interno della memoria (GOTO, CALL, RET) che impiegano 8 cicli, nelle versioni recenti vi sono altre istruzioni che impiegano 8 cicli come quelle di trasferimento dati tra memoria e memoria (MOVFF).
[modifica] Architettura interna
L'architettura è di tipo Harvard a Bus separati, i Bus dati e contolli sono a 8 BIT le istruzioni hanno un formato a 12, 14 o 16 BIT.
Nelle ultime versioni è stata inplementata un'architettura a 16 BIT. Esiste anche il Bus dello stack a partire da 9 BIT in su.
[modifica] Memorie
A causa dell'architettura RISC dove nell'istruzione oltre al significato è compreso anche l'indirizzo di memorizzazione o di salto la memoria viene segmentata. Per cambiare segmento in uso occorre agire su appositi registri. Questa è una scocciatura per i programmatori in assembler e foriera di molti problemi.
[modifica] RAM
La RAM ha una larghezza di 8 Bit e una profondità che varia da pochi byte (25 nei PIC15C5x) fino a qualche kibibyte.
[modifica] Di programma
La larghezza della parola di programma varia da 12 BIT (es.PIC16C54) a 14 BIT (es.PIC16F628) a 16 BIT (es.PIC18F4520).
La sua profondità varia da 256 byte a 128 kibibyte (KiB).
[modifica] Stack
Lo stack è mantenuto in una memoria separata con un suo Bus la cui profondità parte dalle 2 posizioni passa per 8 posizioni e giunge alle 32 nei PIC della serie 18. La sua larghezza parte da 9 BIT.
[modifica] EEPROM
Nelle versioni con memoria flash può essere presente una memoria interna di tipo EEPROM accessibile come fosse una periferica per potervi memorizzare in maniera indelebile dei dati. La sua profondità varia da 256 a 1024 byte.
[modifica] Periferiche
La presenza di periferiche a bordo del chip è quella che fa la differenza tra un microprocessore ed un microcontrollore. Nei PIC si parte da dei semplici I/O digitali per arrivare a delle funzioni complesse passando attraverso una notevole varietà di funzioni.
[modifica] I/O
La funzione di ingresso e uscita di dati digitali è stata la prima funzione implementata. Nei PIC è divisa in porte da 8 o meno BIT ognuna. E' possibile programmare ogni BIT come ingresso o come uscita singolarmente.
In alcune versioni è possibile avere degli ingressi con conversione analogico digitale (ADC) da 10 a 12 BIT.
[modifica] Particolarità
La RAM è trattata totalmente come fosse un registro ed ogni suo membro è chiamato file register o più semplicemente file.
Non esiste un accumulatore vero e proprio ma un registro chiamato W (Working register) e i risultati di tutte le operazioni locico aritmetiche possono essere messi indifferentemente nel file operando o in W.
[modifica] ============================
Per poter svolgere le funzioni volute occorre programmare l'apposita memoria interna che puo essere in tecnologia CMOS oppure flash.
Questa programmazione è svolta da apposite apparecchiature chiamate programmatori. I programmatori utilizzati possono essere diversi. I più conoscuiti sono quelli della casa madre dei PIC, la Microchip Technology, che fornisce una serie di programmatori (PIC Start Plus, Pro Mate, ICD2).
I PIC, ricevono una serie di istruzioni in formato esadecimale (Assembler), tale per cui le celle di memoria presenti all'interno dei chip si settano in modo tale da inizializzare i PIC: definire gli ingressi, le uscite, settare le locazioni di memoria e di conseguenza fare in modo che possa svolgere una determinata funzione all'interno di un circuito più o meno complesso.
The original PIC was built to be used with GI's new 16-bit CPU, the CP1600. While generally a good CPU, the CP1600 had poor I/O performance,
In 1985 GI spun off their microelectronics division, and the new ownership cancelled almost everything — which by this time was mostly out-of-date. The PIC, however, was upgraded with EPROM to produce a programmable channel controller, and today a huge variety of PICs are available with various on-board peripherals (serial communication modules, UARTs, motor control kernels, etc.) and program memory from 512 words to 32k words and more (a "word" is one assembly language instruction, varying from 12, 14 or 16 bits depending on the specific PICmicro family).
[modifica] Coding for PICs
PICs use a RISC instruction set, which varies in length from about 35 instructions for the low-end PICs to about 70 instructions for the high-end PICs. The instruction set includes instructions to perform a variety of operations on the accumulator and a constant or the accumulator and a memory location, as well as for conditionally executing code and jumping/calling other parts of the program and returning from them, and specific hardware features like interrupts and one low-power mode called sleep. Microchip provides a freeware IDE package called MPLAB, that also includes a software simulator as well as an assembler.
Third parties make C and BASIC language compilers for PICs. Microchip also sells compilers for the high-end PICs ("C18" for the 18F series and "C30" for the dsPICs). They also make available for download a "student edition/demo" version of C18 which disables some optimiser features after a timeout period. Open-source compilers for the C, Pascal, JAL, and for the Forth programming language, PicForth, have also been released.
GPUTILS is an Open Source collection of tools, distributed under the GNU General Public License. GPUTILS includes an assembler and linker and works on Linux, Mac OS X, OS/2 and Microsoft Windows. GPSIM is an Open Source simulator for the PIC microcontrollers featuring hardware modules that simulate specific devices that might be connected to them, like LCDs.
[modifica] Programming PICs
Devices called "programmers" are traditionally used to get program code into the target PIC. Most PICs that Microchip sells nowadays have ICSP (In Circuit Serial Programming) and/or LVP (Low Voltage Programming) capabilities, allowing the PIC to be programmed while it is sitting in the target circuit. ICSP programming is performed using the RB6 and RB7 pins for clock and data, while a high voltage (12V) is present on the Vpp/MCLR pin. Low voltage programming allows the elimination of the extra voltage rail in the programmer but comes at the cost of an IO pin and can therefore be disabled (once disabled it can only be re-enabled using high voltage programming). There are many programmers for PIC microcontrollers, ranging from the extremely simple designs that rely on the communications software for taking care of all the communication details to complex designs that can verify the device at several supply voltages and can do much of the work in the hardware. Many of these complex programmers use a pre-programmed PIC themselves to send the programming commands to the PIC that is to be programmed.
Many of the higher end flash based PICs can also write to their own program memory and demo boards are available with a small bootloader factory programmed that can be used to load user programs over an interface such as RS232 or USB.
There are many programmers/debuggers available directly from Microchip:
Microchip Programmers (as of 10/2005)
- PICStart Plus (RS232 serial interface)
- Promate II (RS232 serial interface)
- MPLAB PM3(RS232 serial and USB interface)
- ICD2 (RS232 serial and USB interface)
- PICKit 1 (USB interface)
- PICKit 2 (USB interface)
Microchip In-Circuit Debuggers (as of 10/2005)
- ICD2 (RS232 serial and USB interface)
Microchip Emulators (as of 10/2005)
- ICE2000 (parallel interface, a USB converter is available)
- ICE4000 (USB interface)
Link to Microchip Development Tools Home Page:
There are also programmers available from other sources, ranging from plans as to how to build your own, to kits to put together yourself, to fully tested ready-to-go units.
An exhaustive list of these is not practical, but a query put out on the piclist (piclist@mit.edu -- subscription required) would quickly provide many answers from the knowledgeable people who frequent that list and are happy to help.
[modifica] Word Size
The word size of PICs is a source of much confusion. All PICs (except the dsPICs) handle data in 8-bit chunks, so they should be called 8-bit microcontrollers. But unlike most CPUs, PICs use a Harvard architecture, so the size of an instruction can be different from the size of the data. In fact, different PIC families use different instruction sizes, which makes it a challenge to compare the code size of PICs to other microcontrollers. For example, say a microcontroller has 6144 bytes of program memory --- for a 12-bit PIC, this works out to 4096 words (or assembly instructions); for a 16-bit PIC, this is 3072 words.
[modifica] Modern PICs
The old PROM and EPROM PICs are now gradually replaced by chips with Flash memory. Likewise the original 12-bit instruction set of the PIC1650 and its direct descendants has been superseded by 14-bit and 16-bit instruction sets. Microchip still sells OTP (one-time-programmable, or PROM) and UV-eraseable (EPROM) versions of most of its PICs for legacy support, or volume orders. It should be noted that the Microchip website lists PICs that are not electrically erasable as OTP despite the fact that UV erasable windowed versions of these chips can be ordered.
[modifica] Features
Current PICs offer a wide range of built-in hardware, such as:
- 8/16 bit Modified Harvard Architecture CPU cores
- Flash and ROM Memory options in 256 byte to 256 kilobyte array sizes
- I/O Ports (0 to 5.5 volts Typical)
- 8/16 Bit Timers
- Nanowatt Technology for Power Moding
- Synchronous/Asynchronous Serial Peripherals USART, AUSART, EUSARTs
- Analog-to-digital converters, 10/12 bit
- Voltage Comparators
- Capture/Compare/PWM modules
- LCD Drivers
- MSSP Peripheral for I2C, SPI, and I2S Communications
- Internal EEPROM Memory - up to 1M erase/write cycles durability
- Motor Control Peripherals
- USB interfacing support
- Ethernet controller support
- CAN controller support
- LIN controller support
- IRDA controller support
- Integrated analog RF front ends (PIC16F639, and rfPIC)
- Keeloq Rolling code encryption peripheral (encode/decode)
[modifica] PICs on the Internet
PICs are well-documented on the Internet, mainly for two reasons. First, PICs were commonly used to defeat the security system of popular consumer products (pay-TV, PlayStation), which attracted the attention of crackers. Second, the now obsolete PIC16F84 was the first widely available microcontroller that could easily be re-programmed by hobbyists. There are many forums and lists concerning PIC microcontrollers where the user can post questions and receive free answers.
[modifica] PIC clones
Every now and then there are companies that offer cheap and/or enhanced PIC versions. Most seem to disappear quite soon. Ubicom (formerly Scenix) seems to avoid this fate and produces PIC clones that run much faster than the originals. OpenCores has a pic16f84 core written in Verilog.
[modifica] Wireless PICs
The rfPIC microcontroller devices integrate the power of Microchip´s PICmicro devices with UHF wireless communication capabilities for low power RF applications. The devices offer small package outline and low external component count to fit the most space-constrained applications.
[modifica] dsPICs (Digital Signal PICs)
dsPICs are Microchip's newest family, which entered mass production in late 2004. They are designed as a PIC with digital signal processing capabilities. These are Microchip's first inherent 16-bit (data) microcontrollers. They build on the PICs existing strengths by offering hardware MAC (multiply-accumulate), barrel shifting, bit reversion, (16x16)-bit multiplication and other digital signal processing operations.
[modifica] 8/16-bit PIC microcontroller product families
These links take you to product selection matrices at the manufacturer's site.
8-bit Microcontrollers
16-bit Microcontrollers
16-bit Digital Signal Controllers
[modifica] Commonly used PICs
- PIC12C508/509 (Small 8-pin package, internal oscillator, popular in small designs such as the iPod remote)
- PIC16F84 (generally considered obsolete, but still popular)
- PIC16F84A (upgrade to above, some versions do 20MHz, 1:1 compatible with PIC16F84)
- PIC16F88 (similar to PIC16F84A with additional features)
- PIC12F629/675/683
- PIC16F628 (replaces the PIC16F84)
- The PIC16F87X family (The PIC16F84's "big brothers", with lots of inbuilt hardware. Quite common in hobby projects.)
- PIC18F452