Manual Picbasic em Portugues

Page 1

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. . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1. Utilização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Opções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1. Opção -A . . . . . . . . . . . . . . . . . . . . . . . 3.2.2. Opção -C . . . . . . . . . . . . . . . . . . . . . . . 3.2.3. Opção -H ou -? . . . . . . . . . . . . . . . . . . 3.2.4. Opção -I . . . . . . . . . . . . . . . . . . . . . . . 3.2.5. Opção -L . . . . . . . . . . . . . . . . . . . . . . . 3.2.6. Opção -O . . . . . . . . . . . . . . . . . . . . . . 3.2.7. Opção -P . . . . . . . . . . . . . . . . . . . . . . . 3.2.8. Opção -S . . . . . . . . . . . . . . . . . . . . . . . 3.2.9. Opção -V . . . . . . . . . . . . . . . . . . . . . . .

15 15 16 16 16 17 17 17 17 18 18 18

4. O Básico do PicBasic Pro. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1. Identificadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2. Rótulos de Linha. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3. Variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4. Aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5. Conjuntos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.6. Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.7. Símbolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.8. Constantes Numéricas . . . . . . . . . . . . . . . . . . . . . . . 4.9. Constantes Alfanum. . . . . . . . . . . . . . . . . . . . . . . . . . 4.10. Pinos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11. Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19 19 19 19 20 21 22 22 23 23 23 26

i


PicBasic Pro Compiler

4.12. 4.13. 4.14. 4.15. 4.16.

Linhas c/ Decl. Múltiplas . . . . . . . . . . . . . . . . . . . . Caractere de Extensão de Linha. . . . . . . . . . . . . . . . . INCLUDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DEFINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Op. Matemáticos. . . . . . . . . . . . . . . . . . . . . . . . . 4.16.1. Multiplicação . . . . . . . . . . . . . . . . . . . 4.16.2. Divisão . . . . . . . . . . . . . . . . . . . . . . . 4.16.3. Desl. . . . . . . . . . . . . . . . . . . . . . . . . . . 4.16.4. ABS . . . . . . . . . . . . . . . . . . . . . . . . . . 4.16.5. COS . . . . . . . . . . . . . . . . . . . . . . . . . 4.16.6. DCD . . . . . . . . . . . . . . . . . . . . . . . . . 4.16.7. DIG . . . . . . . . . . . . . . . . . . . . . . . . . . 4.16.8. MAX e MIN . . . . . . . . . . . . . . . . . . 4.16.9. NCD . . . . . . . . . . . . . . . . . . . . . . . . . 4.16.10. REV . . . . . . . . . . . . . . . . . . . . . . . . . 4.16.11. SIN . . . . . . . . . . . . . . . . . . . . . . . . . 4.16.12. SQR . . . . . . . . . . . . . . . . . . . . . . . . 4.16.13. Operadores a Bit . . . . . . . . . . . . . . 4.17. Operadores de Comparação. . . . . . . . . . . . . . . . . . . 4.18. Operadores Lógicos. . . . . . . . . . . . . . . . . . . . . . .

26 26 27 27 28 30 30 30 31 31 31 31 31 32 32 32 32 32 33 33

5. Referência de Declarações do PicBasic Pro. . . . . . . . . . . . . . . . . . 5.1. @ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2. ASM..ENDASM . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3. BRANCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4. BRANCHL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.5. BUTTON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.6. CALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.7. CLEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.8. COUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.9. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.10. DEBUG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.11. DISABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.12. DTMFOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.13. EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.14. ENABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.15. END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.16. FOR..NEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.17. FREQOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.18. GOSUB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.19. GOTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.20. HIGH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.21. HSERIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35 37 38 39 40 41 43 44 45 46 47 49 50 51 52 53 54 55 56 57 58 59

ii


PicBasic Pro Compiler

5.22. 5.23. 5.24. 5.25. 5.26. 5.27. 5.28. 5.29. 5.30. 5.31. 5.32. 5.33. 5.34. 5.35. 5.36. 5.37. 5.38. 5.39. 5.40. 5.41. 5.42. 5.43. 5.44. 5.45. 5.46. 5.47. 5.48. 5.49. 5.50. 5.51. 5.52. 5.53. 5.54. 5.55. 5.56. 5.57. 5.58. 5.59. 5.60. 5.61. 5.62. 5.63. 5.64.

HSEROUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 I2CREAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 I2CWRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 IF..THEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 INPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 {LET} . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 LCDOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 LOOKDOWN . . . . . . . . . . . . . . . . . . . . . . . . . . 75 LOOKDOWN2 . . . . . . . . . . . . . . . . . . . . . . . . . 76 LOOKUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 LOOKUP2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 LOW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 NAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 ON INTERRUPT . . . . . . . . . . . . . . . . . . . . . . . . 81 OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 PAUSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 PAUSEUS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 PEEK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 POKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 POT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 PULSIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 PULSOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 RANDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 RCTIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 READ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 RESUME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 RETURN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 REVERSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 SERIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 SERIN2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 SEROUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 SEROUT2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 SHIFTIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 SHIFTOUT . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 SLEEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 SOUND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 STOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 SWAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 TOGGLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 WHILE..WEND . . . . . . . . . . . . . . . . . . . . . . . . 118 WRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 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 . . . . . . . . . . . . . . . . . 7.1. Quão Rápido é Bastante Rápido?. . . . . . . . . . . . . . . . 7.2. Ajustes de Configuração . . . . . . . . . . . . . . . . . . . 7.3. Utiliz. da RAM. . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.4. Pal. Reservadas . . . . . . . . . . . . . . . . . . . . . . . . 7.5. Vida Após 2K . . . . . . . . . . . . . . . . . . . . . . . . . . .

127 127 129 129 131 131

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

133 133 134 135 137

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

139 139 140 142

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

147 147 147 148 148 149 149 149 151 151 151 152 152 152 152 153 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 bibliotecas 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 reprogramado 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úmero 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 terminar c/ (mas não é requerido) a extensão .BAS. O arquivo texto criado precisa ser texto ASCII puro. Ele não pode conter quaisquer 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 Pause 500

‘ Liga o LED ‘ Atraso de .5 segundos

Low PORTB.0 Pause 500

‘ Desliga o LED ‘ 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, compileo 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 Windows 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 sistema 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 verifique 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 à esquerda. 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 programar 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 acrescentamos um LED e um resistor p/ prover a saída p/ o programa BLINK. +5V

+5V

1 4.7K

2 3 4 5 6 7

470

8 9

RA2

RA1

RA3

RA0

RA4

OSC1

MCLR

OSC2

Vss

Vdd

RB0

RB7

RB1

RB6

RB2

RB5

RB3

RB4

LED

18 17 16

4Mhz

15 14 13 12

22pf

22pf

11 10 .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 apropriados no PICmicro. Partindo destas simples iniciações, você poderá criar sua própria aplicaçã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 corretamente 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 estiverem 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 Microchip 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 filtrada. 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 suficiente nas linhas de alimentação p/ fazer o PICmicro parar de funcionar corretamente. Até mesmo um mostrador a LED pode criar dreno instantâneo suficiente 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 nivel var byte

‘ LED de bateria fraca ‘ A variável irá conter o nível da bateria

If nivel < 10 Then High BatLED Endif

‘ Se o nível estiver baixo ‘ Acenda o LED

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). Normalmente 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 especificado um caminho, o arq. denominado é procurado naquele diretório. Independentemente 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 compilaçã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 A C H(?)

Descrição Usa um Montador diferente Insere linhas de fonte como Comentários no arq. montador Mostra tela de Ajuda

I

Usa um caminho de Inclusão diferente

L O P S

Usa um arq. de Biblioteca diferente Passa Opção p/ montador Especifica Processador alvo 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 especificados 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 OD OL

Descrição Gera Listagem, Tabela Simbólica e Arq. de Mapa 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 gato w0

var var var

byte bit 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

b0

var

w0.byte0

b1

var

w0.byte1

pulga var

‘ fido eh um outro nome p/ cao ‘ b0 eh o primeiro byte da palavra w0 ‘ b1 eh o segundo byte da palavra w0 ‘ pulga eh o bit0 de cao

cao.0

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 peixe var

byte[10] 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 tamanho p/ cada tipo: Tam. BIT

Número Máximo de elementos

BYTE

64

WORD

32

128

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 ratoeiras con

3 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 %100 $100

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

