You are on page 1of 168

PicBasic Pro Compiler

For i = 1 To 10
Gosub nextchar
Serout 0,N2400,[#C
count = count * 2
Next i
Dtmfout 1,[1,2,3,4]
I2cread cont,addr,[idata]
If PORTA.1 = 0 Then pbpressed
* slip + count + 1
loop

0
1
1
00
1

microEngineering Labs, Inc.


Copyrights e Marcas Registradas

Copyright ©1999 microEngineering Labs, Inc.


Todos os direitos reservados.

EPIC e PicBasic Pro são marcas registradas da microEngineering Labs, Inc.


BASIC Stamp é marca registrada da Parallax, Inc.
PICmicro é marca registrada da Microchip Technology Inc.

2/99
PicBasic Pro Compiler

microEngineering Labs, Inc.


PicBasic Pro Compiler

CONTEÚDO

1. Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1. Os PICmicros . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Sobre Este Manual . . . . . . . . . . . . . . . . . . . . . . . . 3

2. I n i c i a n d o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1. Instalação do Software. . . . . . . . . . . . . . . . . . . . . . . 5
2.2. Seu Primeiro Programa. . . . . . . . . . . . . . . . . . . . . . . . 5
2.3. Programe Este PicMicro . . . . . . . . . . . . . . . . . . . . 7
2.4. Ele Vive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5. Eu Tive Problemas . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6. Estilos de Código. . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.6.1. Comentários . . . . . . . . . . . . . . . . . . . . . . 11
2.6.2. Nomes de Pinos e Variáveis . . . . . . . . . . . 12
2.6.3. Rótulos . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.6.4. GOTO . . . . . . . . . . . . . . . . . . . . . . . . . 13

3. Opções de Linha de Comando. . . . . . . . . . . . . . . . . . . . . . . . . . . 15


3.1. Utilização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2. Opções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2.1. Opção -A . . . . . . . . . . . . . . . . . . . . . . . 16
3.2.2. Opção -C . . . . . . . . . . . . . . . . . . . . . . . 16
3.2.3. Opção -H ou -? . . . . . . . . . . . . . . . . . . 17
3.2.4. Opção -I . . . . . . . . . . . . . . . . . . . . . . . 17
3.2.5. Opção -L . . . . . . . . . . . . . . . . . . . . . . . 17
3.2.6. Opção -O . . . . . . . . . . . . . . . . . . . . . . 17
3.2.7. Opção -P . . . . . . . . . . . . . . . . . . . . . . . 18
3.2.8. Opção -S . . . . . . . . . . . . . . . . . . . . . . . 18
3.2.9. Opção -V . . . . . . . . . . . . . . . . . . . . . . . 18

4. O Básico do PicBasic Pro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19


4.1. Identificadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.2. Rótulos de Linha. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.3. Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.4. Aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.5. Conjuntos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.6. Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.7. Símbolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.8. Constantes Numéricas . . . . . . . . . . . . . . . . . . . . . . . 23
4.9. Constantes Alfanum. . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.10. Pinos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.11. Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
i
PicBasic Pro Compiler

4.12. Linhas c/ Decl. Múltiplas . . . . . . . . . . . . . . . . . . . . 26


4.13. Caractere de Extensão de Linha. . . . . . . . . . . . . . . . . 26
4.14. INCLUDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.15. DEFINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.16. Op. Matemáticos. . . . . . . . . . . . . . . . . . . . . . . . . 28
4.16.1. Multiplicação . . . . . . . . . . . . . . . . . . . 30
4.16.2. Divisão . . . . . . . . . . . . . . . . . . . . . . . 30
4.16.3. Desl. . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.16.4. ABS . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.16.5. COS . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.16.6. DCD . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.16.7. DIG . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.16.8. MAX e MIN . . . . . . . . . . . . . . . . . . 31
4.16.9. NCD . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.16.10. REV . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.16.11. SIN . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.16.12. SQR . . . . . . . . . . . . . . . . . . . . . . . . 32
4.16.13. Operadores a Bit . . . . . . . . . . . . . . 32
4.17. Operadores de Comparação. . . . . . . . . . . . . . . . . . . 33
4.18. Operadores Lógicos. . . . . . . . . . . . . . . . . . . . . . . 33

5. Referência de Declarações do PicBasic Pro. . . . . . . . . . . . . . . . . . 35


5.1. @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2. ASM..ENDASM . . . . . . . . . . . . . . . . . . . . . . . . . . 38
5.3. BRANCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5.4. BRANCHL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.5. BUTTON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.6. CALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.7. CLEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.8. COUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.9. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.10. DEBUG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.11. DISABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.12. DTMFOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.13. EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.14. ENABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.15. END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
5.16. FOR..NEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.17. FREQOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.18. GOSUB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.19. GOTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.20. HIGH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.21. HSERIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
ii
PicBasic Pro Compiler

5.22. HSEROUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.23. I2CREAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.24. I2CWRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.25. IF..THEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.26. INPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.27. {LET} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.28. LCDOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.29. LOOKDOWN . . . . . . . . . . . . . . . . . . . . . . . . . . 75
5.30. LOOKDOWN2 . . . . . . . . . . . . . . . . . . . . . . . . . 76
5.31. LOOKUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.32. LOOKUP2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.33. LOW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.34. NAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.35. ON INTERRUPT . . . . . . . . . . . . . . . . . . . . . . . . 81
5.36. OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.37. PAUSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.38. PAUSEUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.39. PEEK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
5.40. POKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.41. POT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.42. PULSIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.43. PULSOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.44. PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.45. RANDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
5.46. RCTIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.47. READ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.48. RESUME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.49. RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.50. REVERSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.51. SERIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.52. SERIN2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.53. SEROUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.54. SEROUT2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.55. SHIFTIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
5.56. SHIFTOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.57. SLEEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
5.58. SOUND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
5.59. STOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
5.60. SWAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
5.61. TOGGLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
5.62. WHILE..WEND . . . . . . . . . . . . . . . . . . . . . . . . 118
5.63. WRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
5.64. XIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
iii
PicBasic Pro Compiler

5.65. XOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

6. Estrutura de Um Programa Compilado . . . . . . . . . . . . . . . . . . . 125


6.1. Cabeçalhos de Alvo Específico . . . . . . . . 125
6.2. Os Arq. de Bibliotecas. . . . . . . . . . . . . . . . . . . . . . . . 125
6.3. Código Gerado pelo PBP . . . . . . . . . . . . . . . . . . . . 126
6.4. Estrutura do Arq. .ASM. . . . . . . . . . . . . . . . . . . . . . 126

7. Outras Considerações do PicBasic Pro . . . . . . . . . . . . . . . . . 127


7.1. Quão Rápido é Bastante Rápido?. . . . . . . . . . . . . . . . 127
7.2. Ajustes de Configuração . . . . . . . . . . . . . . . . . . . 129
7.3. Utiliz. da RAM. . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.4. Pal. Reservadas . . . . . . . . . . . . . . . . . . . . . . . . 131
7.5. Vida Após 2K . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

8. Programação em Linguagem Assembly . . . . . . . . . . . . . . . . . 133


8.1. Dois Assemblers - S/ Espera . . . . . . . . . . . . . 133
8.2. Programando em Linguagem Assembly . . . . . . . 134
8.3. Inserção do Assembly Em-Linha . . . . . . . . . . . . . 135
8.4. Outro Detalhe do Assembly . . . . . . . . . . . . . . . . . . 137

9. Interrupções. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
9.1. Interrupções em Geral . . . . . . . . . . . . . . . . . . . . . 139
9.2. Interrupções em BASIC. . . . . . . . . . . . . . . . . . . . . . 140
9.3. Interrupções em Assembler. . . . . . . . . . . . . . . . . . . 142

10. Diferenças do PicBasic Pro / PicBasic / Stamp . . . . . . . . . 147


10.1. Veloc. de Execução . . . . . . . . . . . . . . . . . . . . . . . 147
10.2. I/O Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
10.3. Instruções p/ Baixo Consumo. . . . . . . . . . . . . . . . . . 148
10.4. Interface PC Faltante . . . . . . . . . . . . . . . . . . . . 148
10.5. S/ Variáveis Automáticas . . . . . . . . . . . . . . . . . 149
10.6. S/ Variáveis do Tipo Nibble . . . . . . . . . . . . . . . . 149
10.7. Op. Matemáticos. . . . . . . . . . . . . . . . . . . . . . . . 149
10.8. [ ] Versus ( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
10.9. DATA, EEPROM, READ e WRITE . . . . . . . 151
10.10. DEBUG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
10.11. GOSUB e RETURN . . . . . . . . . . . . . . . . . 152
10.12. I2CREAD e I2CWRITE . . . . . . . . . . . . . . . 152
10.13. IF..THEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
10.14. MAX e MIN . . . . . . . . . . . . . . . . . . . . . . . . 152
10.15. SERIN e SEROUT . . . . . . . . . . . . . . . . . . 153
10.16. SLEEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
iv
PicBasic Pro Compiler

Apêndice A
Sumário do Conj. de Instruções do Microchip Assembly. . . 155

Apêndice B
Informação Para Contato. . . . . . . . . . . . . . . . . . . . . . . . . 157

v
PicBasic Pro Compiler

vi
PicBasic Pro Compiler

1. Introdução
O PicBasic Pro Compiler (ou PBP) é nossa linguagem de programação
de próxima geração que torna mais rápido e fácil para você programar
os poderosos microcontroladores PICmicro da Microchip Technology.
A linguagem BASIC semelhante ao inglês é mais fácil de ler e escrever que a
a ardilosa linguagem Microchip Assembly.

O PicBasic Pro Compiler é "igual ao BASIC Stamp II" e tem a maioria das biblio-
tecas e funções do BASIC Stamp I e II. Sendo ele um verdadeiro compilador,
os programas rodam mais rápido e podem ser maiores do que em seus
equivalentes Stamp.

O PBP não é tão compatível c/ os BASIC Stamps como nosso PicBasic


Compiler original é c/ o BS1. Foram tomadas decisões que esperamos
melhorem a linguagem em geral. Uma delas foi adicionar um
IF..THEN..ELSE..ENDIF real em vez de IF..THEN(GOTO) dos
Stamps. Estas diferenças serão detalhadas mais adiante neste manual.

O PBP cria por padrão arquivos que rodam em um PIC16F84-04/P de clock


4Mhz. Apenas um mínimo de outras peças é necessário: 2 capacitores de 22pf
p/ o cristal de 4Mhz, um resistor pull-up de 4.7K ligado ao pino /MCLR e uma
fonte apropriada de 5 volts. Vários PICmicros que não o 16F84, bem
como osciladores de freqüências diferentes de 4Mhz, podem ser usados c/ o
PicBasic Pro Compiler.

1.1. Os PICmicros

O PicBasic Pro Compiler produz código que pode ser programado em


uma variedade de microcontroladores PICmicro tendo de 8 a 68 pinos
e várias características em-chip incluindo conversores A/D, timers de hardware
e portas seriais.

Há alguns PICmicros que não irão funcionar c/ o PicBasic Pro


Compiler, notavelmente a série PIC16C5x, incluindo o PIC16C54 e o
PIC16C58. Estes PICmicros baseiam-se no antigo núcleo de 12 bits ao invés
do núcleo mais atual de 14 bits. O PicBasic Pro Compiler requer algumas
das características apenas disponíveis com o núcleo de 14 bits, sendo a mais
destacada a pilha de 8 níveis.

Há vários, vários PICmicros, alguns compatíveis em pinagem c/ a série


'5x, que podem ser usados com o PicBasic Pro Compiler. Atualmente, a

1
PicBasic Pro Compiler

lista inclui o PIC16C554, 556, 558, 61, 62(AB), 620(A), 621(A),


622(A), 63(A), 64(A), 65(AB), 66, 67, 71, 710, 711, 715, 72(A), 73(AB),
74(AB), 76, 77, 773, 774, 84, 923, 924, o PIC16F83, 84, 873, 874,
876, 877, o PIC12C671 e 672 e o PIC14C000, c/ a Microchip
adicionando mais a uma taxa rápida. Para substituição direta de um PIC16C54 ou
58, o PIC16C554, 558, 620 e 622 trabalham bem c/ o compilador e
têm preços muito próximos.*

Para projetos de uso geral em PICmicro utilizando o PicBasic Pro


Compiler, o PIC16F84 (ou PIC16C84 se o 'F84 não estiver disponível) é o
PICmicro atual p/ se escolher. Este microcontrolador de 18 pinos usa tecnologia
flash (ou EEPROM) p/ permitir rápido apagamento e reprogramação p/
uma rápida depuração. Com o clique do mouse no software de
programação, o PIC16F84 pode ser instantaneamente apagado e então re-
programado por várias e várias vezes. Outros PICmicros nas séries 12C67x,
16C55x, 16C6xx, 16C7xx e 16C9xx tanto podem ser programáveis uma
única vez (OTP) ou ter uma janela de quartzo no topo (JW) p/ permitir
apagamento por exposição à luz ultravioleta por vários minutos.

O PIC16F84 (e 'C84) contém também 64 bytes de memória de dados


que pode ser usada p/ armazenar dados de programa e outros parâmetros
mesmo quando a força estiver desligada. Esta área de dados pode ser acessada
simplesmente usando-se os comandos READ e WRITE do PicBasic
Pro Compiler. (O código estará sempre permanentemente guardado no
espaço de código do PICmicro estando a força ligada ou não.

Usando-se o 'F84 p/ teste inicial de um programa, o processo de depuração poderá


ser acelerado. Uma vez que as rotinas principais estejam operando
satisfatoriamente, um PICmicro c/ mais capacidades ou características expandidas
do compilador poderá ser usado.

Enquanto muitas características do PICmicro serão discutidas neste manual, p/


total informação sobre o PICmicro é necessário obter-se as folhas de dados do
PICmicro apropriadas ou o CD-ROM da Microchip Technology. Refira-se
ao Apêndice B p/ informação de contato.

*O preço de venda é ditado pela Microchip Technology Inc. e seus


distribuidores.

2
PicBasic Pro Compiler

1.2. Sobre Este Manual

Este manual não pode ser um tratado completo na linguagem BASIC. Ele
descreve o conj. de instruções do PicBasic Pro e provê exemplos em
como usá-lo. Se você não está familiarizado c/ programação BASIC, você
deve adquirir um livro sobre o tema. Ou apenas mergulhe de cabeça. O BASIC
é projetado p/ ser uma linguagem fácil de usar e há programas de exemplo
adicionais no disco que podem ajudá-lo a começar.

A próxima seção deste manual cobre a instalação do PicBasic Pro


Compiler e você escreverá seu primeiro programa. A seguir há uma seção que
descreve diferentes opções p/ compilar programas.

A seguir, será coberto o básico de programação, seguido por uma seção de referência
listando cada comando do PicBasic Pro em detalhe. A seção de referência
mostra cada protótipo do comando, uma descrição do comando e
alguns exemplos. As chaves, { }, indicam parâmetros opcionais.

O resto do manual provê informação p/ programadores


avançados - todo o funcionamento interno do compilador.

3
PicBasic Pro Compiler

4
PicBasic Pro Compiler

2. I n i c i a n d o

2.1. Instalação do Software

Os arquivos do PicBasic Pro estão compactados em um arquivo auto-extraível no


disquete. Eles precisam ser descompactados antes do uso. Para descompactar os
arquivos, crie um sub-diretório no seu disco rígido chamado PBP ou outro
nome de sua escolha, digitando:

md PBP

no prompt do DOS. Mude p/ o diretório:

cd PBP

Assumindo que o disquete de distribuição está no drive a:, descompacte os


arquivos no diretório PBP:

a:\pbpxxx -d

Não esqueça da opção -d ao final do comando. Isto assegura que os


sub-diretórios apropriados dentro de PBP sejam criados.

Certifique-se de que FILES e BUFFERS estejam ajustados p/ ao menos 50 no


seu arquivo CONFIG.SYS. Dependendo de quantos FILES e BUFFERS já
estiverem em uso pelo seu sistema, poderá ser necessário alocar um núme-
ro maior.

2.2. Seu Primeiro Programa

Para a operação do PicBasic Pro Compiler você precisará de um editor de texto ou


processador de texto p/ a criação do arquivo fonte do seu programa, algum tipo
de programador de PICmicro como o nosso EPIC Plus Pocket PICmicro
Programmer, e o PicBasic Pro Compiler propriamente dito. Claro que você
também precisará de um PC p/ rodar tudo isso.

A seqüência de eventos é mais ou menos a seguinte:

Primeiro crie o arq. fonte em BASIC p/ o programa usando o seu editor de texto
ou processador de texto favorito. Se você não tem um favorito, o EDIT do DOS
(incluso no MS-DOS) ou o NOTEPAD do Windows (incluso no Windows

5
PicBasic Pro Compiler

e Windows 95/98) podem substituir. O nome do arq. fonte deve termi-


nar c/ (mas não é requerido) a extensão .BAS.

O arquivo texto criado precisa ser texto ASCII puro. Ele não pode conter quais-
quer códigos especiais que possam ser inseridos por processadores de texto p/
seus propósitos. Normalmente lhe é dada a opção de salvar o arquivo como
DOS puro ou texto ASCII pela maioria dos processadores.

O seguinte programa provê um bom teste inicial de um PICmicro no mundo


real. Você pode digitá-lo ou simplesmente pegá-lo do sub-diretório
SAMPLES incluso no disquete de distribuição do PicBasic
Pro Compiler. O nome do arq. é BLINK.BAS. O arq. fonte BASIC
deve ser criado ou movido p/ o mesmo diretório onde o arquivo
PBP.EXE estiver.

' Programa exemplo p/ piscar um LED ligado ao PORTB.0 aprox.


uma vez por segundo

loop: High PORTB.0 ‘ Liga o LED


Pause 500 ‘ Atraso de .5 segundos

Low PORTB.0 ‘ Desliga o LED


Pause 500 ‘ Atraso de .5 segundos

Goto loop ‘ Voltar ao loop e piscar


o LED indefinidamente
End

Uma vez satisfeito que o programa que você escreveu funcionará s/


falhas, você pode executar o PicBasic Pro Compiler entrando PBP
seguido pelo nome do seu arquivo texto no prompt do DOS. Por exemplo, se
o arquivo texto que você criou chama-se BLINK.BAS, no prompt de comando
do DOS entre:

PBP blink

O compilador irá mostrar uma mensagem de inicialização (copyright) e


processar seu arq. Se ele gostar do seu arq., ele irá criar um arq. de cód. fonte
assembler (nesse caso chamado BLINK.ASM) e automaticamente invocar seu
montador p/ completar a tarefa. Se tudo correr bem, o arq. final de código
do PICmicro será criado (nesse caso, BLINK.HEX). Se você tiver deixado o
compilador infeliz, ele enviará uma série de erros que precisarão ser
corrigidos no seu arq. fonte BASIC antes de você tentar compilar novamente.

6
PicBasic Pro Compiler

P/ ajudar a ter certeza de que seu arq. original não tem erros, é melhor começar
escrevendo e testando um pequeno pedaço de seu programa, ao invés de escrever
um bloco inteiro de 100.000 linhas de uma só vez e então tentar depurá-lo de ponta
a ponta.

Se você não especificar de outra maneira, o PicBasic Pro Compiler irá


criar código p/ o PIC16F84 por padrão. Para compilar códigos p/ PICmicros que
não o 'F84, simplesmente use a opção de linha de comando -p descrita mais
tarde no manual p/ especificar um processador alvo diferente. Por exemplo, se você
pretende rodar o programa acima, BLINK.BAS, em um PIC16C74, compile-
o usando o comando:

PBP -p16c74 blink

2.3. Programe Este PicMicro

Há ainda duas etapas a fazer - colocar seu programa compilado no


microcontrolador PICmicro e testá-lo.

O PicBasic Pro Compiler gera arquivos padrão de 8 bits Merged Intel HEX
(.HEX) que podem ser usados c/ qualquer programador PICmicro incluindo
nosso EPIC Plus Pocket PICmicro Programmer. Os PICmicros não podem ser
programados c/ cabos de programação do BASIC Stamp.

O seguinte é um exemplo de como um PICmicro pode ser programado usando


nosso EPIC Programmer c/ o software de programação DOS. Se o
Windows95/98/NT estiver disponível, é recomendado usar a versão Win-
dows do EPIC.

Certifique-se de que não haja PICmicros instalados no soquete de programação


do EPIC Programmer ou quaisquer adaptadores.

Conecte o EPIC Programmer à porta de impressora paralela do PC usando um


cabo de extensão DB25 macho p/ DB25 fêmea.

Plugue o adaptador CA na parede e então no EPIC Programmer


(ou encaixe 2 baterias novas de 9 volts no programador e conecte o
jumper “Batt ON”).

O LED no EPIC Programmer poderá estar aceso ou não neste ponto. Não
insira um PICmicro no soquete de programação quando o LED estiver aceso
ou antes do software de programação ter sido iniciado.

7
PicBasic Pro Compiler

Entre:

EPIC

no prompt de comando do DOS p/ iniciar o software de programação. O


software EPIC deve ser rodado de uma sessão DOS pura ou de uma seção
de tela cheia do DOS sob Windows ou OS/2. (Desencorajamos
rodar sob Windows. O Windows (todas as variantes) altera o tempo do sis-
tema e brinca c/ a porta quando você não está olhando, o que pode causar
erros de programação).

O software EPIC irá dar uma olhada ao redor p/ encontrar onde o EPIC
Programmer está ligado e prepará-lo p/ programar um PICmicro. Se o EPIC
Programmer não for encontrado, cheque todas as conexões acima e veri-
fique que não haja nenhum PICmicro ou adaptador conectado ao
programador. Digitando:

EPIC /?

no prompt de comando do DOS irá mostrar uma lista de opções disponíveis


p/ o software EPIC.

Uma vez que a tel de programação é mostrada, use o mouse p/ clicar em


Open file ou pressione Alt-O no seu teclado. Use o mouse (ou
teclado) p/ selecionar BLINK.HEX ou qualquer outro arq. que você quiser
programar no PICmicro a partir da caixa de diálogo.

O arquivo irá carregar e você deverá ver uma lista de números na janela à es-
querda. Este é seu programa em código PICmicro. À direita da tela há
um mostrador da informação de configuração que irá ser
programada no PICmicro. Verifique que isto esteja correto antes de
prosseguir.

Em geral, o Oscillator deverá ser ajustado p/ XT p/ um cristal de 4Mhz e o


Watchdog Timer deverá ser ajustado p/ ON p/ programas PicBasic Pro. Mais
importante, Code Protect deverá estar em OFF quando for programar
qualquer PICmicro c/ janela (JW). Você não conseguirá apagar um PICmicro
c/ janela qu tenha sido protegido contra cópia.

Quando tudo parecer maravilhoso, é hora de inserir um PICmicro no soquete


de programação e clicar em Program ou pressionar Alt-P no
teclado. O PICmicro será primeiramente checado p/ ter certeza que está apagado
e então seu código será programado nele. Se o PICmicro não estiver
8
PicBasic Pro Compiler

apagado e for um 16F84 ou 16C84, você pode simplesmente escolher progra-


mar por cima s/ apagar antes.

Uma vez que a programação esteja completa e o LED esteja apagado, é hora
de testar seu programa.

2.4. Ele Vive

O esquema de amostra abaixo lhe dá uma idéia do pouco que precisa


ser ligado ao PICmicro p/ fazê-lo funcionar. Basicamente tudo que você
precisa é um resistor de pull-up na linha /MCLR, um cristal de 4Mhz c/ 2
capacitores, e algum tipo de fonte de alimentação de 5 volts. Nós acrescen-
tamos um LED e um resistor p/ prover a saída p/ o programa BLINK.

+5V +5V

1 18
RA2 RA1
2 17
4.7K RA3 RA0
3 16 4Mhz
RA4 OSC1
4 15
MCLR OSC2
5 14
Vss Vdd
6 13
RB0 RB7
22pf 22pf
7 12
RB1 RB6
470 8 11
RB2 RB5
9 10
RB3 RB4
LED
.1uf
PIC16F84

Monte e cheque duplamente este simples circuito em um breadboard e encaixe


o PICmicro que você acabou de programar. Nossa linha PICProto de placas de
prototipagem é perfeita p/ este tipo de coisa.

Conecte uma fonte de alimentação. Seu PICmicro deverá ganhar vida e começar
a piscar o LED cerca de uma vez por segundo. Se ele não piscar, cheque todas
as conexões e certifique-se de que os 5 volts estão presentes nos pinos apropri-
ados no PICmicro.

Partindo destas simples iniciações, você poderá criar sua própria apli-
cação que conquistará o mundo.

9
PicBasic Pro Compiler

2.5. Eu Tive Problemas

Os problemas mais comuns em fazer rodar os PICmicros envolvem ter


certeza de que os poucos componentes externos são de valor apropriado e
estão corretamente ligados ao PICmicro. A seguir estão algumas sugestões
p/ ajudar a conseguir que as coisas funcionem.

Certifique-se de que o pino /MCLR esteja ligado aos 5 volts através de algum tipo
de circuito de reset protegido contra tensão ou simplesmente c/ um resistor de 4,7K.
Se você deixar o pino s/ ligação, seu nível flutuará e algumas vezes o
PICmicro funcionará mas normalmente não. O PICmicro tem um circuito de
power-on-reset em-chip assim em geral apenas um resistor de pull-up externo
é adequado. Mas em alguns casos o PICmicro poderá não se ligar cor-
retamente e um circuito externo poderá ser necessário. Veja os PICmicro
data books da Microchip p/ mais informações.

Esteja certo de que você tem um bom cristal c/ capacitores de valores corretos
ligados a ele. Valores de capacitores podem ser difíceis de ler. Se os valores esti-
verem muito fora, o oscilador não partirá e rodará corretamente. Um cristal
de 4MHz c/ 2 capacitores de disco cerâmico de 22pf (picofarads) é um bom começo p/
a maioria dos PICmicros. Mais uma vez, confirme nos data books da Micro-
chip p/ detalhes adicionais no assunto.

Certifique-se de que sua fonte de alim. é apta p/ a tarefa. Enquanto que o


PICmicro consome muito pouca potência, a fonte deve ser bastante bem fil-
trada. Se o PICmicro está controlando dispositivos que puxam muita corrente da
sua fonte, à medida em que se ligam e desligam eles podem pôr ruído sufi-
ciente nas linhas de alimentação p/ fazer o PICmicro parar de funcionar
corretamente. Até mesmo um mostrador a LED pode criar dreno instantâneo sufi-
ciente p/ derrubar momentâneamente uma fonte pequena (como uma bateria de
9 volts) e fazer o PICmicro perder a cabeça.

Cheque as folhas de dados do PICmicro. Alguns dispositivos têm características que


podem interferir c/ operações de pinos esperadas. As peças PIC16C62x (os
16C620, 621 e 622) são um bom exemplo disto. Estes PICmicros têm
comparadores analógicos no PORTA. Quando estes chips iniciam-se,
PORTA é ajustado p/ o modo analógico. Isto faz c/ que as funções dos pinos no PORTA
trabalhem numa maneira inesperada. Para mudar os pinos p/ digital, simplesmente
adicione a linha:

CMCON = 7

10
PicBasic Pro Compiler

próximo do início do seu programa. Qualquer PICmicro c/ entradas analógicas,


tal como os da série PIC16C7xx irá ligar-se em modo analógico. Você
deve fixá-las p/ digital se é assim que você pretende usá-las:

ADCON1 = 7

Um outro exemplo de desastre em potencial é que o pino 4 de PORTA, mostra


um comportamento incomum quando usado como saída. Isto é porque o pino tem
uma saída em coletor aberto ao invés do habitual estágio bipolar do resto dos
pinos de saída. Isto significa que ele pode ser puxado ao terra quando fixado em 0,
mas simplesmente flutuará quando fixado em 1, ao invés de ir p/ nível alto. P/ fazer este
pino agir da maneira esperada, adicione um resistor pull-up entre o pino e os
5 volts. O valor do resistor poderá estar entre 1K e 33K,
dependendo da excitação necessária p/ a entrada conectada. Este pino age
como qualquer outro pino quando usado como entrada.

Todos os pinos do PICmicro estão fixados como entradas ao ligar-se. Se você precisa
que um pino seja uma saída, fixe-o como saída antes de usá-lo, ou use um comando
do PicBasic Pro que o faça p/ você. Mais uma vez, revise as folhas de dados
do PICmicro p/ familiarizar-se c/ as idiossincrasias de uma peça especí-
fica.

Comece pequeno. Escreva programas curtos p/ testar características c/ as quais você


esteja incerto ou tendo problemas. Uma vez que estes programas menores estejam
funcionando corretamente, você poderá trabalhá-los mais.

Tente fazer as coisas de outra maneira. Às vezes o que você está tentando fazer
parece que deveria funcionar mas não o faz, não importa o quanto você bata
nele. Normalmente há mais de uma maneira de se descascar um programa. Tente
abordar o problema de um ângulo diferente e talvez isto
resulte num esclarecimento.

2.6. Estilos de Código

Escrever programas legíveis e preserváveis é uma arte. Há algumas


técnicas simples que você pode seguir que podem ajudá-lo a tornar-se um artista.

2.6.1. Comentários

Use muitos comentários. Mesmo que seja perfeitamente óbvio p/ você o que o
código está fazendo à medida que você o escreve, outra pessoa que esteja olhando
p/ o programa (ou mesmo você quando tornar-se outra pessoa mais tarde na vida) pode

11
PicBasic Pro Compiler

não ter qualquer idéia do que você estava tentando conseguir. Enquanto que os
comentários tomam espaço no seu arq. fonte BASIC, eles não tomam nenhum
espaço adicional no PICmicro portanto use-os livremente.

Faça os comentários dizerem-lhe algo útil sobre o que o programa está


fazendo. Um comentário do tipo "Fixa o Pin0 em 1" somente explica a sintaxe da
linguagem mas não faz nada p/ dizer-lhe por quê você tem a necessidade de fazer
isto. Algo do tipo "Liga o LED de Bateria Fraca" pode ser muito mais
útil.

Um bloco de comentários no início do programa e antes de cada seção


de código pode descrever o que está para acontecer em mais detalhes
do que só o espaço restante após cada declaração. Mas não inclua um bloco
de comentários ao invés de comentáros de linha individuais - use ambos.

No começo do programa descreva o que o programa pretende fazer,


quem o escreveu e quando. Pode também ser útil listar informação
de revisão e datas. Especificar a que cada pino está ligado pode ser de
ajuda p/ se lembrar em qual hardware este programa foi projetado
p/ rodar. Se for pretendido que ele rode c/ um cristal fora de padrão ou
opções especiais do compilador, esteja certo de listá-las.

2.6.2. Nomes de Pinos e Variáveis

Faça do nome de um pino ou variável algo mais coerente do que Pino0


ou B1. Em acréscimo ao uso liberal de comentários, nomes descritivos de pinos
e variáveis podem melhorar grandemente a legibilidade. O seguinte fragmento
de código demonstra:

BatLED var PORTB.0 ‘ LED de bateria fraca


nivel var byte ‘ A variável irá conter o
nível da bateria

If nivel < 10 Then ‘ Se o nível estiver baixo


High BatLED ‘ Acenda o LED
Endif

2.6.3. Rótulos

Rótulos também devem ser mais significativos do que "rotulo1:" ou "aqui:". Até mesmo
um rótulo como "loop:" é mais descritivo (embora apenas levemente). Normal-
mente a linha ou rotina p/ a qual você está pulando fará algo único. Tente e dê

12
PicBasic Pro Compiler

pelo menos uma pista de sua função c/ o rótulo, então prossiga c/ um


comentário.

2.6.4. GOTO

Finalmente, tente não usar muitos GOTOS. Enquanto GOTOS podem ser um
mal necessário, tente minimizar seu uso o máximo possível. Tente escrever
seu código em seções lógicas e não ficar pulando muito por aí.
GOSUBS podem ajudá-lo a conseguir isto.

13
PicBasic Pro Compiler

14
PicBasic Pro Compiler

3. Opções de Linha de Comando

3.1. Utilização

O PicBasic Pro Compiler pode ser invocado a partir da linha de comando do DOS
usando o seguinte formato de comando:

PBP Opções Nome_de_Arquivo

Zero ou mais Opções podem ser usadas p/ modificar a maneira na qual o PBP
compila o arq. especificado. Opções começam c/ um sinal de menos ( - ) ou uma
barra normal (/). O caractere seguinte ao sinal de menos ou barra é uma letra
que seleciona a Opção. Caracteres adicionais poderão vir a seguir se a
Opção requerer mais informação. Cada Opção deve ser separada por
por um espaço, embora nenhum espaço poderá ocorrer de dentro de uma Opção.

Múltiplas Opções podem ser usadas ao mesmo tempo. Por exemplo, a linha
de comando:

PBP -p16c71 -ampasm blink

irá fazer c/ que o arq. BLINK.BAS seja compilado usando MPASM como
montador e direcionado p/ um processador PIC16C71.

O primeiro ítem a não iniciar-se c/ um sinal de menos é assumido como Nome_de_Arquivo.


Se nenhuma extensão é especificada a extensão padrão .BAS é usada. Se for espe-
cificado um caminho, o arq. denominado é procurado naquele diretório. Independente-
mente de onde o arq. fonte é encontrado, os arq. gerados pelo PBP são colocados
no diretório atual.

Por padrão, o PBP lança automaticamente o montador (PM.EXE) se a compi-


lação é executada s/ erro. O PBP espera encontrar PM.EXE no
mesmo diretório que PBP.EXE. Se a compilação tem erros ou a opção -s
é usada, o montador não é lançado.

Se o PBP é invocado s/ parâmetros ou nome de arquivo, uma breve tela de ajuda é


mostrada.

15
PicBasic Pro Compiler

3.2. Options

Opção Descrição
A Usa um Montador diferente
C Insere linhas de fonte como Comentários no arq. montador
H(?) Mostra tela de Ajuda
I Usa um caminho de Inclusão diferente
L Usa um arq. de Biblioteca diferente
O Passa Opção p/ montador
P Especifica Processador alvo
S Pula execução do montador quando terminado
V Modo Verboso

3.2.1. Opção -A

O PBP tem a capacidade de usar tanto o PM, que é incluído c/ o PBP, como o
MPASM da Microchip e seu montador. Para especificar o MPASM (que deve
ser adquirido da Microchip), use -ampasm na linha de comando:

PBP -ampasm nome_de_arquivo

Se nenhum montador é especificado na linha de comando, o PM é usado. Veja a


seção sobre programação em linguagem assembly p/ mais informação.

3.2.2. Opção -C

A opção -C faz c/ que o PBP insira linhas do arq. fonte PicBasic Pro como
comentários no arq. fonte em linguagem assembly. Isto pode ser útil como
ferramenta de depuração ou aprendizado já que ela mostra a instrução
do PicBasic Pro seguida pelas instruções em linguagem assembly que ela gera.

PBP -c nome_de_arquivo

16
PicBasic Pro Compiler

3.2.3. Optção -H ou -?

A opção -H ou -? faz c/ que o PBP mostre uma breve tela de ajuda. Esta
tela de ajuda também é mostrada se nenhuma opção e nome de arq. são espe-
cificados na linha de comando.

3.2.4. Opção -I

A opção -I lhe permite selecionar o caminho de inclusão p/ arq. usados pelo


PicBasic Pro.

3.2.5. Opção -L

A opção -L lhe permite selecionar a biblioteca usada pelo PicBasic Pro. Esta
opção é geralmente desnecessária já que o arq. de biblioteca padrão está fixado em
um arq. de configuração p/ cada microcontrolador. Para mais informação sobre
as bibliotecas do PicBasic Pro, veja as seções avançadas mais tarde neste manual.

PBP -lpbpps2 nome_de_arquivo

Este exemplo diz ao PBP p/ compilar nome_de_arquivo usando a bibl. PicStic2.

3.2.6. Opção -O

A opção -O faz c/ que as letras que se seguem sejam passadas ao


montador em sua linha de comando como opções. Algumas opções pertinentes ao PM
estão listadas na seguinte tabela:

Opção PM Descrição
OD Gera Listagem, Tabela Simbólica e Arq. de Mapa
OL Gera apenas Listagem

PBP -ol nome_de_arquivo

Este exemplo diz ao PBP p/ gerar um nome_de_arquivo.1st após uma


compilação bem-sucedida.

Mais de uma opção -O pode ser passada ao montador de uma vez.

17
PicBasic Pro Compiler

O PICmicro Macro Assembler's manual em disco contém mais


informação sobre o montador e suas opções.

3.2.7. Opção -P

Se não for dito de outra maneira, o PBP compila programas p/ o PIC16F84. Se o


programa requer um processador diferente p/ seu alvo, seu nome deve ser
especificado na linha de comando usando a opção -P.

Por exemplo, se o processador alvo desejado p/ o programa PBP é um


PIC16C74, a linha de comando deverá parecer algo como o seguinte:

PBP -p16c74 nome_de_arquivo

3.2.8. Opção -S

Normalmente, quando o PBP compila um programa c/ sucesso, ele lança


automaticamente o montador. Isto é feito p/ converter a saída do montador
do PBP p/ uma imagem executável. A opção -S previne isso, deixando a
saída do PBP no arquivo .ASM gerado.

Já que -S previne o montador de ser invocado, as opções que são


simplesmente passadas ao montador usando a opção -O são efetivamente
anuladas.

PBP -s nome_de_arquivo

3.2.9. Opção -V

A opção -V liga o modo verboso do PBP o qual apresenta mais


informação durante a compilação do programa.

PBP -v nome_de_arquivo

18
PicBasic Pro Compiler

4. O Básico do PicBasic Pro

4.1. Identificadores

Um identificador é, bem simplesmente, um nome. Identificadores são usados no PBP p/


rótulos e nomes de variáveis. Um identificador é qualquer seqüência de letras,
dígitos e sublinhas, embora ele não deva começar c/ um dígito. Identificadores
não são sensíveis a caixa, assim rótulo, RÓTULO e Rótulo são todos tratados como
equivalentes. E enquanto rótulos podem ter qualquer número de caracteres de
comprimento, o PBP reconhece apenas os primeiros 32.

4.2. Rótulos de Linha

De forma a marcar declarações que o programa pode desejar referenciar


c/ os comandos GOTO ou GOSUB, o PBP usa rótulos de linha. Ao contrário de muitos
BASICs antigos, o PBP não permite números de linha e não requer que cada
linha seja rotulada. Ao invés disso, qualquer linha do PBP pode começar c/ um rótulo de linha,
que é simplesmente um identificador seguido por dois pontos (:).

aqui: Serout 0,N2400,["Olah, Mundo!",13,10]


Goto aqui

4.3. Variáveis

Variáveis são onde dados temporários são guardados num programa do PicBasic Pro.
Elas são criadas usando a palavra-chave VAR. Variáveis podem ser bits, bytes ou
palavras. O espaço p/ cada variável é alocado automaticamente na
RAM do microcontrolador pelo PBP. O formato p/ se criar uma variável é o
seguinte:

Rótulo VAR Tamanho{.Modificadores}

Rótulo é qualquer identificador, excluindo palavras-chave, como descrito acima. Tamanho


é BIT, BYTE ou WORD. Modificadores opcionais adicionam maior controle sobre
como a variável é criada. Alguns exemplos de criação de variável são:

cao var byte


gato var bit
w0 var word

Não há variáveis de usuário predefinidas no PicBasic Pro. Para o bem


da compatibilidade, foram providos dois arquivos que criam as variáveis

19
PicBasic Pro Compiler

padrão usadas c/ os BASIC Stamps: “bs1defs.bas” e


“bs2defs.bas”. Para usar um destes arquivos, adicione a linha:

Include “bs1defs.bas”
ou
Include “bs2defs.bas”

próximo ao topo do programa do PicBasic Pro. Estes arq. contém numerosas


declarações VAR que criam todas as variáveis do BASIC Stamp e definições
de pinagem.

Entretanto, ao invés de usar estes arquivos "enlatados", nós recomendamos que


você crie suas próprias variáveis usando nomes que tenham significado p/ você.

O número de variáveis disponível depende da quantidade de RAM em um


dispositivo em particular e o tamanho das variáveis e conjuntos. O PBP reserva
aproximadamente 24 posições da RAM p/ seu próprio uso. Ele pode também criar
variáveis temporárias adicionais p/ uso na ordenação de equações complexas.

4.4. Aliases

VAR pode também ser usado p/ criar um alias (um outro nome) p/ uma variável.
Isto é mais útil p/ acessar-se as vísceras de uma variável.

fido var cao ‘ fido eh um outro nome


p/ cao
b0 var w0.byte0 ‘ b0 eh o primeiro byte
da palavra w0
b1 var w0.byte1 ‘ b1 eh o segundo byte
da palavra w0
pulga var cao.0 ‘ pulga eh o bit0 de cao

20
PicBasic Pro Compiler

Modificador Descrição
BIT0 ou 0 Cria alias p/ o bit 0 do byte ou palavra
BIT1 ou 1 Cria alias p/ o bit 1 do byte ou palavra
BIT2 ou 2 Cria alias p/ o bit 2 do byte ou palavra
BIT3 ou 3 Cria alias p/ o bit 3 do byte ou palavra
BIT4 ou 4 Cria alias p/ o bit 4 do byte ou palavra
BIT5 ou 5 Cria alias p/ o bit 5 do byte ou palavra
BIT6 ou 6 Cria alias p/ o bit 6 do byte ou palavra
BIT7 ou 7 Cria alias p/ o bit 7 do byte ou palavra
BIT8 ou 8 Cria alias p/ o bit 8 da palavra
BIT9 ou 9 Cria alias p/ o bit 9 da palavra
BIT10 ou 10 Cria alias p/ o bit 10 da palavra
BIT11 ou 11 Cria alias p/ o bit 11 da palavra
BIT12 ou 12 Cria alias p/ o bit 12 da palavra
BIT13 ou 13 Cria alias p/ o bit 13 da palavra
BIT14 ou 14 Cria alias p/ o bit 14 da palavra
BIT15 ou 15 Cria alias p/ o bit 15 da palavra
BYTE0 ou LOWBYTE Cria alias p/ o bit inferior da palavra
BYTE1 ou HIGHBYTE Cria alias p/ o bit superior da palavra

4.5. Conjuntos

Conjuntos de variáveis podem ser criados de maneira similar às variáveis.

Rotulo VAR Tamanho(Numero de elementos)

Rotulo é qualquer identificador, excluindo palavras-chave, como descrito acima. Tamanho


é BIT, BYTE ou WORD. Numero de elementos são quantas posições de
do conjunto se deseja. Alguns exemplos de criação de conjuntos são:

tubaroes var byte[10]


peixe var bit[8]

21
PicBasic Pro Compiler

A primeira posição do conjunto é o elemento 0. No conjunto peixe definido acima,


os elementos são numerados peixe[0] a peixe[7] rendendo 8 elementos
no total.

Por causa da maneira c/ que os conjuntos são alocados na memória, há limites de tama-
nho p/ cada tipo:

Tam. Número Máximo de elementos


BIT 128
BYTE 64
WORD 32

Veja a seção sobre alocação de memória p/ mais informação.

4.6. Constantes

Constantes nomeadas podem ser criadas numa maneira similar às variáveis.


Pode ser mais conveniente usar um nome de constante ao invés de um número
de constante. Se o número precisa ser trocado, ele pode ser trocado em apenas
um lugar no programa; onde a constante é definida. Dados de variáveis não
podem ser guardados em uma constante.

Rotulo CON Expressao constante

Alguns exemplos de constantes são:

ratos con 3
ratoeiras con ratos * 1000

4.7. Símbolos

SYMBOL provê ainda um outro método p/ se dar aliases a variáveis e


constantes. SYMBOL não pode ser usado p/ criar uma variável. Use VAR p/
criar uma variável.

SYMBOL leao = gato ‘ gato foi criado anteriormente


usando VAR
SYMBOL rato = 1 ‘ O mesmo que rato con 1

22
PicBasic Pro Compiler

4.8. Constantes Numéricas

O PBP permite que constantes numéricas sejam definidas nas três bases: decimal,
binária e hexadecimal. Valores binários são definidos usando o prefixo '%'
e valores hexadecimais usando o prefixo '$'. Valores decimais são o
padrão e não requerem prefixo.

100 ‘ Valor decimal 100


%100 ‘ Valor binario p/ o decimal 4
$100 ‘ Valor hexadecimal p/ o decimal 256

Para facilidade de programação, caracteres únicos são convertidos p/ seus equi-


valentes ASCII. Constantes de caractere devem ser quoteadas usando aspas
e devem conter apenas um caractere (de outra forma, elas são cons-
tantes alfanuméricas).

"A" ‘ Valor ASCII p/ o decimal 65


"d" ‘ Valor ASCII p/ o decimal 100

4.9. Constantes Alfanuméricas

O PBP não provê capacidades de manuseio de séries de caracteres, mas elas podem
ser usadas c/ alguns comandos. Uma série contém um ou mais caracteres e é
delimitada por aspas. Não são suportadas seqüências de escape p/
caracteres não-ASCII (embora a maioria dos comandos do PBP têm
embutido este manuseio).

"Olah" ‘ String (Abrev. p/ "O","l","a","h")

Séries são normalmente tratadas como uma lista de valores de caractere individuais.

4.10. Pinos

Pinos podem ser acessados em um número de maneiras diferentes. O melhor jeito


p/ especificar um pino p/ uma operação é simplesmente usar seu nome PORT
e número de bit:

PORTB.1 = 1 ‘ Fixa PORTB, bit 1 p/ 1

Para tornar mais fácil de se lembrar p/ que um pino é usado, a ele deve-se
atribuir um nome usando o comando VAR. Desta maneira, o nome pode
então ser usado em qualquer operação:

23
PicBasic Pro Compiler

led var PORTA.0 ‘ Renomeia PORTA.0 como led


High led ‘ Fixa led (PORTA.0) p/ alto

Para compatibilidade c/ o BASIC Stamp, os pinos usados nos comandos do


PicBasic Pro Compiler podem também ser referenciados por número, 0 - 15. Estes
pinos são fisicamente mapeados sobre portas de hardware do PICmicro diferentes
dependendo de quantos pinos tem o microcontrolador.

Nº de pinos do PICmicro 0-7 8 - 15


8 pinos GPIO* GPIO*
18 pinos PORTB PORTA*
28 pinos (exceto 14C000) PORTB PORTC
28 pinos (14C000) PORTC PORTD
40 pinos PORTB PORTC
*GPIO e PORTA não têm 8 pinos de I/O.

Se uma porta não tem 8 pinos, tal como PORTA, só os números dos pinos
que existem podem ser usados, por exemplo 8 - 12. O uso dos pinos de número 13 - 15
não causará efeito visível.

Esta numeração dos pinos, 0 - 15, nada tem a ver c/ a numeração física dos pinos
de um PICmicro. Dependendo do PICmicro em particular, o pino número 0
poderia ser o pino físico 6, 21 ou 33, mas em cada caso ele mapeia-se ao PORTB.0
(ou GPIO.0 p/ dispositivos de 8 pinos, ou PORTC.0 p/ um PIC14C000) .

Os pinos podem ser referenciados por números (0 - 15), nome (ex. Pino0, se um
dos arquivos bsdefs.bas estão inclusos ou você mesmo os definiu), ou o
nome do bit completo (ex. PORTA.1). Qualquer pino ou bit do microcontrolador pode
ser acessado usando o último método.

Os nomes dos pinos (ex. Pino0) não são automaticamente inclusos no seu
programa. Na maioria dos casos, você iria definir os nomes dos pinos como achar melhor
usando o comando VAR:

led var PORTB.3

Entretanto, foram fornecidos dois arq. de definição p/ melhorar a compatibili-


dade c/ o BASIC Stamp. O arq. “bs1defs.bas” ou “bs2defs.bas” pode ser
incluso no programa do PicBasic Pro p/ prover nomes de pinos e bit que
combinem c/ os nomes BASIC Stamp.

24
PicBasic Pro Compiler

Include “bs1defs.bas”
ou
Include “bs2defs.bas”

O BS1DEFS.BAS define Pins, B0-B13, W0-W6 e a maioria dos outros nomes de


pinos e variáveis do BS1.

BS2DEFS.BAS define Ins, Outs, B0-B25, W0-W12 e a maioria dos outros


nomes de pinos e variáveis do BS2.

Quando um PICmicro é ligado, todos os pinos são fixados como entradas. P/ usar
um pino como saída, o pino ou porta deve ser fixado como uma saída ou deve ser usado
um comando que automaticamente fixa um pino como saída.

Para fixar um pino ou porta como saída (ou entrada), fixe o seu registrador TRIS. Fixando
um bit TRIS em 0 torna seu pino uma saída. Fixando um bit TRIS em 1 torna seu
pino uma entrada. Por exemplo:

TRISA = %00000000 ‘ Ou TRISA = 0

fixa todos os pinos em PORTA como saídas.

TRISB = %11111111 ‘ Ou TRISB = 255

fixa todos os pinos em PORTB como entradas.

TRISC = %10101010

Fixa todos os pinos pares em PORTC como saídas e os pinos ímpares como entradas.
Direções individuais de bit podem ser fixadas da mesma maneira.

TRISA.0 = 0

fixa PORTA, pino 0 como uma saída. Todas as demais direções de pinos
em PORTA permanecem inalteradas.

Os nomes de variáveis do BASIC Stamp Dirs, Dirh, Dirl e Dir0-Dir15


não estão definidas e não devem ser usadas c/ o PicBasic Pro Compiler.
O TRIS deverá ser usado no lugar, mas tem o estado oposto a Dirs.

Isto nãodácerto c/ o PicBasic Pro:

Dir0 = 1 ‘ Não fixa o pino PORTB.0 como saída

25
PicBasic Pro Compiler

Em lugar daquilo, faça isto:

TRISB.0 = 0 ‘ Fixa o pino PORTB.0 como saída

ou simplesmente use um comando que fixa automaticamente a direção do pino.

4.11. Comentários

Um comentário do PBP começa c/ a palavra-chave REM ou o apóstrofe


(‘). Todos os caracteres seguintes nesta linha são ignorados.

Ao contrário de vários BASICs, REM é uma palavra-chave única e não uma abreviação
p/ REMark. Assim, nomes de variáveis podem começar c/ REM (embora REM
por si só não seja válido).

4.12. Linhas c/ Declarações Múltiplas

De maneira a permitir programas mais compactos e agrupamento lógico de co-


mandos relacionados, o PBP suporta o uso de dois pontos (:) p/ separar
declarações colocadas na mesma linha. Assim, os dois exemplos seguintes
são equivalentes:

W2 = W0
W0 = W1
W1 = W2

é o mesmo que:

W2 = W0 : W0 = W1 : W1 = W2

Isto, entretanto, não altera o tamanho do código gerado.

4.13. Caractere de Extensão de Linha

O número máximo de caracteres que podem aparecer em uma linha do PBP é


256. Declarações mais longas podem ser estendidas até a linha seguinte usando o
caractere de extensão de linha (_) ao final de cada linha a ser continuada.

Branch B0,[rotulo0,rotulo1,rotulo2,_
rotulo3,rotulo4]

26
PicBasic Pro Compiler

4.14. INCLUDE

Outros arq. fonte BASIC podem ser adicionados a um programa do PBP usando
INCLUDE. Você pode ter sub-rotinas padronizadas, definições ou outros ar-
quivos que você deseje manter em separado. Os Stamp e arq. de definição
de modo serial são exemplos disso. Estes arquivos podem ser incluídos em
programas onde eles sejam necessários, mas deixados fora de programas
onde eles não sejam precisos.

As linhas de código fonte do arq. incluído são inseridas no programa


exatamente onde o INCLUDE é colocado.

INCLUDE “modedefs.bas”

4.15. DEFINE

Alguns elementos, como a freqüência de clock do oscilador e as posições dos pi-


nos do LCD, são predefinidas no PBP. DEFINE permite que um programa do
PBP altere estas definições, se desejado.

DEFINE pode ser usado p/ mudar o valor predefinido do oscilador, os


pinos de DEBUG e baud rate, e as posições dos pinos do LCD, entre outras
coisas. Estas definições devem estar todas em maiúsculas. Veja as
seções apropriadas do manual p/ informação específica sobre estas
definições.

DEFINE PAUSA_BOTAO 10 'Atraso p/ repique


do botao em ms

DEFINE PASSO_CARAC 1000 ‘passo do caractere


serout em us

DEFINE REG_DEPURA PORTB 'Porta do pino de depuracao


DEFINE BIT_DEPURA 0 'Bit pino depura.
DEFINE BAUD_DEPURA 2400 'Baud rate depura.
DEFINE MODO_DEPURA 1 'Modo depura.: 0 =
Verd., 1 = Invertido
DEFINE PASSO_DEPURA 1000 'Passo caractere
depura. em us

DEFINE HSER_BAUD 2400 'Fixa baud rate


DEFINE HSER_RCSTA 90h 'Fixa reg. rec.
DEFINE HSER_TXSTA 20h 'Fixa reg. transm.

27
PicBasic Pro Compiler

DEFINE HSER_PAR 1 'Use somente se dese-


jar paridade par
DEFINE HSER_IMP 1 'Use somente se de-
sejar parid. impar

DEFINE I2C_INTERNO 1 'Use p/ EEPROM in-


terna em 16CExxx
e 12CExxx
DEFINE I2C_LENTO 1 'Use p/ OSC >8mHz
c/ dispositivos
de veloc. padrao

DEFINE LCD_DREG PORTA 'Porta dados LCD


DEFINE LCD_DBIT 0 'Bit de inicio
LCD 0 ou 4
DEFINE LCD_RSREG PORTA 'Porta de selec.
registro LCD
DEFINE LCD_RSBIT 4 'Bit de selec.
registro LCD
DEFINE LCD_EREG PORTB 'Porta hab. LCD
DEFINE LCD_EBIT 3 'Bit hab. LCD
DEFINE LCD_BITS 4 'Tam. barram. LCD 4 ou
8
DEFINE LCD_LINHAS 2 'Linhas numericas no
LCD

DEFINE OSC 4 '3 4 8 10 12 16 20

DEFINE OSCCAL_1K 1 'Fixa OSCCAL p/


PIC12C671
DEFINE OSCCAL_2K 1 'Fixa OSCCAL p/
PIC12C672

4.16. Operadores Matemáticos

Ao contrário do BASIC Stamp, o PicBasic Pro Compiler executa todas as operações


matemáticas em ordem completamente hierárquica. Isto quer dizer que há precedência
p/ os operadores. Multiplicações e divisões são feitas antes das somas e
subtrações, por exemplo. Para assegurar que as operações sejam levadas a cabo na
ordem que você quiser, use parênteses p/ agrupar as operações:

A = (B + C) * (D - E)

28
PicBasic Pro Compiler

As operações matemáticas não são assinadas e são executadas c/ precisão de 16 bits.


Os operadores suportados são:

Op. Matemáticos Descrição


+ Adição
- Subtração
* Multiplicação
** 16 Bits superiores da multiplicação
*/ 16 Bits do meio da multiplicação
/ Divisão
// Resto (Módulo)
<< Desl. Esq.
>> Desl. Dir.
ABS Valor Absoluto
COS Coseno
DCD Decodif. 2n
DIG Dígito
MAX Máximo*
MIN Mínimo*
NCD Codifica
REV Inverte Bits
SIN Seno
SQR Raiz Quadrada
& AND Lógico
| OR Lógico
^ OR Exclusivo Lógico
~ NOT Lógico
&/ NOT AND Lógico
|/ NOT OR Lógico
^/ NOT OR Exclusivo Lógico
*Implementação difere do BASIC Stamp.

29
PicBasic Pro Compiler

4.16.1. Multiplication

O PBP executa multiplicação 16x16. O operador '*' retorna os 16 bits


inferiores do resultado de 32 bits. Esta é a multiplicação típica encontrada na
maioria das linguagens de programação. O operador '**' retorna os 16 bits
superiores do resultado de 32 bits. Estes dois operadores podem ser usados em conjunto
p/ executar multiplicações 16x16 que produzam resultados de 32 bits.

W1 = W0 * 1000 ‘ Multiplicar o valor em W0 por 1000


e guardar o resultado em W1
W2 = W0 ** 1000 ‘ ultiplicar W0 por 1000
guardar os 16 bits de maior ordem
(que podem ser 0) em W2

O operador ‘*/’ retorna os 16 bits do meio do resultado de 32 bits.

W3 = W1 */ W0 ‘ Multiplicar W1 por W0 e guardar


os 16 bits do meio em W3

4.16.2. Divisão

O PBP executa divisão 16x16. O operador '/' retorna o resultado de 16 bits.


O operador '//' retorna o resto. Isto é às vezes referenciado como
o módulo do número.

W1 = W0 / 1000 ‘ Dividir o valor em W0 por 1000


e guardar o resultado em W1
W2 = W0 // 1000 ‘ Dividir o valor em W0 por 1000
e guardar o resto em W2

4.16.3. Deslocamento

Os operadores '<<' e '>>' deslocam um valor p/ esquerda ou p/ direita, respectivamente,


1 a 15 vezes. Os bits já deslocados são fixados em 0.

B0 = B0 << 3 ‘ Desloca B0 3 casas p/ esquerda


(o mesmo que multiplicar por 8)
W1 = W0 >> 1 ‘ Desloca W0 1 posicao p/ direita
e guarda o resultado em W1 (o mesmo
que dividir por 2)

30
PicBasic Pro Compiler

4.16.4. ABS

ABS retorna o valor absoluto de um número. Se um byte é maior que


127 (bit alto ligado), ABS irá retornar 256 - valor. Se uma palavra é maior que
32767 (bit alto ligado), ABS irá retornar 65536 - valor.

B1 = ABS B0

4.16.5. COS

COS retorna o coseno de 8 bits de um valor. O resultado está na forma


de complemento de dois (ex. -127 p/ 127). Ele usa uma tabela de referência de quarto de onda
p/ encontrar o resultado. O coseno inicia c/ um valor em radianos binários, 0 a 255,
em oposição ao habitual 0 a 359 graus.

B1 = COS B0

4.16.6. DCD

DCD retorna o valor decodificado de um número de bit. Ele altera o número de bit
(0 - 15) p/ um número binário c/ apenas aquele bit fixado em 1. Todos os demais bits são
fixados em 0.

B0 = DCD 2 ‘ Fixa B0 p/ %00000100

4.16.7. DIG

DIG retorna o valor de um dígito decimal. Simplesmente diga a ele o número do dígito
(0 - 4 c/ 0 sendo o dígito mais à direita) do qual você gostaria de saber o valor, e
voila.

B0 = 123 ‘ Fixa B0 em 123


B1 = B0 DIG 1 ‘ Fixa B1 em 2 (dígito 1 de
123)

4.16.8. MAX e MIN

MAX e MIN retorna o máximo e mínimo, respectivamente, de dois


números. Ele é normalmente usado p/ limitar números p/ um valor.

31
PicBasic Pro Compiler

B1 = B0 MAX 100 ‘ Fixa B1 p/ o maior de B0


e 100 (B1 estará entre
100 & 255)
B1 = B0 MIN 100 ‘ Set B1 to the smaller of B0
and 100 (B1 can’t be bigger
than 100)

4.16.9. NCD

NCD retorna o número de bit codificado prioritário (1 - 16) de um valor. Ele é usado
p/ achar o bit mais alto ligado em um valor. Ele retorna 0 se nenhum bit estiver ligado.

B0 = NCD %01001000 ‘ Fixa B0 p/ 7

4.16.10. REV

REV inverte a ordem dos bits inferiores em um valor. O número de bits


a serem invertidos é de 1 a 16.

B0 = %10101100 REV 4 ‘ Fixa B0 em %10100011

4.16.11. SIN

SIN retorna o seno de 8 bits de um valor. O resultado é na forma de complemento de


dois (ex. -127 a 127). Ele usa uma tabela de referência de quarto de onda p/ achar o
resultado. O seno inicia c/ um valor em radianos binários, 0 a 255, em oposição
ao habitual 0 a 359 graus.

B1 = SIN B0

4.16.12. SQR

SQR retorna a raiz quadrada de um valor. Já que o PicBasic Pro só trabalha


c/ inteiros, o resultado será sempre um inteiro de 8 bits não maior do que o
resultado real.

B0 = SQR W1 ‘ Fixa B0 p/ a raiz quadrada de W1

4.16.13. Operadores a Bit

Operadores a bit agem em cada bit de um valor de maneira booleana. Eles


podem ser usados p/ isolar bits ou adicionar bits a um valor.

32
PicBasic Pro Compiler

B0 = B0 & %00000001 ‘ Isola o bit 0 de B0


B0 = B0 | %00000001 ‘ Liga o bit 0 de B0
B0 = B0 ^ %00000001 ‘ Inverte o estado do bit 0
de B0

4.17. Operadores de Comparação

Operadores de comparação são usados em declarações IF..THEN p/ comparar


uma expressão c/ outra. Os operadores suportados são:

Operador de Comparação Descrição


= ou == Igual
<> ou != Não Igual
< Menor que
> Maior que
<= Menor ou Igual a
>= Maior ou Igual a

If i > 10 Then loop

4.18. Operadores Lógicos

Operadores lógicos diferem dos operadores a bit. Eles produzem um resultado


verdadeiro/falso de sua operação. Valores de 0 são tratados como falso. Qualquer outro
valor é tratado como verdadeiro. Eles são mais usados em conjunto c/ os operadores
de comparação em uma declaração IF..THEN. Os operadores
suportados são:

33
PicBasic Pro Compiler

Operador Lógico Descrição


AND ou && AND Lógico
OR ou || OR Lógico
XOR ou ^^ OR Exclusivo Lógico
NOT AND NAND Lógico
NOT OR NOR Lógico
NOT XOR NXOR Lógico

If (A == maior) AND (B > medio) Then run

Esteja certo de usar parênteses p/ dizer ao PBP a ordem exata em que você quer
que as operações sejam executadas.

34
PicBasic Pro Compiler

5. Referência de Declarações do PicBasic Pro


@ Insere uma linha de código em linguagem assembly.
ASM..ENDASM Insere uma seção de código em ling. assembly.
BRANCH GOTO computado (equiv. a ON..GOTO).
BRANCHL BRANCH fora de página (BRANCH longo).
BUTTON Tira o repique e auto-repete a entrada de um pino específico.
CALL Chama subrotina em ling. assembly.
CLEAR Zera todas as variáveis.
COUNT Conta o número de pulsos em um pino.
DATA Define conteúdo inicial da EEPROM no-chip.
DEBUG Saída serial assíncrona p/ um pino fixo e baud.
DISABLE Desabilita processamento ON INTERRUPT.
DTMFOUT Produz tons de discagem em um pino.
EEPROM Define conteúdo inicial p/ a EEPROM no-chip.
ENABLE Habilita processamento ON INTERRUPT.
END Para a execução e entra no modo baixo consumo.
FOR..NEXT Executa declarações repetidamente.
FREQOUT Produz até 2 freqüências em um pino.
GOSUB Chama subrotina BASIC em um rótulo específico.
GOTO Continua execução em um rótulo específico.
HIGH Torna a saída do pino alta.
HSERIN Entrada serial assíncrona de hardware.
HSEROUT Saída serial assíncrona de hardware.
I2CREAD Lê os bytes de um dispositivo I2C.
I2CWRITE Escreve bytes em um dispositivo I2C.
IF..THEN..ELSE..ENDIF Executa declarações condicionalmente.
INPUT Torna o pino uma entrada.
{LET} Atribui o resultado de uma expressão a uma variável.
LCDOUT Mostra caracteres em um LCD.
LOOKDOWN Procura por valor na tabela de constantes.
LOOKDOWN2 Procura por valor na tabela de constantes / variáveis.
LOOKUP Busca valor da constante da tabela.
LOOKUP2 Busca valor da constante / variável da tabela.
LOW Torna a saída do pino baixa.
NAP Desliga o processador por um curto período de tempo.
ON INTERRUPT Executa subrotina BASIC em uma interrupção.
OUTPUT Torna o pino uma saída.
PAUSE Atraso (resolução de 1mSeg).
PAUSEUS Atraso (resolução de 1uSeg).

35
PicBasic Pro Compiler

PEEK Lê o byte do registrador.


POKE Escreve um byte no registrador.
POT Lê o potenciômero em um pino específico.
PULSIN Mede a largura do pulso em um pino.
PULSOUT Gera pulso em um pino.
PWM Coloca um trem de pulsos modulado por largura no pino.
RANDOM Gera um número pseudo-aleatório.
RCTIME Mede a largura do pulso em um pino.
READ Lê o byte da EEPROM no-chip.
RESUME Continua execução após tratar uma interrupção.
RETURN Continua na declaração seguinte ao último GOSUB.
REVERSE Torna pino de saída uma entrada ou pino de entrada uma saída.
SERIN Entrada serial assíncrona (estilo BS1).
SERIN2 Entrada serial assíncrona (estilo BS2).
SEROUT Saída serial assíncrona (estilo BS1).
SEROUT2 Saída serial assíncrona (estilo BS2).
SHIFTIN Entrada serial síncrona.
SHIFTOUT Saída serial síncrona.
SLEEP Desliga o processador por um período de tempo.
SOUND Gera tom ou ruído branco em um pino específico.
STOP Para a execução de um programa.
SWAP Troca os valores de duas variáveis.
TOGGLE Torna o pino uma saída e muda o estado.
WHILE..WEND Executa decl. enquanto a condição for verdadeira.
WRITE Escreve byte na EEPROM no-chip.
XIN Entrada X-10.
XOUT Saída X-10.

36
PicBasic Pro Compiler

5.1. @

@ Declaração

Quando usado no início de uma linha, @ provê um atalho p/ a inserção


de uma Declaração em ling. assembly no seu programa PBP. Você pode
usar este atalho p/ misturar livremente código em ling. assembly c/ declarações
do PicBasic Pro.

i var byte
role-me var byte

For i = 1 to 4
@ rlf _role-me, F ; Gira o bit uma vez p/ esq.
Next i

O atalho @ também pode ser usado p/ incluir rotinas em ling. assembly


em um outro arquivo. Por exemplo:

@ Include “fp.asm”

@ reinicializa a página do registrador p/ 0 antes de executar a instrução em ling.


assembly. A página do registrador não deve ser alterada usando @.

Veja a seção sobre programação em linguagem assembly p/ mais


informação.

37
PicBasic Pro Compiler

5.2. ASM..ENDASM

ASM
ENDASM

As instruções ASM e ENDASM dizem ao PBP que o código entre estas


duas linhas está em ling. assembly e não deve ser interpretado como
declarações do PicBasic Pro. Você pode usar estas duas instruções p/ misturar
livremente código em ling. assembly c/ declarações do PicBasic Pro.

O tamanho máximo p/ uma seção de texto em assembler é 8K. Isto é o


tamanho máximo p/ o fonte atual, incluindo comentários, não o
código gerado. Se o bloco de texto é maior do que isso, quebre-o em seções
ASM..ENDASM múltiplas ou simplesmente inclua-o em um arq. separado.

ASM reinicializa a pág. do registrador p/ 0. Você deve assegurar-se que a pág.


do registrador seja reiniciada p/ 0 antes do ENDASM se o código de linguagem
assembly o tiver alterado.

Veja a seção sobre programação em ling. assembly p/ mais


informação.

ASM
bsf PORTA, 0 ; Fixa bit 0 em PORTA
bcf PORTB, 0 ; Limpa bit 0 em PORTB
ENDASM

38
PicBasic Pro Compiler

5.3. BRANCH

BRANCH Indice,[Rotulo{,Rotulo...}]

BRANCH faz o programa pular p/ um local diferente baseado em um


índice de variáveis. Isto é similar a On..Goto em outros BASICs.

Indice seleciona um de uma lista de rótulos. A execução é retomada no rótulo


indexado. Por exemplo, se Indice é zero, o programa pula p/ o primeiro rótulo
especificado na lista, se Indice é um, o programa pula p/ o segundo
rótulo, e assim vai. Se Indice é maior que ou igual ao número de
rótulos, nenhuma ação é tomada e a execução continua c/ a declaração
seguinte ao BRANCH. Até 256 Rotulos podem ser usados em um BRANCH.

Rotulo deve estar na mesma página de código que a instrução BRANCH. Se


você não puder ter certeza que eles estarão na mesma pág. de código, use BRANCHL
abaixo.

BRANCH B4,[cao,gato,peixe]
‘ O mesmo que:
‘ If B4=0 Then cao (goto cao)
‘ If B4=1 Then gato (goto gato)
‘ If B4=2 Then peixe (goto peixe)

39
PicBasic Pro Compiler

5.4. BRANCHL

BRANCHL Indice,[Rotulo{,Rotulo...}]

BRANCHL (BRANCH longo) funciona muito similarmente ao BRANCH em que ele faz
o programa pular p/ um local diferente baseado em um índice de variáveis.
As principais diferenças são que ele pode pular p/ um Rotulo que está em uma pág. de
cód. diferente da instrução BRANCHL e gera código que é quase o dobro
do tamanho do código gerado pela instrução BRANCH. Se você
estiver certo de que os rótulos estão na mesma pág. que a instrução BRANCH
ou se o microcontrolador não tiver mais do que uma pág. de cód. (2K ou me-
nos de ROM), usar BRANCH ao invés de BRANCHL irá minimizar a utili-
zação da memória.

Indice seleciona um de uma lista de rotulos. A execução prossegue no rótulo


indexado. Por exemplo, se Indice é zero, o programa pula p/ o primeiro rótulo
especificado na lista, se Indice é um, o programa pula p/ o segundo rótulo,
e assim por diante. Se Indice é maior ou igual ao número de rótulos,
nenhuma ação é tomada e a execução continua c/ a declaração seguinte
ao BRANCHL. Até 128 rotulos podem ser usados em um BRANCHL.

BRANCHL B4,[cao,gato,peixe]
‘ O mesmo que:
‘ If B4=0 Then cao (goto cao)
‘ If B4=1 Then gato (goto gato)
‘ If B4=2 Then peixe (goto peixe)

40
PicBasic Pro Compiler

5.5. BUTTON

BUTTON Pino,Down,Delay,Rate,BVar,Action,Rotulo

Lê Pino e opcionalmente executa anti-repique e auto-repetição. Pino é


automaticamente fixado como entrada. Pino pode ser uma constante, 0-15, ou uma
variável que contenha um número 0-15 (ex. B0) ou um nome de pino (ex.
PORTA.0).

Down Estado do pino quando o botão é pressionado (0..1).


Delay Contagem cíclica antes do início da auto-repetição (0..255). Se 0,
nenhum anti-repique ou auto-repetição são executados. Se 255,
é executado o anti-repique mas não a auto-repetição.
Rate Taxa de auto-repetição (0..255).
BVar Variável de um byte usada internamente p/ contagem regr. de
atraso/repetição. Ela deve ser inicializada p/ 0 antes do uso e
não ser usada em outro lugar no programa.
Action Estado do botão sobre o qual atuar (0 se não premido, 1 se premido).
Rotulo A execução prossegue neste rótulo se Action for verdadeiro.

10K

I/O I/O

10K

‘ Vai p/ naopremido se botao nao premido em Pin2


BUTTON PORTB.2,0,100,10,B2,0,naopremido

BUTTON precisa ser usado dentro de um loop p/ a auto-repetição funcionar corretamente.

BUTTON realiza o anti-repique atrasando a execução do programa por um perí-


odo de milisegundos p/ aguardar que os contatos se acomodem. O atraso
padrão de anti-repique é 10ms. Para alterar o anti-repique p/ um outro
valor, use DEFINE:

41
PicBasic Pro Compiler

‘ Fixa o atraso do anti-repique p/ 50ms


Define BUTTON_PAUSE 50

Certifique-se de que BUTTON_PAUSE esteja todo em maiúsculas.

Em geral, é mais fácil simplesmente ler o estado do pino em um IF..THEN


do que usar o comando BUTTON como segue:

If PORTB.2 = 1 Then naopremido

42
PicBasic Pro Compiler

5.6. CALL

CALL Rotulo

Executa a sub-rotina em linguagem assembler chamada Rotulo.

GOSUB é normalmente usado p/ executar uma sub-rotina do PicBasic Pro. A


principal diferença entre GOSUB e CALL é que c/ CALL, a existência de um
Rotulo não é checada até a hora da montagem. Usando CALL, um Rotulo em
uma seção em linguagem assembly que de outra forma seria inacessível
ao PBP pode ser acessado.

Veja a seção sobre programação em linguagem assembly p/ mais


informação sobre CALL.

CALL pass ‘ Executa sub-rotina em linguagem


assembly chamada _pass

43
PicBasic Pro Compiler

5.7. CLEAR

CLEAR

Fixa todos os registradores da RAM p/ zero.

CLEAR zera todos os registradores da RAM em cada banco. Isto irá fixar
todas as variáveis, inclusive as variáveis internas de sistema p/ zero. Isto não
é feito automaticamente quando um programa do PBP inicia como está num
BASIC Stamp. Em geral, as variáveis devem ser fixadas no programa p/ um estado
inicial apropriado ao invés de se usar CLEAR.

CLEAR ‘ Limpa todas as variáveis p/ 0

44
PicBasic Pro Compiler

5.8. COUNT

COUNT Pino,Periodo,Var

Conta o número de pulsos que ocorrem em Pino durante o Periodo e


guarda o resultado em Var. Pino é automaticamente fixado como entrada. Pino pode
ser uma constante, 0-15, ou uma variável que contenha um número 0-15 (ex. B0)
ou um nome de pino (ex. PORTA.0).

A resolução de Periodo é em milisegundos. Ele rastreia a freqüência do


oscilador baseado no DEFINEd OSC.

COUNT checa o estado de Pino em um curto loop e conta as transições de low p/


high. Com um oscilador de 4Mhz ele checa o estado do pino a cada 20us.
Com um oscilador de 20Mhz ele checa o estado do pino a cada 4us. Partindo disto,
pode-se determinar que a mais alta freqüência de pulsos que pode ser
contada é 25Khz c/ um oscilador de 4Mhz e 125Khz c/ um oscilador
de 20Mhz se a freqüência tem um ciclo ativo de 50% (o tempo de high é o
mesmo que o tempo de low).

‘ Conte # de pulsos em Pino1 em 100 milisegundos


COUNT PORTB.1, 100, W1

‘ Determine a frequencia em um pino


COUNT PORTA.2, 1000, W1 ‘ Conte p/ 1 segundo
Serout PORTB.0, N2400, [W1]

45
PicBasic Pro Compiler

5.9. DATA

DATA {@Local,}Constante{,Constante...}

Guarde constantes na EEPROM não-volátil no-chip quando o dispositivo é programado


pela primeira vez. Se o valor opcional Local é omitido, a primeira declaração
DATA começa a guardar no endereço 0 e declarações subseqüentes guardarão
nas posições seguintes. Se o valor Local for especificado, ele denota
a posição inicial onde estes valores serão guardados. Um rótulo opcional
pode ser atribuído ao endereço inicial da EEPROM p/ futura referência pelo
programa.

Constante pode ser uma constante numérica ou alfanumérica. Apenas o


byte menos significativo de valores numéricos é guardado a não ser que o
modificador WORD seja usado. Strings são guardadas como bytes consecutivos
de valores ASCII. Nenhum comprimento ou terminador é automaticamente adicionado.

DATA funciona apenas c/ microcontroladores c/ EEPROM no-chip como o


PIC16F84 e o PIC16C84. Já que EEPROM é memória não-volátil,
os dados permanecerão intactos mesmo quando a força for desligada.

Os dados são guardados no espaço da EEPROM apenas uma vez na hora em que
o microcontrolador é programado, não a cada vez que o programa é rodado.
WRITE pode ser usado p/ fixar os valores da EEPROM no-chip em tempo
de execução.

‘ Guarde 10, 20 e 30 começando na posição 5


DATA @5,10,20,30

‘ Atribua um rotulo a uma palavra na prox. pos.


dlabel DATA word $1234 ‘ Guarda $34, $12

‘ Pule 4 posições e guarde 10 0s


DATA (4), 0(10)

46
PicBasic Pro Compiler

5.10. DEBUG

DEBUG Item{,Item...}

Envia um ou mais Itens p/ um pino predefinido a uma taxa de transf. predefinida


no formato assíncrono padrão usando 8 bits de dados, s/ paridade e 1 bit de pa-
rada (8N1). O pino é automaticamente fixado como saída.

Se um jogo-da-velha (#) precede um Item, a representação ASCII p/ cada dígito


é enviada serialmente. DEBUG também suporta os mesmos modificadores de dados
que SEROUT2. Refira-se à seção sobre SEROUT2 p/ esta informação.

DEBUG é uma de muitas funções seriais assíncronas embutidas. Ela é a menor


das rotinas seriais geradas por software. Ela pode ser usada p/
enviar informação de depuração (variáveis, marcadores de posição de programa, etc.)
p/ um programa de terminal como o Hyperterm. Ela pode também ser usada a qualquer
hora em que for desejada uma saída serial em um pino fixo a uma taxa de transf. fixa.

O pino serial e taxa de transf. são especificados usando DEFINEs:

‘ Fixa a porta de pinos p/ Debug


DEFINE DEBUG_REG PORTB

‘ Fixa o bit de pinos p/ Debug


DEFINE DEBUG_BIT 0

‘ Fixa a taxa de transf. p/ Debug


DEFINE DEBUG_BAUD 2400

‘ Fixa o modo do Debug: 0 = verdadeiro, 1 = invertido


DEFINE DEBUG_MODE 1

DEBUG assume um oscilador de 4Mhz quando gera sua temporização de bit. Para
manter a temp. apropriada da taxa de transf. c/ outros valores do oscilador, esteja certo
de DEFINIR o ajuste do OSC p/ qualquer valor de oscilador diferente.

Em alguns casos, as taxas de transmissão das instruções do DEBUG podem


apresentar os caracteres muito rapidamente p/ o dispositivo receptor. Um DEFINE adiciona
cadência aos caracteres às transmissões seriais de saída. Isto permite
tempo adicional entre os caracteres à medida em que são transmitidos. A
cadência dos caracteres DEFINE permite um atraso de 1 a 65.535 microsegundos
(,001 a 65,535 milisegundos) entre cada caractere transmitido.

47
PicBasic Pro Compiler

Por exemplo, p/ pausar 1 milisegundo entre a transmissão de cada


caractere:

DEFINE DEBUG_PACING 1000

Enquanto que conversores de nível RS-232 são comuns e


baratos, graças à implementação RS-232 atual e as excelentes
especificações de E/S do PICmicro, a maioria das aplicações não requer conversores
de nível. Ao invés disso, pode ser usado TTL invertido (DEBUG_MODE = 1). Um
resistor limitador de corrente é sugerido (supõe-se que a RS-232 seja
tolerante a curtos).

DB9 DB25
1K
Pino RS-232 RX Pino 2 Pino 3

RS-232 GND Pino 5 Pino 7

‘ Envie o texto “B0=” seguido pelo valor decimal


de B0 e um avanco de linha serialmente
DEBUG “B0=“, dec B0, 10

48
PicBasic Pro Compiler

5.11. DISABLE

DISABLE

DESABILITA o processam. de interr. seguinte a esta instrução. Interr. podem


ainda ocorrer mas o gerenciador de interr. BASIC no programa PicBasic Pro
não será executado até que seja encontrado um ENABLE.

DISABLE e ENABLE são mais como pseudo-ops os quais dão as


direções ao compilador, ao invés de gerar código. Veja ON
INTERRUPT p/ mais informação.

DISABLE ‘ Desabilita interrupções no gerenciador


myint: led = 1 ‘ Liga o LED quando interrompido
Resume ‘ Retorna ao programa principal
Enable ‘ Habilita interrupções após gerenciador

49
PicBasic Pro Compiler

5.12. DTMFOUT

DTMFOUT Pino,{Onms,Offms,}[Tom{,Tom...}]

Produz seqüência de tons DTMF em Pino. Pino é automaticamente


fixado como saída. Pino pode ser uma constante, 0-15, ou variável que
contém um número 0-15 (ex. B0) ou um nome de pino (ex. PORTA.0).

Onms é o número de milisegundos p/ gerar cada tom e Offms é o


número de milisegundos p/ pausar entre cada tom. Se eles não forem
especificados, Onms padroniza-se em 200ms e Offms padroniza-se em 50ms.

Tons são numerados 0-15. Tons 0-9 são os mesmos de um teclado de


telefone. Tom 10 é a tecla *, Tom 11 é a tecla # e Tons 12-15
correspondem às teclas estendidas A-D.

DTMFOUT usa FREQOUT p/ gerar os tons duplos. FREQOUT


gera tons usando uma forma de modulação por largura de pulso. Os dados puros
que saem do pino se parecem bem assustadores. Geralmente, é necessária
alguma filtragem p/ alisar o sinal p/ uma onda senoidal e livrar-se de alguns
harmônicos que são gerados:

DTMFOUT trabalha melhor c/ um oscilador de 20Mhz. Ela também pode trabalhar


c/ um oscilador de 10Mhz, e até a 4Mhz, embora comece a ficar muito difícil
de filtrar e seja de amplitude razoavelmente baixa. Qualquer outra freqüência irá fazer
c/ que DTMFOUT gere uma freqüência que é uma relação do oscilador real
usado e 20Mhz o que não será muito útil p/ o envio de tons de discagem.

‘ Envia tons DTMF p/ 212 no Pino1


DTMFOUT PORTB.1,[2,1,2]

50
PicBasic Pro Compiler

5.13. EEPROM

EEPROM {Posicao,}[Constante{,Constante...}]

Guarda constantes na EEPROM no-chip. Se o valor da Posicao opcional é


omitido, a primeira declaração da EEPROM começa a guardar no end. 0 e
declarações subseqüentes guardarão nas posições seguintes. Se o
valor da Posicao é especificado, ele denota a posição inicial onde estes
valores serão guardados.

Constante pode ser uma constante numérica ou alfanumérica. Apenas o


byte menos significativo de valores numéricos é guardado. Strings são guardadas como
bytes consecutivos de valores ASCII. Nenhum comprimento ou termi-
nador são automaticamente adicionados.

EEPROM funciona apenas c/ microcontroladores c/ EEPROM no-chip tais como


o PIC16F84 e PIC16C84. Já que a EEPROM é memória não-volátil,
os dados permanecerão intactos mesmo quando a força for desligada.

Os dados são guardados no espaço da EEPROM apenas uma vez na hora que o
microcontrolador é programado, não a cada vez que o programa é rodado.
WRITE pode ser usado p/ fixar os valores da EEPROM no-chip em tempo
de execução.

‘ Guarde 10, 20 e 30 comecando na posicao 5


EEPROM 5,[10,20,30]

51
PicBasic Pro Compiler

5.14. ENABLE

ENABLE

HABILITE o processamento de interrupções que foi previamente


DESABILITADO (c/ DISABLE) seguinte a esta instrução.

DISABLE e ENABLE são mais parecidos com pseudo-ops no sentido de que


eles dão direções ao compilador ao invés de gerar código. Veja ON
INTERRUPT p/ mais informação.

Disable ‘ Desabilita interrupcoes no gerenciador


myint: led = 1 ‘ Liga o LED quando interrompido
Resume ‘ Retorna ao programa principal
ENABLE ‘ Habilita interrupcoes apos gerenciador

52
PicBasic Pro Compiler

5.15. END

END

Para a execução do programa e entra em modo de baixo consumo. Todos os pinos


de E/S ficam no estado atual. END trabalha executando uma instrução Sleep
continuamente em um loop.

Um END ou STOP ou GOTO devem ser colocados no fim de cada programa


p/ evitar que ele caia para fora do fim da memória e recomece.

END

53
PicBasic Pro Compiler

5.16. FOR..NEXT

FOR Conta = Inicio TO Fim {STEP {-} Inc}


{Corpo}
NEXT {Conta}

O loop FOR..NEXT permite que os programas executem um número de


declarações (o Corpo) por algumas vezes usando uma variável como
contador. Devido à sua complexidade e versatilidade, FOR..NEXT é
melhor descrito passo a passo:

1) O valor de Inicio é atribuído à variável índice, Conta.


Conta pode ser uma variável de qualquer tipo.
2) O Corpo é executado. O Corpo é opcional e pode ser omitido
(talvez p/ um loop de atraso).
3) O valor de Inc é adicionado a (ou subtraído de se "-" é
especificado) Conta. Se nenhuma cláusula STEP é definida,
Conta é incrementada uma vez.
4) Se Conta não tiver passado de Fim ou estourado o tipo de variável,
a execução retorna ao Passo 2.

Se o loop necessitar Contar mais do que 255, uma variável dimensionada por pa-
lavra deve ser usada.

FOR i = 1 TO 10 ‘ Conta de 1 a 10
Serout 0,N2400,[#i,” “] ‘ Envia cada numero p/
Pin0 serialmente
NEXT i ‘ Retorna e faz a proxima
contagem
Serout 0,N2400,[10] ‘ Envia um avanco de linha

FOR B2 = 20 TO 10 STEP -2 ‘ Conta de 20 a 10


de 2 em 2
Serout 0,N2400,[#B2,” “] ‘ Envia cada numero
a Pin0 serialmente
NEXT B2 ‘ Retorna e faz a proxima
contagem
Serout 0,N2400,[10] ‘ Envia um avanco de linha

54
PicBasic Pro Compiler

5.17. FREQOUT

FREQOUT Pino,Onms,Frequencia1{,Frequencia2}

Produz a(s) Frequencia(s) no Pino por Onms milisegundos. Pino é


automaticamente fixado como saída. Pino pode ser uma constante, 0-15, ou uma
variável que contenha um número 0-15 (ex. B0) ou um nome de pino (ex.
PORTA.0).

Uma ou duas freqüências diferentes de 0 a 32767 hertz podem ser produzidas


por vez.

FREQOUT gera tons usando uma forma de modulação por largura de pulso. Os
dados puros que saem do pino parecem bem assustadores. Algum tipo de filtragem
é geralmente necessária p/ alisar o sinal p/ uma onda senoidal livrando-se
dos harmônicos que são gerados:

FREQOUT trabalha melhor c/ um oscilador de 20Mhz. Ele também pode trabalhar


c/ um oscilador de 10Mhz e até mesmo c/ 4Mhz, embora comece a ficar muito difícil
de filtrar e seja de amplitude razoavelmente baixa. Qualquer outra freqüência irá
fazer c/ que FREQOUT gere uma freqüência que é uma relação do oscilador
usado e 20Mhz.

‘ Envia tom de 1Khz em Pino1 por 2 segundos


FREQOUT PORTB.1,2000,1000

55
PicBasic Pro Compiler

5.18. GOSUB

GOSUB Rotulo

Pula p/ a subrotina em Rotulo salvando seu endereço de retorno na pilha.


Diferente de GOTO, quando uma declaração RETURN é alcançada, a execução segue
c/ a declaração seguinte à última declaração GOSUB executada.

Um número ilimitado de subrotinas pode ser usado em um programa.


Subrotinas também podem ser aninhadas. Em outras palavras, É possível p/ uma
subrotina chamar outra subrotina. Tal aninhamento de subrotinas deve se
restringir a não mais do que quatro níveis de profundidade.

GOSUB beep ‘ Execute subrotina chamada beep


...
beep: High 0 ‘ Ligue o LED conectado a Pin0
Sound 1,[80,10] ‘ Bipe o alto-falante conectado a
Pin1
Low 0 ‘ Desligue o LED conectado a Pin0
Return ‘ Voltar p/ a rotina principal que
nos chamou

56
PicBasic Pro Compiler

5.19. GOTO

GOTO Rotulo

A execução do programa continua c/ as declarações em Rotulo.

GOTO send ‘ Pule p/ a declaracao chamada envia


...
envia: Serout 0,N2400,[“Oi”] ‘ Envia “Oi” p/ Pin0
serialmente

57
PicBasic Pro Compiler

5.20. HIGH

HIGH Pino

Põe o Pino especificado em nível alto. Pino é fixado automaticamente como saída.
Pino pode ser uma constante, 0-15, ou uma variável que contenha um número 0-15
(ex. B0) ou um nome de pino (ex. PORTA.0).

HIGH 0 ‘ Fixa Pin0 como saida e o leva


a nivel alto (~5 volts)
HIGH PORTA.0 ‘ Fixa PORTA, pino 0 como saida
e o leva a alto (~5 volts)

led var PORTB.0 ‘ Define pino do LED


HIGH led ‘ Fixa pino do LED como saida e
o leva a alto (~5 volts)

Alternativamente, se o pino já for uma saída, uma maneira mais rápida e mais
curta (a partir de um ponto de parada de código gerado) de levá-lo a nível alto seria:

PORTB.0 = 1 ‘ Fixa PORTB pino 0 alto

58
PicBasic Pro Compiler

5.21. HSERIN

HSERIN {RotuloParidade,}{Timeout,Rotulo,}[Item{,...}]

Receba um ou mais Items da porta serial do hardware em dispositivos


que suportam comunicações seriais assíncronas em hardware.

HSERIN é uma das muitas funções seriais assíncronas embutidas. Ela pode
apenas ser usada c/ dispositivos que tenham um USART no hardware. Veja a
folha de dados do dispositivo p/ informação sobre o pino de entrada serial e outros
parâmetros. Os parâmetros seriais e baud rate são especificados usando
DEFINEs:

‘ Fixa registrador de recepcao p/ receptor habilitado


DEFINE HSER_RCSTA 90h

‘ Fixa registrador de transmissao p/ transmissor habilitado


DEFINE HSER_TXSTA 20h

‘ Fixa baud rate


DEFINE HSER_BAUD 2400

HSERIN assume um oscilador de 4Mhz nos cálculos de baud rate. Para


manter a temporização de baud rate correta c/ outros valores de osciladores, certifique-
se de definir (DEFINE) o ajuste OSC p/ o novo valor do oscilador.

Opcionalmente, Timeout e Rotulo podem ser incluídos p/ permitir que o progra-


ma continue se um caractere não for recebido dentro de um certo tempo.
Timeout é especificado em unidades de 1 milisegundo.

O formato dos dados seriais padrão é 8N1, 8 bits de dados, s/ bit de paridade e 1
bit de parada. 7E1 (7 bits de dados, paridade par, 1 bit de parada) ou 7O1 (7 bits de dados,
paridade ímpar, 1 bit de parada) podem ser habilitados usando um dos seguintes DEFINEs:

‘ Use apenas se desejada paridade par


DEFINE HSER_EVEN 1

‘ Use apenas se desejada paridade ímpar


DEFINE HSER_ODD 1

O ajuste de paridade, juntamente c/ todos os outros DEFINEs HSER, afeta ambos


HSERIN e HSEROUT.

59
PicBasic Pro Compiler

Um RotuloParidade opcional pode ser incluído na declaração. O


programa irá continuar nesta posição se um caractere c/ um erro de paridade é
recebido. Ele deve ser usado apenas se a paridade estiver habilitada usando um
dos defines precedentes.

Visto que a recepção serial é feita em hardware, não é possível fixar


os níveis p/ um estado invertido p/ eliminar um driver RS-232. Portanto
um driver apropriado deve ser usado c/ HSERIN.

HSERIN suporta os mesmos modificadores de dados que SERIN2. Refira-se


à seção sobre SERIN2 p/ esta informação.

HSERIN [B0, dec W1]

60
PicBasic Pro Compiler

5.22. HSEROUT

HSEROUT [Item{,Item...}]

Envie um ou mais Items ao hardware da porta serial em dispositivos que


suportem comunicações seriais assíncronas em hardware.

HSEROUT é uma das muitas funções seriais embutidas. Ela pode


apenas ser usada c/ dispositivos que tenham um USART em hardware. Veja a
folha de dados do dispositivo p/ informação sobre o pino de saída serial e outros
parâmetros. Os parâmetrros seriais e baud rate são especificados usando
DEFINEs:

‘ Fixa registrador de recepcao p/ receptor habilitado


DEFINE HSER_RCSTA 90h

‘ Fixa registrador de transmissao p/ transmissor habilitado


DEFINE HSER_TXSTA 20h

‘ Fixa baud rate


DEFINE HSER_BAUD 2400

HSEROUT assume um oscilador de 4Mhz nos cálculos de baud rate. Para


manter a temporização de baud rate correta c/ outros valores de osciladores, certifique-
se de definir (DEFINE) o ajuste OSC p/ o novo valor do oscilador.

O formato dos dados seriais padrão é 8N1, 8 bits de dados, s/ bit de paridade e 1
bit de parada. 7E1 (7 bits de dados, paridade par, 1 bit de parada) ou 7O1 (7 bits de dados,
paridade ímpar, 1 bit de parada) podem ser habilitados usando um dos seguintes DEFINEs:

‘ Use apenas se desejada paridade par


DEFINE HSER_EVEN 1

‘ Use apenas se desejada paridade ímpar


DEFINE HSER_ODD 1

O ajuste de paridade, juntamente c/ todos os outros DEFINEs HSER, afeta ambos


HSERIN e HSEROUT.

Visto que a recepção serial é feita em hardware, não é possível fixar


os níveis p/ um estado invertido p/ eliminar um driver RS-232. Portanto
um driver apropriado deve ser usado c/ HSEROUT.

61
PicBasic Pro Compiler

HSEROUT suporta os mesmos modificadores de dados que SEROUT2. Refira-se


à seção sobre SEROUT2 p/ esta informação.

‘ Envie o valor decimal de B0 seguido por um avanco


de linha p/ o hardware da USART
HSEROUT [dec B0,10]

62
PicBasic Pro Compiler

5.23. I2CREAD

I2CREAD PinoDados,PinoClock,Controle,{Endereco,}
[Var{,Var...}]{,Rotulo}

Envie bytes de Controle e Endereco opcional p/ o PinoClock e


PinoDados e guarde o(s) byte(s) recebido(s) na Var. PinoClock e
PinoDados podem ser uma constante, 0-15, ou uma variável que contenha um
número 0-15 (ex. B0) ou um nome de pino (ex. PORTA.0).

I2CREAD e I2CWRITE podem ser usados p/ ler e escrever dados p/ uma EE


PROM c/ uma interface I2C de dois fios como a Microchip 24LC01B
e dispositivos similares. Isto permite que os dados sejam guardados em memória
externa não-volátil de forma que possam ser mantidos mesmo depois que a força
seja desligada. Estes comandos operam no modo mestre I2C e também
podem ser usados p/ falar c/ outros dispositivos c/ uma interface I2C como
sensores de temperatura e conversores A/D.

Os 7 bits superiores do byte Controle contém o código de controle juntamente


c/ seleção de pastilha ou informação adicional de endereço, dependendo do
dispositivo em particular. O bit de ordem inferior é uma flag interna indicando se o
comando é de leitura ou escrita e deve ser mantido livre.

Este formato p/ o byte Controle é diferente do formato usado pelo PicBasic


Compiler original. Esteja certo de usar este formato c/ operações
PBP I2C.

Por exemplo, quando se comunicar c/ um 24LC01B, o código de controle é


%1010 e a seleção de pastilha não é utilizada de forma que o byte Controle seria
%10100000 ou $A0. Seguem formatos de bytes Controle p/ algumas
das diferentes peças:

63
PicBasic Pro Compiler

Dispos. Capacid. Controle Tam. de End.


24LC01B 128 bytes %1010xxx0 1 byte
24LC02B 256 bytes %1010xxx0 1 byte
24LC04B 512 bytes %1010xxb0 1 byte
24LC08B 1K bytes %1010xbb0 1 byte
24LC16B 2K bytes %1010bbb0 1 byte
24LC32B 4K bytes %1010ddd0 2 bytes
24LC65 8K bytes %1010ddd0 2 bytes
bbb = bits de sel. de bloco (end. de ordem superior)
ddd = bits de seleção de dispositivo
xxx = irrelevante

O tamanho do Endereco enviado (byte ou palavra) é determinado pelo tamanho


da variável que é usada. Se uma variável de tamanho de byte é usada p/ o En-
dereco, um endereco de 8 bits é enviado. Se uma variável de tamanho de palavra é usada,
é enviado um endereço de 16 bits. Esteja certo de usar a variável corretamente dimen-
sionada p/ o dispositivo c/ o qual deseja se comunicar.

Se uma Var de tamanho de palavra é especificada, 2 bytes são lidos e guardados no


byte superior de Var primeiro, seguidos pelo byte inferior. Esta ordem é diferente da
maneira que as variáveis são normalmente guardadas, byte inferior primeiro.

Se o Rotulo opcional é incluído, o programa pulará p/ este rótulo se não


for recebido um acknowledge do dispositivo I2C.

As instruções I2C podem ser usadas p/ acessar a EEPROM serial no-chip nos
dispositivos 12CExxx e 16CExxx. Simplesmente especifique os nomes dos pinos
p/ as linhas internas apropriadas como parte do comando I2C e coloque
o seguinte DEFINE no topo do programa:

DEFINE I2C_INTERNAL 1

Veja as folhas de dados da Microchip sobre estes dispositivos p/ mais informação.

A temporização das instuções I2C é fixada de forma que dispositivos de veloc. padrão
(100Khz) serão acessíveis a velocidades de clock de até 8Mhz. Dispositivos

64
PicBasic Pro Compiler

de modo rápido (400Khz) podem ser usados até 20Mhz. Se for desejado acessar
um dispositivo de velocidade padrão acima de 8Mhz, o seguinte DEFINE deve ser
adicionado ao programa:

DEFINE I2C_SLOW 1

As linhas de clock e dados do I2C devem ser levadas ao Vcc c/ um resistor


de 4,7K de acordo c/ o seguinte esquema já que elas são ambas
manipuladas em modo bidirecional de coletor aberto.

addr var byte


cont con %10100000
addr = 17 ‘ Fixa endereco em 17
‘ Le dados no endereco 17 em B2
I2CREAD PORTA.0,PORTA.1,cont,addr,[B2]

Veja o “Non-Volatile Memory Products Data Book” da Microchip p/ mais


informação sobre estes e outros dispositivos que podem ser usados c/ os
comandos I2CREAD e I2CWRITE.

65
PicBasic Pro Compiler

5.24. I2CWRITE

I2CWRITE PinoDados,PinoClock,Controle,{Endereco,}
[Valor{,Valor...}]{,Rotulo}

I2CWRITE envia Controle e Endereco opcional p/ o PinoClock


e PinoDados do I2C seguidos por Valor. PinoClock e PinoDados
podem ser uma constante, 0-15, Ou uma variável que contenha um número 0-15 (ex.
B0) ou um nome de pino (ex. PORTA.0).

O tamanho do Endereco enviado (byte ou palavra) é determinado pelo tamanho da


variável que é usada. Se uma variável de tamanho de byte é usada p/ o Endereco,
um endereço de 8 bits é enviado. Se uma variável de tamanho de palavra é usada, um end.
de 16 bits é enviado. Esteja certo de usar o tamanho apropriado de variável p/ o
dispositivo c/ o qual você deseja se comunicar.

Quando for escrever em uma EEPROM serial é necessário esperar 10ms (depende do
dispositivo) p/ a escrita completar-se antes de tentar comunicação
c/ o dispositivo novamente. Se um I2CREAD ou I2CWRITE subseqüente é
tentado antes da escrita ser completada, o acesso será ignorado.

Enquanto que uma simples declaração I2CWRITE pode ser usada p/ escrever múltiplos
bytes de uma vez, fazendo assim poderá violar os requisitos de tempo acima p/
EEPROMs seriais. Algumas EEPROMS seriais lhe permitem escrever múltiplos bytes
em uma única página antes de necessitar a espera. Cheque a folha de dados
p/ o dispositivo específico que você está usando p/ estes detalhes. A característica de
escrita em múltiplos bytes também pode ser útil c/ dispositivos I2C além das
EEPROMs seriais que não têm que esperar entre escritas.

Se um Valor de tamanho de palavra é especificado, 2 bytes são enviados, primeiro


o byte superior seguido pelo byte inferior. Esta ordem é diferente do modo que as
variáveis são normalmente guardadas, c/ o byte inferior primeiro.

Se o Rotulo opcional é incluído, este rótulo será endereçado se nenhum


reconhecimento for recebido do dispositivo I2C.

As instruções I2C podem ser usadas p/ acessar a EEPROM serial no-chip


nos dispositivos 12CExxx e 16CExxx. Simplesmente especifique os nomes dos pinos
p/ as linhas internas apropriadas como parte do comando I2C e coloque
o seguinte DEFINE no topo do programa:

DEFINE I2C_INTERNAL 1

66
PicBasic Pro Compiler

Veja as folhas de dados da Microchip p/ estes dipspositivos p/ mais informação.

A temporização das instruções I2C é feita de forma que dispositivos de veloc. padrão
(100Khz) sejam acessíveis a velocidades de clock de até 8Mhz. Dispositivos de
modo rápido (400Khz) podem ser usados até 20Mhz. Se for desejado acessar um
dispositivo de velocidade padrão acima de 8Mhz, o seguinte DEFINE deve ser
adicionado ao programa:

DEFINE I2C_SLOW 1

Veja o comando I2CREAD acima p/ obter o resto da história.

addr var byte


cont con %10100000

addr = 17 ‘ Fixa endereco em 17


‘ Envia o byte 6 ao endereco 17
I2CWRITE PORTA.0,PORTA.1,cont,addr,[6]
Pause 10 ‘ Espera 10ms p/ a escrita se
completar
addr = 1 ‘ Fixa endereco em 1
‘ Envia o byte em B2 ao endereco 1
I2CWRITE PORTA.0,PORTA.1,cont,addr,[B2]
Pause 10 ‘ Espera 10ms p/ a escrita se
completar

67
PicBasic Pro Compiler

5.25. IF..THEN

IF Comp {AND/OR Comp...} THEN Rotulo


IF Comp {AND/OR Comp...} THEN
Declaracao...
ELSE
Declaracao...
ENDIF

Efetua uma ou mais comparações. Cada termo Comp pode relacionar uma
variável a uma constante ou outra variável e inclui um dos
operadores de comparação listados anteriormente.

If..Then avalia os termos da comparação p/ verdadeiro ou falso. Se


ele for verdadeiro, a operação após o Then é executada. Se ele
resultar em falso, a operação após o Then não é executada.
Comparações que resultem em 0 são consideradas falsas. Qualquer outro valor é
considerado verdadeiro. Todas as comparações estão s/ assinatura já que o PBP
apenas suporta tipos s/ assinatura.

Esteja certo de usar parênteses p/ especificar a ordem em que as operações devem ser
testadas. De outra forma, a precedência de um operador irá determiná-la p/ você e
o resultado pode não sair como esperado.

IF..THEN pode operar de 2 maneiras. Em uma forma, o THEN em um


IF..THEN é essencialmente um GOTO. Se a condição é verdadeira, o programa
fará GOTO até o rótulo após o THEN. Se a condição resultar em falso, o
programa continuará na próxima linha após o IF..THEN. Uma outra
declaração não poderá ser colocada após o THEN, deverá ser um rótulo.

If Pin0 = 0 Then pushd ‘ Se o botao conectado ao


Pin0 é pressionado (0), pule
p/ o rotulo pushd
If B0 >= 40 Then old ‘ Se o valor na
variavel B0 eh maior
que ou igual a 40,
pule p/ old
If PORTB.0 Then itson ‘ Se PORTB, pino 0 é
alto (1), pule p/ itson
If (B0 = 10) AND (B1 = 20) Then loop

68
PicBasic Pro Compiler

Na segunda forma, IF..THEN pode executar condicionalmente um grupo de


Declaracoes seguintes ao THEN. As Declaracoes devem ser seguidas
por um ELSE ou ENDIF p/ completar a estrutura.

If B0 <> 10 Then
B0 = B0 + 1
B1 = B1 - 1
Endif

If B0 = 20 Then
led = 1
Else
led = 0
Endif

69
PicBasic Pro Compiler

5.26. INPUT

INPUT Pino

Torna o Pino especificado uma entrada. Pino pode ser uma constante, 0-15, ou uma
variável que contenha um número 0-15 (ex. B0) ou um nome de pino (ex.
PORTA.0).

INPUT 0 ‘ Fixa Pino0 como entrada


INPUT PORTA.0 ‘ Fixa PORTA, pino 0 como entrada

Alternativamente, o pino pode ser fixado como entrada de forma mais rápida e
curta (a partir de um standpoint de código gerado):

TRISB.0 = 1 ‘ Fixa PORTB, pino 0 como entrada

Todos os pinos em uma porta podem ser fixados como entradas ajustando-se
todo o registrador TRIS de uma vez:

TRISB = %11111111 ‘ Fixa todo o PORTB como entrada

70
PicBasic Pro Compiler

5.27. {LET}

{LET} Var = Valor

Atribui um Valor a uma Variável. O Valor pode ser uma constante, uma outra
variável ou o resultado de uma expressão. Refira-se à seção anterior sobre
operadores p/ mais informação. A palavra-chave LET é opcional.

LET B0 = B1 * B2 + B3
B0 = Sqr W1

71
PicBasic Pro Compiler

5.28. LCDOUT

LCDOUT Item{,Item...}

Mostra Items em um Display de Cristal Líquido inteligente. O PBP suporta


módulos LCD c/ um controlador Hitachi 44780 ou equivalente. Estes
LCDs geralmente têm um cabeçalho de 14 ou 16 pinos em linha simples ou
dupla em uma extremidade.

Se um jogo-da-velha (#) precede um Item, a representação ASCII p/ cada


dígito é enviada ao LCD. LCDOUT também pode usar qualquer um dos modificadores
usados c/ SEROUT2. Veja a seção sobre SEROUT2 p/ esta informação.

Um programa deve esperar por pelo menos meio segundo antes de enviar o primeiro
comando a um LCD. Pode levar um bom tempo p/ um LCD se inicializar.

São enviados comandos ao LCD enviando-se um $FE seguido pelo


comando. Alguns comandos úteis estão listados na seguinte tabela:

Command Operation
$FE, 1 Limpa display
$FE, 2 Retorno (início da primeira linha)
$FE, $0C Cursor desligado
$FE, $0E Cursor sublinhado ligado
$FE, $0F Cursor piscante ligado
$FE, $10 Move cursor uma posição à esquerda
$FE, $14 Move cursor uma posição à direita
$FE, $C0 Move cursor ao início da segunda linha

Note que há um comando p/ mover o cursor p/ o início da segunda linha


de um display de 2 linhas. Para a maioria dos LCDs, os caracteres mostrados
e linhas não são consecutivos na memória do display - pode haver uma interrupção
entre posições. Para a maioria dos displays de 16x2, a primeira linha inicia em $0
e a segunda linha inicia em $40. O comando:

LCDOUT $FE, $C0


ajusta o display p/ começar a escrever caracteres no início da segunda
linha. Displays de 16x1 geralmente são formatados como displays de 8x2 c/ uma

72
PicBasic Pro Compiler

interrupção entre as posições de memória p/ os primeiros e segundos 8 caracteres.


Displays de 4 linhas também têm um mapa de memória misturado.

Veja a folha de dados p/ o dispositivo LCD em particular p/ as posições de


memória de caracteres e comandos adicionais.

LCDOUT $FE, 1, “Alo” ‘ Limpa display e mostra


“Alo”
LCDOUT B0, #B1

O LCD pode estar conectado ao PICmicro usando barramentos de 4 bits ou


de 8 bit. Se o de 8 bits for usado, todos os 8 bits devem estar em uma porta. Se o
de 4 bits for usado, ele deve estar conectado aos 4 bits inferiores ou aos 4 bits su-
periores de uma porta. Habil. e Sel. de Registrador podem estar conectados a qualquer
pino da porta. R/W deve ser aterrado já que o comando LCDOUT é apenas de
escrita.

PBP assume que o LCD está conectado a pinos específicos a não ser que seja dito
de outra forma. Ele assume que o LCD será usado c/ um barram. de 4 bits c/ as linhas
de dados DB4 - DB7 conectadas à PORTA.0 - PORTA.3 do PICmicro, Sel. de
Registrador à PORTA.4 e Habilitação à PORTB.3.

Ele também é pré-ajustado p/ inicializar o LCD p/ um display de 2 linhas.

Para alterar esta configuração, coloque um ou mais dos seguintes DEFINEs, todos em
maiúsculas, no topo do seu programa PicBasic Pro:

‘ Fixa porta de Dados do LCD


DEFINE LCD_DREG PORTB
‘ Fixa bit de Dados inicial (0 ou 4) se o barram. for de 4 bits
DEFINE LCD_DBIT 4
‘ Fixa porta de Selecao de Registrador do LCD
DEFINE LCD_RSREG PORTB
‘ Fixa bit de Selecao do Registrador do LCD
DEFINE LCD_RSBIT 1
‘ Fixa porta de Habilitacao do LCD
DEFINE LCD_EREG PORTB
‘ Fixa bit de Habilitacao do LCD
DEFINE LCD_EBIT 0
‘ Fixa tamanho do barramento do LCD (4 or 8 bits)
DEFINE LCD_BITS 4
‘ Fixa o numero de linhas no LCD
DEFINE LCD_LINES 2

73
PicBasic Pro Compiler

Este arranjo dirá ao PBP que um LCD de 2 linhas está ligado no modo de 4 bits c/ o
barram. de dados nos 4 bits superiores de PORTB, Sel. de Reg. em PORTB.1, e
Habilitação em PORTB.0.

O seguinte esquema mostra uma maneira de se ligar um LCD a um


PICmicro:

74
PicBasic Pro Compiler

5.29. LOOKDOWN

LOOKDOWN Pesquisa,[Constante{,Constante...}],Var

A declaração LOOKDOWN pesquisa uma lista de valores de Constante de 8 bits p/


a presença de um valor Pesquisa. Se encontrado, o índice da constante coin-
cidente é guardado em Var. Assim, se o valor encontrado for o primeiro da lista, Var
é fixado em zero. Se for o segundo da lista, Var é fixado em um. E assim vai. Se não
for encontrado, nenhuma ação é tomada e Var permanece inalterado.

A lista de constantes pode ser uma mistura de constantes numéricas e string.


Cada caractere em uma string é tratado como uma constante separada c/ o
valor ASCII do caractere. Cadeias de variáveis c/ um índice de variável não podem
ser usadas em LOOKDOWN embora cadeias de variáveis c/ um índice constante são
permitidas.

Serin 1,N2400,B0 ‘ Pega o caractere hexadecimal


do Pino1 serialmente
LOOKDOWN B0,[“0123456789ABCDEF”],B1 ‘ Converte
caractere
hexadecimal em
B0 p/
valor
decimal B1
Serout 0,N2400,[#B1] ‘ Envia valor decimal p/
Pino0 serialmente

75
PicBasic Pro Compiler

5.30. LOOKDOWN2

LOOKDOWN2 Pesquisa,{Teste}[Valor{,Valor...}],Var

A declaração LOOKDOWN2 pesquisa uma lista de Valores p/ a presença


do valor Pesquisa. Se encontrado, o índice da constante coincidente é
guardado em Var. Assim, se o valor encontrado for o primeiro da lista, Var é fixado em
zero. Se for o segundo da lista, Var é fixado em um. E assim vai. Se não for encontrado,
nenhuma ação é tomada e Var permanece inalterado.

O parâmetro opcional Test pode ser usado p/ executar um teste que não
seja igual a (“=”) quando pesquisar a lista. Por exemplo, a lista poderia
ser pesquisada p/ o primeiro Valor maior que o parâmetro Pesquisa
usando “>” como o parâmetro de Teste. Se Teste é deixado de fora, “=” é assumido.

A lista de Valor pode ser uma mistura de constantes numéricas e string de 16 bits
and variáveis. Cada caractere numa string é tratado como uma constante
separada igual ao valor ASCII do caractere. Expressões não podem ser
usadas na lista de Valor, embora elas possam ser usadas como o valor Pesquisa.
Cadeias de variáveis c/ um índice variável não podem ser usadas em LOOKDOWN2
embora cadeias de variáveis c/ um índice constante sejam permitidas.

LOOKDOWN2 gera código que é cerca de 3 vezes maior do que


LOOKDOWN. Se a lista de pesquisa é feita apenas de constantes de 8 bits e
strings, use LOOKDOWN.

LOOKDOWN2 W0,[512,W1,1024],B0
LOOKDOWN2 W0,<[10,100,1000],B0

76
PicBasic Pro Compiler

5.31. LOOKUP

LOOKUP Indice,[Constante{,Constante...}],Var

A declaração LOOKUP pode ser usada p/ recuperar valores de uma tabela de cons-
tantes de 8 bits. Se Indice é zero, Var é fixado como o valor da primeira
Constante. Se Indice é um, Var é fixado como o valor da segunda
Constante. E assim vai. Se Indice é maior que ou igual ao número
de entradas na lista constantes, nenhuma ação é tomada e Var permanece
inalterado.

A lista de constantes pode ser uma mistura de constantes numéricas e string.


Cada caractere numa string é tratado como uma constante separada igual ao
valor ASCII do caractere. Cadeias de variáveis c/ um índice variável não podem
ser usadas em LOOKUP embora cadeias de variáveis c/ um índice constante são
permitidas.

For B0 = 0 to 5 ‘ Conta de 0 a 5
LOOKUP B0,[“A l o !”],B1 ‘ Pega caractere
numero B0 da
string p/ variavel
B1
Serout 0,N2400,[B1] ‘ Envia caractere
em B1 p/ Pino0
serialmente
Next B0 ‘ Faz proximo caractere

77
PicBasic Pro Compiler

5.32. LOOKUP2

LOOKUP2 Indice,[Valor{,Valor...}],Var

A declaração LOOKUP2 pode ser usada p/ recuperar entradas de uma tabela de


Valores. Se Indice é zero, Var é fixado ao primeiro Valor. Se Indice é um,
Var é fixado ao segundo Valor. E assim vai. Se Indice é maior que ou
igual ao número de entradas na lista, nenhuma ação é tomada e Var
permanece inalterado.

A lista Valor pode ser uma mistura de constantes numéricas e string de 16 bits
e variáveis. Cada caractere numa string é tratado como uma constante
separada igual ao valor ASCII do caractere. Expressões não podem ser
usadas na lista Valor, embora elas possam ser usadas como o valor Indice.
Cadeias de variáveis c/ um índice variável não podem ser usadas em LOOKUP2
embora cadeias de variáveis c/ um índice constante sejam permitidas.

LOOKUP2 gera código que é cerca de 3 vezes maior do que LOOKUP. Se


a lista Valor é feita apenas de constantes e strings de 8 bits, use
LOOKUP.

LOOKUP2 B0,[256,512,1024],W1

78
PicBasic Pro Compiler

5.33. LOW

LOW Pino

Leva o Pino especificado a nível baixo. Pino é automaticamente fixado como saída. Pino
pode ser uma constante, 0 - 15, ou uma variável que contenha um número 0 - 15
(ex. B0) ou um nome de pino (ex. PORTA.0).

LOW 0 ‘ Fixa Pino0 como saída e o leva a nível baixo


(0 volts)
LOW PORTA.0 ‘ Torna PORTA, pino 0 uma saída e
o leva a nível baixo (0 volts)

led var PORTB.0 ‘ Define pino do LED


LOW led ‘ Torna pino do LED uma saída e
o leva a nível baixo (0 volts)

Alternativamente, se o pino já for uma saída, um meio mais rápido e curto


(partindo de um standpoint de código gerado) de levá-lo a nível baixo seria:

PORTB.0 = 0 ‘ Leva PORTB, pino 0 p/ nivel baixo

79
PicBasic Pro Compiler

5.34. NAP

NAP Periodo

Coloca o microcontrolador em modo de baixo consumo por curtos períodos de tempo.


Durante este NAP, o consumo de força é reduzido ao mínimo. Os períodos
listados são apenas aproximações porque a temporização é derivada do
Timer de Watchdog o qual é comandado via R/C e pode variar muito de chip p/
chip e com a temperatura. Já que o NAP usa o Timer de Watchdog, sua
temporização é independente da freqüência do oscillator.

Periodo Atraso (Aprox.)


0 18 milisegundos
1 36 milisegundos
2 72 milisegundos
3 144 milisegundos
4 288 milisegundos
5 576 milisegundos
6 1.152 segundos
7 2.304 segundos

NAP 7 ‘ Pausa em baixo consumo por cerca de 2.3 segundos

80
PicBasic Pro Compiler

5.35. ON INTERRUPT

ON INTERRUPT GOTO Rotulo

ON INTERRUPT permite a manipulação das interrupções do microcon-


trolador por uma subrotina do PicBasic Pro.

Há 2 maneiras de manipular interrupções usando o PicBasic Pro Compiler.


A primeira é escrever uma rotina de interrupções em linguagem assembly. Esta é a
maneira de manipular interrupções c/ a menor latência e menor overhead.
Este método é discutido em tópicos avançados em uma seção mais tarde.

O segundo método é escrever um manipulador de interrupções em PicBasic Pro. Isto


se parece c/ uma subrotina do PicBasic Pro mas termina c/ um RESUME.

Quando uma interrupção ocorre, ela é bandeirada. Logo que a execução da de-
claração atual do PicBasic Pro está completa, o programa pula p/ o manipulador de
interrupções BASIC em Rotulo. Uma vez que o manipulador de interrupções está
completo, a declaração RESUME envia o programa de volta p/ onde ele estava
quando a interrupção ocorreu, continuando de onde ele havia parado.

DISABLE e ENABLE permitem que diferentes seções de um programa do


PicBasic Pro executem s/ a possibilidade de serem interrompidas. O
lugar mais notável p/ se usar DISABLE é logo antes do próprio manipulador
de interrupções. Ou o manipulador de interrupções pode ser colocado antes da
declaração ON INTERRUPT já que a flag de interrupções não é checada antes do
primeiro ON INTERRUPT num programa.

Latência é o tempo que leva da hora da própria interrupção à


hora que o manipulador de interrupções entra. Já que as decl. do PicBasic Pro não
são re-entrantes (ex. você não pode executar uma outra declaração do PicBasic Pro
enquanto uma estiver sendo executada), pode haver considerável latência antes
da rotina de interrupções ser introduzida.

O PBP não introduzirá o manipulador de interrupções BASIC até que tenha acabado
a execução da declaração atual. Se a declaração for PAUSE ou SERIN,
poderá levar um bom tempo antes da interrupção ser reconhecida. O
programa deve ser projetado c/ esta latência em mente. Se for
inaceitável e as interrupções precisarem ser manipuladas mais rapidamente,
uma rotina de interrupção em linguagem assembly deve ser usada.

81
PicBasic Pro Compiler

O overhead é um outro problema. ON INTERRUPT irá adicionar uma instrução


após cada declaração p/ checar se uma interrupção ocorreu ou não.
DISABLE desliga a adição desta instrução. ENABLE a liga novamente.
Geralmente a instrução adicional não será um grande
problema, mas programas longos em microcontroladores pequenos podem sofrer.

Mais do que um ON INTERRUPT podem ser usados em um programa.

ON INTERRUPT GOTO myint ‘ Manip. de interruções é


myint
INTCON = %10010000 ‘ Habil. interrupção RB0

. . .

DISABLE ‘ Desab. interrupções no


manipulador
myint: led = 1 ‘ Liga o LED quando interrompido
RESUME ‘ Retorna ao progr. principal
ENABLE ‘ Habilita interrupções após
manipulador

Para desligar as interrupções permanentemente (ou até serem necessárias


novamente) uma vez que ON INTERRUPT tenha sido usado, fixe INTCON em $80:

INTCON = $80

82
PicBasic Pro Compiler

5.36. OUTPUT

OUTPUT Pino

Torna o Pino especificado uma saída. Pino pode ser uma constante, 0 - 15, ou
uma variável que contenha um número 0 - 15 (ex. B0) ou um nome de pino (ex.
PORTA.0).

OUTPUT 0 ‘ Torna Pino0 uma saída


OUTPUT PORTA.0 ‘ Torna PORTA, pino 0 uma saída

Alternativamente, o pino pode ser fixado como saída de uma maneira mais
rápida e curta (partindo de um standpoint de código gerado):

TRISB.0 = 0 ‘ Fixa PORTB, pino 0 como


saída

Todos os pinos numa porta podem ser fixados como saídas ajustando-se todo
o registrador TRIS de uma só vez:

TRISB = %00000000 ‘ Fixa todo o PORTB como saída

83
PicBasic Pro Compiler

5.37. PAUSE

PAUSE Periodo

Pausa o programa por Periodo milisegundos. Periodo é de 16 bits, então


atrasos podem ser de até 65,535 milisegundos (pouco mais de um minuto). Dife-
rente das outras funções de atraso (NAP e SLEEP), PAUSE não põe o
microcontrolador em modo de baixo consumo. Assim, PAUSE consome mais
potência mas é também muito mais preciso. Ele tem a mesma precisão que o
clock do sistema.

PAUSE assume uma freqüência de oscilador de 4Mhz. Se um oscilador diferente


de 4Mhz é usado, o PBP deve ser informado usando um comando DEFINE OSC.
Veja a seção sobre velocidade p/ mais informação.

PAUSE 1000 ‘ Atraso de 1 segundo

84
PicBasic Pro Compiler

5.38. PAUSEUS

PAUSEUS Periodo

Pausa o programa por Periodo microsegundos. Periodo é de 16 bits, então


atrasos podem ser de até 65,535 microsegundos. Diferente das outras funções
de atraso (NAP e SLEEP), PAUSEUS não põe o microcontrolador
em modo de baixo consumo. Assim, PAUSEUS consome mais potência mas é
também muito mais preciso. Ele tem a mesma precisão que o clock
do sistema.

PAUSEUS toma um número mínimo de ciclos p/ operar. Por causa disto


e dependendo da freqüência do oscilador, atrasos de menos que um
número mínimo de microsegundos não são possíveis usando PAUSEUS.
Para obter atrasos precisos menores que isto, use uma rotina em linguagem
assembly em uma construção ASM..ENDASM. A tabela abaixo lista o
númeo mínimo de microsegundos obteníveis em uma freqüência de oscilador
particular.

OSC Atraso mínimo


3 (3.58) 20us
4 24us
8 12us
10 8us
12 7us
16 5us
20 3us

PAUSEUS assume uma freqüência de oscilador de 4Mhz. Se um oscilador diferente


de 4Mhz é usado, o PBP deve ser informado usando um comando DEFINE OSC
Veja a seção sobre velocidade p/ mais informação.

PAUSEUS 1000 ‘ Atraso de 1 milisegundo

85
PicBasic Pro Compiler

5.39. PEEK

PEEK Endereco,Var

Lê o registrador do microcontrolador no Endereco especificado e guarda


o resultado em Var. Características especiais do PICmicro como os conversores A/D
e portas adicionais de E/S podem ser lidas usando PEEK.

PEEK e POKE permitem acesso direto a todos os registradores num PICmicro


incluindo PORTA, PORTB, PORTC, PORTD, PORTE e seus
registradores de direção de dados (TRIS) associados. PEEK e POKE operam em
todos os bits, ex. o byte inteiro, do registrador em particular de uma vez. Quando
você POKEa dados ao PORTA, a porta inteira é atualizada, não apenas
um bit individual.

PEEK PORTA,B0 ‘ Pega estado atual dos pinos em PORTA


p/ variavel B0

O PicBasic Pro Compiler pode acessar diretamente os registradores e bits


s/ a necessidade de PEEK e POKE. É recomendado que este acesso
direto seja usado em vez de PEEK e POKE.

B0 = PORTA ‘ Pega estado atual dos pinos em PORTA


p/ B0

86
PicBasic Pro Compiler

5.40. POKE

POKE Endereco,Valor

Escreve Valor no registrador do microcontrolador no Endereco especificado.


Características especiais do PICmicro como conversores A/D e portas de E/S
adicionais podem ser escritas usando POKE.

POKE $85,0 ‘ Escreve 0 no registrador hexadecimal 85


(Fixa todo o PORTA como saidas)

O PicBasic Pro Compiler pode acessar diretamente os registradores e bits


s/ a necessidade de PEEK e POKE. É recomendado que este acesso
direto seja usado em vez de PEEK e POKE.

TRISA = 0 ‘ Fixa todo o PORTA como saidas


PORTA.0 = 1 ‘ Leva o bit 0 de PORTA a nivel alto

87
PicBasic Pro Compiler

5.41. POT

POT Pino,Escala,Var

Lê um potenciômetro (ou algum outro dispositivo resistivo) em Pino. Pino


pode ser uma constante, 0 - 15, ou uma variável que contenha um número 0 - 15
(ex. B0) ou um nome de pino (ex. PORTA.0).

A resistência é medida contando a descarga de um capacitor


através do resistor (tipicamente 5K a 50K). Escala é usado p/ ajuste de
constantes RC variantes. Para constantes RC maiores, Escala deve ser
abaixado (um valor mínimo de um). Para constantes RC menores, Escala deve
ser fixado em seu valor máximo (255). Se Escala for ajustado corretamente, Var
deverá ser zero perto da resistência mínima e 255 perto da resistência máxima.

Infelizmente, Escala deve ser determinado experimentalmente. Para isto, fixe


o dispositivo sob medição p/ a resistência máxima e leia-o c/
Escala fixo em 255. Sob estas condições, Var irá produzir um
valor apropriado p/ Escala. (NOTA: Este é o mesmo tipo de processo
realizado pela opção Alt-P do ambiente BS1).

Pin 5-50K

0.1uF

POT 3,255,B0 ‘ Lê o potenciômetro no


Pino3 p/ determinar escala
Serout 0,N2400,[#B0] ‘ Envia valor do pot
serialmente ao Pino0

88
PicBasic Pro Compiler

5.42. PULSIN

PULSIN Pino,Estado,Var

Mede a largura do pulso em Pino. Se Estado é zero, a larg. de um pulso baixo


é medida. Se Estado é um, a largura de um pulso alto é medida.
A largura medida é colocada em Var. Se a borda do pulso nunca acontece
ou a largura do pulso é grande demais p/ medir, Var é fixo em zero. Se
uma variável de 8 bits é usada, somente o LSB da medição de 16 bits é
usada. Pino pode ser uma constante, 0 - 15, ou uma variável que contenha um
número 0 - 15 (ex. B0) ou um nome de pino (ex. PORTA.0).

A resolução de PULSIN é dependente da freqüência do oscilador. Se


um oscilador de 4Mhz é usado, a largura do pulso é retornada em incrementos
de 10us. Se um oscilador de 20Mhz é usado, a largura do pulso terá uma
resolução de 2us. Definir um valor OSC não tem efeito em PULSIN. A
resolução sempre muda c/ a velocidade atual do oscilador.

‘ Mede pulso alto em Pino4 guardado em W3


PULSIN PORTB.4,1,W3

89
PicBasic Pro Compiler

5.43. PULSOUT

PULSOUT Pino,Periodo

Gera um pulso em Pino de Periodo especificado. O pulso é gerado


comutando o pino duas vezes, assim o estado inicial do pino determina a
polaridade do pulso. Pino é automaticamente fixado como saída. Pino pode ser
uma constante, 0 - 15, ou uma variável que contenha um número 0 - 15 (ex. B0)
ou um nome de pino (ex. PORTA.0).

A resolução de PULSOUT é dependente da freqüência do oscillator.


Se um oscilador de 4Mhz é usado, o Periodo do pulso gerado será em
incrementos de 10us. Se um oscilador de 20Mhz é usado, Periodo terá uma re-
solução de 2us. Definir um valor OSC não tem efeito em PULSOUT. A
resolução sempre muda c/ a velocidade atual do oscilador.

‘ Envia um pulso de 1mSec (em 4Mhz) ao Pino5


PULSOUT PORTB.5,100

90
PicBasic Pro Compiler

5.44. PWM

PWM Pino,Duty,Ciclo

Produz um trem de pulsos em modulação por largura de pulso em Pino. Cada ciclo de
PWM consiste de 256 passos. O Duty cycle p/ cada ciclo PWM
vai de 0 (0%) a 255 (100%). Este ciclo PWM é repetido Ciclo
vezes. Pino pode ser uma constante, 0 - 15, ou uma variável que contenha
um número 0 - 15 (ex. B0) ou um nome de pino (ex. PORTA.0).

O tempo do Ciclo do PWM é dependente da freqüência do oscilador. Se um


oscilador de 4Mhz é usado, cada Ciclo duraria cerca de 5ms. Se um
oscilador de 20Mhz é usado, cada Ciclo teria cerca de 1ms de comprimento.
Definir um valuor OSC não tem nenhum efeito em PWM. O tempo de Ciclo
sempre muda c/ a velocidade atual do oscilador.

Pino é fixado como saída logo antes da geração dos pulsos e reverte p/ en-
trada após parar a geração. A saída PWM num pino se parece tanto
com sujeira, e não uma linda série de ondas quadradas. Algum tipo de
filtro é necessário p/ tornar o sinal em algo útil. Um circuito RC
pode ser usado como um simples conversor D/A:

10K
Pino Saída Analóg.

1uF

PWM PORTB.7,127,100 ‘ Envia um sinal PWM com


50% duty cycle ao Pino7 por
100 ciclos

91
PicBasic Pro Compiler

5.45. RANDOM

RANDOM Var

Executa uma iteração de pseudo-randomização em Var. Var deve ser


uma variável de 16 bits. Cadeias de variáveis c/ um índice variável não podem ser
usadas em RANDOM embora cadeias de variáveis c/ um índice constante sejam permitidas.
Var é usado tanto como a semente e p/ guardar o resultado. O algoritmo
pseudo-randômico usado tem um comprimento de caminhada de 65535
(somente o zero não é produzido).

RANDOM W4 ‘ Pega um número randômico p/ W4

92
PicBasic Pro Compiler

5.46. RCTIME

RCTIME Pino,Estado,Var

RCTIME mede o tempo que um Pino fica num Estado particular. Ele é
basicamente meio PULSIN. Pino pode ser uma constante, 0 - 15, ou uma variável
que contenha um número 0 - 15 (ex. B0) ou um nome de pino (ex. PORTA.0).

RCTIME pode ser usado p/ ler um potenciômetro (ou algum outro dispositivo re-
sistivo). Resistência pode ser medida pela descarga e cronometragem da
carga (ou vice versa) de um capacitor através do resistor (tipicamente 5K a
50K).

A resolução de RCTIME é dependente da freqüência do oscilador. Se


um oscilador de 4Mhz é usado, o tempo no estado é retornado em incre-
mentos de 10us. Se um oscilador de 20Mhz é usado, o tempo no estado terá uma
resolução de 2us. Definir um valor OSC não tem nenhum efeito em RCTIME. A
resolução sempre muda c/ a velocidade atual do oscilador.

Se o pino nunca mudar de estado, 0 é retornado.

Low PORTB.3 ‘ Descarrega cap p/ iniciar


Pause 10 ‘ Descarrega por 10ms
RCTIME PORTB.3,0,W0 ‘ Lê potenciômetro no
Pino3

93
PicBasic Pro Compiler

5.47. READ

READ Endereco,Var

Lê a EEPROM no-chip no Endereco especificado e guarda o


resultado em Var. Esta instrução só pode ser usada c/ um PICmicro que
tenha uma área de dados de EEPROM no-chip tal como o PIC16F84 ou
PIC16C84.

READ 5,B2 ‘ Coloca o valor da posicao 5 da EEPROM


em B2

94
PicBasic Pro Compiler

5.48. RESUME

RESUME {Rotulo}

Prossegue de onde o programa deixou após manipular uma interrupção. RESUME


similar a RETURN mas é usado ao final de uma interrupção do manipulador
do PicBasic Pro.

Se o Rotulo opcional é usado, a execução do programa irá continuar no


Rotulo ao invés de onde estava quando foi interrompida. Neste caso, quaisquer
outros endereços de retorno na pilha não serão mais acessíveis.

Veja ON INTERRUPT p/ mais informação.

clockint: seconds = seconds + 1 ‘ Conta tempo


RESUME ‘ Retorna ao programa apos
interrupcao

error: High errorled ‘ Liga LED de erro


RESUME restart ‘ Continua em outro lugar

95
PicBasic Pro Compiler

5.49. RETURN

RETURN

Retorna da subrotina. RETURN continua a execução na declaração


seguinte ao GOSUB que chamou a subrotina.

Gosub sub1 ‘ Vai p/ subrotina rotulada sub1


...
sub1: Serout 0,N2400,[“Almoco”] ‘ Envia “Almoco” ao
Pino0 serialmente
RETURN ‘ Retorna ao programa principal apos o Gosub

96
PicBasic Pro Compiler

5.50. REVERSE

REVERSE Pino

Se Pino é uma entrada, ele é fixado como saída. Se Pino é uma saída, ele é fixado
como entrada. Pino pode ser uma constante, 0 - 15, ou uma variável que contenha
um número 0 - 15 (ex. B0) ou um nome de pino (ex. PORTA.0).

Output 4 ‘ Fixa Pino4 como saida


REVERSE 4 ‘ Altera Pino4 p/ entrada

97
PicBasic Pro Compiler

5.51. SERIN

SERIN
Pino,Modo,{Timeout,Rotulo,}{[Qual...],}{Item...}

Recebe um ou mais Items no Pino no formato assíncrono padrão


usando 8 bits de dados, s/ paridade e um stop bit (8N1). SERIN é similar ao
comando Serin do BS1 c/ a adição de um Timeout. Pino é
automaticamente fixado como entrada. Pino pode ser uma constante, 0 - 15,
ou uma variável que contenha um número 0 - 15 (ex. B0) ou um nome de
pino (ex.PORTA.0).

Os nomes Mode (ex. T2400) são definidos no arquivo MODEDEFS.BAS.


Para usá-los, adicione a linha:

Include “modedefs.bas”

ao topo do programa PicBasic Pro. BS1DEFS.BAS e


BS2DEFS.BAS já incluem MODEDEFS.BAS. Não o inclua de
novo se um destes arquivos já estiver incluso. Os números Mode podem
ser usado s/ a inclusão deste arquivo.

Mode No. Mode Baud Rate Estado


T2400 0 2400
T1200 1 1200
Verdadeiro
T9600 2 9600
T300 3 300
N2400 4 2400
N1200 5 1200
Invertido
N9600 6 9600
N300 7 300

Um Timeout e Label opcionais podem ser inclusos p/ permitir ao programa


continuar se um caractere não for recebido dentro de um certo tempo.
Timeout é especificado em unidades de 1 milisegundo.

A lista de ítens de dados a serem recebidos pode ser precedida por um ou mais
qualificadores contidos entre colchetes. SERIN deve receber estes bytes na

98
PicBasic Pro Compiler

ordem exata antes de receber os ítens de dados. Se qualquer byte recebido não
coincidir c/ o próximo byte na seqüência do qualificador, o processo de
qualificação recomeça (ex. o próximo byte recebido é comparado ao primeiro
ítem na lista do qualificador). Um Qualificador pode ser uma constante, variável
ou uma constante string. Cada caractere de uma string é tratado como um
qualificador individual.

Uma vez que os qualificadores são satisfeitos, SERIN começa a guardar dados nas
variáveis associadas c/ cada Item. Se o nome da variável é usado
sozinho, o valor do caractere ASCII recebido é guardado na
variável. Se a variável é precedida por um jogo-da-velha ( # ), SERIN converte um
valor decimal em ASCII e guarda o resultado naquela variável. Todos os não-
dígitos recebidos antes do primeiro dígito do valor decimal são ignorados e
descartados. Os caracteres não-dígito que terminarem o valor decimal
também são descartados.

SERIN assume um oscilador de 4Mhz quando gerar sua temporização de bit. Para
manter a temporização de baud rate apropriada c/ outros valores de oscilador, esteja
certo de definir (DEFINE) o ajuste OSC ao novo valor do oscilador.

Enquanto conversores de nível RS-232 de um só chip são comuns e


baratos, as excelentes especificações de E/S do PICmicro permitem que a maioria
das aplicações rodem s/ conversores de nível. Ao invés disso, entradas invertidas
(N300..N9600) podem ser usadas em conjunto c/ um resistor
limitador de corrente.

DB9 DB25
22K
Pino RS-232 TX Pino 3 Pino 2

RS-232 GND Pino 5 Pino 7

SERIN 1,N2400,[“A”],B0 ‘ Aguarda até que o


caractere “A” seja
recebido serialmente no
Pino1 e colocado proximo
ao caractere em B0

99
PicBasic Pro Compiler

5.52. SERIN2

SERIN2 PinoDados{\PinoFluxo},Mode,{RotuloParidade,}
{Timeout,Rotulo,}[Item...]

Recebe um ou mais Items no Pino em formato assíncrono padrão.


SERIN2 é similar ao comando Serin do BS2. PinoDados é automaticamente
fixado como entrada. O PinoFluxo opcional é automaticamente fixadao como saída.
PinoDados e PinoFluxo podem ser uma constante, 0 - 15, ou uma variável que
contenha um número 0 - 15 (ex. B0) ou um nome de pino (ex. PORTA.0).

O pino de controle de fluxo optional, PinoFluxo, pode ser incluso p/ ajudar a evitar
que os dados sobrecarreguem o receptor. Se for usado, PinoFluxo é
automaticamente levado ao estado habilitado p/ permitir a transmissão de cada
caractere. Este estado habilitado é determinado pela polaridade dos dados
especificados por Mode.

Mode é usado p/ especificar o baud rate e parâmetros de operação da


transferência serial. Os 13 bits de ordem inferior selecionam o baud rate. O bit 13 seleciona
paridade ou s/ paridade. O bit 14 seleciona invertido ou nível real. O bit 15 não é
usado.

Os bits de baud rate especificam o tempo de bit em microsegundos - 20. Para en-
contrar o valor p/ um dado baud rate, use a equação:

(1000000 / baud) - 20

Alguns baud rates padrão estão listados na seguinte tabela.

Baud Rate Bits 0 - 12


300 3313
600 1646
1200 813
2400 396
4800 188
9600 84
19200 32

100
PicBasic Pro Compiler

O bit 13 seleciona paridade par (bit 13 = 1) ou s/ paridade (bit 13 = 0). Normalmente,


as transmissões seriais são 8N1 (8 bits de dados, s/ paridade e 1 bit de parada). Se
a paridade é selecionada, os dados são recebidos como 7E1 (7 bits de dados,
paridade par e 1 bit de parada).

O bit 14 seleciona o nível dos dados e pinos de controle de fluxo. Se o bit 14 = 0,


os dados são recebidos na forma real p/ uso c/ drivers RS-232. Se o bit 14 =
1, os dados são recebidos invertidos. Este modo pode ser usado p/ evitar
a instalação de drivers RS-232.

Alguns exemplos de Mode são: Mode = 84 (9600 bauds, s/ paridade, real),


Mode = 16780 (2400 bauds, s/ paridade, invertido), Mode = 27889 (300
bauds, paridade par, invertido).

Se RotuloParidade é incluso, este rótulo será endereçado se um caractere


c/ erro de paridade é recebido. Ele deve somente ser usado se a paridade
par é selecionada (bit 13 = 1).

Um Timeout e Rotulo opcionais podem ser inclusos p/ permitir ao programa


continuar se um caractere não é recebido dentro de um certo tempo.
Timeout é especificado em unidades de 1 milisegundo.

SERIN2 suporta muitos modificadores de dados diferentes que podem ser misturados
e combinados livremente dentro de uma única declaração SERIN2 p/ prover várias
formatações de entrada.

Modificador Operação
BIN{1..16} Recebe dígitos binários
DEC{1..5} Recebe dígitos decimais
HEX{1..4} Recebe dígitos hexadecimais
SKIP n Pula n caracteres recebidos
STR CadeiaVar\n{\c} Recebe cadeia de n caracteres
opcionalmente terminados c/ caractere c
WAIT ( ) Espera por seqüência de caracteres
WAITSTR CadeiaVar{\n} Espera por cadeia de caracteres

1) Uma variável precedida por BIN irá receber a represen-


tação ASCII de seu valor binário. Por exemplo, se BIN B0 é
especificado e “1000" é recebido, B0 será fixado em 8.
101
PicBasic Pro Compiler

2) Uma variável precedida por DEC irá receber a represen-


tatção ASCII de seu valor decimal. Por exemplo, se DEC B0 é
especificado e “123" é recebido, B0 será fixado em 123.
3) Uma variável precedida por HEX irá receber a represen-
tação ASCII de seu valor hexadecimal. Por exemplo, se HEX
B0 é especificado e “FE" é recebido, B0 será fixado em 254.
4) SKIP seguido por uma contagem irá pular aquela quantia de caracteres
na corrente de entrada. Por exemplo, SKIP 4 irá pular 4 caracteres..
5) STR seguido por uma variável de cadeia de byte, contagem e caractere termi-
nador opcional irá receber uma cadeia de caracteres. O compr. da cadeia é
determinado pela contagem ou quando o caractere opcional é
encontrado na entrada.
6) A lista de ítens de dados a serem recebidos pode ser precedida por um ou
mais qualificadores entre parênteses após WAIT. SERIN2 deve
receber estes bytes na ordem exata antes de receber os ítens de
dados. Se qualquer byte recebido não coincidir c/ o próx. byte na
seqüência do qualificador, o processo de qualificação recomeça (ex. o
próx. byte recebido é comparado ao primeiro ítem na lista do
qualificador). Um Qualificador pode ser uma constante, variável
ou uma constante de string. Cada caractere de uma string é tratado como
um qualificador individual.
7) WAITSTR pode ser usado como WAIT acima p/ forçar SERIN2 a
esperar por uma cadeia de caracteres de um compr. opcional antes
de proceder.

Uma vez que quaisquer qualificadores WAIT ou WAITSTR são satisfeitos, SERIN2 começa
a guardar dados nas variáveis associadas c/ cada Item. Se o nome da
variável é usado sozinho, o valor do caractere ASCII recebido é guardado
na variável. Se a variável é precedida por BIN, DEC ou HEX, então
SERIN2 converte um valor binário, decimal ou hexadecimal em ASCII e
guarda o resultado naquela variável. Todos os não-dígitos recebidos antes do primeiro
dígito do valor decimal são ignorados e descartados. O caractere
não-dígito que termina o valor é também descartado.

BIN, DEC e HEX podem ser seguidos por um número. Normalmente, estes
modificadores recebem tantos dígitos quanto há na entrada. Entretanto, se um
número segue o modificador, SERIN2 irá sempre receber aquele número de
dígitos, pulando dígitos adicionais conforme necessário.

102
PicBasic Pro Compiler

SERIN2 assume um oscilador de 4Mhz enquanto genera sua temporização de bit. Para
manter a temporização de baud rate apropriada c/ outros valores de oscilador, esteja certo
de fazer o DEFINE do parâmetro OSC p/ o novo valor do oscilador.

Enquanto que conversores de nível RS-232 num só chip são comuns e


baratos, graças à atual implementação da RS-232 e as excelentes
especificações de E/S do PICmicro, a maioria das aplicações não requerem conver-
sores de nível. Em lugar disso, TTL invertido (Mode bit 14 = 1) pode ser usado. Um
resistor limitador de corrente é sugerido (supõe-se que a RS-232 seja
tolerante a curtos).

DB9 DB25
22K
Pino RS-232 TX Pino 3 Pino 2

RS-232 GND Pino 5 Pino 7

‘ Espera até que o caractere “A” seja recebido


serialmente no Pino1 e coloca prox. caractere em B0
SERIN2 1,16780,[wait (“A”),B0]

‘ Pula 2 caracteres e pega um número decimal de 4 digitos


SERIN2 PORTA.1,84,[skip 2,dec4 B0]

SERIN2 PORTA.1\PORTA.0,84,100,tlabel,[wait (“x”,


b0), str ar]

103
PicBasic Pro Compiler

5.53. SEROUT

SEROUT Pino,Modo,[Item{,Item...}]

Envia um ou mais ítens ao Pino em formato assíncrono padrão usando


8 bits de dados, s/ paridade e uma parada (8N1). SEROUT é similar ao comando
Serout do BS1. Pino é automaticamente fixado como saída. Pino pode ser uma
constante, 0 - 15, ou uma variável que contenha um número 0 - 15 (ex. B0) ou
um nome de pino (ex. PORTA.0).

Os nomes Mode (ex. T2400) são definidos no arquivo MODEDEFS.BAS.


Para usá-los, adicione a linha:

Include “modedefs.bas”

no topo do programa PicBasic Pro. BS1DEFS.BAS e


BS2DEFS.BAS já incluem MODEDEFS.BAS. Não inclua-o
novamente se um destes arquivos já estiver incluso. Os números Mode podem
ser usados s/ incluir este arquivo.

104
PicBasic Pro Compiler

Mode No. Mode Baud Rate Estado


T2400 0 2400
T1200 1 1200
Acionam. Real
T9600 2 9600
T300 3 300
N2400 4 2400
N1200 5 1200 Acionam.
N9600 6 9600 Invertido
N300 7 300
OT2400 8 2400
OT1200 9 1200
Aberto Real
OT9600 10 9600
OT300 11 300
ON2400 12 2400
ON1200 13 1200
Aberto Invertido
ON9600 14 9600
ON300 15 300

SEROUT suporta três tipos de dados diferentes que podem ser misturados e
combinados livremente dentro de uma única declaração SEROUT.

1) Uma constante string é enviada como uma string de caracteres literal.


