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' LCDwLCDCMD LCDCOMMAND - Enviar comandosTodos comandos:LCDCMD LCDCLR = limpa todo displayLCDCMD LCDCH = cursor no inicioLCDCMD LCDCR =mover cursor para direitaLCDCMD LCDCL = move cursor para esquerdaLCDCMD LCDSL = conteudo do display pra esquerdaLCDCMD LCDSR= conteudo do display para direitaLCDCMD LCDL1= seleciona linha 1 do LCDLCDCMD LCDL2= seleciona linha 2 do LCDLCD_DDADR DDRamAddress – Aponta para o endereço da DDRAMExemplo: LCD_DDADR .3Faz com que o proximo caractere seja iniciado na terceira linhaLCDLINE – outro comando para acessar a linha 1 ou a linha 2 do ecra do LCDExemplo: LCDLINE1 = seleciona linha 1LCDLINE2 = 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
|