Para facilidade de programação, caracteres únicos são convertidos p/ seus equivalentes ASCII. Constantes de caractere devem ser quoteadas usando aspas e devem conter apenas um caractere (de outra forma, elas são constantes alfanuméricas). "A" "d"

‘ Valor ASCII p/ o decimal 65 ‘ 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 High led

‘ Renomeia PORTA.0 como 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

PORTB PORTC 40 pinos *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 compatibilidade 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 comandos 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 arquivos 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 pinos 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 DEFINE DEFINE DEFINE

'Porta do pino de depuracao 'Bit pino depura. 'Baud rate depura. 'Modo depura.: 0 = Verd., 1 = Invertido 'Passo caractere depura. em us

REG_DEPURA BIT_DEPURA BAUD_DEPURA MODO_DEPURA

PORTB 0 2400 1

DEFINE PASSO_DEPURA 1000 DEFINE HSER_BAUD 2400 DEFINE HSER_RCSTA 90h DEFINE HSER_TXSTA 20h 27

'Fixa baud rate 'Fixa reg. rec. 'Fixa reg. transm.


PicBasic Pro Compiler

DEFINE HSER_PAR

1

DEFINE HSER_IMP

1

'Use somente se desejar paridade par 'Use somente se desejar parid. impar

DEFINE I2C_INTERNO 1 DEFINE I2C_LENTO

1

DEFINE LCD_DREG DEFINE LCD_DBIT

PORTA 0

DEFINE LCD_RSREG

PORTA

DEFINE LCD_RSBIT

4

DEFINE LCD_EREG DEFINE LCD_EBIT DEFINE LCD_BITS

PORTB 3 4

DEFINE LCD_LINHAS

2

DEFINE OSC 4

'Use p/ EEPROM interna em 16CExxx e 12CExxx 'Use p/ OSC >8mHz c/ dispositivos de veloc. padrao 'Porta dados LCD 'Bit de inicio LCD 0 ou 4 'Porta de selec. registro LCD 'Bit de selec. registro LCD 'Porta hab. LCD 'Bit hab. LCD 'Tam. barram. LCD 4 ou 8 'Linhas numericas no LCD '3 4 8 10 12 16 20

DEFINE OSCCAL_1K

1

DEFINE OSCCAL_2K

1

'Fixa OSCCAL p/ PIC12C671 '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

<<

Desl. Esq.

>>

Desl. Dir.

ABS

Valor Absoluto

COS

Coseno

DCD DIG

Decodif. 2n 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

(Módulo)

*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 W2 = W0 ** 1000

‘ Multiplicar o valor em W0 por 1000 e guardar o resultado em W1 ‘ 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 W2 = W0 // 1000

‘ Dividir o valor em W0 por 1000 e guardar o resultado em W1 ‘ 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 W1 = W0 >> 1

‘ Desloca B0 3 casas p/ esquerda (o mesmo que multiplicar por 8) ‘ 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 B1 = B0 DIG 1

‘ Fixa B0 em 123 ‘ 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 B1 = B0 MIN 100

‘ Fixa B1 p/ o maior de B0 e 100 (B1 estará entre 100 & 255) ‘ 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 B0 = B0 | %00000001 B0 = B0 ^ %00000001

‘ Isola o bit 0 de B0 ‘ Liga o bit 0 de B0 ‘ 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

<=

Menor ou Igual a

>=

Maior

que 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 POKE POT PULSIN PULSOUT PWM RANDOM RCTIME READ RESUME RETURN REVERSE SERIN SERIN2 SEROUT SEROUT2 SHIFTIN SHIFTOUT SLEEP SOUND STOP SWAP TOGGLE WHILE..WEND WRITE XIN XOUT

Lê o byte do registrador. Escreve um byte no registrador. Lê o potenciômero em um pino específico. Mede a largura do pulso em um pino. Gera pulso em um pino. Coloca um trem de pulsos modulado por largura no pino. Gera um número pseudo-aleatório. Mede a largura do pulso em um pino. Lê o byte da EEPROM no-chip. Continua execução após tratar uma interrupção. Continua na declaração seguinte ao último GOSUB. Torna pino de saída uma entrada ou pino de entrada uma saída. Entrada serial assíncrona (estilo BS1). Entrada serial assíncrona (estilo BS2). Saída serial assíncrona (estilo BS1). Saída serial assíncrona (estilo BS2). Entrada serial síncrona. Saída serial síncrona. Desliga o processador por um período de tempo. Gera tom ou ruído branco em um pino específico. Para a execução de um programa. Troca os valores de duas variáveis. Torna o pino uma saída e muda o estado. Executa decl. enquanto a condição for verdadeira. Escreve byte na EEPROM no-chip. Entrada X-10. 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 role-me var @

