(Parte 4 de 4)

> UART (SERIAL) RECEIVEvar

LDmicro pode gerar código para usar a UART embutida em certos microcontroladores. Nos AVRs com várias UARTs, sometne a UART1 (não UART 0) será suportada. Configure a taxa de transferência (baud rate) usando a opção “Settings

MCU Parameters. Certas taxas podem não ser aceitas em certas faixas de freqüência de clock. LDmicro irá alertá-lo, neste casos.

Se a condição de entrada desta instrução for DESLIGADO, então nada irá ocorrer. Caso contrário a instrução tentará receber um simples caracter da UART. Se nenhum caracter for lido, então a condição de saída será FALSO. Se um caractere for lido, então o mesmo será armazenado na variável ‘var’ e a condição de saída da instrução será LIGADO (por um único ciclo de execução).

> UART (SERIAL) SEND var --{UART SEND}--

Se a entrada desta instrução estiver DESLIGADA, então nada acontecerá. Se a condição estiver LIGADA, a instrução irá enviar um simples caractere na UART. O valor ASCII do caractere a ser enviado deve ter sido previamente armazenado na variável ‘var’. A opção de saída do degrau será LIGADA enquanto a transmissão estiver ocorrendo, e DESLIGADO quando o processo terminar.

Lembre que o caractere toma algum tempo para ser transmitido. Verifique a condição de saída para se certificar que o processo de transmissão do primeiro caractere terminou antes de enviar um segundo.

Veja também a instrução FORMATTED STRING OVER UART, que é muito mais prática e fácil para enviar grandes trechos de dados.

> FORMATTED STRING OVER UARTvar

Quanto esta instrução é utilizada (com sinal de entrada LIGADO), ela começa a enviar uma seqüência de caracteres (STRING) através da porta serial. Na string, onde houver a seqüência \3, será substituída pela variável em questão. O \3 significa que o valor irá tomar exatos 3 caracteres; Por exemplo, se a variável ‘var’ estiver comportando o valor 35, então a string exata que será enviada seriá: ‘Pressure: 35\r\n’ (observe o espaço extra antes do número). Se, por outro lado, a variável ‘var’ poderá assumir número de mais dígitos, como por exemplo o número 1432, então deverá ser mudada esta definição. Será necessário usar o ‘\4’.

Se a variável em questão poderá assumir valores negativos, use ‘\-3d’ ou ‘\-4d’. O dígito aparecerá somente quando os valores forem negativos. Para valores positivos, o sinal será substituído por um espaço.

Se múltiplas strings formatadas forem acionadas simultaneamente (ou se uma for acionada antes de outra terminar), ou se estas instruções estiverem sendo usadas simultaneamente com instruções UART TX, o resultado poderá ser indefinido.

Isso é permitido para que possa ser enviada uma simples string de dados, e pelo programa, disparar, em seqüência, os dados em outra linha.

Use o caractere especial ‘\\’ para exibir uma contrabarra. Abaixo a lista de caracteres especiais que podem ser usados:

* \r -- carriage return (retorno de carro. Volta para primeira coluna) * \n -- newline (Nova linha.)

* \f -- formfeed (Alimenta formulário. Geralmente usado como clear)

* \b -- backspace (Volta um caractere)

* \xAB -- character with ASCII value 0xAB (hex) (exibir carac. especial)

A saída desta instrução é verdadeira enquanto ela estiver transmitindo dados. Esta instrução consome muita memória de programa, e deve ser usada com cuidado. Na implementação atual do LDMicro, esta função não é muito otimizada consumindo muito recurso de processamento.

Lembre que o LDmicro realiza somente instruções matemáticas com inteiros de 16 bits. Isso significa que o resultado final de qualquer cálculo que for realizado deverá ser um valor inteiro entre -32768 e 327667. Isso também quer dizer que valores intermediários de cálculos também devem permanecer nesta faixa.

Por exmeplo, supondo que você queira calcular y = (1/x)*1200, onde x é um valor entre 1 e 20. Então y poderá valer 1200 a 60, armazenados em uma variável inteira de 16 bits. Para isso ser calculado, teoricamente há duas maneiras de se escrever o código:

||{DIV temp :=} ||
||---------{ 1 / x}----------||
||||
||{DIV y :=} ||

Matematicamente, as duas são equivalents. Mas se você testá-las, poderá observar que a primeira sempre dará o incorreto resultado de y = 0. Isso é porque a variável ‘temp’ somente armazenará valores inteiros, e o resultado do primeiro degrau (1 / x) geralmente será um número menor que 1 (para x = 3, tempo será 0,3...) e isso não é possível de se armazenar em uma variável inteira.

Se você estiver tendo problemas nos resultados de suas equações, verifique portanto os valores intermediários, observando se nenhum valor gerado irá resultar em dados não armazenáveis em variáveis de 16 bits com sinal.

Quando você precisar multiplicar uma variável por uma fração, use isso usando respectivamente as instruções de multiplicação e divisão. Por exemplo, para multiplicar y por 1.8 * x, calcule: y = (9/5)*x (lembrando que 9/5 = 1.8). E, no código ladder, faça a multiplicação ocorrer antes da divisão.

||{MUL temp :=} ||
||---------{ x * 9}----------||
||||
||{DIV y :=} ||

Isso funcionará para qualquer x < (32767 / 9), ou x < 3640. Para valores maiores de x, a variável ‘temp’ irá sair de seu limite.

É permitido múltiplas bobinas em paralelo em um simples degrau. Isso significa que você pode fazer coisas como isso:

||Xa Ya ||
||||
||Xb Yb ||
||| ||
||| Yc ||
||+-------( )-------||
||||
||Xa Ya ||
||||
||||
||||
||||
||Xb Yb ||
||||
||||
||||
||||
||Xb Yc ||

Isso permite que, em teoria, você possa escrever programas em um único degrau gigante. Na prática isso pode não ser uma boa idéia, porque os degraus ficarão mais complexos e mais difíceis de serem editados, lidos e interpretados.

Mesmo assim, isso pode ser uma boa idéia para grupos de mesma relevância lógica, tratando-as como um simples degrau.

** *

LDmicro não gera um código HEX muito eficiente. É um pouco lento para ser executado e desperdiça muita memória RAM e ROM. Em contrapartida, LDmicro com um microcontrolador de porte médio (modelos PIC ou AVR) pode fazer tudo que um pequeno PLC pode, o que compensa esta baixa otimização de recursos.

O comprimento máximo do nome das variáveis é limitado. Programas danificados (arquivo .ld) podem executar código inesperado. Por favor, reporte bugs adicionais ou requisitos ao autor.

Agradecimentos:

* Marcelo Solano, for reporting a UI bug under Win98 * Serge V. Polubarjev, for not only noticing that RA3:0 on the

PIC16F628 didn't work but also telling me how to fix it

* Maxim Ibragimov, for reporting and diagnosing major problems with the till-then-untested ATmega16 and ATmega162 targets

* Bill Kishonti, for reporting that the simulator crashed when the ladder logic program divided by zero

* Mohamed Tayae, for reporting that persistent variables were broken on the PIC16F628

* David Rothwell, for reporting several user interface bugs and a problem with the "Export as Text" function

Este programa é um software livre: Você pode redistribui-lo e/ou modificálo sob os termos da GNU (General Public License) publicado pela Free Software Foundation, na versão 3 da licença ou superior.

Este programa é distribuído na esperança de ser útil, mas não há NENHUMA

GARANTIA ASSOCIADA, sem nenhuma garantia, seja comercial ou particular. (veja GNU para maiores detalhes)

Você pode obter uma cópia do termo GNU em http://www.gnu.org/licences

Traduzido e adaptado do texto original de Jonathan Westhues por Daniel Corteletti

Rijswijk-- Dec 2004

Jonathan Westhues Waterloo ON -- Jun, Jul 2005

Cambridge MA -- Sep, Dec 2005

(Parte 4 de 4)

Comentários