2) Um valor numérico (uma variável ou uma constante) irá enviar o
caractere ASCII correspondente. Mais notavelmente, 13 é o retorno
do carro e 10 é o avanço de linha.
3) Um valor numérico precedido por um jogo-da-velha ( # ) irá enviar a
representação ASCII de seu valor decimal. Por exemplo, se W0 =
123, então #W0 (ou #123) irá enviar '1', '2', '3'.

SEROUT assume um oscilador de 4Mhz enquanto gera sua temporização de bit. Para
manter a temporização de baud rate apropriada c/ outros valores de oscilador, esteja
certo de fazer o DEFINE do parâmetro OSC p/ o novo valor do oscilador.

105
PicBasic Pro Compiler

Em alguns casos, as taxas de transmissão das instruções SEROUT podem


apresentar caracteres muito rapidamente ao dispositivo receptor. Um DEFINE
adiciona cadência de caractere às transmissões de saída serial. Isto permite
tempo adicional entre os caracteres à medida em que são transmitidos. Um
DEFINE de cadência de caracteres permite um atraso de 1 a 65,535 micro-
segundos (.001 a 65.535 milisegundos) entre cada caractere transmitido.

Por exemplo, p/ pausar 1 milisegundo entre a transmissão de cada


caractere:

DEFINE CHAR_PACING 1000

Enquanto que conversores de nível RS-232 de um só chip são comuns e


baratos, graças à atual implementação RS-232 e as excelentes
especificações de E/S do PICmicro, a maioria das aplicações não requerem conver-
sores de nível. Em lugar disso, TTL invertido (N300..N9600) pode ser usado.
Um resistor limitador de corrente é sugerido (supõe-se que o RS-232 seja
tolerante a curtos).

DB9 DB25
1K
Pino RS-232 RX Pino 2 Pino 3

RS-232 GND Pino 5 Pino 7

SEROUT 0,N2400,[#B0,10] ‘ Envia o valor ASCII


de B0 seguido por um avan-
co de linha ao Pino0
serialmente

106
PicBasic Pro Compiler

5.54. SEROUT2

SEROUT2 PinoDados{\PinoFluxo},Modo,{Passo,}
{Timeout,Rotulo,}[Item...]

Envia um ou mais Items ao PinoDados em formato assíncrono padrão.


SEROUT2 é similar ao comando Serout do BS2. PinoDados é
automaticamente fixado como saída. O PinoFluxo opcional é automaticamente
fixado como entrada. PinoDados e PinoFluxo podem ser uma constante, 0 - 15,
ou uma variável que contenha um número 0 - 15 (ex. B0) ou um nome de pino (ex.
PORTA.0).

O pino de controle de fluxo opcional, PinoFluxo, pode ser incluído p/ ajudar a impedir
que os dados sobrecarreguem o receptor. Se ele é usado, os dados seriais não serão
enviados até que PinoFluxo esteja no estado apropriado. Este estado é determinado
pela polaridade dos dados especificados por Mode.

Um Timeout e Label opcionais podem ser incluídos p/ permitir que o programa


continue se o PinoFluxo não mudar p/ o estado habilitado dentro de
um certo tempo. Timeout é especificado em unidades de 1 milisegundo.

Em alguns casos, as taxas de transmissão das instruções SEROUT2 podem


apresentar caracteres muito rapidamente p/ o dispositivo receptor. Pode não ser
desejável usar um pino extra p/ controle de fluxo. Um Passo opcional pode ser
usado p/ adicionar cadência de caractere às transmissões de saída seriais. Isto
permite tempo adicional entre os caracteres à medida em que eles são transmitidos.
O cadenciamento de caractere permite um atraso de 1 a 65,535 milisegundos
entre cada caractere transmitido.

Mode é usado p/ especificar o baud rate e parâmetros operacionais da


transferência serial. Os 13 bits de ordem inferior selecionam o baud rate. O bit 13
seleciona paridade ou s/ paridade. O bit 14 seleciona invertido ou nível real. O bit 15
seleciona se é por acionamento ou aberto.

Os bits de baud rate especificam o tempo de bit em microsegundos - 20. Para achar
o valor p/ um dado baud rate, use a equação:

(1000000 / baud) - 20

Alguns baud rates padrão estão listados na seguinte tabela.

107
PicBasic Pro Compiler

Baud Rate Bits 0 - 12


300 3313
600 1646
1200 813
2400 396
4800 188
9600 84
19200 32

O bit 13 seleciona paridade par (bit 13 = 1) ou s/ paridade (bit 13 = 0). Normalmente,


as transmissões seriais são 8N1 (8 bits de dados, s/ paridade e 1 bit de parada). Se
a paridade é selecionada, os dados são enviados como 7E1 (7 bits de dados,
paridade par e 1 bit de parada).

O bit 14 seleciona o nível dos dados e pinos de controle de fluxo. Se o bit 14 = 0,


os dados são enviados na forma real p/ uso c/ drivers RS-232. Se o bit14 = 1, os
dados são enviados invertidos. Este modo pode ser usado p/ evitar instalar
drivers RS-232.

O bit 15 seleciona se o pino de dados é sempre acionado (bit 15 = 0), ou é


aberto em um dos estados (bit 15 = 1). O modo aberto pode ser usado p/
encadear muitos dispositivos juntos no mesmo barramento serial.

Alguns exemplos de Modo são: Modo = 84 (9600 bauds, s/ paridade, real,


sempre acionado), Modo = 16780 (2400 bauds, s/ paridade, invertido, acionado),
Modo = 60657 (300 bauds, paridade par, invertido, aberto).

SEROUT2 suporta muitos modificadores de dados diferentes que podem ser


misturados e combinados livremente dentro de uma única declaração SEROUT2
p/ prover vários formatos de saída.

108
PicBasic Pro Compiler

Modificador Operação
{I}{S}BIN{1..16} Envia dígitos binários
{I}{S}DEC{1..5} Envia dígitos decimais
{I}{S}HEX{1..4} Envia dígitos hexadecimais
REP c\n Envia caractere c repetido n vezes
STR ArrayVar{\n} Envia cadeia de n caracteres

1) Uma constante de string é enviada como uma cadeia de caracteres literal.


2) Um valor numérico (uma variável ou uma constante) irá enviar o
caractere ASCII correspondente. Mais notavelmente, 13 é o retorno
do carro e 10 é o avanço de linha.
3) Um valor numérico precedido por BIN irá enviar a representação
ASCII de seu valor binário. Por exemplo, se B0 = 8, então
BIN B0 (ou BIN 8) irá enviar “1000".
4) Um valor numérico precedido por DEC irá enviar a representação
ASCII de seu valor decimal. Por exemplo, se B0 = 123,
então DEC B0 (ou DEC 123) irá enviar “123".
5) Um valor numérico precedido por HEX irá enviar a representação
ASCII de seu valor hexadecimal. Por exemplo, se B0 =
254, então HEX B0 (ou HEX 254) irá enviar “FE”.
6) REP seguido por um caractere e contagem irá repetir o caractere,
tempo de contagem. Por exemplo, REP “0"\4 irá enviar “0000".
7) STR seguido por uma variável de cadeia de bytes e contagem opcional irá
enviar uma cadeia de caracteres. O tamanho da cadeia é determinado
pela contagem ou quando um caractere 0 é encontrado na cadeia.