byte byte

For i = 1 to 4 rlf _role-me, F Next i

; Gira o bit uma vez p/ esq.

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 bcf PORTB, 0 ENDASM

; Fixa bit 0 em PORTA ; Limpa bit 0 em PORTB

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 menos de ROM), usar BRANCH ao invés de BRANCHL irá minimizar a utilizaçã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 Delay

Rate BVar

Action Rotulo

Estado do pino quando o botão é pressionado (0..1). 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. Taxa de auto-repetição (0..255). 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. Estado do botão sobre o qual atuar (0 se não premido, 1 se premido). 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 parada (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).

Pino

1K

DB9

DB25

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 myint: led = 1 Resume Enable

‘ ‘ ‘ ‘

Desabilita interrupções no gerenciador Liga o LED quando interrompido Retorna ao programa principal 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 terminador 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 myint: led = 1 Resume ENABLE

‘ ‘ ‘ ‘

Desabilita interrupcoes no gerenciador Liga o LED quando interrompido Retorna ao programa principal 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) 2) 3)

4)

O valor de Inicio é atribuído à variável índice, Conta. Conta pode ser uma variável de qualquer tipo. O Corpo é executado. O Corpo é opcional e pode ser omitido (talvez p/ um loop de atraso). O valor de Inc é adicionado a (ou subtraído de se "-" é especificado) Conta. Se nenhuma cláusula STEP é definida, Conta é incrementada uma vez. 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 palavra 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 HIGH PORTA.0 led

var PORTB.0 HIGH led

‘ a ‘ e

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

‘ Define pino do 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, certifiquese de definir (DEFINE) o ajuste OSC p/ o novo valor do oscilador. Opcionalmente, Timeout e Rotulo podem ser incluídos p/ permitir que o programa 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, certifiquese 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 Endereco, 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 dimensionada 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 cont

var byte 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 cont

var con

byte %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 INPUT PORTA.0

‘ Fixa Pino0 como entrada ‘ 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 $FE, 1 $FE, 2

Operation Limpa display 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 superiores 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 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. 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 constantes 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 LOW led

‘ Define pino do 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 microcontrolador 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 declaraçã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 myint: led = 1 RESUME ENABLE

‘ Desab. interrupções no manipulador ‘ Liga o LED quando interrompido ‘ Retorna ao progr. principal ‘ 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 OUTPUT PORTA.0

‘ Torna Pino0 uma saída ‘ 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). Diferente 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).

5-50K

Pin

0.1uF

POT 3,255,B0

‘ Lê o potenciômetro no Pino3 p/ determinar escala ‘ Envia valor do pot serialmente ao Pino0

Serout 0,N2400,[#B0]

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 resoluçã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/ entrada 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:

Pino

10K

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 resistivo). 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 incrementos 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 Pause 10 RCTIME PORTB.3,0,W0

‘ Descarrega cap p/ iniciar ‘ Descarrega por 10ms ‘ 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 RESUME restart

‘ Liga LED de erro ‘ 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 REVERSE 4

‘ Fixa Pino4 como saida ‘ 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

T2400

0

2400

T1200

1

1200

T9600

2

9600

T300

3

300

N2400

4

2400

N1200

5

1200

N9600 N300

6 7

9600 300

Estado

Verdadeiro

Invertido

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ãodí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.

Pino

22K

DB9

DB25

RS-232 TX

Pino 3

Pino 2

RS-232 GND

Pino 5

Pino 7

SERIN 1,N2400,[“A”],B0

99

‘ Aguarda até que o caractere “A” seja recebido serialmente no Pino1 e colocado proximo ao caractere em B0


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 encontrar 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. Operação

Modificador 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 Espera por seqüência de caracteres

WAIT ( )

WAITSTR CadeiaVar{\n} Espera por cadeia de caracteres 1)

Uma variável precedida por BIN irá receber a representaçã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)

3)

4) 5)

6)

7)

