Microprocessadors

Circuits digitals. Hardware. Microcontroladors. Chip. Memoria de dades. Timers

  • Enviado por: Joan Xinamorts
  • Idioma: catalán
  • País: España España
  • 34 páginas
publicidad
publicidad

APUNTS DE MICROPROCESSADORS

Introducció

Un microprocessador és un circuit digital programable consistent.

Té les següents parts

  • Unitat de Control |

  • Unitat Aritmètrico-Lógica | CPU

  • Registres (mem interna) |

Control Circuit seqüencial que depèn d'un rellotge, la seva freqüència es la pauta temporal del rellotge (ex: 133 MHz)

Microprocessadors

la ALU (Unitat Aritmètico Lógica) Operacions aritmètiques bàsiques i lógiques

Posicions de memòria Dades i Programa, depèn del processador

En el MP hi ha integrat lo següent:

  • Co-processador matemàtic

  • Gestor caché

  • Gestor Entrada/Sortida

Es basa en integrar aquests elements en una pestilla

Sistema en P

Està format per lo següent:

  • Unitat de Control

  • Memòria de Programa (ROM) S'hi guarda el programa en sí

  • Memòria de Dades (RAM) s'hi guarden les variables

  • Dispositius d'entrada/Sortida (Perifèrics)

Ens permeten l'entrada de variables exteriors

  • Port Serial (UART)

  • Port Paral·lel (mateixa amplada del bus de dades)

Microprocessadors

Tipus de captadors de dades

  • Teclat (Keyboard)

  • Sensors de mesura

  • Analògiques

  • Mòduls A/D - D/A

  • Modems

Microprocessadors

En el paral·lel les dades no poden fer llargues distàncies: Impressora / ZIP paralel

Tots aquests elements anteriors s'han de comunicar. Per fer-ho existeix lo següent:

  • BUS de dades

  • BUS d'adreces

  • BUS de control

Microprocessadors

La ROM (mem. Programa) és només de lectura

La RAM (mem. Dades) és de lectura-escriptura

El Bus es qui adreça la memòria depèn de:

  • dades (variables), (LECTURA-ESCRITURA)

  • instruccions (programa) (NOMES LECTURA)

Les adreces dels elements les dóna el bus d'adreces.

El P genera un senyal de control (connectem dispositiu en els busos) i desconnecta tots els altres elements. No hi ha d'haver interferències

Tinc diferents maneres (arquitectures) per col·locar els busos:

Microprocessadors

Tinc 2 busos 2 accessos (ARQUITECTURA VON NEUMANN)

Avantatges i inconvenients:

  • No hi poden haver cruces

  • El seu rendiment és baix

  • Baixa complexitat

  • Masses potes en el Microprocessador. Dificultat de construcció microprocessador

ARQUITECTURA HARVARD

Només utilitza un sol bus per tots els accessos. Avantatges i inconvenients:

  • Possible presència de cruces

  • Alt rendiment

  • Alta complexitat (ús tècniques avanzades)

  • Microprocessador amb poques potes

ARQUITECTURA HÍBRIDA

Microprocessadors

Hi ha altres arquitectures (filosofies)

El que no es pot fer és: | - Adreçar en un perifèric

| - Escriure en un altre perifèric diferent

Si el que fem es enviar un 1 i un 0 al mateix temps provoquem un curtcircuit. Normalment aquest circuits treballen a 5V (1) i 0V (0) com en transistors.

Si hi hagués un cruce petaria perquè la intensitat I = 5-0/R, però R és molt petita, la intensitat seria molt gran.

El CLOCK, Rellotge

Per solucionar el problema dels curtcircuits el que es fa es utilitzar el CLOCK. Aquest el que fa és donar una senyal quadrada de freqüència de MHz.

Les senyals que emetem van en funció del rellotge. Quan hi ha flanc de pujada o baixada ell discretitza la senyal que tenim, exemple:

Microprocessadors

El problema és que tot està supeditat a la freqüència del rellotge

  • Problemes amb la freqüència del CLOCK

  • Lentitud de procés del senyal

  • Se sol utilitzar sols en sistemes petits

  • Grau discretitzacíó depèn de la freqüència

Les Interrupcions

Els dispositius d'E/S estan programats per enviar dades desde l'exterior.

Microprocessadors

M'interessa que les dades arribin ràpidament. Cal avisar de l'arribada d'una dada.

INT = Interrupció Ens avisa de l'arribada de dades.

Sense INTs caldria anar mirant dades i consultat els E/S. Si no hi ha dada haurem derrotxat una entrada.

E/S (pot anar de 2 maneres)

  • Per Consulta (Consulta a E/S)

  • Per Interrupcions

Les interrupcions ens avisen de què algo passa. N'hi ha d'internes i d'externes.

  • Internes: Solen indicar anormalitats de funcionament

  • Externes: Arribades de dades

Es poden donar en qualsevol lloc del programa: MAIN, RUTINA, SUBRUTINA.

Però, què passa si tinc més d'un dispositiu E/S??

El que necessito es un alt rendiment d'intercanvi de dades.

Microprocessadors

Necessito ara 3 entrades interrupció (no solen tenir-se)

El que tenim és un gestor d'interrupcions.

PIC = Controlador Interrupcions

Microprocessadors

Normalment es solen tenir 1 ó 2 INTs.

INT Trencament seqüència programa. Cal un bon gestor si tenim molts E/S

CONSULTA Sols és viable en sistemes petits amb pocs E/S

Sempre dependrà de l'aplicació que vulguem fer.

Microcontrolador 8051

Microprocessadors

P -> Son de propòsit general per a aplicacions diverses. Utilitats.

  • Bases de dades

  • Fulles de Càlcul / Programes de càlcul

  • Processadors de Textos

  • Comunicacions

  • Tractament Gràfic

  • Simulació

C -> Sistemes dedicats que ejecuten el mateix programa de control.

Per aplicacions específiques, normalment en temps real.

  • Integren tots els components en una pestilla

  • Petites capacitats de memòria (normalment ROM>RAM)

Esquemes bàsics de Cs i Ps

Microprocessadors

Microcontroladors

RAM Es per magatzem de variables i piles (stock)

No tenen suport magnètic

  • vectors d'interrupcions en la ROM

  • Preparats per aplicacions en temps real (regulació de sistemes)

  • Tenim instruccions per manipulació de BITs

  • Facilitat operacional amb 1 sol bit (no en P)

  • L'amplada del bus de dades no té importància

  • Tenen mode de “baix consum”

Mode baix consum

Microprocessadors

Per fer la reducció del consum s'utilitza el concepte de sincronisme. El que consumeix energia son les oscil.lacions. Si en fem menos ens consumirà menys. Per tant:

Microprocessadors

Depen de la freqüència. Aquestes són les de treball actualment

P 166/200/233 MHz (no tenen mode IDLE)

C 16/25/40 MHz (normal), en modo idle es solen reduir al 25%

En el mode de baix consum tallem l'accés oscil.lació rellotge a llocs i només reben els circuits bàsics per mantenir el microcontrolador en funcionament.

Una mica d'economia

Què encareix un C?

Microprocessadors

Microprocessadors

HARD $ (circuits integrats, E/S, ROM/RAM)...

SOFT Programari en sí (TESTS SOFT, mem, Test HARD+SOFT)