BIN, DEC e HEX podem ser precedidos ou seguidos por muitos parâmetros
opcionais. Se qualquer um deles for precedido por um I (p/ indicado), a
saída será precedida por um “%”, “#” ou “$” p/ indicar que o valor
seguinte é binário, decimal ou hexadecimal.

Se qualquer um for precedido por um S (p/ assinado), a saída será enviada


precedida por um “-“ se the o bit de ordem superior dos dados é ligado. Isto permite
a transmissão de números negativos. Tenha em mente que toda a aritmética
e comparações no PBP não são assinadas. Entretanto, aritmética não-assinada
pode render resultados assinados. Por exemplo, pegue o caso de B0 = 9 - 10.
O resultado de DEC B0 seria “255". Enviando SDEC B0 daria “-

109
PicBasic Pro Compiler

1" desde que o bit de ordem superior seja enviado. Então c/ um pouco de manha, a
aritmética não-assinada do PBP pode render resultados assinados.

BIN, DEC e HEX podem também serem seguidos por um número. Normalmente, estes
modificadores mostram exatamente quantos dígitos forem necessários, zero apagado
(zeros à esquerda não são enviados). Entretanto, se um número segue o modificador,
SEROUT2 irá sempre enviar aquele número de dígitos, adicionando zeros à esquerda con-
forme necessário. Ele também irá ajustar quaisquer dígitos de ordem superior extra. Por
exemplo, BIN6 8 enviaria “001000" e BIN2 8 enviaria “00".