Uma variável precedida por DEC irá receber a representatção ASCII de seu valor decimal. Por exemplo, se DEC B0 é especificado e “123" é recebido, B0 será fixado em 123. Uma variável precedida por HEX irá receber a representação ASCII de seu valor hexadecimal. Por exemplo, se HEX B0 é especificado e “FE" é recebido, B0 será fixado em 254. SKIP seguido por uma contagem irá pular aquela quantia de caracteres na corrente de entrada. Por exemplo, SKIP 4 irá pular 4 caracteres.. STR seguido por uma variável de cadeia de byte, contagem e caractere terminador opcional irá receber uma cadeia de caracteres. O compr. da cadeia é determinado pela contagem ou quando o caractere opcional é encontrado na entrada. 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. 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 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).

Pino

22K

DB9

DB25

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

T2400

0

2400

T1200

1

1200

T9600

2

9600

T300

3

300

N2400

4

2400

N1200

5

1200

N9600

6

9600

N300

7

300

OT2400

8

2400

OT1200

9

1200

OT9600

10

9600

OT300

11

300

ON2400

12

2400

ON1200

13

1200

ON9600

14

9600

ON300

15

300

Estado

Acionam. Real

Acionam. Invertido

Aberto Real

Aberto Invertido

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

3)

Uma constante string é enviada como uma string de caracteres literal. 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. 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 microsegundos (.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 conversores 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).

Pino

1K

DB9

DB25

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 avanco 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

Operação

Modificador

1) 2)

3)

4)

5)

6) 7)

{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

Uma constante de string é enviada como uma cadeia de caracteres literal. 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. 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". 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". 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”. REP seguido por um caractere e contagem irá repetir o caractere, tempo de contagem. Por exemplo, REP “0"\4 irá enviar “0000". 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 conforme 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).

Pino

1K

DB9

DB25

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

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

Operação

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 caracterí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]

114

‘ Envia 2 sons consecutivamente ao Pino7


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 B0 = B1 B1 = temp

‘ Maneira antiga

SWAP

‘ Maneira nova

B0, B1

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 TOGGLE 0

‘ Inicia Pino0 como nivel baixo ‘ 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 microcontrolador à linha de força CA. O TW-523 p/ comunicações X-10 bidirecionais é 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 interface X-10. PinoZero é automaticamente fixado como entrada p/ receber a temporização de instante zero da interface X-10. Ambos os pinos devem ser ligados 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 (aproximadamente 8.33 milisegundos). XIN apenas processa dados a cada instante zero da linha de força CA conforme 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 formato 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 temporizaçã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

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

Operação

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:

No. Fio

Fiação PL-513 Cor do Fio

Conexão

Saída instante zero

1

Preto

2

Vermelho

3

Verde

Comum transmissão X-10

4

Amarelo

Entrada transmissão X-10

Comum instante zero

123


PicBasic Pro Compiler

FiaçãoTW-523 Cor do Fio

No. Fio

house var unit var

1

Preto

2

Vermelho

3

Verde

4

Amarelo

Conexão

Saída instante zero Comum Saída recepção X-10 Entrada transmissão X-10

byte 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 dispositivo é 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 nickel

VAR VAR

WORD BANK0 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 biblioteca. 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 bcf bcf Endasm

STATUS,RP0 TRISA,0 STATUS,RP0

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 wsave1 var

byte $20 system 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 wsave1 var

byte $20 system byte $a0 system

143

‘ If device has RAM in bank1


PicBasic Pro Compiler

wsave2 var

byte $120 system

wsave3 var

byte $1a0 system

ssave psave

byte bank0 system byte bank0 system

var var

‘ If device has RAM in bank2 ‘ If device has RAM in bank3

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 ssave var psave var

byte $20 system byte bank0 system 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 readmodify-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 2wire 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 ADDWF ANDLW ANDWF BCF BSF BTFSC BTFSS CALL CLRF CLRW CLRWDT COMF DECF DECFSZ GOTO INCF INCFSZ IORLW IORWF MOVF MOVLW k MOVWF f NOP RETFIE RETLW RETURN RLF RRF SLEEP SUBLW SUBWF SWAPF XORLW XORWF

k f,d k f,d f,b f,b f,b f,b k f f,d f,d f,d k f,d f,d k f,d f,d

k f,d f,d k f,d f,d k 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.


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.