MACROS

 

Macros élas por si só já representam um grande avanço na programação de qualquer projeto. Vou explicar algumas macros e suas funções.

 

 

TEXTOS ORIGINAIS :

 

http://www.mikroelektronika.co.yu/portuguese/product/books/picbook/capitulo6a.htm

 

 

 

 

Macro Print

 

Na pagina onde foi escrito estas macros, eles relacionam a macro PRINT.INC como facilidade de envio de dados para: displays LCD, RS232, impressora matricial...etc

Mas o que importa no momento é para envio de dados para  display LCD, não pretendo entrar em detalhes da estrutura de programação desta macro porque não interessa no momento, mas é muito simples seu codigo, mas a melhor definição desta macro é :

A melhor maneira de formar um série de dados, é usar uma diretiva DT(definir tabela). Esta instrução guarda uma série  de dados na memória de programa, na forma  de um grupo de intruções RETLW cujos operandos são os caracteres da cadeia de caracteres.”

 

Exemplo:

ORG 0X00

GOTO MAIN

 

STRING

 MOVWF PCL

STRING1 DT esta e a cadeia ASCII”

STRING2 DT “ segunda serie”

END

 

MOVLW .5

CALL STRING

 

A primeira instrução depois do rótulo Main, escreve a posição de um membro da cadeia(String) no registrador W. A seguir com a instrução CALL saltamos para o rotulo STRING, onde a posição de um membro da sequencia é adicionada ao valor do contador de programa :PCL=PCL+W. A seguir, teremos no contador de programa um endereço da instrução RETLW com o membro da cadeia desejado. Quando esta instrução é executada, o membro da cadeia vai ficar no registrador W e o endereço da instrução que sera executado  depois da instrução CALL estara no contador de programa. O rótulo END é um modulo elegante  de marcar o endereço em que a cadeia termina.

 

 

A macro PRINT possui cinco argumentos:

 

PRINT MACRO ADDR, START, END, VAR, OUT

 

ADDR é o endereço onde uma ou mais cadeias começam

START é o endereço do primeiro caracter da cadeia

END é o endereço em que a cadeia termina

VAR é a variavel que tem a função de apontar os membros da cadeia

OUT é um argumento que usamos para enviar o endereço do subprograma que trabalha com os dispositivos de saida como: LCD,RS-232 etc...

 

Exemplo:

ORG OXOO

GOTO MAIN

 

SERIES MOVWF PCL

MENSAGEM DT “ balee, testando”

END

 

MAIN

  PRINT SERIES, MENSAGEM, END, POINTER, LCDW

     .

     .

     .

 

Neste teste a Macro PRINT escreveria balee, testando no ecrão do LCD

 Facil não é  J

Esta macro vai servir para auxiliar a macro do LCD para enviar cadeia de caracter para o LCD, mas lembre que éla sozinha não escreve nada hehehehe, é preciso da macro LCD que chegaremos la

Uma variavel deve ser declarada: POINTER

Vamos ver outra Macro que sera utilizada neste modulo

 

 

 

 

 

 

 

 

 

Macro  WAIT

 

2 variaveis devem ser declaradas : WCYCLE, PRESCWAIT

O arquivo WAIT.INC contem duas macros WAIT e WAITX, através destas macros é possivel conseguir diferentes intervalos de tempo. Ambas macros usam usam o preenchimento do contador TMR0 como intervalo de tempo basico. Modificando o valor do prescaler, nós podemos variar o intervalo de tempo correspondente ao enchimento do contador TMR0.

 

 

 

 

 

 

Se usarmos um oscilador (ressonador) de 4MHz e para valores do prescaler  de 0, 1 e 7 a dividir o clock básico do oscilador, os intervalos de tempo causados por transbordo do temporizador TMR0, serão nestes três casos de respectivamente 0,512mS, 1,02mS  e 65,3mS. Na prática isso significa que o maior intervalo de tempo possível será de 256x65,3mS = 16,72 segundos.

 

 

A Macro WAIT tem um argumento. O valor standard atribuído ao prescaler nesta macro é 1 (1,02mS) e não pode ser alterado.

WAIT timeconst_1

timeconst_1 é um número de 0 a 255. Multiplicando esse número pelo tempo de enchimento, obtemos o tempo total:  TEMPO=timeconst_1 x 1,02mS.

Exemplo:  WAIT    .100

 

 

O exemplo mostra como gerar um atraso de 100x1,02mS no total de 102mS.

Ao contrário da macro WAIT, a macro WAITX tem mais um argumento que serve para atribuir um valor ao prescaler. Os dois argumentos da macro WAITX são :

Timeconst_2 é um número entre 0 e 255. Multiplicando esse número pelo tempo de enchimento, obtemos o tempo total:

TIME=timeconst_1 x 1,02mS x PRESCext

PRESCext é um número entre 0 e 7 que estabelece a relação entre o clock e o temporizador TMR0.

Exemplo: WAITX  .100, 7

O exemplo mostra como gerar um intervalo de tempo de 100x65,3 mS, ou seja, de 6,53S.

Texto original : http://www.mikroelektronika.co.yu/portuguese/product/books/picbook/capitulo6.htm

 

 

 

 

 