Qualquer uma ou todas as combinações de modificadores podem ser usadas


de uma vez. Por exemplo, ISDEC4 B0.

SEROUT2 assume um oscilador de 4Mhz enquanto gera sua temporização de bit.


Para manter a temporização de baud rate apropriada c/ outros valores de oscilador,
esteja certo de fazer o DEFINE do parâmetro OSC p/ o novo valor do oscilador.

Enquanto que conversores de nível RS-232 de um só chip são comuns e


baratos, graças à atual implementação da RS-232 e as excelentes
especificações de E/S do PICmicro, a maioria das aplicações não requer conversores
de nível. Em lugar disso, TTL invertido (Mode bit 14 = 1) pode ser usado. Um
resistor limitador de corrente é sugerido (supõe-se que a RS-232
seja tolerante a curtos).

DB9 DB25
1K
Pino RS-232 RX Pino 2 Pino 3

RS-232 GND Pino 5 Pino 7

‘ Envia o valor ASCII de B0 seguido por um


avanco de linha ao Pino0 serialmente a 2400 bauds
SEROUT2 0,16780,[dec B0,10]

‘ Envia “B0 =” seguido pelo valor binário de B0


p/ PORTA pino 1 serialmente a 9600 bauds
SEROUT2 PORTA.1,84,[“B0=”, ihex4 B0]

