INTRODUCTION
============

LDmicro gnre du code natif pour certains microcontroleurs Microchip
PIC16F et Atmel AVR. Usuellement les programmes de developpement pour ces
microcontrolleurs sont crits dans des langages comme l'assembleur , le
C ou le Basic. Un programme qui utilise un de ces langages est une suite
de commandes. Ces programmes sont puissants et adapts  l'architecture
des processeurs, qui de faon interne excutent une liste d'instructions.

Les API (Automates Programmables Industriels, PLC en anglais, SPS en
allemand) utilisent une autre voie et sont programms en Langage 
Contacts (ou LADDER). Un programme simple est reprsent comme ceci :


   ||                                                                    ||
   ||    Xbutton1           Tdon           Rchatter           Yred       ||
 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||
   ||                                 |                                  ||
   ||    Xbutton2           Tdof      |                                  ||
   ||-------]/[---------[TOF 2.000 s]-+                                  ||
   ||                                                                    ||
   ||                                                                    ||
   ||                                                                    ||
   ||    Rchatter            Ton             Tnew           Rchatter     ||
 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||
   ||                                                                    ||
   ||                                                                    ||
   ||                                                                    ||
   ||------[END]---------------------------------------------------------||
   ||                                                                    ||
   ||                                                                    ||

(TON est une tempo travail; TOF est une tempo repos. les commandes --] [--
reprsentent des Entres, qui peuvent tre des contacts de relais. Les
commandes --( )-- sont des Sorties, qui peuvent reprsenter des bobines de
relais. Beaucoup de rfrences de programmes de langage  contacts (LADDER)
existent sur Internet et sont  quelques dtails prs, identiques 
l'implmentation reprsente ci-dessus.

Un certain nombre de diffrences apparaissent entre les programmes en
langage volus ( C, Basic, Etc..) et les programmes pour API:

    * Le programme est reprsent dans un format graphique, et non
      comme une liste de commandes en format texte. Beaucoup de personnes
      trouve cela plus facile  comprendre.

    * Au niveau de base, le programme apparait comme un diagramme
      de circuit avec des contacts de relais (Entres) et des bobines
      (Sorties). Ceci est intuitif pour les programmeurs qui connaissent
      la thorie des circuits lectriques.

    * Le compilateur de langage  contacts vrifie tout ceci lors
      de la compilation. Vous n'avez pas  crire de code quand une
      Sortie est remplace et est remise en Entre ou si une temporisation
      est modifie, vous n'avez pas non plus  spcifier l'ordre o les
      calculs doivent tre effectus. L'outil API (PLC) s'occupe de cela
      pour vous.


LDmicro compile le langage  contact (ladder) en code pour PIC16F ou
AVR. Les processeurs suivants sont supports:

    * PIC16F877
    * PIC16F628
    * PIC16F876 (non test)
    * PIC16F88  (non test)
    * PIC16F819 (non test)
    * PIC16F887 (non test)
    * PIC16F886 (non test)
    * ATmega128
    * ATmega64
    * ATmega162 (non test)
    * ATmega32  (non test)
    * ATmega16  (non test)
    * ATmega8   (non test)

Il doit tre facile de supporter d'autres PIC ou AVR, mais je n'est
aucun moyen pour les tester. Si vous en voulez un en particulier faites
moi parvenir votre demande et je verrai ce que je peux faire.

En utilisant LDmicro, vous dessinez un diagramme  contacts pour votre
programme. Vous pouvez simuler le fonctionnement logique en temps rel sur
votre PC. Quand vous tes convaincu que le fonctionnement est correct,
vous pouvez affecter les broches du microcontroleur pour les Entres et
Sorties, ensuite vous compilez votre programmeen code AVR ou PIC. Le
fichier de sortie du compilateur est un fichier .HEX que vous devrez
mettre dans le microcontroleur en utilisant un programmateur pour PIC
ou AVR.


LDmicro est conu pour tre similaire  la majorit des API commerciaux.
Il y a quelques exceptions, et une partie des possibilits n'est
pas standard avec le matriel industriel. Lire attentivement la
description de chaque instruction mme si elle parait familire. Ce
document considre que vous avez une connaisance de base du langage 
contact et de la structure des logiciels pour automates programmables.
Cycle d'excution : Lecture des Entres -> Calculs -> Ecriture des Sorties


CIBLES ADDITIONNELLES
=====================

Il est aussi possible de gnrer du code ANSI C . Vous pouvez utiliser
ceci pour n'importe quel processeur dont vous avez un compilateur C,
mais le runtime est de votre responsabilit. LDmicro grre uniquement
le source pour le cycle de l'API. Vous tes responsable de l'appel de
chaque squence du cycle et de l'implmentation de toutes les Entres
/ Sorties (Lecture/Ecriture des Entres digitales, etc ...). Voir les
commentaires dans le code source pour plus de dtails.

Finalement, LDmicro peut gnrer un code byte indpendant du processeur
pour une machine virtuelle prvue pour faire fonctionner ce type de code.
J'ai prvu un exemple simple d'implmentation d'un interprteur /VM
crit en code C le plus portable possible.  La cible fonctionne juste sur
quelques plateformes ou vous pouvez prvoir votre VM. Ceci peut tre utile
pour des applications ou vous pouvez utiliser le languages  contacts
comme du langage script pour customiser un programme important. Voir
les commentaires dans l'exemple pour les dtails.


OPTIONS LIGNE DE COMMANDE
=========================

LDmicro.exe fonctionne normallement sans options de ligne de commande.
Vous pouvez faire un raccourci vers le programme et le sauvegarder sur
l'cran , il suffit alors de faire un double clic pour le faire dmarrer
et vous vous retrouvez ainsi dans l'interface utilisateur.

Si un nom de fichier est pass en ligne de de commande de LDmicro, (ex:
`ldmicro.exe asd.ld'), alors LDmicro va essayer d'ouvrir `asd.ld', si
il existe. Une erreur se produira si `asd.ld' n'existe pas. Vous avez
la possibilit d'associer LDmicro avec les fichiers d'extention .ld.
Ceci permet  LDmicro de dmarrer automatiquement lors d'un double clic
sur un fichier  xxx.ld.

Si les arguments de la ligne de commande sont passs sous la forme:
`ldmicro.exe /c src.ld dest.hex', LDmicro compilera le programme`src.ld',
et sauvegardera le fichier compil sous`dest.hex'. Aprs compilation
LDmicro se termine, que la compilation soit correcte ou pas. Aucun
message n'est affich sur la console. Ce mode est pratique uniquement
lorsque vous excutez LDmicro en ligne de commande.


BASES
=====

Si vous excutez LDmicro sans arguments de ligne de commande, il dmarre
avec un programme vide. Si vous dmarrer avec le nom d'un programme
langage  contacts (xxx.ld) en ligne de commande, il va essayer de
charger le programme au dmarrage. LDmicro utilise son format interne
pour le programme , il ne peut pas importer de programmes dits par
d'autres outils.

Si vous ne chargez pas un programme existant, LDmicro dmarre en insrant
une ligne vide. Vous pouvez ajouter les instructions pour votre programme:
par exemple ajouter un jeu de contacts (Instruction -> Insrer Contact)
qui sera nomm `Xnew'. `X' dsigne un contact qui peut tre li  une
broche d'entre du microcontroleur, vous pouvez affecter la broche pour
ce contact plus tard aprs avoir choisi le microcontroleur et renomm
les contacts. La premire lettre indique de quel type de composants il
s'agit par exemple :

    * Xnom  -- Reli  une broche d'entre du microcontroleur
    * Ynom  -- Reli  une broche de sortie du microcontroleur
    * Rnom  -- `Relais interne': un bit en mmoire
    * Tnom  -- Temporisation; Tempo travail, tempo repos, ou totalisatrice
    * Cnom  -- Compteur, Compteur ou dcompteur
    * Anom  -- Un entier lu sur un comvertisseur A/D
    * nom   -- Variable gnrique (Entier : Integer)

Choisir le reste du nom pour dcrire l'utilisation de ce que fait cet
objet et qui doit tre unique dans tout le programme. Un mme nom doit
toujours se rfrer au mme objet dans le programme en entier.Par
exemple , vous aurez une erreur si vous utilisez une tempo travail
(TON) appelle TDelai et une tempo repos (TOF) appelle aussi TDelai
dans le mme programme, le comptage effectu par ces tempo utilisera le
mme emplacement en mmoire, mais il est acceptable d'avoir une tempo
sauvegarde (RTO) Tdelai mme nom avec une instruction de RES, dans ce
cas l'instruction fonctionne avec le mme timer.

Les noms de variables peuvent tre des lettres, chiffres ou le
caractre _.  Un nom de variable ne doit pas commencer par un chiffre.
Les noms de variables sont sensibles  la casse (majuscule/minuscules).

Les instructions de manipulation de variables (MOV, ADD, EQU,
etc.) peuvent travailler avec des variables de n'importe quel nom. Elles
peuvent avoir accs aux accumulateurs des temporisations ou des
compteurs. Cela peut quelquefois tre trs utile, par exemple si vous
voulez contrler la valeur d'un compteur ou d'une temporisation dans
une ligne particulire.

Les variables sont toujours des entiers 16 bits. Leur valeur peut
donc tre comprise entre -32768 et 32767 inclus. Les variables sont
toujours signes.  Vous pouvez les spcifier de faon littrale comme
des nombres dcimaux normaux (0, 1234, -56), vous pouvez aussi les
spcifier en caractres ASCII ('A', 'z') en mettant le caractre entre
des guillemets simples. Vous pouvez utiliser un caractre ASCII dans la
majorit des endroits o vous pouvez utiliser les nombres dcimaux.

En bas de l'cran, vous pouvez voir la liste de tous les objets
utiliss dans votre programme. La liste est automatiquement gnre
 partir du programme.  La majorit des objets ne necessitent aucune
configuration. Seuls : les objets `Xnom', `Ynom', and `Anom' doivent tre
affects  une broche du micro La premire chose  faire est de choisir
la microcontroleur utilis : Paramres -> Microcontroleur ensuite vous
affectez les broches en faisant un double clic dans la liste.

Vous pouvez modifier le programme en insrant ou supprimant des
instructions.  Le curseur clignote dans la programme pour indiquer
l'instruction courante slectionne et le point d'insertion. S'il ne
clignote pas pressez <Tab> ou cliquer sur une instruction, ou vous
pouvez insrer une nouvelle instruction  la droite ou  la gauche
(en srie avec), ou au dessous ou au dessus (en parallle avec) de
l'instruction slectionne. Quelques oprations ne sont pas permises ,
par exemple aucune instruction permise  droite de la bobine.

Le programme dmarre avec uniquement une ligne. Vous pouvez ajouter
plusieurs lignes en slectionnant Insertion -> Ligne avant ou aprs
dans le menu. Vous pouvez faire un circuit complexe en plaant plusieurs
branches en parallle ou en srie avec une ligne, mais il est plus clair
de faire plusieurs lignes.

Une fois votre programme crit, vous pouvez le tester par simulation,
et le compiler dans un fichier HEX pour le microcontroleur de destination.

SIMULATION
==========

Pour entrer dans la mode simulation choisir Simulation -> Simuler
ou presser <Ctrl+M> le programme est affich diffremment en mode
simulation. Les instructions actives sont affiches en rouge vif, les
instructions qui ne le sont pas sont affiches en gris. Appuyer sur la
barre d'espace pour dmarrer l'API pour 1 cycle. Pour faire fonctionner
continuellement en temps rel choisir Simulation ->Dmarrer la simulation
en temps rel ou presser <Ctrl+R> L'affichage du programme est mise 
jour en temps rel en fonction des changements d'tat des entres.

Vous pouvez valider l'tat des entres du programme en faisant un
double clic sur l'entre dans la liste au bas de l'cran, ou sur le
contact `Xnom' de l'instruction dans le programme, pour avoir le reflet
automatiquement de la validation d'une entre dans le programme, il
faut que le programme soit en cycle.(le dmarrer par <Ctrl+R> ou barre
d'espace pour un seul cycle).

COMPILER EN CODE NATIF
======================

Le point final est de gnrer un fichier .HEX qui sera programm dans le
microcontroleur que vous avez choisi par Paramtres -> Microcontroleur
Vous devez affecter les broches d'entres sorties pour chaque 'Xnom'
et 'Ynom'. Vous pouvez faire cela en faisant un double clic sur la nom
de l'objet dans la liste au bas de l'cran. Une boite de dialogue vous
demande de choisir une des broches non affectes dans la liste.

Vous devez aussi choisir la temps de cycle que voulez utiliser pour
votre application, vous devez aussi choisir la frquence d'horloge du
processeur.  Faire Paramtres -> Paramtres MCU dans le menu. En gnral,
le temps de cycle peut tre laiss  la valeur par dfaut (10 ms) qui est
une bonne valeur pour la majorit des applications. Indiquer la frquence
du quartz utilis (ou du rsonateur cramique ou autres..) et cliquer OK.

Maintenant vous pouvez crer le fichier pour intgrer dans le
microcontroleur. Choisir  Compilation -> Compiler, ou compiler sous...
Si vous avez prcdemment compil votre programme, vous pouvez spcifier
un nom diffrent de fichier de sortie. Si votre programme ne comporte
pas d'erreur (li  la structure du programme), LDmicro gnre un fichier
IHEX prt  tre programm dans le chip.

Utilisez votre logiciel et matriel de programmation habituel pour
charger le fichier HEX dans la microcontroleur. Vrifiez et validez
les bits de configuration (fuses), pour les processeurs PIC16Fxxx ces
bits sont inclus dans le fichier HEX, et la majorit des logiciels de
programmation les valident automatiquement, pour les processeurs AVR ,
vous devez le faire manuellement.

REFERENCE DES INSTRUCTIONS
==========================

> CONTACT, NORMALLEMENT OUVERT  Xnom            Rnom          Ynom
                            ----] [----     ----] [----    ----] [----

    Si le signal arrivant  cette instruction est FAUX (0) le signal
    de sortie est aussi faux (0), s'il est vrai , il sera aussi vrai
    en sortie si et uniquement si la broche d'Entre ou de Sortie
    ou de Relais interne est vraie, sinon l'instruction sera fausse.
    Cette instruction peut vrifier l'tat d'une broche d'entre, d'une
    broche de sortie ou d'un relais interne


> CONTACT, NORMALLEMENT FERME    Xnom            Rnom          Ynom
                             ----]/[----     ----]/[----    ----]/[----

    Si le signal arrivant  cette instruction est FAUX (0) le signal
    de sortie est vrai (1), s'il est vrai , il sera faux en sortie .
    Cette instruction peut vrifier l'tat d'une broche d'entre, d'une
    broche de sortie ou d'un relais interne. Fonctionne en opposition
    par rapport au contact normallement ouvert.


> BOBINE, NORMALE                Rnom           Ynom
                             ----( )----     ----( )----

    Si le signal arrivant  cette instruction est faux, alors le relais
    interne ou la broche de sortie est faux (mise  zro). Si le signal
    arrivant  cette instruction est vrai(1), alors le relais interne ou
    la broche de sortie est valide (mise  1). Il n'est pas important
    d'affecter une variable  une bobine.
    Cette instruction est place le plus  droite dans une squence.


> BOBINE, INVERSE                Rnom         Ynom
                             ----(/)----     ----(/)----

    Si le signal arrivant  cette instruction est vrai, alors le relais
    interne ou la broche de sortie est faux (mise  zro). Si le signal
    arrivant  cette instruction est faux(0), alors le relais interne ou
    la broche de sortie est valide (mise  1). Il n'est pas important
    d'affecter une variable  une bobine.
    Cette instruction est place le plus  droite dans une squence.


> BOBINE, ACCROCHAGE             Rnom           Ynom
                             ----(S)----     ----(S)----

    Si le signal arrivant  cette instruction est vrai, alors le
    relais interne ou la broche de sortie est valide (mise  1). Cette
    instruction permet de changer l'tat d'un relais ou d'une sortie :
    uniquement passe  vrai, ou reste vrai si elle tait dj  1,
    elle est typiquement utilise en combinaison avec une Bobine REMISE
    A ZERO.
    Cette instruction est place le plus  droite dans une squence.


> BOBINE, REMISE A ZERO          Rnom           Ynom
                             ----(R)----     ----(R)----

    Si le signal arrivant  cette instruction est vrai, alors le relais
    interne ou la sortie est mise  zro (0), si elle tait dj  0,
    il n'y a aucun changement, cette instruction change l'tat d'une
    sortie uniquement si elle tait  1, cette instruction fonctionne en
    combinaison avec l'instruction ci-dessus Bobine  ACCROCHAGE.
    Cette instruction est place le plus  droite dans une squence.


> TEMPORISATION TRAVAIL         Tdon
                           -[TON 1.000 s]-

    Quand la signal arrivant  cette instruction passe de faux  vrai
    (0  1), le signal de sortie attend 1.000 seconde avant de passer
     1. Quand le signal de commande de cette instruction passe ZERO,
    le signal de sortie passe immdiatement  zro. La tempo est remise
     zro  chaque fois que l'entre repasse  zro. L'entre doit tre
    maintenue vraie  1 pendant au moins 1000 millisecondes conscutives
    avant que la sortie  ne devienne vraie. le dlai est configurable.

    La variable `Tnom' compte depuis zro en units de temps de scan.
    L'instruction Ton devient vraie en sortie quand la variable du
    compteur est plus grande ou gale au delai fix. Il est possible
    de manipuler la variable du compteur en dehors, par exemple par une
    instruction MOVE.


> TEMPORISATION REPOS           Tdoff
                           -[TOF 1.000 s]-

    Quand le signal qui arrive  l'instruction passe de l'tat vrai
    (1)  l'tat faux (0), la sortie attend 1.000 s avant de dvenir
    faux (0) Quand le signal arrivant  l'instruction passe de l'tat
    faux  l'tat vrai, le signal passe  vrai immdiatement. La
    temporisation est remise  zro  chaque fois que l'entre devient
    fausse. L'entre doit tre maintenue  l'tat faux pendant au moins
    1000 ms conscutives avant que la sortie ne passe  l'tat faux. La
    temporisation est configurable.

    La variable `Tname' compte depuis zro en units de temps de scan.
    L'instruction Ton devient vraie en sortie quand la variable du
    compteur est plus grande ou gale au delai fix. Il est possible
    de manipuler la variable du compteur en dehors, par exemple par une
    instruction MOVE.


> TEMPORISATION TOTALISATRICE           Trto
                                   -[RTO 1.000 s]-

    Cette instruction prend en compte le temps que l'entre a t  l'tat
    vrai (1). Si l'entre a t vraie pendant au moins 1.000s la sortie
    devient vraie (1).L'entre n'a pas besoin d'tre vraie pendant 1000 ms
    conscutives. Si l'entre est vraie pendant 0.6 seconde puis fausse
    pendant 2.0 secondes et ensuite vraie pendant 0.4 seconde, la sortie
    va devenir vraie. Aprs tre pass  l'tat vrai, la sortie reste
    vraie quelque soit la commande de l'instruction. La temporisation
    doit tre remise  zro par une instruction de RES (reset).

    La variable `Tnom' compte depuis zro en units de temps de scan.
    L'instruction Ton devient vraie en sortie quand la variable du
    compteur est plus grande ou gale au delai fix. Il est possible
    de manipuler la variable du compteur en dehors, par exemple par une
    instruction MOVE.


> RES Remise  Zro             Trto             Citems
                           ----{RES}----     ----{RES}----

    Cette instruction fait un remise  zro d'une temporisation ou d'un
    compteur. Les tempos TON et TOF sont automatiquement remisent  zro
    lorsque leurs entres deviennent respectivement fausses ou vraies,
    RES n'est pas donc pas ncessaire pour ces tempos. Les tempos RTO
    et les compteurs dcompteurs CTU / CTD ne sont pas remis  zro
    automatiquement, il faut donc utiliser cette instruction. Lorsque
    l'entre est vraie , le compteur ou la temporisation est remis 
    zro. Si l'entre reste  zro, aucune action n'est prise.
    Cette instruction est place le plus  droite dans une squence.


> FRONT MONTANT                 _    _
                           --[_/ OSR/ \_]--

    La sortie de cette instruction est normallement fausse. Si
    l'instruction d'entre est vraie pendant ce scan et qu'elle tait
    fausse pendant le scan prcdent alors la sortie devient vraie. Elle
    gnre une impulsion  chaque front montant du signal d'entre. Cette
    instruction est utile si vous voulez intercepter le front montant
    du signal.


> FRONT DESCENDANT            _      _
                           --[ \_OSF/ \_]--

    La sortie de cette instruction est normallement fausse. Si
    l'instruction d'entre est fausse (0) pendant ce scan et qu'elle
    tait vraie (1) pendant le scan prcdent alors la sortie devient
    vraie. Elle gnre une impulsion  chaque front descendant du signal
    d'entre. Cette instruction est utile si vous voulez intercepter le
    front descendant d'un signal.


> COURT CIRCUIT (SHUNT), CIRCUIT OUVERT
                           ----+----+----      ----+     +----

    Une instruction shunt donne en sortie une condition qui est toujours
    gale  la condition d'entre. Une instruction Circuit Ouvert donne
    toujours une valeur fausse en sortie.
    Ces instructions sont en gnral utilises en phase de test.


> RELAIS DE CONTROLE MAITRE
                           -{MASTER RLY}-

    Par dfaut, la condition d'entre d'une ligne est toujours vraie. Si
    une instruction Relais de contrle maitre est excute avec une
    valeur d'entre fausse, alors toutes les lignes suivantes deviendront
    fausses. Ceci va continuer jusqu' la rencontre de la prochaine
    instruction relais de contrle maitre qui annule l'instruction de
    dpart. Ces instructions doivent toujours tre utilises par paires:
    une pour commencer (qui peut tre sous condition) qui commence la
    partie dactive et une pour la terminer.


> MOUVOIR                   {destvar :=  }      {Tret :=     }
                           -{ 123     MOV}-    -{ srcvar  MOV}-

    Lorsque l'entre de cette instruction est vraie, elle va mettre la
    variable de destination  une valeur gale  la variable source ou 
    la constante source. Quand l'entre de cette instruction est fausse
    rien ne se passe. Vous pouvez affecter n'importe quelle variable
     une instruction de dplacement, ceci inclu l'tat de variables
    compteurs ou temporisateurs qui se distinguent par l'entte T ou
    C. Par exemple mettre 0 dans Tsauvegard quivaut  faire une RES
    de la temporisation.  Cette instruction doit tre compltement 
    droite dans une squence.


> OPERATIONS ARITHMETIQUES   {ADD  kay  :=}       {SUB  Ccnt :=}
                            -{ 'a' + 10   }-     -{ Ccnt - 10  }-

>                            {MUL  dest :=}       {DIV  dv :=  }
                            -{ var * -990 }-     -{ dv / -10000}-

    Quand l'entre de cette instruction est vraie, elle place en
    destination la variable gale  l'expression calcule. Les oprandes
    peuvent tre des variables (en incluant les variables compteurs et
    tempos) ou des constantes. Ces instructions utilisent des valeurs 16
    bits signes. Il faut se souvenir que le rsultat est valu  chaque
    cycle tant que la condition d'entre est vraie. Si vous incrmentez
    ou dcrmentez une variable (si la variable de destination est
    aussi une des oprandes), le rsultat ne sera pas celui escompt,
    il faut utiliser typiquement un front montant ou descendant de la
    condition d'entre qui ne sera valu qu'une seule fois. La valeur
    est tronque  la valeur entire.  Cette instruction doit tre
    compltement  droite dans une squence.


> COMPARER              [var ==]        [var >]        [1 >=]
                       -[ var2 ]-      -[ 1   ]-      -[ Ton]-

>                       [var !=]       [-4 <   ]       [1 <=]
                       -[ var2 ]-     -[ vartwo]-     -[ Cup]-

    Si l'entre de cette instruction est fausse alors la sortie est
    fausse.  Si l'entre est vraie, alors la sortie sera vraie si et
    uniquement si la condition de sortie est vraie. Cette instruction
    est utilise pour comparer (Egalit, plus grand que,plus grand ou
    gal , ingal, plus petit que, plus petit ou gal ) une variable 
    une autre variable, ou pour comparer une variable avec une constante
    16 bits signe.


> COMPTEUR DECOMPTEUR          Cnom           Cnom
                           --[CTU >= 5]--  --[CTD > -5]--

    Un compteur incrmente ( Compteur CTU, count up) ou dcrmente
    (Dcompteur CTD, count down) une variable  chaque front montant de
    la ligne en condition d'entre (CAD quand la signal passe de l'tat
    0  l'tat 1. La condition de sortie du compteur est vraie si la
    variable du compteur est gale ou plus grande que 5 (dans l'exemple),
    et faux sinon. La condition de sortie de la ligne peut tre vraie,
    mme si la condition d'entre est fausse, cela dpend uniquement de la
    valeur de la variable du compteur. Vous pouvez avoir un compteur ou
    un dcompteur avec le mme nom, qui vont incrmnter ou decrmenter
    une variable.  L'instruction Remise  Zro permet de resetter un
    compteur (remettre  zro), il est possible de modifier par des
    oprations les variables des compteurs dcompteurs.


> COMPTEUR CYCLIQUE             Cnom
                           --{CTC 0:7}--

    Un compteur cyclique fonctionne comme un compteur normal
    CTU, exception faite, lorsque le compteur arrive  sa
    limite suprieure, la variable du compteur revient  0. dans
    l'exemple la valeur du compteur volue de la faon suivante :
    0,1,2,4,5,6,7,0,1,2,3,4,5,6,7,0,1,3,4,5,etc. Ceci est trs pratique
    en conbinaison avec des intructions conditionnelles sur la variable
    Cnom. On peut utiliser ceci comme un squenceur, l'horloge du compteur
    CTC est valide par la condition d'entre associe  une instruction
    de front montant.
    Cette instruction doit tre compltement  droite dans une squence.


> REGISTRE A DECALAGE       {SHIFT REG   }
                           -{ reg0..3    }-

    Un registre  dcalage est associ avec un jeu de variables. Le
    registre  dcalage de l'exemple donn est associ avec les
    variables`reg0', `reg1', `reg2', and `reg3'. L'entre du registre 
    dcalage est `reg0'. A chaque front montant de la condition d'entre
    de la ligne, le registre  dcalage va dcaler d'une position 
    droite. Ce qui donne `reg3 := reg2', `reg2 := reg1'. et `reg1 :=
    reg0'.`reg0' est  gauche sans changement. Un registre  dcalage
    de plusieurs lments peut consommer beaucoup de place en mmoire.
    Cette instruction doit tre compltement  droite dans une squence.


> TABLEAU INDEXE            {dest :=     }
                           -{ LUT[i]     }-

    Un tableau index et un groupe ordonn de n valeurs Quand la condition
    d'entre est vraie, la variable entire `dest' est mise  la valeur
    correspondand  l'index i du tableau. L'index est compris entre 0 et
    (n-1). Le comportement de cette instruction est indfini si l'index
    est en dehors du tableau
    Cette instruction doit tre compltement  droite dans une squence.


> TABLEAU ELEMENTS LINEAIRES {yvar :=     }
                            -{ PWL[xvar]  }-

    C'est une bonne mthode pour valuer de faon approximative une
    fonction complique ou une courbe. Trs pratique par exemple pour
    appliquer une courbe de calibration pour linariser tension de sortie
    d'un capteur dans une unit convenable.

    Supposez que vous essayez de faire une fonction pour convertir une
    variable d'entre entire, x, en une variable de sortie entire, y,
    vous connaissez la fonction en diffrents points, par exemple vous
    connaissez :

        f(0)   = 2
        f(5)   = 10
        f(10)  = 50
        f(100) = 100

    Ceci donne les points

        (x0, y0)   = (  0,   2)
        (x1, y1)   = (  5,  10)
        (x2, y2)   = ( 10,  50)
        (x3, y3)   = (100, 100)

    lis  cette courbe. Vous pouvez entrer ces 4 points dans un
    tableau associ  l'instruction tableau d'lments linaires. Cette
    instruction regarde la valeur de xvar et fixe la valeur de yvar
    correspondante. Par exemple si vous mettez xvar = 10 , l'instruction
    validera yvar = 50.

    Si vous mettez une instruction avec une valeur xvar entre deux valeurs
    de x du tableau (et par consquence aussi de yvar). Une moyenne
    proportionnelle entre les deux valeurs , prcdente et suivante de
    xvar et de la valeur lie yvar, est effectue. Par exemple xvar =
    55 donne en sortie yvar = 75 Les deux points xvar (10.50) et yvar
    (50,75) , 55 est la moyenne entre 10 et 100 et 75 est la moyenne
    entre 50 et 100, donc (55,75) sont lis ensemble par une ligne de
    connection qui connecte ces deux points.

    Ces points doivent tre spcifis dans l'ordre ascendant des
    coordonnes x.  Il peut tre impossible de faire certaines oprations
    mathmatiques ncessaires pour certains tableaux, utilisant des
    entiers 16 bits. Dans ce LDmicro va provoquer une alarme. Ce tableau
    va provoquer une erreur :

        (x0, y0)    = (  0,   0)
        (x1, y1)    = (300, 300)

    Vous pouvez supprimer ces erreurs en diminuant l'cart entre les
    points du tableau, par exemple ce tableau est quivalent  celui ci
    dessus , mais ne provoque pas d'erreur:

        (x0, y0)    = (  0,   0)
        (x1, y1)    = (150, 150)
        (x2, y2)    = (300, 300)

    Il n'est pratiquement jamais ncessaire d'utiliser plus de 5 ou
    6 points.  Ajouter des points augmente la taille du code et diminue
    sa vitesse d'excution. Le comportement, si vous passez une valeur
     xvar plus grande que la plus grande valeur du tableau , ou plus
    petit que la plus petite valeur, est indfini.
    Cette instruction doit tre compltement  droite dans une squence.


> LECTURE CONVERTISSEUR A/D    Anom
                           --{READ ADC}--

    LDmicro peut gnrer du code pour utiliser les convertisseurs A/D
    contenus dans certains microcontroleurs. Si la condition d'entre
    de l'instruction est vraie, alors une acquisition du convertisseur
    A/D est ffectue et stocke dans la variable Anom. Cette variable
    peut tre par la suite traite comme les autres variables par les
    diffrentes oprations arithmtiques ou autres. Vous devez affecter
    une broche du micro  la variable Anom de la mme faon que pour
    les entres et sorties digitales par un double clic dans la list
    affiche au bas de l'cran. Si la condition d'entre de la squence
    est fausse la variable Anom reste inchange.

    Pour tous les circuits supports actuellement, 0 volt en entre
    correspond  une lecture ADC de 0, et une valeur gale  VDD (la
    tension d'alimentation ) correspond  une lecture ADC de 1023. Si
    vous utilisez un circuit AVR, vous devez connecter Aref  VDD.

    Vous pouvez utiliser les oprations arithmtiques pour mettre 
    l'chelle les lectures effectues dans l'unit qui vous est la plus
    approprie. Mais souvenez vous que tous les calculs sont faits en
    utilisant les entiers.

    En gnral, toutes les broches ne sont pas utilisables pour les
    lecture de convertisseur A/D. Le logiciel ne vous permet pas
    d'affecter une broche non A/D pour une entre convertisseur.
    Cette instruction doit tre compltement  droite dans une squence.


> FIXER RAPPORT CYCLE PWM    duty_cycle
                           -{PWM 32.8 kHz}-

    LDmicro peut gnrer du code pour utiliser les priphriques PWM
    contenus dans certains microcontroleurs. Si la condition d'entre
    de cette instruction est vraie, le rapport de cycle du priphrique
    PWM va tre fix  la valeur de la variable Rapport de cycle PWM.
    Le rapport de cycle est un nombre compris entre 0 (toujours au
    niveau bas) et 100 (toujours au niveau haut). Si vous connaissez la
    manire dont les priphriques fonctionnent vous noterez que LDmicro
    met automatiquement  l'chelle la variable du rapport de cycle en
    pourcentage de la priode d'horloge PWM.

    Vous pouvez spcifier la frquence de sortie PWM, en Hertz. Le
    frquence que vous spcifiez peut ne pas tre exactement accomplie, en
    fonction des divisions de la frquence d'horloge du microcontroleur,
    LDmicro va choisir une frquence approche. Si l'erreur est trop
    importante, il vous avertit.Les vitesses rapides sont au dtriment
    de la rsolution. Cette instruction doit tre compltement  droite
    dans une squence.

    Le runtime du language  contacts consomme un timers (du micro) pour
    le temps de cycle, ce qui fait que le PWM est uniquement possible
    avec des microcontroleurs ayant au moins deux timers utilisables.
    PWM utilise CCP2 (pas CCP1) sur les PIC16F et OC2(pas OC1) sur les
    Atmel AVR.

> METTRE PERSISTANT          saved_var
                           --{PERSIST}--

    Quand la condition d'entre de cette instruction est vraie, la
    variable entire spcifie va tre automatiquement sauvegarde en
    EEPROM, ce qui fait que cette valeur persiste mme aprs une coupure
    de l'alimentation du micro. Il n'y a pas  spcifier ou elle doit
    tre sauvegarde en EEPROM, ceci est fait automatiquement, jusqu'a
    ce quelle change  nouveau.  La variable est automatiquement charge
     partir de l'EEPROM suite  un reset  la mise sous tension.

    Si une variables, mise persistante, change frquemment, l'EEPROM de
    votre micro peut tre dtruite trs rapidement, Le nombre de cycles
    d'criture dans l'EEPROM est limit  environ 100 000 cycles Quand
    la condition est fausse, rien n'apparait. Cette instruction doit
    tre compltement  droite dans une squence.


> RECEPTION UART (SERIE)         var
                           --{UART RECV}--

    LDmicro peut gnrer du code pour utiliser l'UART, existant dans
    certains microcontroleurs. Sur les AVR, avec de multiples UART,
    uniquement l'UART1 est utilisable (pas l'UART0). Configurer la
    vitesse en utilisant -> Paramtres -> Paramtres MCU. Toutes les
    vitesses de liaison ne sont pas utilisables avec tous les quartz de
    toutyes les frquences. Ldmicro vous avertit dans ce cas.

    Si la condition d'entre de cette instruction est fausse, rien ne se
    passe. Si la condition d'entre est vraie, elle essaie de recevoir
    un caractre en provenance de l'UART. Si aucun caractre n'est lu
    alors la condition de sortie devient fausse. Si un caractre est
    lu la valeur ASCII est stocke dans 'var' et la condition de sortie
    est vraie pour un seul cycle API.


> EMMISION UART (SERIE)          var
                           --{UART SEND}--

    LDmicro peut gnrer du code pour utiliser l'UART, existant dans
    certains microcontroleurs. Sur les AVR, avec de multiples UART,
    uniquement l'UART1 est utilisable (pas l'UART0). Configurer la
    vitesse en utilisant -> Paramtres -> Paramtres MCU. Toutes les
    vitesses de liaison ne sont pas utilisables avec tous les quartz
    de toutyes les frquences. Ldmicro vous avertit dans ce cas.

    Si la condition d'entre de cette instruction est fausse, rien ne
    se passe. Si la condition d'entre est vraie alors cette instruction
    crit un seul caractre vers l'UART. La valeur ASCII du caractre 
    transmettre doit avoir t stock dans 'var' par avance. La condition
    de sortie de la squence est vraie, si l'UART est occupe (en cours
    de transmission d'un caractre), et fausse sinon.

    Rappelez vous que les caractres mettent un certain temps pour tre
    transmis. Vrifiez la condition de sortie de cette instruction pour
    vous assurer que le premier caractre  bien t transmis, avant
    d'essayer d'envoyer un second caractre, ou utiliser une temporisation
    pour insrer un dlai entre caractres; Vous devez uniquement vrifier
    que la condition d'entre est vraie (essayez de transmettre un
    caractre) quand la condition de sortie est fausse(UART non occuppe).

    Regardez l'instruction Chaine formatte(juste aprs) avant d'utiliser
    cette instruction, elle est plus simple  utiliser, et dans la
    majorit des cas, est capable de faire ce dont on a besoin.


> CHAINE FORMATTEE SUR UART                var
                                   -{"Pression: \3\r\n"}-

    LDmicro peut gnrer du code pour utiliser l'UART, existant dans
    certains microcontroleurs. Sur les AVR, avec de multiples UART,
    uniquement l'UART1 est utilisable (pas l'UART0). Configurer la
    vitesse en utilisant -> Paramtres -> Paramtres MCU. Toutes les
    vitesses de liaison ne sont pas utilisables avec tous les quartz
    de toutyes les frquences. Ldmicro vous avertit dans ce cas.

    Quand la condition d'entre de cette instruction passe de faux  vrai,
    elle commence  envoyer une chaine complte vers le port srie. Si
    la chaine comporte la squence spciale '3', alors cette squence
    va tre remplace par la valeur de 'var', qui est automatiquement
    converti en une chaine. La variable va tre formatte pour prendre
    exactement trois caractres; par exemple si var = 35, la chaine
    exacte qui va tre "imprime" sera 'Pression:  35\r\n' (notez les
    espaces supplmentaires). Si au lieu de cela var = 1432 , la sortie
    est indfinie parceque 1432 comporte plus de 3 digits. Dans ce cas
    vous devez ncessairement utiliser '\4'  la place.

    Si la variable peut tre ngative, alors utilisez '\-3d' (ou `\-4d'
    etc.)  la place. Ceci oblige LDmicro  imprimer un espace d'entte
    pour les nombres positifs et un signe moins d'entte pour les chiffres
    ngatifs.

    Si de multiples instructions de chaines formattes sont actives au
    mme moment (ou si une est active avant de finir la prcdente)
    ou si ces instructions sont imbriques avec des instructions TX
    (transmission), le comportement est indfini.

    Il est aussi possible d'utiliser cette instruction pour sortie une
    chaine fixe, sans l'intervention d'une variable en valeur entire
    dans le texte qui est envoye sur la ligne srie. Dans ce cas,
    simplement ne pas inclure de squence spciale Escape.

    Utiliser `\\' pour l'anti-slash. en addition  une squence escape
    pour intervenir sue une variables entire, les caractres de
    contrles suivants sont utilisables :

        * \r   -- retour en dbut de ligne
        * \n   -- nouvelle ligne
        * \f   -- saut de page
        * \b   -- retour arrire
        * \t   -- horizontal tab
        * \v   -- vertical tab
        * \a   -- alert
        * \xAB -- caractre avec valeur ASCII  0xAB (hex)

    La condition de sortie de cette instruction est vraie quand elle
    transmet des donnes, sinon elle est fausse. Cette instruction
    consomme une grande quantit de mmoire, elle doit tre utilise
    avec modration. L'implmentation prsente n'est pas efficace, mais
    une meilleure implmentation demanderait une modification de tout
    le reste.

NOTE CONCERNANT LES MATHS
=========================

Souvenez vous que LDmicro travaille uniquement en mathmatiques entiers
16 bits. Ce qui fait que le rsultat final de mme que tous les calculs
mmes intermdiaires seront compris entre -32768 et 32767.

Par exemple, si vous voulez calculer y = (1/x)*1200,ou x est compris
entre 1 et 20, ce qui donne un rsultat entre 1200 et 60,le rsultat est
bien  l'intrieur d'un entier 16 bits, il doit donc tre thoriquement
possible de faire le calcul. Nous pouvons faire le calcul de deux faons
d'abord faire 1/x et ensuite la multiplication:

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

Ou uniquement faire simplement la division en une seule ligne :

   ||           {DIV  y  :=}           ||
   ||-----------{ 1200 / x }-----------||

Mathmatiquement c'est identique, la premire donne y = 0 , c'est  dire
une mauvais rsultat, si nous prenons par exemple x = 3 , 1/x = 0.333 mais
comme il s'agit d'un entier, la valeur pour Temp est de 0 et 0*1200 = 0
donc rsultat faux.Dans le deuxime cas, il n'y a pas de rsultat
intermdiaire et le rsultat est correct dans tous les cas.

Si vous trouvez un problme avec vos calculs mathmatiques, vrifiez les
rsultats intermdiaires, si il n'y a pas de dpassement de capacits par
rapports aux valeurs entires. (par exemple 32767 + 1 = -32768). Quand
cela est possible essayer de choisir des valeurs entre -100 et 100.

Vous pouvez utiliser un certain facteur de multiplication ou division pour
mettre  l'echelle les variables lors de calculs par exemple : pour mettre
mettre  l'echelle y = 1.8*x , il est possible de faire y =(9/5)*x
(9/5 = 1.8) et coder ainsi y = (9*x)/5 en faisant d'abord la multiplication

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

Ceci fonctionne tant que  x < (32767 / 9), or x < 3640. Pour les grandes
valeurs de x,la variable `temp' va se mettre en dpassement. Ceci est
similaire vers la limite basse de x.


STYLE DE CODIFICATION
=====================

Il est permis d'avoir plusieurs bobines en parallle, contrles par
une simple ligne comme ci-dessous :

   ||       Xa               Ya        ||
 1 ||-------] [--------------( )-------||
   ||                                  ||
   ||       Xb               Yb        ||
   ||-------] [------+-------( )-------||
   ||                |                 ||
   ||                |       Yc        ||
   ||                +-------( )-------||
   ||                                  ||

 la place de ceci :

   ||       Xa               Ya        ||
 1 ||-------] [--------------( )-------||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||       Xb               Yb        ||
 2 ||-------] [--------------( )-------||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||       Xb               Yc        ||
 3 ||-------] [--------------( )-------||
   ||                                  ||

Il est permis thoriquement d'crire un programme avec une squence trs
importante et de ne pas utiliser plusieurs lignes pour la faire. En
pratique c'est une mauvaise ide,  cause de la complxit que cela
peut engendrer et plus difficile  diter sans effacer et redessiner un
certain nombre d'lments de logique.

Nanmoins, c'est une bonne ide de regrouper diffrents lments d'un bloc
logique dans une seule squence. Le code gnr est identique dans les
deux cas, et vous pouvez voir ce que fait la squence dans le diagramme
 contacts.

                  *                 *                  *

En gnral, il est considr comme mauvais d'crire du code dont la
sortie dpend de l'ordre d'excution. Exemple : ce code n'est pas trs
bon lorsque xa et xb sont vrai en mme temps :

   ||       Xa         {v  :=       }  ||
 1 ||-------] [--------{ 12      MOV}--||
   ||                                  ||
   ||       Xb         {v  :=       }  ||
   ||-------] [--------{ 23      MOV}--||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||      [v >]             Yc        ||
 2 ||------[ 15]-------------( )-------||
   ||                                  ||

Ci-dessous un exemple pour convertir 4 bits Xb3:0 en un entier :

   ||                                   {v  :=       }  ||
 3 ||-----------------------------------{ 0       MOV}--||
   ||                                                   ||
   ||       Xb0                  {ADD  v  :=}           ||
   ||-------] [------------------{ v + 1    }-----------||
   ||                                                   ||
   ||       Xb1                  {ADD  v  :=}           ||
   ||-------] [------------------{ v + 2    }-----------||
   ||                                                   ||
   ||       Xb2                  {ADD  v  :=}           ||
   ||-------] [------------------{ v + 4    }-----------||
   ||                                                   ||
   ||       Xb3                  {ADD  v  :=}           ||
   ||-------] [------------------{ v + 8    }-----------||
   ||                                                   ||

Si l'instruction MOV est dplace en dessous des instructions ADD, la
valeur de la variable v, quand elle est lue autrepart dans le programme,
serait toujours 0. La sortie du code dpend alors de l'ordre d'valuations
des instructions. Ce serait possible de modifier ce code pour viter cela,
mais le code deviendrait trs encombrant.

DEFAUTS
=======

LDmicro ne gnre pas un code trs efficace; il est lent  excuter et
il est gourmand en Flash et RAM. Un PIC milieu de gamme ou un AVR peut
tout de mme faire ce qu'un petit automate peut faire.

La longueur maximum des noms de variables est trs limite, ceci pour
tre intgre correctement dans le diagramme logique, je ne vois pas de
solution satisfaisante pour solutionner ce problme.

Si votre programme est trop important, vitesse excution, mmoire
programme ou contraintes de mmoire de donnes pour le processeur que vous
avez choisi, il n'indiquera probablement pas d'erreur. Il se blocquera
simplement quelque part.

Si vous tes programmeur ngligent dans les sauvegardes et les
chargements, il est possible qu'un crash se produise ou excute un code
arbitraire corrompu ou un mauvais fichier .ld .

SVP, faire un rapport sur les bogues et les demandes de modifications.

Thanks to:
    * 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

Particular thanks to Marcel Vaufleury, for this translation (of both
the manual and the program's user interface) into French.


COPYING, AND DISCLAIMER
=======================

DO NOT USE CODE GENERATED BY LDMICRO IN APPLICATIONS WHERE SOFTWARE
FAILURE COULD RESULT IN DANGER TO HUMAN LIFE OR DAMAGE TO PROPERTY. THE
AUTHOR ASSUMES NO LIABILITY FOR ANY DAMAGES RESULTING FROM THE OPERATION
OF LDMICRO OR CODE GENERATED BY LDMICRO.

This program is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.


Jonathan Westhues

Rijswijk      -- Dec 2004
Waterloo ON   -- Jun, Jul 2005
Cambridge MA  -- Sep, Dec 2005
                 Feb, Mar 2006

Email: user jwesthues, at host cq.cx