Macro para registrador de deslocamento

Os registos de deslocamento de entrada série e saída paralela, transformam dados série em dados paralelo. Sempre que ocorre um impulso ascendente de clock, o registo de deslocamento lê o estado lógico da linha de dados, guarda-o num registo temporário e repete oito vezes esta operação. Quando a linha ‘latch’ é ativada, os dados são copiados do registo de deslocamento para o registo de saída (registo latch) onde ficam disponíveis em paralelo.

 

 

Este tipo de ligação mostrado é para o chip 74HC595,  é facil enteder esta macro:

A macro usada neste exemplo é o arquivo  hc595.inc e é designada para o  74HC595.

Mas tive a liberdade de trocar o chip, o que nao muda em nada o funcionamento, o chip escolhido é o CD4094 por ser R$1 real mais barato hehehe  e mais facil de encontrar

A macro HC595 tem dois argumentos:

HC595 macro Var, Var1

Var  variável cujo conteúdo é transferido para as saídas do registo de deslocamento.

Var1 contador de ciclos (loops)

Exemplo:  HC595 Dados, contador

O dado que queremos transferir, é guardado na variável dados e a variável contador é usada como contador de ciclos.

...simples....

Fonte: http://www.mikroelektronika.co.yu/portuguese/product/books/picbook/capitulo6.htm

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MACRO LCD.INC

Bom esta macro é a mais importante e nao é autonoma, ela precisa de algumas outras para rodar perfeitamente, por exemplo, sem a macro WAIT.INC ela não pode rodas pois fica sem operações de delays, sem a macro PRINT.INC também não roda, pois fica sem operções de tabelas para strings, sem a macro LCDV8.INC a macro roda normalmente mas fica sem a opção de converter um byte em um numero decimal e apresentar no LCD.

Então esta macro é a mais importante, mas tambem a mais dependente das outras macros. No meu projeto do modulo serial  eu alterei algumas coisas nela, então as funções da macro original funcionarão perfeitamente na que modifiquei, vou explicar da macro original, cujo autor mantem livremente seus códigos e  curso em http://www.mikroelektronika.co.yu/portuguese/product/books/picbook/capitulo6a.htm

Na verdade o arquivo LCD.INC tem diversas macros em uma, para podermos acessar os diversos parametros de um LCD

2 variaveis devem ser declaradas:

LCDBUF

LCDTEMP

 

Comandos :

LCDINIT 

macro usada para iniciar o porta  que o LCD está ligado.  O LCD é configurado para trabalhar no modo de 4 bits.

Exemplo :

Main

 LCDINIT

..

..

 

LCDCHAR  LCDARG 

 Escrever caracter ASCII. O argumento é o caracter ASCII.

Exemplo:  LCDCHAR ‘d’

Escreve a letra d no LCD

 

 

LCDW  

  Escrever o caracter correspondente ao conteúdo do registo W.

Exemplo:  movlw ‘p'

                 LCDw

 

 

LCDCMD LCDCOMMAND  - Enviar comandos

Todos comandos:

LCDCMD LCDCLR = limpa todo display

LCDCMD LCDCH = cursor no inicio

LCDCMD LCDCR =mover cursor para direita

LCDCMD LCDCL = move cursor para esquerda

LCDCMD LCDSL = conteudo do display pra esquerda

LCDCMD LCDSR= conteudo do display para direita

LCDCMD LCDL1= seleciona linha 1 do LCD

LCDCMD LCDL2= seleciona linha 2  do LCD

 

LCD_DDADR  DDRamAddress – Aponta para o endereço da DDRAM

Exemplo:  LCD_DDADR .3

Faz com que o proximo caractere seja iniciado na terceira linha

 

LCDLINE – outro comando para acessar a linha 1 ou a linha 2 do ecra do LCD

Exemplo: LCDLINE1 = seleciona linha 1

              LCDLINE2 = seleciona linha 2

 

VEJ A O EXEMPLO PARA FICAR FACIL ENTENDER

 

 

 

 

 

Macro LCDV8.INC

Quando se trabalha com um microcontrolador os números são tratados na forma binária.

Como tal, é difícil apresentá-los num display. É por isso que é  necessário converter esses números do sistema binário para o sistema decimal, de modo a que possam ser facilmente entendidos. A seguir, apresentam-se as listagens de duas macros LCDval_08

A  macro LCDval_08 converte um número binário de oito bits num número decimal entre 0 e 255 e mostra o resultado num display LCD. É necessário declarar as seguintes variáveis no programa principal: TEMP1, TEMP2, LO, LO_TEMP, BCHECK. O número binário de oito bits é guardado na variável LO. Quando a macro é executada, o equivalente decimal deste número vai ser mostrado no display LCD. Os zeros à esquerda não irão ser mostrados.

Depois vc vera que para usar esta macro é só colocar o byte na variavel LO e chamar no programa

LCDVAL_8

Fazendo isto, juntamente com a macro do LCD vc poe no visor do LCD o numero em decimal do byte que esta na variavel LO ... facil ... né J

5 VARIAVEIS DEVEM SER DECLARADAS NO PROGRAMA:

TEMP1, TEMP2, LO, LO_TEMP,BCHECK