110
PicBasic Pro Compiler

5.55. SHIFTIN

SHIFTIN PinoDados,PinoClock,Modo,[Var{\Bits}...]

Clock em PinoClock, desloca os bits de forma síncrona e p/ dentro em PinoDados e guarda


o(s) byte(s) recebidos em Var. PinoClock e PinoDados podem ser uma constante,
0-15, ou uma variável que contenha um número 0-15 (ex. B0) ou um nome de pino
(ex. PORTA.0).

\Bits opcionalmente especifica o número de bits a serem deslocados. Se não for


especificado, são deslocados 8 bits, independente do tipo de variável.

Os nomes Modo (ex. MSBPRE) são definidos no arquivo MODEDEFS.BAS.


Para usá-los, adicione a linha:

Include “modedefs.bas”

ao topo do programa PicBasic Pro. BS1DEFS.BAS e


BS2DEFS.BAS já incluem MODEDEFS.BAS. Não inclua-o novamente se
um destes arquivos já estiver incluso. Os números Modo podem
ser usados s/ a inclusão deste arquivo.

Modo No. Modo Operação


MSBPRE 0 Desloca dados no bit superior primeiro,
Lê dados antes de enviar o clock
LSBPRE 1 Desloca dados no bit inferior primeiro,
Lê dados antes de enviar o clock
MSBPOST 2 Desloca dados no bit superior primeiro,
Lê dados após enviar o clock
LSBPOST 3 Desloca dados no bit inferior primeiro,
Lê dados após enviar o clock