Necesitem lo següent pel microcontrolador

  • Simulador (ens simula el comportament d'un C en un PC)

  • Emulador (Programa que permet sincronitzar C i PC treballant sobre la placa)

  • Programes de dissseny

  • Oscil.loscopis i analitzadors lògics

Altres característiques:

  • Dispositius de detecció d'errors integrats

  • Supervisió de tensió, timers, paritat

  • Timer watchdog

Els supervisors revisen la tensió de la bateria no baixi d'un cert valor

El watchdog es un contador que passat un temps ens fa un RESET

Reset

Microprocessadors

El watchdog ens fa que si el processador es penja, al cap d'un cert temps es reseteja així es pot tornar a utilitzar. Quan un programa es penja eno controla el sistema i el watchdog va contant i quan arriba a X reseteja. Tornar a executar el programa

  • Es sistema es reinicialitza

  • S'evita el dixcontrol

En un reset tot els registres, flags es posen a un estat determinat (CONEGUT)

Protecció escriptura de la memòria interna.

Si vulguéssim podríem llegir programes d'altres sistemes

Microprocessadors

Utilitzem una cadena d'encriptació per ocultar la informació i no es pugui llegir.

No puc interpretar les ordres i no puc copiar el programa.

La cadena sol tenir 32 BITS.

Rangs de funcionament

  • Quan més ampli és el marge de temperatures i humitat que pot funcionar

Més robust és [ 0 - 40º / 0% - 70% || -20 - 100º / 10% - 95% ]

  • tipus encapsulat

  • Online (alineat en microprocessador)

  • Quadrat

  • Pins en direccions diferents (PLCC, FLCC)

  • Nº de pins variable (40 pins / 24 pins/ 64 pins)

Molts microcontroladors tenen arquitectura HARVARD (1 sol BUS)

Aplicacions

  • Automòbils ( ABS, airbags, sistemes digitals)

  • Electrodomèstics (control funcionament / Electrodomestics programables)

  • Màquines recreatives

  • Robòtica , programació de robots i autòmats

  • Plaques perifèrics de computadors (Mouse / Modems / Tarja de so)

Arquitectura HARVARD

Microprocessadors

Alguns C estan adaptats desde els P de la mateixa marca. Motorola 6800

Altres estan dissenyats específicament INTEL 8051

Modes de funcionament

  • Single Chip (pels microcontroladors)

  • Expanded (pels microprocessadors)

El mode single Chip es basa en què:

  • Pins dedicats a dispositius integrats

  • Pins amb diferents funcions

  • No té memòria externa (no cal treure busos a fora)

Quan es necessiten dispositius externs s'utilitza el mode expandit

  • treure a l'exterior busos adreces i dades

  • No és possible fer-ho amb C amb pocs pins (24 pins)

  • Hi ha una pèrdua de busos, per tant, sacrifici de recursos

Ens llimen les característiques degut a la pèrdua de busos, sacrifiquem recursos.

Configuració del mode de funcionament

6811 Depen de l'estat de les línees al arrancar (Es automatic)

8051 Depen de les instruccions que s'utilitzen | MOV (no recursos externs)

| MOVX (move external)

el MOVX i MOVC converteixen linees de port en busos de dades/adreces.

També es poc activar i desactivar la ROM interna

6811 Registre implementat en EPROM (Sols vàlid a l'arrancar)

8051 Linia específica dedicada ACT/DES ROM INTERNA (1 pin)

Si el pin està a 0V Mem PRG. External

Si està a 5V Mem PRC. Internal

Sistemes basats en Microprocessadors

El 8051, microprocessador té integrat el següent:

  • Bus dades (8 bits)

  • Bus Adreces (16 bits)

  • 2 senyals alimentació

  • 1 senyal rellotge (Clock)

  • 1 senyal RESET

  • Dispositius E/S

  • (Bus Control)

Això sumat dóna més de 40 pins. El 8051 té 40 potes (40 pins). Cal pensar en reduir el nº de potes o bé utilitzar tècniques com les de MULTIPLEXAT

Microprocessadors

El bus de dades i el d'adreces utilitza els mateixos pins. P0 -> port 0 i P2 -> Port 2.

1er lloc Proporcionar informació d'adreça

2on lloc Llegir/Escriure dades

Es fa seqüencialment en el temps i amb MULTIPLEXAT en el temps.

El que passa és que necessitem dispositius externs per fer-ho.

Microprocessadors

Latch Unitat de memòria. També anomenat Flip-Flop.

Hi ha 2 maneres diferents:

  • 8051 (16 bits 40 potes)

  • Motorola 6800, és de 16 bits i el processador té 64 potes (VoN-NeUmAnN)

En el 8086 està molt exagerat. Hi ha massa multiplexat, és molt complicat

Microcontroladors i Microprocessadors

Si integro tots els elements com ara:

  • UART

  • Microprocessadors

  • Entrada / Sortida

  • Memòries (RAM/ROM/EPROM)

Això es un microcontrolador. Està tot en una pastilla de 40 ó 64 potes.

Tenen una petita memòria (ordre dels Ks) per petits programes de control i memória de variables reduïda (uns 256 bytes). S'usen en aplicacions senzilles / específiques.

L'altra vessant són els microprocessadors (Pentiums, 486...)

En aquest es tendeix a treure la memòria, dispositius E/S cap a l'exterior. Poden tenir molta més memòria i poden ser molt complicats (com els pentiums).

Unitat de Control

La unitat de control s'encarrega de processar la instrucció que ha rebut de la memòria, i un seqüenciador que genera un senyal de bus acorde a la instrucció rebuda.

Se'n diu que es un codificador (codifica la instrucció)

ALU Unitat aritmètico-Lógica, fa les operacions lógiques i aritmètiques.

Etapes en la codificació d'una instrucció

  • Buscar la instrucció

  • Bus d'adreces i bus de control senyals que llegeixen:

    Cal llegir la memòria de programa (és on hi ha les instruccions).

    • Adreça a la memòria

    • Contador de Programa

    Generen l'adreça cap a l'exterior i la instrucció arriba al bus dades i va al registre d'instruccions.

  • Retenció de la instrucció en el registre d'instrucció

  • Microprocessadors

    1 byte unitat de control

    El que es fa és “analitzar” la instrucció.

    Exemple amb ADD A, #0AH

    ADD ALU (es una suma)

    A Al registre acumulador

    #0AH Adreça a afegir. Implica lectura bus de control. És l'operand que resta.

    Les instruccions ocupen un nº determinat de bytes.

    INC A Es un byte, indica incrementar 1 unitat l'acumulador.

    CP Contador de programa, ens va a buscar el següent byte.

    Exemple:

    JMP FF0A

    JMP Salta a... Necesito l'adreça a saltar, cal fer un accés a memòria

    Es salta a l'adreça FF0A de la memòria.

    El PC el que fa és no anar a següent, sino que carrega FF0A al contador.

    OPCODE Es el primer byte d'una instrucció, es el codi d'operació de la instrucció, indica què cal fer.

    Els Registres

    N'hi ha d'ús general i de dedicats

    | - Guardar operands, resultats parcials d'operacions

    Ús General | - Estalvi accessos a memòria externa (rapidesa)

    | - N'hi ha variats: B,C,D,E,H,L,B',C',D',E',H',L' (registres de treball)

    el motorola 6800 té 8 registres interns i memòria com a registres.

    Acumulador

    L'acumulador és un registre molt important. És de 8 bits i s'usa per:

    • Font i destí de les operacions

    • Resultats parcials d'operacions

    Registres de Treball

    Estan duplicats i són de propòsit general.

    Dedicats Tenen funcions específics i instruccions particulars.

    Exemple: IX, IY (Indexament de taules)

    Microprocessadors

    PC Guarda l'adreça on s'adreça el bus d'adreces en la següent instrucció.

    BANALITZATS

    • Per utilitats qualssevol

    • Poden usat tot el joc d'instruccions

    • Tots registres com a acumulador

    TEMPORALS (INTERNS)

    • Guarden dades uns períodes de rellotge (CK)

    • Eviten problemes de trànsit entre els E/S de l'ALU

    • Associats a registres importants (PC,A)

    AC Registre acumulador temporal

    Registres d'interès

    Flags

    Flag (bandera) PSW (Processor Status Word)

    Es un indicador d'estats de la CPU (flags) que s'activen o desactiven segons el resultat d'operacions. N'hi ha de bastants tipus, algunes són

    • Indicadors Bàsics

    Z nº zero

    S signe positiu/negatiu

    P Paritat (0 = nº senar d'1s, 1 = nº parell d'1s) Correcció d'errors de trasmissió

    C Carry. Es el bit de portada en sumes i restes

    Indicador de xifres significatives d'una operació

    OV Overflow (desbordament en operacions)

    PC (punter de programes)

    El PC té les següents funcions:

    • Punter dels programes (control memòria de programa)

    • Contingut Access al BUS d'adreces

    • Contador. Incrementa en 1 quan ha captat la instrucció

    Registre d'instruccions, RI

    El RI recull la instrucció a ser codificada en el cicle de recerca en la memòria de programa.

    Recerca Cicle búsqueda d'instruccions (BUS DADES)

    Decodificador Mirar el codi d'operació de la instrucció i decodificar-lo.

    Operands Obtenir els operands de la intrucció

    Executar-la

    La instrucció queda magatzemada pq la unitat lògica de control la decodifiqui.

    SP (Stack pointer, punter de pila)

    El SP o punter de pila s'usa en les rutines i subrutines

    • Conjunts de posicions en les memòria.

    Quan hi ha salt a rutines, interrupcions o subrutines l'ordre del programa es capgira. El punter guarda la informació anterior al salt.

    Un cop ha acabat la rutina, s'encarrega de què es torni exactament al mateix lloc on haviems quedat abans.

    O sigui, ens guarda l'adreça de retorn

    Microprocessadors

    El que faria el PC seria ADD+1 ADD3 però hi ha un salt

    SP es guarda el ADD2 Empilar

    Anem a la subrutina i quan acaba a la pila fa ADD+1 = ADD3

    Llavors ADD3 Desempilar

    Treballa com una pila de papers, l'ultim que hi poso és el primer que recupero. Normalment la pila té N posicions i podem fer bastantes subrutines encadenades.

    Stack pointer (SP) me diu on poso la pila

    EL MICROCONTROLADOR 8051

    Microprocessadors

    • Tecnologia memòria interna ( EPROM / E2PROM )

    • Memòria PRG interna = 4kbytes

    Si Mem > 4k ús de 80552 o d'altres dispositius

    Posar memòria de programa externa (implica perdre pins)

    • Memòria DADES interna = 256 bytes

    Si mem > 256 b, bàsicament les mateixes opcions que abans

    • Rellotge integrat alimentat en cristall de quarz (OSC)

    • Bus control Si necessitem memòria a fora que calen en els recursos externs

    • 4 Ports E/S digitals (32 línees), multiples combinacions

    Pot ser activat bit a bit o bé de 8 en 8

    Els ports P0 i P2 si tenim mem externa ens fan de busos de dades i adreces.

    Deixen de ser E/S per convertir-se en busos. Hem perdut 2 dispositius E/S

    • Port Sèrie Intercanvi de dades

    Pot tenir una standard RS232 i és un dispositiu de comunicació, transmissió i

    Recepció de dades (es comunica a uns 19200 baud)

    • Timers

    Timer o bé conta senyals regulars o pulsos irregulars (temporitzador).

    També temporitza el serial port per velocitat en bauds. Es un comptador

    • Control d'interrupcions. Ens controla:

    • Timers

    • Externs (línees externes)

    • Port sèrie

    Timers

    Ens permeten comptar desde 0 fins a 255 (8 bits)

    Sempre que s'arriba a 255 (11111111) aquest timer envia una interrupció d'overflow

    L'overflow (desborde) ens avisa que s'ha arribat a 255.

    Per comptar, per exemple, fins a 20 no ho faríem de 0 al 20 sinó del 235 al 255 així ens donaria l'overflow (interrupció)

    Microprocessadors

    així depenent de la freqüència dels senyals pot contar:

    1 Hz Segons

    10 Hz Dècimes de segon

    també permet comptar senyals irregulars amb el temporitzador.

    Port sèrie

    Serveix per tractar dades i té el seu propi sistema d'interrupcions.

    Arquitectura del chip

    Microprocessadors

    Memòria de Programa

    N'hi ha de 2 tipus

    • INTERNA (en el XiP)

    • EXTERNA (Xip Extern + Busos)

    La capacitat màxima permesa és de 64 kbytes.

    Microprocessadors

    La mem. Interna sempre comença a 0000h. Podem que n'hi hagi a dintre i no la fem servir (es de gilis).

    Pin E.A. ON/OFF Desactiva/Activa la memória interna.

    Part baixa de memòria de programa

    Cal tenir una mica de cura amb la part baixa de la memòria. Hi ha limitacions

  • Contador PC apunti adreça 0000h després del reset.

  • Microprocessadors

    Pot ser que el gestor d'interrupcions estigui desactivat però si està activat cal saber que la interrupció es realitza en una adreça determinada

    L'adreça de la interrupció es la 0003h. Si el programa té ordres a la 0003h matxacarem la rutina d'interrupció.

    Aquestes adreces de la memòria baixa ja estant fixades:

    • 0003h Rutina interrupció 0

    • 0008h Timer 0

    • 0013h Rutina interrupció 1

    • 0018h Timer 1

    • 0023h Gestió E/S

    Normalment el que es fa es a la direcció 0000h saltar a una altra posició

    0000h JMP |02|00 (consumim fins a la 0002h i anem a la 0200h)

    Si utilitzo interrupcions, timers o altres coses cal vegilar les direccions anteriors.

    Doble utilitat dels ports

    PORT 1 Es un port paral.lel de per sí

    PORTS 0 i 2 són ports que poden convertirse en busos dades / adreces.

    PORT 3 Permet maniobres especials (TxD,RxD, WR, RD...)

    Oscillator

    L'oscil·lador es un rellotge que en el nostre cas la seva freqüència és 12 MHz.

    Microprocessadors

    Réset

    Serveix perquè quan realimentem.

    Al iniciar es passa de 0 a 5 V de múltiples maneres

    Microprocessadors

    Cal deixar passar temps abans que el P treballi a tensió estabilitzada a 5V, aquest retard ens l'imposa el reset.

    • Qunies condicions són les inicials de treball??

    • Estan fijades en valors coneguts

    • Els continguts dels registres després dels resets

    El reset ens reinicialitza, ens posa als estats fixats per arrancar.

    Microprocessadors
    RESET REINICIALITZACIÓ

    La memòria de dades

    En la memòria de programa hi havia el programa + constats + missatges

    L'inici del programa calia que estigués lluny perquè hi cabessin les rutines d'interrupció, timers i entrada/sortida.

    En la memòria de dades (RAM) hi van les variables.

    • D'aquesta memòria SEMPRE n'hi ha d'interna.

    Microprocessadors

    De la mem.interna de dades podem destriar-ne 2 parts:

    • 128 bytes (00-7F) Indirect Access (té vàries parts)

    • 128 bytes (80-FF) Direct Access o SFR (registre funcions especials)

    SFR

    Els bits dels registres són responsables dels perifèrics E/S Control

    Es guarden 128 bytes per compatibilitat (ex: 8051 - 80552)

    Memòria Externa

    En podem tenir fins a 64K (0000-FFFF).

    Com podem observar hi ha 2 adreces 0 0000 i 00 interna.

    Hi ha instruccions determinades per externa i interna.

    MOV Transferència de dades en memòria interna

    MOVX Move external, transferència en memòria externa.

    Microprocessadors

    Zona 00-1F, Bancs de registres

    00 Registre R0 | Hi ha 4 bancs de 8 posicions cadascun

    ... | BANC 0 Associats a registres

    07 Registre R7 |

    El banc 0, per exemple, està associat a R0, R7 però es possible canviar-ho i associar-los a altres bancs (l'1, el 2 o el 3)

    • Commutació dels bancs de registres

    Això ens serveix per a les interrupcions

    Imaginem que per guardar resultats usem els registres

    R0 = 5; R1 = 23; R2 = 3; R3 = 7...

    Això si no es diu res va a parar al BANK 0

    Si sols tinguéssim 1 banc perdríems les dades que teniem en el principal al entrar en la interrupció. Ens interessa conservar aquests valors. Faig servir el banc 1 a la rutina INT. He commutat els registres al banc 1.

    No perdo les dades perquè estàn en un altre banc i no les he sobrescrit.

    Abans de fer el RETY dic BANC 0 (commuto) i torno a tenir les dades que tenía.

    S'una bàsicament en:

    • Rutines interrupció

    • Subrutines del programa principal

    Zona 20-2F (BIT ACCESS MEM)

    Tinc 16 posicions de memòria, el que es el mateix 16 X 8 = 128 bits.

    Aquesta memoria te la particularitat que es pot manipular BIT a BIT.

    Exemples:

    MOV 20,#55H 20 : 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1

    Però també ho podria fer bit a bit:

    SETB 1 20 : 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0

    SETB 3 20 : 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0

    SETB 5 20 : 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0

    SETB 7 20 : 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1

    Per tant fer SETB 7 és el mateix que MOV 20, #01H i el mateix que SETB 20,0

    Cal tenir en compte el següent:

    SETB 7 20 : 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1

    SETB 20,0 20 : 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1

    Els bits van numerats 7 6 5 4 3 2 1 0 (seria 27, 26, 25, 24 , 23 , 22, 21, 20)

    Només es permet fer SETB des de la 00-7F

    El que sí es pot fer es modificar bit a bit altres parts de la memòria

    SETB 54,4 54 : 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0

    La resta de les posicions són memòria de dades normals.

    PRÀCTIQUES DE MICROPROCESSADORS

    Pràctica 0 // 1

    Objectiu

    És iniciar en la manipulació de les eines de desenvolupament i programació de sistemes basats en microprocessadors o microcomputadors. Ens centrarem bàsicament en el microcontrolador 8031/8051 d'Intel

    Eines de control

    Les eines de control que tenim són:

    • Assembler A8051: Permet establir interconexions entre diferents mòduls escrits en llenguatge ensamblador o en C

    • Enllaçador XLINK: Permet enllaçar diferents mòduls de programa o llibreries per generar un executable. És universal, permet enllaçar varis microprocessadors.

    • Simulador SIM51: Permet simulació de programes escrits en assembler-8051, permet la visualització i interacció amb les àrees de memòria, registres interns, ports i així com l'execució de programes pas a pas (debugger).

    • USD3, PRG.Control: Es un depurador simbòlic, permet la interacció entre el PC i el sistema de microprocessador que està sent provat mitjançant un emulador que executa el programa en temps real (MICE-II)

    Enunciat de la pràctica

    A partir de les eines que hem descrit en l'informe de la pràctica 0, es desenvoluparà un programa escrit en llenguatge assemblador del 8051.

    • Compilar i enllaçar el programa amb l'A8051 i el XLINK

    • Amb el simulador SIM51 descriure com es comporta el programa pas a pas havent enllaçat i compilat sense problemes.

    Programa a introduir

    Un exemple de programa a treballar és el següent:

    org 0

    ajmp inici

    inici: org 100h

    mov #dptr,#F000

    mov a,0

    movx @dptr,a

    inc a

    inc dptr

    movx @dptr,a

    inc a

    inc dptr

    movx @dptr,a

    mov dptr,#F000

    movx a,@dptr

    mov r0,a

    inc dptr

    movx a,@dptr

    mov r1,a

    inc dptr

    movx a,@dptr

    mov r2,a

    end

    Explanació de instruccions utilitzades amb el emulador

    S'ha picat el programa anterior i s'ha fet córrer l'emulador de 8051.

    Per mirar el que fa el programa s'ha posat la finestra de registres en pantalla per poder veure les evolucions en l'acumulador, data pointer i registres R0...R7

    Per poder configurar la memòria externa perquè ens he funcionés (fos de lectura-escriptura), s'ha hagut de fer lo següent

    *M 08000 - 0FFFF E (la memòria entre 08000-0FFFF és externa (RD-WR)

    Per poder veure una posició de memòria:

    MX posició (si pertany a la memòria externa, també podent canviar-se si es vol)

    MI posició (si pertany a memòria interna, podent-se canviar si es desitja)

    MP posició (si és memòria de programa, al canviar-la afectem el nostre programa)

    Per poder canviar els registres com l'acumulador

    RACC

    A: contingut (podent-se canviar el contingut si un ho desitja)

    Explicació del programa pas per pas

    > USD3 (nom de l'emulador)

    > A (per començar a introduir el programa)

    Al introduir tot el programa, s'ha utilitzat la funció Istep (trace pas per pas)

    Finestra de Registres

    ACC B PSW DPH DPL R0 R1 R2 R3 R4 R5 R6 R7 PSW PC

    (aquí baix van els valors que tenen cada un dels registres)

    • MOV DPTR,#F000

    ACC B PSW DPH PDL Ens posa en el registre DPTR la direcció F000

    -- -- ----- F0 00

    • MOV A,0

    E2 -- ----- F0 00 Ens posa a l'acumulador el que hi hagi a la direcció

    0 de la memòria interna (MI 0 E2) Hi ha un E2

    • MOVX @DPTR,A

    E2 -- ----- F0 00 Ens posa el que hi ha en l'acumulador en la direcció

    De memòria externa on apunta el DPTR (F000)

    Així si fem MX F000 E2 (lo de l'acumulador)

    • INC A

    E3 -- ------ F0 00 Ens incrementa en 1 unitat el que hi ha a l'acumulador

    • INC DPTR

    E3 -- ------ F0 01 Incrementa en 1 unitat el que hi ha al data pointer

    • MOVX @DPTR,A

    E3 -- ----- F0 01 Ens posa el que hi ha en l'acumulador en la direcció

    De memòria externa on apunta el DPTR (F001)

    Així si fem MX F001 E3 (lo de l'acumulador)

    • INC A

    E4 -- ------ F0 01 Ens incrementa en 1 unitat el que hi ha a l'acumulador

    • INC DPTR

    E4 -- ------ F0 02 Incrementa en 1 unitat el que hi ha al data pointer

    • MOVX @DPTR,A

    E4 -- ----- F0 02 Ens posa el que hi ha en l'acumulador en la direcció

    De memòria externa on apunta el DPTR (F002)

    Així si fem MX F001 E4 (lo de l'acumulador)

    ACC B PSW DPH PDL

    E4 -- ----- F0 02

    • MOV DPTR, #F000

    E4 -- ----- F0 00 Ens torna a posar en el DTPR la direcció F000

    • MOVX A, @DPTR

    E2 -- ----- F0 00 Ens porta a l'acumulador el contingut de la direcció

    De memòria on apunta el data pointer, com que abans

    Li havien donat el valor E2, ara això ho tenim al ACC.

    • MOV R0,A

    E2 -- ----- F0 00 Ens posa el que tenim a l'acumulador (E2)

    En el registre R0 (posició 0 de la mem.interna)

    R0 = E2 (Abans no sabem que hi havia)

    • INC DPTR

    E2 -- ----- F0 01 Ens incrementa en 1 unitat el DPTR

    • MOVX A, @DPTR

    E3 -- ----- F0 01 Ens porta a l'acumulador el contingut de la direcció

    De memòria on apunta el data pointer, com que abans

    Li havien donat el valor E3, ara això ho tenim al ACC.

    • MOV R1,A

    E3 -- ----- F0 01 Ens posa el que tenim a l'acumulador (E2)

    En el registre R1 (posició 1 de la mem.interna)

    R1 = E3 (Abans no sabem que hi havia)

    • INC DPTR

    E3 -- ----- F0 02 Ens incrementa en 1 unitat el DPTR

    • MOVX A, @DPTR

    E4 -- ----- F0 02 Ens porta a l'acumulador el contingut de la direcció

    De memòria on apunta el data pointer, com que abans

    Li havien donat el valor E4, ara això ho tenim al ACC.

    • MOV R2,A

    E4 -- ----- F0 02 Ens posa el que tenim a l'acumulador (E2)

    En el registre R1 (posició 1 de la mem.interna)

    R1 = E4 (Abans no sabem que hi havia)

    Al final els registres ens queden de la següent manera:

    ACC B PSW DPH DPL R0 R1 R2 R3 R4 R5 R6 R7 PSW PC

    E4 -- ------ F0 02 E2 E3 E4 --- --- --- --- --- ------ ---

    Explicacions complementàries

    L'ús de MOV i MOVX depèn de si les direccions de memòria són internes o externes. Veient el programa ens n'adonem que:

    ACC, R0, R1, R2, DPTR, direcció 0 Estan a la memòria interna

    Direccions F000,F001,F002 Estan a la memòria externa

    Els registres R0,R1,R2 són equivalents (si no s'ha fet commutació registres) a les posicions 00,01,02 de la memòria interna del microcontrolador. Podem mirar el que hi ha fent MI 00, MI 01, Mi 02

    Les direccions amb 4 caràcters hexadecimals corresponen a memòria externa, en el cas F000, F001, F002. Cal configurar aquestes posicions que siguin memòria de lectura-escritura sinó el programa no ens podrà escriure a memòria i no podrem veure'n el funcionament.

    PRÀCTICA 2, FUNCIONAMENT DELS TIMERS

    Teoria

    Hi ha 2 timers:

    • Timer0 de 16 bits

    • Timer1, estretament lligat al port sèrie

    Bits que ens controlen els tímers

    • C/T* Ens indica si l'entrada bé d'un pin exterior o és un senyal intern

    • C/T* = 0, el senyal és intern i com a màxim podem contar 65'3 ms

    • C/T* = 1, el senyal és extern i podem utilitzar-lo per 2 coses

    • temporitzador (amb senyals de freqüències conegudes

    • comptador (amb senyals irregulars)

    • GATE Ens indica si l'arrencada és per SOFT o bé per HARD

    • GATE = 0, ens arranca per programa (SOFT)

    • GATE = 1, ens arranca per senyal electrònic en un PIN

    • TR Bit d'engegada del timer

    • TR = 0, el timer no ens conta

    • TR = 1, ens engega el timer i aquest comença a contar

    • TF bit que ens indica si hi ha o no overflow en el tímer

    OVERFLOW = quan el timer passa de 1.1.1.1.1.1.1.1 0.0.0.0.0.0.0.0

    • TF = 1 , ens genera un avís que hi ha hagut overflow

    • M1/M0 bits que controlen el mode de funcionament del tímer

    • M1M0 = 00 , Mode 0, 13 bits (TH = 8 bits, TL = 5 bits)

    • M1M0 = 01 , Mode 1, 16 bits (TH = 8 bits, TL = 8 bits)

    • M1M0 = 10 , Mode 2, 8 bits AUTOLOAD (TH = TL = 8 bits)

    Una part conta i l'altra s'hi guarda el que hi havia abans i quan

    hi ha overflow torna a contar el mateix d'abans.

    Registres que ens controlen els tímers

    • TH Registre on hi ha encabuts els 8 primers bits de contatge del tímer

    • TL Registre on hi ha encabuts els 8 últims bits de contatge del tímer

    • TMOD Registre programable pels tímers on hi ha les següents coses:

    • GATE, C/T*, M1, M0 (del tímer 1)

    • GATE, C/T*, M1, M0 (del tímer 0)

    • TCON Registre on s'activen els tímers i els flags (overflows)

    • TF1, TR1, TF0, TR0

    Microprocessadors

    Realització pràctica

    Objectiu

    Escriure un programa que ens inicialitzi un dels tímers i que ens permeti fer una temporització per encendre intermitentment els LEDs que el microprocessador té integrants en el port 1.

    Realització

    Per l'escritura del programa s'ha utilitzat el tímer 1 i també els documents necessaris on s'expliquen les ordres bàsiques del microprocessador.

    El programa utilitzat per programar el tímer 1 és el següent:

    0000 CLR P1.7

    0002 MOV TMOD,#20

    0005 MOV TH1,#00

    0008 MOV TL1,#00

    000B SETB .TR1

    000D JNB .TF1,000D

    0010 SETB P1.7

    0012 MOV TMOD,#20

    0015 MOV TH1,#00

    0018 MOV TL1,#00

    001A SETB .TR1

    001C JNB .TF1, 001C

    0020 AJMP 0000

    Explicació del programa pas per pas

    El programa ens fa lo següent

    • CLR P1.7

    Això ens posa a 0 el setè bit del port 1, que, com s'ha explicat a teoria, conté un dels quatre LEDS del microprocessador en el PORT 1

    Equival a apagar el LED (light emissor diode)

    • MOV TMOD,#20

    Microprocessadors

    Amb aquesta instrucció el que fem es inicialitzar les variables del registre TMOD

    C/T* = 0, indica que utilitzarem el rellotge intern per temporitzar (contar)

    GATE = 0, que el timer ens arranca directament per programa

    M1M0 = 01 , utilitzem el mode 1 de programació del tímer

    16 bits (TH = 8 bits, TL = 8 bits), per contar màxim 65'3 ms

    El mode 1 és el mode recomanable per temporitzar / contar.

    S'agafa només el segment de bits pel tímer 1 (que és el que utilitzarem)

    • MOV TH1,#00

    S'inicialitza el TH1 (bits alts del tímer 1) a tot 0s

    • MOV TL1,#00

    S'inicialitza el TL1 (bits alts del tímer 1) a tot 0s

    Això es fa per poder contar 65535 (216 dígits) 16 bits

    Es podria inicialitzar amb altres valors per contar menys dígits, això depenent del que volguéssim fer amb el nostre programa.

    • SETB .TR1

    Aquesta instrucció el que ens fa és posar el bit .TR1 a 1

    El bit TR1 és el bit d'inicialització del tímer 1, quan el posem a 1 el tímer es posa a contar els dígits segons el que li haguem posat en els registres TH1 i TL1

    En el nostre cas li hem posat tot zeros, perquè ens arribi a tot 1s i ens generi un overflow cal que passin 65535 dígits.

    • JNB .TF1,000D

    Aquesta instrucció lògica (de salt condicional) es un bucle que ens fa el següent

    Primerament ens mira el valor del BIT TF1

    • si aquest bit és 0, es genera un bucle i el programa torna a mirar el Bit TF1

    • si aquest bit és 1, la condició es compleix i es salta a la següent línia

    El bit TF1 ens indica si hi ha hagut o no overflow en els tímers

    • TF1 = 0, indica que no hi ha hagut overflow (per tant encara li falten digits per contar)

    • TF1 = 1, indica que hi ha hagut overflow, per tant s'ha acabat el cicle de comptatge del tímer

    • SETB P1.7

    Això ens posa a 1 el setè bit del port 1, que, com s'ha explicat a teoria, conté un dels quatre LEDS del microprocessador en el PORT 1

    Equival a encendre el LED

    A partir d'aquesta instrucció el programa és igual que l'anterior, això s'ha fet per fer la mateixa temporització tan en l'apagada del LED i en l'encesa.

    A simple vista no podem apreciar si el LED s'apaga o s'encén perquè l'ull humà no pot distingir pampallugues en un període de 65 ms (aproximadament 15 Hz) i menys si apaguem un altre cop enseguida el LED perquè semblarà que sempre estigués apagat ja que la instrucció d'apagar el LED dura uns 2 us, impossible d'apreciar a simpre vista, per tant s'ha cregut convenient fer la segona part del programa.

    • MOV TMOD,#20

    • MOV TH1,#00

    • MOV TL1,#00

    • SETB .TR1

    • JNB .TF1, 001C

    Aquestes línees són iguals que les anteriors

    • AJMP 0000

    Aquesta instrucció simplement ens salta a la línia 0000 (inici programa) així es pot veure molt millor la temporització.

    TEMPORITZACIÓ DEL LED

    El que li passa al LED és que nosaltres veiem que la seva intensitat de llum, comparada amb un altre LED encés (per exemple el P1.6) és inferior, cosa que indica que hi ha una temporització

    Això es pot comprovar amb l'oscil.loscopi que ens dóna un senyal quadrat d'un període d'uns 130 ms.

    PRÀCTICA 3, FUNCIONAMENT DEL PORT SÈRIE

    Teoria

    • El port série consta de 2 pins:

    • TxD Transmissió de dades

    • RxD Recepció de dades

    • Nivells de tensió

    • Microprocessador 1 = 5V, 0 = 0V

    • Standard RS-232 1 = 12 V, 0 = -12V (el valor típic)

    Es fa així per disminuir l'efecte del “soroll de fons” en les transmissions

    • Propietats del Port sèrie

    • Comunicació full-duplex

    • Latch Master/slave (treballen 2 búffers al mateix temps)

    • Escriure al SBUF Transmissió

    • Llegir al SBUF Rebuda de dades a la UART

    • Modes de Programació

    • MODE0 (Síncron)

    En ell es transmeten 8 bits de la següent forma:

    • RxD enviar i rebre dades

    • TxD enviar senyal de CLOCK (sincronisme entre dada enviada i CK)

    El CK sincronitza la transmissió de dades entre 2 dispositius comunicant-se

    Frequència fixa a 1/12 rellotge intern 1 MHz

    • MODE1 (Asícron, no s'envia rellotge, sincronisme de velocitats)

    S'envien 10 bits: 1 bit start, 8 bits dades, 1 bit stop

    • start: és un 0 que dura un temps de bit, després rebem les dades

    • stop: és un 1 que indica final de transmissió

    Per mirar el bit, degut al soroll es fa amb un sistema de Votació

    • el senyal es discretitza en 16 talls i es miren els 7,8,9

    • si hi ha majoria de 0s 0 i si no és un 1. Igual pels bits d'start i stop

    • Es pot calibrar-ne la velocitat de transmissió en BAUD

    Ús del timer 1 en mode 2, 8 bits amb autocàrrega

    Registres TH1, TL1 carguen valors tabulats de velocitats

    • MODE2 (Asíncron, amb bit de paritat)

    Es igual que el mode 1 però s'envien 11 bits

    1 bit start, 8 bits dades, 9é bit (paritat), 1 bit stop

    9é bit: Paritat s'utilitza per evitar errors de comunació degudes a soroll

    La seva freq es entre 1/32 i 1/64 la del rellotge intern

    Bits que controlen el port série

    • TI Indica si la transmissió ha acabat o no

    TI = 1, la transmissió ha acabat (el registre SBUF està buit)

    Cal tornar-lo a inicialitzar a 0 sinó no podrem transmetre res més.

    • RI Indica si la recepció ha acabat o no

    RI = 1, la recepció s'ha acabat (el registre SBUF està ple)

    Cal reinicialitzar-lo a 0 sino no podrem tornar a rebre res més

    • TB8 És el nové bit (paritat) que s'envia en el mode 2 del port série

    • SMOD Ens dobla la velocitat del port sèrie

    SMOD = 0, la velocitat no està doblada

    SMOD = 1, dobla la velocitat (per la transmissió a 19200 baud)

    • REN Ens habilita/deshabilita la recepció de dades

    REN = 0; Ens habilita la recepció de dades

    REN = 1; Ens deshabilita la recepció de dades

    • PB8 És el 9é bit que obtenim al rebre (bit de paritat)

    • SM0/SM1 Controlen els modes de funcionament del port série

    • SM0SM1 = 00 Mode 0 (Asíncron)

    • SM0SM1 = 01 Mode 1 (Síncron, sense bit de paritat, velocitat controlable)

    • SM0SM1 = 10 Mode 2 (Sínctron, amb bit de paritat, velocitat regulable)

    • SM0SM1 = 11 Mode 3

    • SM2 Comunicació multiprocessador, activa flag de recepció

    • M1M0 Del timer 1, s'han de programar en mode 2

    • Mode 2 , 8 bits amb autocàrrega, per regular velocitats en Baud

    Registres que controlen el port série

    • SBUF Es el registre que s'utilitza per enviar/transmetre dades

    MOV SBUF,A (activa l'emissió de dades, la de l'acumulador al port série

    Aquest registre s'anomena serial Buffer (99h)

    • SCON Conté informació: flags, bits, que afecten el port série

    SM0, SM1 Modes de programació

    REN Reception Enable TI/RI Control transimissions/recepcions

    T8B, P8B 9ens bits (paritats)

    És programable

    • PCON Modes de funcionament en baix consum

    Conté el bit SMOD, que s'utilitza per doblar la velocitat del port série

    • TH1/TL1 Registres de comtatge del tímer 1, s'usen per regular velocitat en baud de les transmissions a partir d'unes taules

    Microprocessadors

    • Taula de velocitats del port série

    SMOD C/T MODE RELOAD BAUD

    1 0 2 FDh 19200

    0 0 2 FDh 9600

    0 0 2 FAh 4800

    0 0 2 F4h 2400

    0 0 2 E8h 1200

    Realització pràctica

    Objectiu

    Escriure un programa que ens permeti d'enviar dades pel port sèrie amb una velocitat regulable de manera que poguem veure'n el senyal per l'oscil.loscopi.

    Realització

    Per l'escritura del programa s'ha utilitzat el tímer 1, els port serial i també els documents necessaris on s'expliquen les ordres bàsiques del microprocessador.

    El programa utilitzat per programar el port série és el següent:

    0000 MOV SCON,#40

    0003 MOV TMOD,#20

    0006 MOV TH1,#E8

    0009 MOV TL1,#E8

    000C MOV A,#AA

    000E SETB .TR1

    0010 MOV SBUF,A

    0012 JNB .TI, 0012

    0015 CLR .TI

    0017 AJMP 000E

    Explicació del programa pas per pas

    El programa ens fa lo següent

    • MOV SCON,#40

    Microprocessadors

    Posem el port série en el mode 1 (Síncron sense paritat) per fer la transmissió

    Res als bits de paritat (no estem en mode 2) i tampoc multiprocessador.

    • MOV TMOD,#20

    Microprocessadors

    Amb aquesta instrucció el que fem es inicialitzar les variables del registre TMOD

    C/T* = 0, indica que utilitzarem el rellotge intern per temporitzar (contar)

    GATE = 0, que el timer ens arranca directament per programa

    M1M0 = 10 , utilitzem el mode 2 de programació del tímer

    8 bits amb autocàrrega

    El mode 2 s'utilitza per regular la velocitat del port série en modes 1 i 2.

    S'agafa només el segment de bits pel tímer 1 (que és el que necessitem)

    • MOV TH1,#E8

    S'inicialitza el TH1 (bits alts del tímer 1) a E8

    • MOV TL1,#E8

    S'inicialitza el TL1 (bits alts del tímer 1) a E8

    Això es fa perquè volem que la velocitat de transmissó del port série sigui 1200 baud i segons la taula, hem de posar aquest valor.

    Els 2 registres TL1, TH1, han de ser iguals sinó la recàrrega no ens funcionaria i només contaríem una vegada desde E8 a FF.

    Un cop tenim overflow, com que estem en mode 2, no se'ns genera cap tipus d'avís i el microprocessador tornará a contar un altre cop desde E8.

    • MOV A,#AA

    Aquesta instrucció ens envia a l'acumulador el nº AA (10101010), això es fa perquè aquest és un bon número per veure el funcionament el port sèrie, el senyal que ens hauria de donar aquest número és un senyal quadrat, incloent els bits d'start i d'stop que s'utilitza en l'standard RS-232.

    • SETB .TR1

    Aquesta instrucció el que ens fa és posar el bit .TR1 a 1

    El bit TR1 és el bit d'inicialització del tímer 1, quan el posem a 1 el tímer es posa a contar els dígits des de E8 fins a FF i quan acaba, hi ha una autocàrrega per tornar a utilitzar el mateix valor perquè la velocitat sigui constant i de 1200 baud.

    • MOV SBUF,A

    Es posa en el registre SBUF (serial Buffer) el contingut de l'acumulador. Posar una dada a l'SBUF vol dir transmetre-la pel port serial. Com que abans hem calibrat el timer 1 perquè ens donés 1200 baud, les dades seràn enviades a aquesta velocitat pel port serie.

    • JNB .TI,0012

    Aquesta instrucció lògica (de salt condicional) es un bucle que ens fa el següent

    Primerament ens mira el valor del BIT TI

    • si aquest bit és 0, es genera un bucle i el programa torna a mirar el BIT TI

    • si aquest bit és 1, la condició es compleix i es salta a la següent línia

    El bit TI ens indica si una dada que està a l'SBUF ha estat enviada o no

    • TI = 0, indica que encara no s'ha acabat la transimissió

    • TI = 1, indica que s'ha acabat la transmissió del que havia a l'SBUF.

    • CLR .TI

    Per poder tornar a enviar una dada, cal reinicialitzar el TI (bit de control) a 0 sino el microcontrolador no ens enviarà cap més dada encara que nosaltres volguem, per això es posa aquest bit a 0 abans d'intentar enviar una altra dada.

    • AJMP 000E

    Ens salta a la direcció 000E (SETB .TR1)

    Així tornem a iniciar el timer i llavors un altre cop el mateix esquema que abans:

    • Enviar la dada

    • Mirar si s'ha enviat

    • Tornar a enviar

    Es un bucle per poder veure detenidament el funcionament del port série

    Pràctica 4, Programació del DISPLAY

    Teoria

    • El Display és un dispositiu d'E/S programable, podem:

    • Enviar-li instruccions

    • Visualitzar dades

    • Ocupa unes adreces úniques, però hi ha una decodificació incompleta

    • Adreces: A13-A14-A15 = 1

    • Ocupa desde la #E000-#E003 (només 4 adreces)

    • Està a la memòria externa de dades

    • És un dispositiu molt lent

    • Cada instrucció tarda uns 100ms a executar-se en el display

    • Cal fer temporització en 2 ó 3 registres

    • Modes de display, tenim 3 modes de visualització en el display

    • Mode 2 X16

    • Mode 2 X 32

    • Mode 2 X 64

    Depenent d'això s'utilitzen diferents posicions de memòria

    Bits que controlen el port série

    • DEN* = Display Enable, permet connectar/desconnectar el display

    • DEN* = 0 (Display Activat)

    • VIS1 = Activació del display (Decodificador U8)

    • La lògica diu que s'activa quan A15,A14,A13 són tots 1

    • NRD* = Lectura del display

    • Ens serveix únicament per saber l'status del Display

    • NRD* = 0, senyal de lectura pel display

    • NWR* = Escriptura en el display

    • NWR* = 0, escriptura en el display

    • BUSY, bit que indica si el display està o no ocupat

    - BUSY = 1, display ocupat

    - BUSY = 0, display desocupat

    Programació del display

    • Function Set

    DL = 0 (Ús dels 4 bits per enviar dades), DL = 1 (Ús de 8 bits)

    - Per posar a 8 bits... MOVX #E000 0011|1000

    • Display ON/OFF control

    Serveix per engegar el display, bàsicament

    - Per posar a 8 bits... MOVX #E000 0000|1110

    • Entry mode Set

    Serveix dir al display que ens escrigui un caràcter darrere un altre

    • Per fer-ho... MOVX #E000 0000 | 0110

    • Escriure un caràcter

    • Per fer-ho... MOVX #E002 Codi del caràcter

    Els codis dels caràcters es troben en unes taules adjuntes

    • Canvi adreça del display

    • Per anar a la segona línia del display

    MOVX #E000 0100 | 0000

    • Altres inicialitzacions

    • Esborrar la pantalla : MOVX #E000 0000 | 0001

    • Situar el cursor a adreça 00: MOVX #E000 0000 | 0010

    Realització pràctica

    Objectiu

    Escriure un programa que ens permeti visualitzar un missatge en el display.

    Coses a tenir en compte

    • Cal inicialitzar el display per poder-hi escriure

    • El display es molt lent, caldrà fer una subrutina de temporització per registres

  • Subrutina de temporització per registres:

  • El nom de la subrutina és kaka (podria ser qualsevol nom, no??)

    mov a,#06mov r0,a

    rnt2: mov a,#FFmov r1,a

    rnt2: mov a,#FFmov r2,a

    rnt: dec r2mov a,r2

    jnz rnt

    mov a,#FFdec r1mov a,r1

    jnz rnt3

    mov a,#FFdec r0mov a,r0

    jnz rnt2 retExplicació de la rutina pas a pas

    • MOV A,#06

    Ens posa en l'acumulador el valor 6, aquest valor l'utilitzarem per temporitzar ja que el display és un dispositiu molt lent i si no fem la temporització no veurem res.MOV R0,AEns posa el que tenim a l'acumulador (06) en el registre R0, això ho utilitzarem per decrementar els registres i poder fer una temporització en cadena.

    MOV A,#FF (en aquí establim el número de línia RNT3)Ens posa en l'acumulador el valor 255 per tenir un bon número per comptar temps, aquesta línia (la RNT3) ens serveix perquè en el tercer registre utilitzat contarem per cada unitat que l'incrementem, 2552 unitatsMOV R1,AEns posa el que tenim a l'acumulador (FF) en el registre R1, així tenim un altre registre per fer la temporització i així poder fer passar més temps.MOV A,#FF (en aquí establim el número de línia RNT2)Ens posa en l'acumulador el valor 255 per tenir un bon número per comptar temps, aquesta línia (la RNT2) ens serveix pel mateix que la RNT3 però ara cada increment d'aquest registre, l'R1 són 255 unitats.MOV R2,AEns posa el que tenim a l'acumulador (FF) en el registre R2, pel mateix que abans.DEC R2 (En aquí establim el número de línia RNT)En aquí decrementem el valor de R2, el disminuïm amb 1 unitat per tal de utilitzar una instrucció de salt condicional.

    MOV A,R2

    • Es mou el contingut del registre r2 a l'acumulador, això es fa perquè la instrucció que utilitzarem de salt condicional només ens serveix per saber si l'ACUMULADOR és diferent de 0JNZ RNTAquesta instrucció ens mira si el valor de l'acumulador és o no és 0.Si és diferent de 0 ens salta cap a la línia RNT que és la que hi ha el DEC R2 perquè ens decrementi una unitat més fins que arribi a 0, un cop arribat a 0, aquest bucle ja no saltarà a RNT sinó a la linia següent:MOV A,#FF

    Ens posa en l'acumulador el valor 255 per seguir el mateix procés que abansDEC R1Ara el registre que es decrementa és R1, una unitat de R1 es compon de 255 del registre anterior, l'R2MOV A,R1Es mou el contingut del registre r1 a l'acumulador per utilitzar la mateixa instrucció d'abansJNZ RNT2La mateixa instrucció de salt condicional que abans, però ara salta a RNT2, això vol dir que cada unitat d'aquest seràn 255 del registre R2.

    • MOV A,#FF

    • DEC R0MOV A,R0

    • JNZ RNT3

    • Aquestes instruccions fan el mateix que abans però ara saltant per a cada unitat a RNT3, utilitzant 3 registres. Cada unitat del registre R0 són R1*R2 = 2552 unitatsRET

    Serveix per tornar al punt on ha estat cridada la subrutina

    Programa Principal, escriputa en el Display:Part 1: INICIALITZACIÓ DEL DISPLAY

    mov dptr,#0e000h

    mov a,#01h

    movx @dptr,a

    acall kaka

    mov dptr,#0e000h

    mov a,#02h

    movx @dptr,a

    acall kaka

    mov dptr,#0e000h

    mov a,#38h

    movx @dptr,a

    acall kaka

    mov dptr,#0e000h

    mov a,#0eh

    movx @dptr,a

    acall kaka

    mov dptr,#0e000h

    mov a,#06h

    movx @dptr,a

    acall kaka

    • MOV DPTR,#E000

    Aquesta instrucció s'utilitza perquè el nostre microcontrolador no està preparat per remenar la memòria externa de dades directament. Hem d'utilizar el data pointer per poder intercanviar dades amb la memòria externa, o sigui, el display

    • La direcció E000 és la direcció on tenim l'apartat de funcions en el display, com s'ha indicat abans s'ha de programar el display.MOV A,#01

    • Es posa a l'acumulador el valor 01MOVX @DPTR,A

    Ens mou el que hi ha a l'acumulador a la direcció on apunta el data pointer.Segons les funcions del DISPLAY, posar un 01 en la direcció E000 s'utilitza per esborrar la pantalla del display.

    • ACALL KAKA

    Es crida la subrutina de temporització (comentada anteriorment) El display és tan lent que necessita molt de temps abans de poder executar la instrucció.MOV DPTR,#E000MOV A,#02MOVX @DPTR,AACALL KAKAAquest paquet d'instruccions el que ens fa és posar el cursor del DISPLAY en l'adreça 0, o sigui, en el marge superior esquerre

    • MOV DPTR,#E000

    • MOV A,#38

    • MOVX @DPTR,AACALL KAKAAquest paquet d'instruccions el que ens fa és posar el display en el mode d'envío de 8 bits directament per rebre el caràcter, per fer això s'utilitza el function SET, el bit DL que és qui ens controla si volem 4 ó 8 bits per enviar. MOV DPTR,#E000MOV A,#0EMOVX @DPTR,AACALL KAKAAquest paquet d'instruccions ens controlen el que se'n diu DISPLAY ON/OFF CONTROL, el que hem fet ara és posar el display en ON, o sigui, engegar-lo perquè hi poguem escriure caràcters, si no ho féssim no podríem escriure res.MOV DPTR,#E000

    • MOV A,#06

    MOVX @DPTR,AACALL KAKAAquest paquet d'instruccions ens controlen la ordenació dels caràcters que ens apareixeran en el display. Cal que es col.loquin l'un darrere l'altre perquè si fiquem el #07 el que ens passarà és que ens sobreescriurà caràcters en la mateixa posició i no podrem llegir el nostre missatge.Part 2: ESCRIPTURA DE CARÀCTERS PEL DISPLAYPer poder escriure un caràcter en el display hem de fer els següents passos:MOV DPTR,#E002Aquesta instrucció s'utilitza perquè el nostre microcontrolador no està preparat per remenar la memòria externa de dades directament. Hem d'utilizar el data pointer per poder intercanviar dades amb la memòria externa, o sigui, el display

    La direcció E002 és la direcció on tenim la funció CC/GG RAM WRITE que la utilitzem per escriure els caràcters en el DISPLAY.MOV A,#41Es posa a l'acumulador el valor 41 (que correspon al codi d'un caràcter, segurament el codi ASCII)MOVX @DPTR,AEns mou el que hi ha a l'acumulador a la direcció on apunta el data pointer.En aquest cas seria posar un #41h en la direcció E002, i això el que ens farà serà escriure en el display el caràcter que es correspongui al codi ASCII 41 (la lletra “A”).ACALL KAKAEs crida la subrutina de temporització (comentada anteriorment) El display és tan lent que necessita molt de temps abans de poder executar la instrucció.Per escriure més caràcters el que s'ha de fer és repetir les mateixes línees canviant només el valor de l'acumulador enlloc d'un #41 un altre valor que correspongui al caràcter que es desitgi o fer una subrutina d'escriptura.En l'exemple del nostre programa havíem escrit aquest missatge subliminal

    Valors que es posen a l'acumulador (codi ASCII)H 48A 41L 4C A 41 20M 4DA 41D 44R 53I 49D 44! 21! 21Per acollonar sobre la séptima copa d'Europa, tot s'ha de dir!! VISCA EL BARÇA!!