SHIFTIN 0,1,MSBPRE,[B0]

111
PicBasic Pro Compiler

5.56. SHIFTOUT

SHIFTOUT PinoDados,PinoClock,Modo,[Var{\Bits}...]

Desloca de forma síncrona e p/ fora Var em PinoClock e PinoDados. PinoClock


e PinoDados podem ser uma constante, 0-15, ou uma variável que contenha um
número 0-15 (ex. B0) ou um nome de pino (ex. PORTA.0).

\Bits opcionalmente especifica o número de bits a serem deslocados. Se não for


especificado, são deslocados 8 bits, independente do tipo de variável.

Os nomes Modo (ex. LSBFIRST) são definidos no arquivo


MODEDEFS.BAS. Para usá-los, adicione a linha:

Include “modedefs.bas”

ao topo do programa PicBasic Pro. BS1DEFS.BAS e


BS2DEFS.BAS já incluem MODEDEFS.BAS. Não inclua-o novamente se
um destes arquivos já estiver incluso. Os números Modo podem
ser usados s/ a inclusão deste arquivo.

Modo No. Modo Operação


LSBFIRST 0 Desl. dados bit inferior primeiro
MSBFIRST 1 Desl. dados bit superior primeiro

SHIFTOUT 0,1,MSBFIRST,[B0]
SHIFTOUT PORTA.1, PORTA.2, 1,[wordvar\4]

112
PicBasic Pro Compiler

5.57. SLEEP

SLEEP Periodo

Coloca o microcontrolador em modo de baixo consumo por Periodo segundos.


Periodo é de 16 bits, então atrasos podem ser de até 65,535 segundos
(pouco acima de 18 horas).

SLEEP usa o Timer de Watchdog então ele é independente da própria


freqüência do oscilador. A granularidade é de cerca de 2.3 segundos e pode variar
baseada em especificações do dispositivo e temperatura. Esta variação é incomum
ao BASIC Stamp. A alteração foi necessária porque quando o
PICmicro executa um reset do Timer de Watchdog, ele reseta muitos dos
registradores internos p/ valores predefinidos. Estes valores podem diferir muito
daquilo que o seu programa pode esperar. Ao se rodar o comando SLEEP
não calibrado, este problema é contornado.

SLEEP 60 ‘ Descansa por cerca de 1 minuto

113
PicBasic Pro Compiler

5.58. SOUND

SOUND Pino,[Nota,Duracao{,Nota,Duracao...}]

Gera tons e/ou ruído branco no Pino especificado. Pino é


automaticamente fixado como saída. Pino pode ser uma constante, 0 - 15, ou
uma variável que contenha um número 0 - 15 (ex. B0) ou um nome de pino
(ex. PORTA.0).

Nota 0 é silêncio. Notas 1-127 são tons. Notas 128-255 são ruído
branco. Tons e ruídos brancos estão em ordem ascendente (ex. 1 e 128
são as freqüências mais baixas, 127 e 255 são as mais altas). Nota 1 é
cerca de 78.74hz e Nota 127 é cerca de 10,000hz.

Duracao é 0-255 e determina por quanto tempo a Nota é tocada em


incrementos de cerca de 12 milisegundos. Nota e Duração não
precisam ser constantes.

SOUND manda ondas quadradas de nível TTL. Graças às excelentes caracte-


rísticas de E/S do PICmicro, um alto-falante pode ser acionado através de um
capacitor. O valor do capacitor deve ser determinado c/ base nas
freqüências de interesse e da carga do alto-falante. Alto-falantes piezo-elétricos
podem ser acionados diretamente.

10uF

Pin

SOUND PORTB.7,[100,10,50,10] ‘ Envia 2 sons


consecutivamente
ao Pino7

114
PicBasic Pro Compiler

5.59. STOP

STOP

Para a execução do programa executando um loop infinito. Isto não


coloca o microcontrolador em modo de baixo consumo. O microcontrolador
ainda está trabalhando como nunca. Ele apenas não está fazendo muito.

STOP ‘ Faz o programa andar s/ sair do lugar.

115
PicBasic Pro Compiler

5.60. SWAP

SWAP Variavel,Variavel

Troca os valores entre 2 variáveis. Geralmente, é um processo tedioso


trocar o valor de 2 variáveis. SWAP o faz em uma declaração s/ usar nenhuma
variável intermediária. Ele pode ser usado c/ variáveis tipo bit, byte
e word. Cadeias de variáveis c/ um índice variável não podem ser
usadas em SWAP embora caddeias de variáveis c/ um índice constante
sejam permitidas.

temp = B0 ‘ Maneira antiga


B0 = B1
B1 = temp

SWAP B0, B1 ‘ Maneira nova

116
PicBasic Pro Compiler

5.61. TOGGLE

TOGGLE Pino

Inverte o estado do Pino especificado. Pino é automaticamente fixado


como saída. Pino pode ser uma constante, 0 - 15, ou uma variável que
contenha um número 0 - 15 (ex. B0) ou um nome de pino (ex. PORTA.0).

Low 0 ‘ Inicia Pino0 como nivel baixo


TOGGLE 0 ‘ Altera estado do Pino0 p/ alto

117
PicBasic Pro Compiler

5.62. WHILE..WEND

WHILE Condicao
Declaracao...
WEND

Executa repetidamente Declaracaoões WHILE (ENQUANTO) Condicao é verdadeira.


Quando a Condicao não for mais verdadeira, a execução continua na declaração
seguinte ao WEND. Condicao pode ser qualquer expressão de comparação.

i = 1
WHILE i <= 10
Serout 0,N2400,[”No:”,#i,13,10]
i = i + 1
WEND

118
PicBasic Pro Compiler

5.63. WRITE

WRITE Endereco,Valor

Escreve Valor na EEPROM no-chip no Endereco especificado. Esta


instrução pode somente ser usada c/ um PICmicro que tenha uma área
de dados de EEPROM no-chip tal como o PIC16F84 ou PIC16C84.

WRITE é usado p/ fixar os valores da EEPROM no-chip em tempo de execução.


Para fixar os valores da EEPROM no-chip em tempo de programação,
use a declaração DATA ou EEPROM.

Cada WRITE é auto-temporizado e leva cerca de 10 milisegundos p/ executar


em um PICmicro.

WRITE 5,B0 ‘ Envia valor de B0 p/ posicao 5


da EEPROM

119
PicBasic Pro Compiler

5.64. XIN

XIN PinoDados,PinoZero,{Timeout,Rotulo,}[Var{,...}]

Recebe dados X-10 e guarda o House Code e o Key Code em Var.

XIN é usado p/ receber informação dos dispositivos X-10 que podem enviar
tal informação. Módulos X-10 estão disponíveis em uma larga variedade de
fontes sob muitas marcas. Uma interface é requerida p/ conectar o micro-
controlador à linha de força CA. O TW-523 p/ comunicações X-10 bidire-
cionais é requerido pelo XIN. Este dispositivo contém a interface de linha de
força e isola o microcontrolador da linha CA. Já que o formato X-10
é patenteado, esta interface também cobre as taxas de licença.

PinoDados é automaticamente fixado como entrada p/ receber dados da inter-


face X-10. PinoZero é automaticamente fixado como entrada p/ receber a
temporização de instante zero da interface X-10. Ambos os pinos devem ser liga-
dos aos 5 volts c/ resistores de 4.7K. PinoDados e PinoZero podem ser
constantes, 0-15, ou uma variável que contenha um número 0-15 (ex. B0) ou
um nome de pino (ex. PORTA.0).

Um Timeout opcional e Rotulo podem ser incluídos p/ permitir ao programa


continuar se dados X-10 não forem recebidos dentro de um certo tempo.
Timeout é especificado em meio-ciclos da linha de força CA (aproximada-
mente 8.33 milisegundos).

XIN apenas processa dados a cada instante zero da linha de força CA confor-
me recebido no PinoZero. Se não houverem transições nesta linha, XIN
irá efetivamente esperar p/ sempre.

Se Var tiver tamanho de palavra, cada House Code recebido é guardado no byte
superior da palavra. Cada Key Code recebido é guardado no byte inferior da
palavra. Se Var for um byte, apenas o Key Code é guardado.

O House Code é um número entre 0 e 15 que corresponde ao


House Code fixado no módulo X-10 A até P.

O Key Code tanto pode ser o número de um módulo X-10 específico ou


a função que for ser executada por um módulo. Na prática normal, primeiro um
comando especificando o número do módulo X-10 é enviado, seguido por um
comando especificando a função desejada. Algumas funções operam em todos
os módulos de uma vez assim o número do módulo é desnecessário. Esperamos

120
PicBasic Pro Compiler

que futuros exemplos irão clarear as coisas. Números de Key Code 0-15
correspondem aos números 1-16 do módulo.

XOUT abaixo lista as funções bem como a informação de fiação.

housekey var word

‘ Pega dados X-10


loop: XIN PORTA.2,PORTA.0,[housekey]

‘ Mostra dados X-10 no LCD


Lcdout $fe,1,“House=”,#housekey.byte1,
“Key=”,#housekey.byte0

Goto loop ‘ Faz isso p/ sempre

‘ Checa por dados X-10, vai p/ semdados se nenhum


XIN PORTA.2,PORTA.0,1,semdados,[housekey]

121
PicBasic Pro Compiler

5.65. XOUT

XOUT PinoDados,PinoZero,
[HouseCode\KeyCode{\Repeticao}{,...}]

Envia o HouseCode seguido pelo KeyCode, Repeticao número de vezes em for-


mato X-10. Se a Repeticao opcional é desconsiderada, 2 vezes (o mínimo)
é assumido. Repeticao é geralmente reservado p/ uso c/ os comandos
Aumento e Redução do Brilho.

XOUT é usado p/ enviar informação de controle aos módulos X-10. Estes


módulos estão disponíveis em uma larga variedade de fontes sob muitas
marcas. Uma interface é requerida p/ conectar o microcontrolador à
linha de força CA. Tanto a PL-513 p/ somente envio, ou a TW-523 p/
comunicações X-10 bidirecionais são requeridas. Estes dispositivos contém a
interface de linha de força e isolam o microcontrolador da linha CA.
Já que o formato X-10 é patenteado, estas interfaces também cobrem
as taxas de licença.

PinoDados é automaticalmente fixado como saída p/ enviar dados à interface


X-10. PinoZero é automaticamente fixado como entrada p/ receber a tempori-
zação de instante zero da interface X-10. Ele deve ser ligado aos 5 volts
c/ um resistor de 4.7K. PinoDados e PinoZero podem ser constantes, 0-15,
ou uma variável que contenha um número 0-15 (ex. B0) ou um nome de pino
(ex. PORTA.0).

XOUT apenas processa dados a cada instante zero da linha de força AC conforme
recebido no PinoZero. Se não houver transições nesta linha, XOUT irá
efetivamente esperar para sempre.

HouseCode é um número entre 0 e 15 que corresponde ao


House Code fixado no módulo X-10 A até P. O HouseCode
apropriado deve ser enviado como parte de cada comando.

O KeyCode tanto pode ser o número de um módule X-10 específico ou a


função que for ser executada por um módulo. Na prática normal, primeiro um
comando especificando o número do módulo X-10 é enviado, seguido por um
comando especificando a função desejada. Algumas funções operam em
todos os módulos de uma vez de forma que o número do módulo é desnecessário.
Esperamos que exemplos futuros irão clarear as coisas. Os números KeyCode
0-15 correspondem aos números de módulo 1-16.

122
PicBasic Pro Compiler

Os nomes (ex. unitOn) KeyCode (função) são definidos no arquivo


MODEDEFS.BAS. Para usá-los, adicione a linha:

Include “modedefs.bas”

ao topo do programa PicBasic Pro. BS1DEFS.BAS e


BS2DEFS.BAS já incluem MODEDEFS.BAS. Não inclua-o novamente
se um destes arquivos já estiver incluso. Os números KeyCode
podem ser usados s/ a inclusão deste arquivo.

KeyCode No. KeyCode Operação


unitOn %10010 Liga o módulo
unitOff %11010 Desliga o módulo
unitsOff %11100 Desliga todos os módulos
lightsOn %10100 Liga todos os mód. de luz
lightsOff %10000 Desl. todos os mód. de luz
bright %10110 Mais brilho no mód. de luz
dim %11110 Reduz o brilho do módulo de luz

A conexão às interfaces X-10 requer 4 ligações. Saída da interface X-10


(instante zero e recepção de dados) são coletor aberto e requerem um
resistor pull up de cerca de 4.7K a 5 volts. Tabelas de fiação p/
cada interface são mostradas abaixo:

Fiação PL-513
No. Fio Cor do Fio Conexão
1 Preto Saída instante zero
2 Vermelho Comum instante zero
3 Verde Comum transmissão X-10
4 Amarelo Entrada transmissão X-10

123
PicBasic Pro Compiler

FiaçãoTW-523
No. Fio Cor do Fio Conexão
1 Preto Saída instante zero
2 Vermelho Comum
3 Verde Saída recepção X-10
4 Amarelo Entrada transmissão X-10

house var byte


unit var byte

Include “modedefs.bas”

house = 0 ‘ Set house to 0 (A)


unit = 8 ‘ Set unit to 8 (9)
‘ Liga unidade 8 na casa 0
XOUT PORTA.1,PORTA.0,[house\unit,house\unitOn]

‘ Desliga todas as luzes na casa 0


XOUT PORTA.1,PORTA.0,[house\lightsOff]

‘ Pisca luz 0 a cada 10 segundos


XOUT PORTA.1,PORTA.0,[house\0]

loop: XOUT PORTA.1,PORTA.0,[house\unitOn]


Pause 10000 ‘ Espera 10 segundos

XOUT PORTA.1,PORTA.0,[house\unitOff]
Pause 10000 ‘ Espera 10 segundos

Goto loop

124
PicBasic Pro Compiler

6. Estrutura de Um Programa Compilado


O PBP é desenhado p/ ser fácil de usar. Programas podem ser compilados e rodados
c/ pouca preocupação c/ o funcionamento interno do PBP. Algumas pessoas,
entretanto, apenas têm confiança num produto quando elas entendem seu
funcionamento interno. Outras são somente curiosas.

Esta seção é p/ elas. Ela descreve os arquivos usados e a saída


gerada pelo PBP e dá alguma idéia do que exatamente está acontecendo.

6.1. Cabeçalhos de Alvo Específico

Três arquivos de cabeçalho de alvo específico são usados quando um programa é


compilado. Um é usado pelo PBP, os outros dois são incluídos p/ uso pelo
assembler.

Um arquivo c/ o nome do microcontrolador seguido pela extensão


.BAS contém informação específica do chip necessária ao PBP. Isto inclui
o perfil da memória do chip, qual biblioteca ele usa, e inclui as definições das
variáveis de que ele necessita. Para o PIC16F84, o microcontrolador
padrão, o arquivo é chamado 16F84.BAS.

Um arquivo c/ o nome do microcontrolador seguido pela extensão


.INC é incluído no arquivo .ASM gerado p/ dar a informação do
assembler sobre o chip, incluindo os parâmetros de configuração. Para
o PIC16F84, o arquivo é chamado 16F84.INC.

Finalmente, o assembler tem seu próprio arquivo include que define os endereços
dos registradores do microcontrolador. Este arquivo é geralmente chamado de
algo da ordem de P16F84.INC.

6.2. Os Arquivos de Bibliotecas

O PBP inclui um conjunto de arquivos de biblioteca que contém todo o código e


arquivos de definição p/ um grupo particular de microcontroladores. No caso de
PICmicros de núcleo de 14 bits, estes arquivos começam c/ o nome PBPPIC14.

PBPPIC14.LIB contém todas as subrotinas em linguagem assembly usadas


pelo compilador. PBPPIC14.MAC contém todas as macros que chamam
estas subrotinas. A maioria dos comandos do PicBasic Pro consistem de uma
macro e uma subrotina de biblioteca associada.

125
PicBasic Pro Compiler

PBPPIC14.RAM contém as declarações VAR que alocam a memória


necessária pela biblioteca.

PIC14EXT.BAS contém as definições externas que dizem ao PBP todos os


nomes dos registradores do PICmicro de núcleo de 14 bits.

6.3. Código Gerado pelo PBP

Um programa compilado pelo PicBasic Pro é construído em muitos estágios. Primeiro


o PBP cria o arq. .ASM. Ele então constrói um arq. .MAC personalizado que contém
somente as macros da biblioteca que são usadas no arq. .ASM. Se
tudo estiver livre de erros até este ponto, ele lança o assembler.

O assembler gera seu próprio conjunto de arquivos. Estes incluem o arq. de saída
final .HEX e possivelmente arquivos de listagem e depuração.

6.4. Estrutura do Arquivo .ASM

O arquivo .ASM tem uma estrutura muito específica. As coisas precisam ser
feitas numa ordem particular p/ que tudo funcione apropriadamente.

O primeiro ítem colocado no arquivo é um equate definindo qual assembler


será usado, seguido por um INCLUDE p/ dizer ao assembler qual
microprocessador é o alvo e dar a ele alguma informação básica, tal como
os dados de configuração.

Depois, todas as alocações de variável e apelidos são listados. Em seguida


vem a inicialização da EEPROM, se for chamada.

Um INCLUDE p/ o arquivo de macro é então colocado no arquivo, seguido por


um INCLUDE p/ as subrotinas de biblioteca.

Finalmente, o código do programa é incorporado. Este código de programa é


simplesmente uma lista de macros que foram geradas pelas linhas do PicBasic Pro.

126
PicBasic Pro Compiler

7. Outras Considerações do PicBasic Pro

7.1. Quão Rápido é Bastante Rápido?

Por padrão, o PicBasic Pro Compiler gera programas p/ serem rodados num
PICmicro c/ um cristal de 4Mhz ou ressonador cerâmico. Todas as instru-
ções tempo-sensíveis assumem um tempo de instrução de 1 microssegundo
p/ seus atrasos. Isto permite um PAUSE 1000, por exemplo, p/ esperar 1
segundo e as baud rates dos comandos SERIN e SEROUT serem
precisas.

Existem horas, entretanto, quando seria útil rodar o PICmicro a uma freqüência
diferente de 4Mhz. Ainda que os programas compilados andem a um
passo muito bom, poderia ser bom rodá-los ainda mais rápido.
Ou talvez seja desejável fazer a entrada ou saída serial a 19,200
bauds em vez da velocidade máxima atual de 9600 bauds.

Os programas PicBasic Pro podem ser rodados em freqüências de clock diferentes de


4Mhz em um par de maneiras diferentes. A primeira é simplesmente usar um oscilador
diferente de 4Mhz e não contar ao PBP. Isto pode ser uma técnica útil se
você prestar atenção ao que acontece c/ as instruções dependentes do tempo.

Se você deseja rodar o barramento serial a 19,200 como descrito acima, você
iria simplesmente temporizar o microcontrolador c/ um cristal de 8Mhz em vez de um
cristal de 4Mhz. Isto, c/ efeito, faz tudo rodar duas vezes mais rápido,
incluindo os comandos SERIN e SEROUT. Se você dizer ao SERIN ou
SEROUT p/ rodarem a 9600 bauds, o dobramento da velocidade do cristal
irá dobrar a baud rate atual p/ 19,200 bauds.

Entretanto, tenha em mente que comandos como PAUSE e SOUND também irão
rodar duas vezes mais rápido. O PAUSE 1000 mencionado acima iria esperar
apenas .5 segundos c/ um cristal de 8Mhz antes de permitir que a execução do
programa continue.

A outra técnica é usar uma freqüência de oscilador diferente e contar


ao PBP as suas intenções. Isto é feito através do uso de um DEFINE.
DEFINE, como demonstrado no comando LCDOUT em uma seção
anterior, é usado p/ dizer ao PBP p/ usar algo diferente dos seus padrões.

Normalmente, o padrão do PBP é usar um oscilador de 4Mhz. Adicionando


a declaração:

127
PicBasic Pro Compiler

DEFINE OSC 8

próximo ao começo do programa PicBasic Pro diz ao PBP p/ assumir que um


oscilador de 8Mhz será usado no lugar. As definições de oscillator
aceitáveis são:

Valor OSC Oscilador Usado


3 3.58Mhz
4 4Mhz
8 8Mhz
10 10Mhz
12 12Mhz
16 16Mhz
20 20Mhz

Dizer ao PBP a freqüência do oscilador o permite compensar e


produzir a temporização correta p/ COUNT, DEBUG, DTMFOUT, FREQOUT,
HSERIN, HSEROUT, I2CREAD, I2CWRITE, LCDOUT, PAUSE, PAUSEUS,
SERIN, SERIN2, SEROUT, SEROUT2, SHIFTIN, SHIFTOUT, SOUND, XIN
e XOUT.

Alterações na freqüência do oscilador podem também ser usadas p/ melhorar


a resolução das instruções PULSIN, PULSOUT e RCTIME. A 4Mhz estas
instruções operam c/ uma resolução de 10 microsegundos. Se um cristal de
20Mhz é usado, a resolução é aumentada 5 vezes p/ 2 microsegundos.
Existe uma troca entretanto. A largura do pulso é ainda medida c/ relação a uma
variável de palavra de 16 bits. Com uma resolução de 2 microsegundos, a
largura de pulso máxima mensurável seria 131,070 microsegundos.

Indo na outra direção e rodando c/ um oscilador de 32.768Khz é


problemático. Pode ser desejável tentar isto por razões de redução de
consumo de força e poderá funcionar até certo ponto. Os comandos SERIN e
SEROUT serão inúteis e o Timer de Watchdog pode fazer o programa
reiniciar periodicamente. Experimente p/ descobrir se sua aplicação
particular é possível nesta velocidade de clock. Não dói nada
tentar.

128
PicBasic Pro Compiler

7.2. Ajustes de Configuração

Como mencionado antes, os ajustes de configuração padrão p/ um dispositivo


em particular estão fixados no arq. .INC c/ o mesmo nome do dispositivo, ex.
16F84.INC. Estes ajustes podem ser alterados na hora em que o dispositivo
é fisicamente programado.

O oscilador padrão é XT na maioria dos dispositivos. Este é o ajuste p/ o oscilador


padrão de 4Mhz. Se um oscilador mais rápido é usado, este ajuste precisa ser
alterado p/ HS. Dispositivos c/ osciladores internos têm por padrão INTRC.

O Timer de Watchdog é habilitado pelo PBP. Ele é usado, juntamente c/ o


prescaler TMR0, p/ suportar as instruções NAP e SLEEP. Se nenhuma
das instruções são usadas em um progama, o Timer de Watchdog pode
ser desabilitado e o prescaler usado p/ outra coisa qualquer.

A Proteção por Código é desligada por padrão mas pode ser ligada quando o dis-
positivo é fisicamente programado. Não proteja por código um dispositivo c/ janela.

Veja a folha de dados da Microchip p/ o dispositivo em particular p/


os dados de configuração específicos àquela peça.

7.3. Utilização da RAM

Em geral não é necessário saber como a RAM é alocada pelo PBP no


microcontrolador. O PBP cuida de todos os detalhes assim o programador
não precisará fazê-lo. Entretanto há vezes quando este conhecimento
poderia ser útil.

Variáveis são guardadas nos registradores da RAM do PICmicro. A primeira


posição da RAM disponível é $0C p/ o PIC16F84 e alguns dos
PICmicros menores, e $20 p/ o PIC16C74 e outros PICmicros
maiores. Refira-se aos data books PICmicro da Microchip p/ a posição
real do início dos registradores da RAM p/ um dado microcontrolador.

As variáveis são atribuídas à RAM seqüencialmente numa ordem particular.


A ordem é cadeias de palavras primeiro (se houver), seguido por cadeias de byte e bit.
Então é alocado o espaço p/ palavras, bytes e finalmente bits individuais. Bits
são acondicionados em bytes como possível. Esta ordem faz o melhor uso
da RAM disponível.

129
PicBasic Pro Compiler

Cadeias precisam caber num único banco. Elas não podem cruzar os limites de um
banco. Isto efetivamente limita o comprimento de uma cadeia individual. Veja
a seção anterior sobre cadeias p/ estes limites.

Você pode sugerir ao PBP um banco em particular no qual colocar a variável:

penny VAR WORD BANK0


nickel VAR BYTE BANK1

Se requisições de banco específicas forem feitas, estas são manipuladas primeiro.


Se não houver suficiente espaço num banco requisitado, o primeiro espaço disponível
é usado e um aviso é lançado.

Você pode até fixar endereços específicos p/ variáveis. Na maioria dos casos, é
melhor deixar o PBP manipular o mapeamento de memória p/ você. Mas em alguns
casos, tais como armazenamento do registrador W num manipulador de interrup-
ções, é necessário definir um endereço fixo. Isto pode ser feito numa maneira
similar à seleção de bancos:

w_store VAR BYTE $20

Muitas variáveis de sistema, usando cerca de 24 bytes de RAM, são


automaticamente alocadas pelo compilador p/ uso por subrotinas de biblio-
teca. Estas variáveis são alocadas no arquivo PBPPIC14.RAM e devem estar
no banco 0.

Variáveis de usuário são precedidas de um underscore (_) enquanto variá-


veis de sistema não têm underscore assim elas não interferem uma à
outra.

R0 VAR WORD SYSTEM

Variáveis BASIC Stamp B0 - B25 e W0 - W12 não são automaticamente


alocadas. É melhor criar suas próprias variáveis usando a instrução VAR.
Entretanto se você quer que estas variáveis sejam criadas p/ você,
simplesmente inclua o arquivo apropriado, BS1DEFS.BAS ou BS2DEFS.BAS,
no início do programa PicBasic Pro. Estas variáveis alocam espaço
separado e longe de quaisquer outras variáveis que você pode criar mais tarde.
Isto é diferente do BS2 onde usar as variáveis pré-concebidas e
variáveis criadas pelo usuário pode lhe causar inconvenientes.

Variáveis temporárias adicionais podem ser geradas automaticamente pelo


compilador p/ ajudá-lo a sortear equações. Uma lista destas variáveis, assim
130
PicBasic Pro Compiler

como todo o mapa de memória, pode ser vista no arquivo .ASM ou


.LST gerados.

7.4. Palavras Reservadas

Palavras reservadas são simplesmente isto - palavras que são reservadas p/ uso pelo
compilador e não podem ser definidas nem como nomes de variável ou rótulos.
Estas palavras reservadas podem ser os nomes de comandos, pseudo-ops,
tipos de variáveis ou os nomes dos registradores do PICmicro.

Os pseudo-ops, tipos de variáveis e palavras-chave de comandos são listados


nas suas seções apropriadas. Os nomes dos registradores do PICmicro
são definidos no arquivo PIC14EXT.BAS. Se os arquivos BS1DEFS.BAS,
BS2DEFS.BAS ou MODEDEFS.BAS estão inclusos, as definições dentro deles
essencialmente tornam-se palavras reservadas e não podem ser redefinidas.

7.5. Vida Após 2K

Sim, há vida após 2K usando o PicBasic Pro Compiler.

PICmicros têm espaço de código segmentado. Instruções do PICmicro como


Call e Goto têm apenas bits suficientes dentro delas p/ endereçar 2K de
espaço de programa. Para conseguir programar fora dos limites de 2K, o
registrador PCLATH deve ser fixado antes de cada Call ou Goto.

O PBP automaticamente fixa estes bits PCLATH p/ você. Há are algumas


restrições impostas, entretanto. A biblioteca do PicBasic Pro precisa caber inteira
na página 0 do espaço de código. Normalmente isto não é um problema já que a
biblioteca é a primeira coisa num programa do PicBasic Pro e a biblioteca inteira
é menor que 2K. Entretanto, deve-se prestar atenção a este assunto se
bibliotecas adicionais são usadas.

Manipuladores de interrupção de linguagem assembly também precisam caber


na página 0 do espaço de código. Colocá-las no início do programa
PicBasic Pro deve funcionar. Veja a seção a seguir sobre linguagem
assembly para mais informação.

A adição de instruções p/ fixar os bits do PCLATH não adiciona overhead


ao código produzido. O PBP irá fixar os bits do PCLATH p/ qualquer código
PICmicro que cruze o limite de 2K ou p/ qualquer referências à frente em
PICmicros c/ mais que 2K de espaço de código.

131
PicBasic Pro Compiler

Há instruções do PicBasic Pro específicas p/ assistir os problemas de 2K.

BRANCHL foi criada p/ permitir ramificações p/ rótulos que podem estar do


outro lado de um limite de 2K. Se o PICmicro tem 2K ou menos de espaço de
programa, BRANCH deve ser usado já que ele toma menos espaço que BRANCHL.
Se o microcontrolador tem mais que 2K de espaço de código, e você não
pode estar certo de que BRANCH irá agir sempre dentro da mesma página, use
BRANCHL.

O assembler pode lançar um aviso de que um limite de página foi


cruzado. Isto é normal e está lá p/ sugerir que você cheque por quaisquer
BRANCHes que possam cruzar um limite de página.

132
PicBasic Pro Compiler

8. Programação em Linguagem Assembly


Rotinas em linguagem assembly podem ser um útil adjunto ao programa do
PicBasic Pro Compiler. Enquanto em geral a maioria das tarefas podem ser feitas
completamente em PicBasic Pro, há vezes quando pode ser necessário fazer uma
determinada tarefa mais rápido, ou usando uma quantia menor de espaço de código,
ou só diferentemente de como o compilador o faz. Nessas horas é útil ter
as capabcidades de um assembler em-linha.

Pode ser benéfico escrever a maioria de um programa rapidamente usando a


linguagem PicBasicPro e então enfiar algumas linhas de código assembly p/
aumentar a funcionalidade. Este código adicional pode ser inserido diretamente
no programa PBP ou incluso como um outro arquivo.

8.1. Dois Assemblers - Sem Espera

Na execução, o PBP primeiro compila o programa em linguagem


assembly e então automaticamente lança um montador. Isto converte
a saída assembler no arquivo final .HEX que pode ser programado
em um microcontrolador.

Dois montadores diferentes podem ser usados c/ o PBP: PM, nosso PICmicro
Macro Assembler, e MPASM, o montador da Microchip. O PM é incluído
c/ o compilador enquanto o MPASM deve ser obtido diretamente da
Microchip através do seu web site ou é incluído c/ seus programadores
PICmicro.

Há benefícios e desvantagens em se usar cada montador. PM é


acessível porque está incluso como parte do PBP. Ele é também muito mais rápido
do que o MPASM e pode montar programas muito maiores no DOS. O PM inclui
um conj. de instruções no estilo 8051 que é mais intuitivo que os mnemônicos
Microchip. Para informação completa sobre o PICmicro Macro
Assembler, veja o arquivo PM.TXT em disco.

O MPASM, por outro lado, tem a capacidade de criar um arquivo .COD.


Este arquivo contém informação adicional que pode ser muito útil c/
simuladores e emuladores. O MPASM é também mais compatível c/ a
larga variedade de examplos em linguagem assembly encontrados na web
e nos data books da Microchip.

133
PicBasic Pro Compiler

PBP defaults to using PM. To use MPASM with PBP, simply copy all of
the MPASM files into their own subdirectory, perhaps named MPASM.
This subdirectory must also be in the DOS PATH.

MPASM may be used with PBP in two ways. If the command line option
"-ampasm" is used, MPASM will be launched following compilation to
complete the process. MPASM will display its own screen with its
progress.

PBP -ampasm filename

Alternatively, the command line option "-amp" will launch MPASM in


quiet mode and only display any errors. However, the launcher
consumes additional memory that is therefore not available to MPASM.

PBP -amp filename

For maximum memory availability to MPASM, the command line option


"-ampasm" should be used or the Windows version of MPASM should
be used.

In any case, MPASM is not included with PBP and must be obtained
from Microchip.

8.2. Programming in Assembly Language

PBP programs may contain a single line of assembly language


preceded by an “at” symbol (@), or one or more lines of assembly code
preceded by the ASM keyword and ended by the ENDASM keyword. Both
keywords appear on their lines alone.

@ bsf PORTA,0

Asm
bsf STATUS,RP0
bcf TRISA,0
bcf STATUS,RP0
Endasm

The lines of assembly are copied verbatim into the assembly output file.
This allows the PBP program to use all of the facilities of PM, the
PICmicro Macro Assembler. This also, however, requires that the
programmer have some familiarity with the PBP libraries. PBP’s

134
PicBasic Pro Compiler

notational conventions are similar to other commercial compilers and


should come as no shock to programmers experienced enough to
attempt in-line assembly.

All identifier names defined in a PBP program are similarly defined in


assembly, but with the name preceded with an underscore ( _ ). This
allows access to user variables, constants, and even labeled locations,
in assembly.

Thus, any name defined in assembly starting with an underscore has


the possibility of conflicting with a PBP generated symbol. If conflict is
avoided, can these underscored assembly values be accessed from
PBP? No. Remember, the underscored names generated by PBP are
only shadows of the actual information defined in the compiler. Since
in-line assembly is copied directly to the output file and not processed by
the compiler, the compiler not only lacks any type or value information
about assembly symbols, it is completely unaware that they exist. If
variables are to be shared between assembly and PBP, you must define
the variables in PBP.

Just as underscored symbols have possible conflicts, so do symbols not


starting with underscores. The problem is internal library identifiers.
Luckily, most library identifiers contain a '?' or make reference to one of
the working registers (such as R0). Avoiding such names should be
reduce problems. If you should have a name collision, the compiler will
report the duplicate definitions as an error.

In assembly language the comment designator changes from the single


quote (‘) in PicBasic Pro to a semicolon (;).

‘ PicBasic Pro comment


; Assembly language comment

8.3. Placement of In-line Assembly

PBP statements execute in order of appearance in the source. The


organization of the code is as follows: Starting at location 0, the reset
vector, PBP inserts some startup code followed by a jump to INIT.
Next, the called-for library subroutines are stuffed in. At the end of the
library is INIT, where any additional initialization is completed. Finally,
at the label MAIN, the compiled PicBasic Pro statement code is added.

135
PicBasic Pro Compiler

The first executable line that appears in the PicBasic Pro source is
where the program starts execution. That statement literally appears in
memory right behind the controller’s startup and library code, right after
the MAIN label.

The tendency of programmers is to place their own library functions


written using the in-line assembler either before or after their code. In
light of the above explanation, this could create some obvious problems.
If they appear early in the program, the assembly routines execute prior
to any PBP instructions (some programmers will invariably exploit this
feature). If they appear at the tail of the program, execution which "falls
off the end" of the PBP statements may mysteriously find themselves
unintentionally executing assembly routines.

There are a couple of deciding factors as to where might be the best


place to insert assembly language subroutines. If the entire program fits
into 2K (one code page), place your assembly routines after your PBP
code. If you need to terminate your program, explicitly place an END or
STOP statement at the end of your code rather than floating off into
space.

If the program is longer than 2K, it could make more sense to put the
assembly language routines at the beginning of the PBP program. This
should ensure them of being in the first code page so that you know
where to find them. This is the way assembly language interrupt
routines should be handled.

If the routines are placed at the front, you must include a GOTO (or JMP)
around the code to the first executable PBP statement. See the section
on interrupts for an example of this.

The actual code for the assembly language routines may be included in
your program or in a separate file. If a routine is used by only one
particular PicBasic Pro program, it would make sense to include the
assembler code within the PBP source file. This routine can then be
accessed using the CALL command.

If it is used by several different PBP programs, a separate file containing


the assembly routines can simply be included at the appropriate place in
the PicBasic Pro source:

Asm

136
PicBasic Pro Compiler

Include “myasm.inc”
Endasm

8.4. Another Assembly Issue

PICmicro registers are banked. PBP keeps track of which register bank
it is pointing to at all times. It knows if it is pointing to a TRIS register,
for example, it needs to change the bank select bits before it can access
a PORT.

It also knows to reset the bank select bits to 0 before making a Call or a
Jump. It does this because it can’t know the state of the bank select bits
at the new location. So anytime there is a change of locale or a label
that can be called or jumped to, the bank select bits are zeroed.

It also resets the bank select bits before each ASM and the @ assembler
shortcut. Once again, the assembler routine won’t know the current
state of the bits so they are set to a known state. The assembler code
must be sure to reset the bank select bits before it exits, if it has altered
them.

137
PicBasic Pro Compiler

138
PicBasic Pro Compiler

9. Interrupts
Interrupts can be a scary and useful way to make your program really
difficult to debug.

Interrupts are triggered by hardware events, either an I/O pin changing


state or a timer timing out and so forth. If enabled (which by default they
aren’t), an interrupt causes the processor to stop whatever it is doing
and jump to a specific routine in the microcontroller called an interrupt
handler.

Interrupts are not for the faint of heart. They can be very tricky to
implement properly, but at the same time they can provide very useful
functions. For example, an interrupt could be used to buffer serial input
data behind the scenes while the main PicBasic Pro program is off
doing something else. (This particular usage would require a
microcontroller with a hardware serial port.)

There are many ways to avoid using interrupts. Quickly polling a pin or
register bit instead is usually fast enough to get the job done. Or you
can check the value of an interrupt flag without actually enabling
interrupts.

However, if you just gotta do it, here are some hints on how to go about
it.

The PicBasic Pro Compiler has two different mechanisms to handle


interrupts. The first is simply to write the interrupt handler in assembler
and tack it onto the front of a PBP program. The second method is to
use the PicBasic Pro statement ON INTERRUPT. Each method will be
covered separately, after we talk about interrupts in general.

9.1. Interrupts in General

When an interrupt occurs, the PICmicro stores the address of the next
instruction it was supposed to execute on the stack and jumps to
location 4. The first thing this means is that you need an extra location
on the hardware stack, which is only 8 deep to begin with.

The PicBasic Pro library routines can use up to 4 stack locations


themselves. The remaining 4 are reserved for CALLs and nested
BASIC GOSUBs. You must make sure that your GOSUBs are only nested

139
PicBasic Pro Compiler

3 deep at most with no CALLs within them in order to have a stack


location available for the return address. If your interrupt handler uses
the stack (by doing a Call or GOSUB itself for example), you’ll need to
have additional stack space available.

Once you have dealt with the stack issues, you need to enable the
appropriate interrupts. This usually means setting the INTCON register.
Set the necessary enable bits along with Global Interrupt Enable. For
example:

INTCON = %10010000

enables the interrupt for RB0/INT. Depending on the actual interrupt


desired, you may also need to set the PIE register.

Refer to the Microchip PICmicro data books for additional information on


how to use interrupts. They give examples of storing processor context
as well as all the necessary information to enable a particular interrupt.
This data is invaluable to your success.

Finally, select the best technique with which to handle your particular
interrupts.

9.2. Interrupts in BASIC

The easiest way to write an interrupt handler is to write it in PicBasic Pro


in conjunction with the ON INTERRUPT statement. ON INTERRUPT tells
PBP to activate its internal interrupt handling and to jump to your BASIC
interrupt handler as soon as it can after receiving an interrupt. Which
brings us the first issue.

Using ON INTERRUPT, when an interrupt occurs PBP simply flags the


event and immediately goes back to what it was doing. It does not
immediately vector to your interrupt handler. Since PBP statements are
not re-entrant (PBP must finish the statement that is being executed
before it can begin a new one) there could be considerable delay
(latency) before the interrupt is handled.

As an example, lets say that the PicBasic Pro program just started
execution of a Pause 10000 when an interrupt occurs. PBP will flag
the interrupt and continue with the PAUSE. It could be up to 10 seconds

140
PicBasic Pro Compiler

later before the interrupt handler is executed. If it is buffering characters


from a serial port, many characters will be missed.

To minimize the problem, use only statements that don’t take very long
to execute. For example, instead of Pause 10000, use Pause 1 in a
long FOR..NEXT loop. This will allow PBP to complete each statement
more quickly and handle any pending interrupts.

If interrupt processing needs to occur more quicky than can be provided


by ON INTERRUPT, interrupts in assembly language should be used.

Exactly what happens when ON INTERRUPT is used is this: A short


interrupt handler is placed at location 4 in the PICmicro. This interrupt
handler is simply a Return. What this does is send the program back to
what it was doing before the interrupt occurred. It doesn’t require any
processor context saving. What it doesn’t do is re-enable Global
Interrupts as happens using an Retfie.

A Call to a short subroutine is placed after each statement in the


PicBasic Pro program once an ON INTERRUPT is encountered. This
short subroutine checks the state of the Global Interrupt Enable bit. If it
is off, an interrupt is pending so it vectors to the users interrupt handler.
If it is still set, the program continues with the next BASIC statement,
after which, the GIE bit is checked again, and so forth.

When the RESUME statement is encountered at the end of the BASIC


interrupt handler, it sets the GIE bit to re-enable interrupts and returns to
where the program was before the interrupt occurred. If RESUME is
given a label to jump to, execution will continue at that location instead.
All previous return addresses will be lost in this case.

DISABLE stops PBP from inserting the Call to the interrupt checker after
each statement. This allows sections of code to execute without the
possibility of being interrupted. ENABLE allows the insertion to continue.

A DISABLE should be placed before the interrupt handler so that it will


not keep getting restarted every time the GIE bit is checked.

If it is desired to turn off interrupts for some reason after ON INTERRUPT


is encountered, you must not turn off the GIE bit. Turning off this bit tells
PBP an interrupt has happened and it will execute the interrupt handler
forever. Instead set:

141
PicBasic Pro Compiler

INTCON = $80

This disables all the individual interrupts but leaves the Global Interrupt
Enable bit set.

One final note about interrupts in BASIC: If the program uses the form:

loop: Goto loop

and expects to be interrupted, it isn’t going to happen. Keep in mind the


interrupt flag is checked after each instruction. There really isn’t a place
for the check after a GOTO. It immediately jumps to the loop with no
interrupt check. Some other statement must be placed in the loop for
the interrupt check to happen.

9.3. Interrupts in Assembler

Interrupts in assembly language are a little trickier.

Since you have no idea of what the processor was doing when it was
interrupted, you have no idea of the state of the W register, the STATUS
flags, PCLATH or even what register page you are pointing to. If you
need to alter any of these, and you probably will, you must save the
current values so that you can restore them before allowing the
processor to go back to what it was doing before it was so rudely
interrupted. This is called saving and restoring the processor context.

If the processor context, upon return from the interrupt, is not left exactly
the way you found it, all kinds of subtle bugs and even major system
crashes can and will occur.

This of course means that you cannot even safely use the compiler’s
internal variables for storing the processor context. You cannot tell
which variables are in use by the library routines at any given time.

You should create variables in the PicBasic Pro program for the express
purpose of saving W, the STATUS register and any other register that
may need to be altered by the interrupt handler. These variables should
not be otherwise used in the BASIC program.

While it seems a simple matter to save W in any RAM register, it is


actually somewhat more complicated. The problem occurs in that you
have no way of knowing what register bank you are pointing to when the
142
PicBasic Pro Compiler

interrupt happens. If you have reserved a location in Bank0 and the


current register pointers are set to Bank1, for example, you could
overwrite an unintended location. Therefore you must reserve a RAM
register location in each bank of the device at the same offset.

As an example, let's choose the 16C74(A). It has 2 banks of RAM


registers starting at $20 and $A0 respectively. To be safe, we need to
reserve the same location in each bank. In this case we will choose the
first location in each bank. A special construct has been added to the
VAR command to allow this:

wsave var byte $20 system


wsave1 var byte $a0 system

This instructs the compiler to place the variable at a particular location in


RAM. In this manner, if the save of W "punches through" to another
bank, it will not corrupt other data.

The interrupt routine should be as short and fast as you can possibly
make it. If it takes too long to execute, the Watchdog Timer could
timeout and really make a mess of things.

The routine should end with an Retfie instruction to return from the
interrupt and allow the processor to pick up where it left off in your
PicBasic Pro program.

The best place to put the assembly language interrupt handler is


probably at the very beginning of your PicBasic Pro program. This
should ensure that it is in the first 2K to minimize boundary issues. A
GOTO needs to be inserted before it to make sure it won’t be executed
when the program starts. See the example below for a demonstration of
this.

If the PICmicro has more than 2K of code space, an interrupt stub is


automatically added that saves the W, STATUS and PCLATH registers
into the variables wsave, ssave and psave, before going to your
interrupt handler. Storage for these variables must be allocated in the
BASIC program:

wsave var byte $20 system


wsave1 var byte $a0 system ‘ If device has
RAM in bank1

143
PicBasic Pro Compiler

wsave2 var byte $120 system ‘ If device has


RAM in bank2
wsave3 var byte $1a0 system ‘ If device has
RAM in bank3
ssave var byte bank0 system
psave var byte bank0 system

You must restore these registers at the end of your assembler interrupt
handler. If the PICmicro has 2K or less of code space, the registers are
not saved. Your interrupt handler must save and restore any used
registers.

Finally, you need to tell PBP that you are using an assembly language
interrupt handler and where to find it. This is accomplished with a
DEFINE:

Define INTHAND Label

Label is the beginning of your interrupt routine. PBP will place a jump
to this Label at location 4 in the PICmicro.

' Assembly language interrupt example

led var PORTB.1

wsave var byte $20 system


ssave var byte bank0 system
psave var byte bank0 system

Goto start ' Skip around interrupt handler

‘ Define interrupt handler


define INTHAND myint

‘ Assembly language interrupt handler


asm
; Save W, STATUS and PCLATH registers
myint movwf wsave
swapf STATUS, W
clrf STATUS
movwf ssave
movf PCLATH, W
movwf psave

144
PicBasic Pro Compiler

; Insert interrupt code here


; Save and restore FSR if used

bsf _led ; Turn on LED (for example)

; Restore PCLATH, STATUS and W registers


movf psave, W
movwf PCLATH
swapf ssave, W
movwf STATUS
swapf wsave, F
swapf wsave, W
retfie
endasm

‘ PicBasic Pro program starts here


start: Low led ‘ Turn LED off

‘ Enable interrupt on PORTB.0


INTCON = %10010000

loop: Goto loop ‘ Wait here till interrupted

145
PicBasic Pro Compiler

146
PicBasic Pro Compiler

10. PicBasic Pro / PicBasic / Stamp Differences


Compatibility is a two-edged sword. And then there is the pointy end.
PicBasic Pro has made some concessions to usability and code size.
Therefore we call it “BASIC Stamp like” rather than BASIC Stamp
compatible. PBP has most of the BASIC Stamp I and II instruction set
and syntax. However there are some significant differences.

The following sections discuss the implementation details of PBP


programs that might present problems. It is hoped that if you do
encounter problems, these discussions will help illuminate the
differences and possible solutions.

10.1. Execution Speed

The largest potential problem is speed. Without the overhead of


reading instructions from the EEPROM, many PBP instructions (such as
GOTO and GOSUB) execute hundreds of times faster than their BASIC
Stamp equivalents. While in many cases this is a benefit, programs
whose timing has been developed empirically may experience
problems.

The solution is simple - good programs don't rely on statement timing


such as FOR..NEXT loops. Whenever possible, a program should use
handshaking and other non-temporal synchronization methods. If
delays are needed, statements specifically generating delays (PAUSE,
PAUSEUS, NAP or SLEEP) should be used.

10.2. Digital I/O

Unlike the BASIC Stamp, PBP programs operate directly on the PORT
and TRIS registers. While this has speed and RAM/ROM size
advantages, there is one potential drawback.

Some of the I/O commands (e.g. TOGGLE and PULSOUT) perform read-
modify-write operations directly on the PORT register. If two such
operations are performed too close together and the output is driving an
inductive or capacitive load, it is possible the operation will fail.

Suppose, for example, that a speaker is driven though a 10uF cap (just
as with the SOUND command). Also suppose the pin is initially low and
the programmer is attempting to generate a pulse using TOGGLE

147
PicBasic Pro Compiler

statements. The first command reads the pin's low level and outputs its
complement. The output driver (which is now high) begins to charge the
cap. If the second operation is performed too quickly, it still reads the
pin's level as low, even though the output driver is high. As such, the
second operation will also drive the pin high.

In practice, this is not much of a problem. And those commands


designed for these types of interfacing (SOUND and POT, for example)
have built-in protection. This problem is not specific to PBP programs.
This is a common problem for PICmicro (and other microcontroller)
programs and is one of the realities of programming hardware directly.

10.3. Low Power Instructions

When the Watchdog Timer time-out wakes a PICmicro from sleep


mode, execution resumes without disturbing the state of the I/O pins.
For unknown reasons, when the BASIC Stamp resumes execution after
a low power instruction (NAP or SLEEP), the I/O pins are disturbed for
approximately 18 mSec. PBP programs make use of the PIC's I/O
coherency. The NAP and SLEEP instructions do not disturb the I/O pins.

10.4. Missing PC Interface

Since PBP generated programs run directly on a PICmicro, there is no


need for the Stamp's PC interface pins (PCO and PCI). The lack of a
PC interface does introduce some differences.

Without the Stamp’s IDE running on a PC, there is no place to send


debugging information. Debugging can still be accomplished by using
one of the serial output instructions like DEBUG or SEROUT in conjunction
with a terminal program running on the PC such as Hyperterm.

Without the PC to wake the PICmicro from an END or STOP statement, it


remains idle until /MCLR is lowered, an interrupt occurs or power is
cycled.

148
PicBasic Pro Compiler

10.5. No Automatic Variables

The PicBasic Pro Compiler does not automatically create any variables
like B0 or W0. They must be defined using VAR. Two files are
provided: BS1DEFS.BAS and BS2DEFS.BAS that will define the
standard BS1 or BS2 variables. However, it is recommended that you
assign your own variables with meaningful names rather than using
either of these files.

10.6. No Nibble Variable Types

The BS2's nibble variable type is not implemented in the PicBasic Pro
Compiler. As PBP allows many more variables than a BS2, simply
change nibble variable types to bytes.

10.7. Math Operators

Mathematical expressions now have precedence of operation. This


means they are not evaluated in strict left to right order as they are in
the BASIC Stamp and original PicBasic Compiler. This precedence
means that multiplication and division are done before adds and
subtracts, for example.

Parenthesis should be used to group operations into the order in which


they are to be performed. In this manner, there will be no doubt about
the order of the operations.

The following table list the operators in hierarchal order:

Highest Precedence

()

NOT

SQR ABS DCD NCD COS SIN

149
PicBasic Pro Compiler

Highest Precedence

**

*/

//

<<

>>

MIN

MAX

DIG

REV

&

&/

/|

^/

&& AND

^^ XOR

|| OR

Lowest Precedence

150
PicBasic Pro Compiler

10.8. [ ] Versus ( )

PBP uses square brackets, [], in statements where parenthesis, (),


were previously used. This is more in keeping with BASIC Stamp II
syntax.

For example, the BS1 and original PicBasic Compiler SEROUT


instruction looks something like:

Serout 0,T2400,(B0)

The PicBasic Pro Compiler SEROUT instruction looks like:

Serout 0,T2400,[B0]

Any instructions that previously used parenthesis in their syntax should


be changed to include square brackets instead.

10.9. DATA, EEPROM, READ and WRITE

The BASIC Stamp allows EEPROM not used for program storage to
store non-volatile data. Since PBP programs execute directly from the
PICmicro's ROM space, EEPROM storage must be implemented in
some other manner.

The PIC16F84 (the default target for PBP programs), PIC16F83 and
PIC16C84 have 64 bytes of on-chip EEPROM. PBP programs may use
this for EEPROM operations and supports the Stamp's DATA, EEPROM,
READ and WRITE commands.

To access off-chip non-volatile data storage, the I2CREAD and


I2CWRITE instructions have been added. These instructions allow 2-
wire communications with serial EEPROMs like Microchip Technology’s
24LC01B.

10.10. DEBUG

DEBUG in PBP is not a special case of SEROUT as it is on the Stamps. It


has its own much shorter routine that works with a fixed pin and baud
rate. It can be used in the same manner to send debugging information
to a terminal program or other serial device.

151
PicBasic Pro Compiler

Question marks (?) in DEBUG statements are ignored. The modifier


ASC? should not be used.

10.11. GOSUB and RETURN

Subroutines are implemented via the GOSUB and RETURN statements.


User variable W6 is used by the BS1 as a four nibble stack. Thus,
Stamp programs may have up to 16 GOSUBs and subroutines can be
nested up to four levels deep.

The PICmicros have Call and Return instructions as well as an eight


level stack. PBP programs make use of these instructions and may use
four levels of this stack, with the other four levels being reserved for
library routines. Thus, W6 is still available, subroutines may still be
nested up to four levels deep and the number of GOSUBs is limited only
by the PICmicro's code space.

10.12. I2CREAD and I2CWRITE

The I2CREAD and I2CWRITE commands differ from the original


PicBasic Compiler’s I2CIN and I2COUT commands. The most obvious
difference is that the data and clock pin numbers are now specified as
part of the command. They are no longer fixed to specific pins.

The other difference is that the control byte format has changed. You
no longer set the address size as part of the control byte. Instead, the
address size is determined by the type of the address variable. If a
byte-sized variable is used, an 8-bit address is sent. If a word-sized
variable is used, a 16-bit address is sent.

10.13. IF..THEN

The BASIC Stamps and the original PicBasic compiler only allow a label
to be specified after an IF..THEN. PicBasic Pro additionally allows an
IF..THEN..ELSE..ENDIF construct as well as allowing actual code to
be executed as a result of an IF or ELSE.

10.14. MAX and MIN

The MAX and MIN operator’s function have been altered somewhat from
the way they work on the Stamp and the original PicBasic Compiler.

152
PicBasic Pro Compiler

MAX will return the maximum of two values. MIN will return the minimum
of two values. This corresponds more closely to most other BASICs and
does not have the 0 and 65535 limit problems of the Stamp’s MIN and
MAX instructions.

In most cases, you need only change MIN to MAX and MAX to MIN in
your Stamp programs for them to work properly with PBP.

10.15. SERIN and SEROUT

SERIN and SEROUT use BS1 syntax. SERIN2 and SEROUT2 use BS2
syntax. A BS2 style timeout has been added to the SERIN command.

SERIN and SEROUT have been altered to run up to 9600 baud from the
BS1 limit of 2400 baud. This has been accomplished by replacing the
little used rate of 600 baud with 9600 baud. Modes of T9600, N9600,
OT9600 and ON9600 may now be used.

600 baud is no longer available and will cause a compilation error if an


attempt is made to use it.

10.16. SLEEP

PBP’s SLEEP command is based solely on the Watchdog Timer. It is no


longer calibrated using the system clock oscillator. This change was
necessitated by the effect Watchdog Timer resets have on the
PICmicro.

Whenever the PICmicro was reset during SLEEP calibration, it altered


the states of some of the internal registers. For smaller PICmicros with
few registers, these registers could be saved before and restored after
calibration resets. However, since PBP may be used on many different
PICmicros with many registers that are altered upon reset, this save and
restore proved to be too unwieldy.

Therefore it has been decided to run SLEEP in an uncalibrated mode


based strictly upon the accuracy of the Watchdog Timer. This ensures
the stability of the PICmicro registers and I/O ports. However, since the
Watchdog Timer is driven by an internal R/C oscillator, its period can
vary significantly based on temperature and individual chip variations. If

153
PicBasic Pro Compiler

greater accuracy is needed, PAUSE, which is not a low-power command,


should be used.

154
PicBasic Pro Compiler

Appendix A

Summary of Microchip Assembly Instruction Set

ADDLW k
ADDWF f,d
ANDLW k
ANDWF f,d
BCF f,b
BSF f,b
BTFSC f,b
BTFSS f,b
CALL k
CLRF f
CLRW
CLRWDT
COMF f,d
DECF f,d
DECFSZ f,d
GOTO k
INCF f,d
INCFSZ f,d
IORLW k
IORWF f,d
MOVF f,d
MOVLW k
MOVWF f
NOP
RETFIE
RETLW k
RETURN
RLF f,d
RRF f,d
SLEEP
SUBLW k
SUBWF f,d
SWAPF f,d
XORLW k
XORWF f,d

b - bit address
d - destination; 0 = w, 1 = f
f - register file address
k - literal constant

155
PicBasic Pro Compiler

156
PicBasic Pro Compiler

Appendix B

Contact Information

Technical support and sales may be reached at:

microEngineering Labs, Inc.


Box 7532
Colorado Springs CO 80933-7532
(719) 520-5323
(719) 520-1867 fax
http://www.melabs.com
email:support@melabs.com

PICmicro data sheets, CD-ROMs and literature may be obtained from:

Microchip Technology Inc.


2355 W. Chandler Blvd.
Chandler AZ 85224-6199
(602) 786-7200
(602) 899-9210 fax
http://www.microchip.com
email:literature@microchip.com

157
READ THE FOLLOWING TERMS AND CONDITIONS CAREFULLY
BEFORE OPENING THIS PACKAGE.
microEngineering Labs, Inc. ("the Company") is willing to license the
enclosed software to the purchaser of the software ("Licensee") only on
the condition that Licensee accepts all of the terms and conditions set
forth below. By opening this sealed package, Licensee is agreeing to
be bound by these terms and conditions.

Disclaimer of Liability

THE COMPANY DISCLAIMS ALL WARRANTIES, EXPRESS OR


IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE AND THE
IMPLIED WARRANTY OF MERCHANTABILITY. IN NO EVENT
SHALL THE COMPANY OR ITS EMPLOYEES, AGENTS, SUPPLIERS
OR CONTRACTORS BE LIABLE FOR ANY INCIDENTAL, INDIRECT,
SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN
CONNECTION WITH LICENSE GRANTED UNDER THIS
AGREEMENT, INCLUDING WITHOUT LIMITATION, LOST PROFITS,
DOWNTIME, GOODWILL, DAMAGE TO OR REPLACEMENT OF
EQUIPMENT OR PROPERTY, OR ANY COSTS FOR RECOVERING,
REPROGRAMMING OR REPRODUCING ANY DATA USED WITH
THE COMPANY'S PRODUCTS.

Software License

In consideration of Licensee's payment of the license fee, which is part


of the price Licensee paid for this product, and Licensee's agreement to
abide by the terms and conditions on this page, the Company grants
Licensee a nonexclusive right to use and display the copy of the
enclosed software on a single computer at a single location. Licensee
owns only the enclosed disk on which the software is recorded or fixed,
and the Company retains all right, title and ownership (including the
copyright) to the software recorded on the original disk copy and all
subsequent copies of the software. Licensee may not network the
software or otherwise use it on more than one computer terminal at the
same time. Copies may only be made for archival or backup purposes.
The enclosed software is licensed only to the Licensee and may not be
transferred to anyone else, nor may copies be given to anyone else.
Any violation of the terms and conditions of this software license shall
result in the immediate termination of the license.

You might also like