Exercice N°7 - Jeux de Lumière RX-TX - Programmation Structurée --------------------------------------------------------------- Avant de commencer à définir les tâches réalisées par chaque élément du système, il serait bon de déterminer avec précision le protocole utilisé pour l'échange des informations entre les deux cartes. Les éléments à transmettre sont : - L'état du système (ON ou OFF) - Le n° de l'effet (entre 0 et 7) - La vitesse (entre 0 et 255) - La puissance d'éclairage (Entre 0 et 7) La transmission se fera de manière classique en RS232 : - 19200 Bauds - 8 bits de datas - 1 StartBit - 1 StopBit - Pas de Parité Vu la quantité de données à transmettre, il est possible d'utiliser deux octets pour la transmission. Le premier octet sera "construit" à partir du n° d'effet (3 bits), de la puissance (3 bits) et de l'état du système (1 bit). Le deuxième octet reprendra la valeur de la vitesse sur 8 Bits. Un troisième octet sera ajouté avec un checksum construit de la manière suivante : Nibble de poids faible : total des 0 Nibble de poids fort : total des 1 La définition du premier octet sera la suivante : Bit - Valeur 7 - Etat (0=OFF - 1=ON) 6 - \ 5 - > Puissance (0=faible - 7=fort) 4 - / 3 - (non utilisé) 2 - \ 1 - > N° de l'effet (de 0 à 7) 0 - / Après réception des valeurs, la carte de puissance renvoie un ACK sous la forme de 1 octet qui sera constitué du checksum qui sera calculé de la même manière que dans la carte de commande. Si les 2 checksums ne sont pas identiques, les commandes sont réenvoyées jusqu'à ce que les checksums soient identiques. Les "effets" lumineux se feront sur 8 sorties. Effet n°1 (16 pas) (Marche avant) -------------------------------- 00 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $80/00 - 128/000 01 - 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $40/00 - 064/000 02 - 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 - $20/00 - 032/000 03 - 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 - $10/00 - 016/000 04 - 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - $08/00 - 008/000 05 - 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - $04/00 - 004/000 06 - 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 - $02/00 - 002/000 07 - 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 - $01/00 - 001/000 08 - 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 - $00/80 - 000/128 09 - 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 - $00/40 - 000/064 10 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 - $00/20 - 000/032 11 - 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 - $00/10 - 000/016 12 - 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 - $00/08 - 000/008 13 - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 - $00/04 - 000/004 14 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 - $00/02 - 000/002 15 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - $00/01 - 000/001 Effet n°2 (16 pas) (Marche arrière) ---------------------------------- 00 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - $00/01 - 000/001 01 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 - $00/02 - 000/002 02 - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 - $00/04 - 000/004 03 - 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 - $00/08 - 000/008 04 - 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 - $00/10 - 000/016 05 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 - $00/20 - 000/032 06 - 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 - $00/40 - 000/064 07 - 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 - $00/80 - 000/128 08 - 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 - $01/00 - 001/000 09 - 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 - $02/00 - 002/000 10 - 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - $04/00 - 004/000 11 - 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - $08/00 - 008/000 12 - 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 - $10/00 - 016/000 13 - 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 - $20/00 - 032/000 14 - 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $40/00 - 064/000 15 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $80/00 - 128/000 Effet n°3 (30 pas) (Aller & Retour) ----------------------------------- 00 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $80/00 - 128/000 01 - 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $40/00 - 064/000 02 - 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 - $20/00 - 032/000 03 - 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 - $10/00 - 016/000 04 - 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - $08/00 - 008/000 05 - 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - $04/00 - 004/000 06 - 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 - $02/00 - 002/000 07 - 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 - $01/00 - 001/000 08 - 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 - $00/80 - 000/128 09 - 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 - $00/40 - 000/064 10 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 - $00/20 - 000/032 11 - 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 - $00/10 - 000/016 12 - 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 - $00/08 - 000/008 13 - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 - $00/04 - 000/004 14 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 - $00/02 - 000/002 15 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - $00/01 - 000/001 16 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 - $00/02 - 000/002 17 - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 - $00/04 - 000/004 18 - 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 - $00/08 - 000/008 19 - 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 - $00/10 - 000/016 20 - 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 - $00/20 - 000/032 21 - 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 - $00/40 - 000/064 22 - 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 - $00/80 - 000/128 23 - 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 - $01/00 - 001/000 24 - 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 - $02/00 - 002/000 25 - 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 - $04/00 - 004/000 26 - 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 - $08/00 - 008/000 27 - 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 - $10/00 - 016/000 28 - 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 - $20/00 - 032/000 29 - 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $40/00 - 064/000 Effet n°4 (15 pas) (Croisement) ------------------------------- 00 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - $80/01 - 128/001 01 - 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 - $40/02 - 064/002 02 - 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 - $20/04 - 032/004 03 - 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 - $10/08 - 016/008 04 - 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 - $08/10 - 008/016 05 - 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 - $04/20 - 004/032 06 - 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 - $02/40 - 002/064 07 - 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 - $01/80 - 001/128 08 - 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 - $01/80 - 001/128 09 - 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 - $02/40 - 002/064 10 - 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 - $04/20 - 004/032 11 - 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 - $08/10 - 008/016 12 - 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 - $10/08 - 016/008 13 - 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 - $20/04 - 032/004 14 - 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 - $40/02 - 064/002 Effet n°5 (16 pas) (remplissage par le centre) ---------------------------------------------- 00 - 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 - $01/80 - 001/128 01 - 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 - $03/C0 - 003/192 02 - 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 - $07/E0 - 007/224 03 - 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 - $0F/F0 - 015/240 04 - 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 - $1F/F8 - 031/248 05 - 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 - $3F/FC - 063/252 06 - 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 - $7F/FE - 127/254 07 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - $FF/FF - 255/255 08 - 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 - $7F/FE - 127/254 09 - 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 - $3F/FC - 063/252 10 - 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 - $1F/F8 - 031/248 11 - 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 - $0F/F0 - 015/240 12 - 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 - $07/E0 - 007/224 13 - 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 - $03/C0 - 003/192 14 - 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 - $01/80 - 001/128 15 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $00/00 - 000/000 Effet n°6 (16 pas) (remplissage par le bord) -------------------------------------------- 00 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - $80/01 - 128/001 01 - 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 - $C0/03 - 192/003 02 - 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 - $E0/07 - 224/007 03 - 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 - $F0/0F - 240/015 04 - 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 - $F8/1F - 248/031 05 - 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 - $FC/3F - 252/063 06 - 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 - $FE/7F - 254/127 07 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - $FF/FF - 255/255 08 - 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 - $FE/7F - 254/127 09 - 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 - $FC/3F - 252/063 10 - 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 - $F8/1F - 248/031 11 - 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 - $F0/0F - 240/015 12 - 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 - $E0/07 - 224/007 13 - 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 - $C0/03 - 192/003 14 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - $80/01 - 128/001 15 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $00/00 - 000/000 Effet n°7 (32 pas) (Remplissage par la gauche) ---------------------------------------------- 00 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $80/00 - 128/000 01 - 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $C0/00 - 192/000 02 - 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 - $E0/00 - 224/000 03 - 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 - $F0/00 - 240/000 04 - 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 - $F8/00 - 248/000 05 - 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 - $FC/00 - 252/000 06 - 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 - $FE/00 - 254/000 07 - 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 - $FF/00 - 255/000 08 - 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 - $FF/80 - 255/128 09 - 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 - $FF/C0 - 255/192 10 - 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 - $FF/E0 - 255/224 11 - 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 - $FF/F0 - 255/240 12 - 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 - $FF/F8 - 255/248 13 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 - $FF/FC - 255/252 14 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 - $FF/FE - 255/254 15 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - $FF/FF - 255/255 16 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 - $FF/FE - 255/254 17 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 - $FF/FC - 255/252 18 - 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 - $FF/F8 - 255/248 19 - 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 - $FF/F0 - 255/240 20 - 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 - $FF/E0 - 255/224 21 - 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 - $FF/C0 - 255/192 22 - 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 - $FF/80 - 255/128 23 - 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 - $FF/00 - 255/000 24 - 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 - $FE/00 - 254/000 25 - 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 - $FC/00 - 252/000 26 - 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 - $F8/00 - 248/000 27 - 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 - $F0/00 - 240/000 28 - 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 - $E0/00 - 224/000 29 - 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $C0/00 - 192/000 30 - 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $80/00 - 128/000 31 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $00/00 - 000/000 Effet n°8 (32 pas) (Remplissage par la droite) ---------------------------------------------- 00 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - $00/01 - 000/001 01 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 - $00/03 - 000/003 02 - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 - $00/07 - 000/007 03 - 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 - $00/0F - 000/015 04 - 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 - $00/1F - 000/031 05 - 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 - $00/3F - 000/063 06 - 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 - $00/7F - 000/127 07 - 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 - $00/FF - 000/255 08 - 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 - $01/FF - 001/255 09 - 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 - $03/FF - 003/255 10 - 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 - $07/FF - 007/255 11 - 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 - $0F/FF - 015/255 12 - 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 - $1F/FF - 031/255 13 - 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - $3F/FF - 063/255 14 - 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - $7F/FF - 127/255 15 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - $FF/FF - 255/255 16 - 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - $7F/FF - 127/255 17 - 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - $3F/FF - 063/255 18 - 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 - $1F/FF - 031/255 19 - 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 - $0F/FF - 015/255 20 - 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 - $07/FF - 007/255 21 - 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 - $03/FF - 003/255 22 - 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 - $01/FF - 001/255 23 - 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 - $00/FF - 000/255 24 - 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 - $00/7F - 000/127 25 - 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 - $00/3F - 000/063 26 - 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 - $00/1F - 000/031 27 - 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 - $00/0F - 000/015 28 - 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 - $00/07 - 000/007 29 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 - $00/03 - 000/003 30 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 - $00/01 - 000/001 31 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - $00/00 - 000/000 Comme les effets ne possèdent pas le même nombre de pas, il faudra tenir compte de cette particularité dans le programme, et créer une variable qui contienne la longeur de l'effet. Définition du hardware utilisé pour la carte de commande (TX) ------------------------------------------------------------- L'élément émmetteur (TX) est constitué des éléments suivants : - Carte Alim - Carte Bus - Carte AT-Mega16/32 - Carte I2C Analogique (avec 2 pots de 10K en entrée) - Carte Mi-Test - Cable IDC40 Vu la configuration des cartes, l'idéal serait de connecter les cartes "Alim", "AT-Mega16/32" sur son grand côté (Port A) et "I2C Analogique" sur la carte "Bus", puis, de raccorder la carte "MI-Test" sur le port B de la carte "AT-Mega16/32" via le cable IDC40. Liste des connexions pour la carte AVR -------------------------------------- Port A (Grand côté) Port B (Petit côté) ----------------------------------------------- 1 - P00 - PD0 (RXD) 1 - P00 - PA7 (ADC7) 2 - P01 - PD1 (TXD) 2 - P01 - PA6 (ADC6) 3 - P02 - PD2 (INT0) 3 - P02 - PA5 (ADC5) 4 - P03 - PD3 (INT1) 4 - P03 - PA4 (ADC4) 5 - P04 - PD4 (OSC1B) 5 - P04 - PA3 (ADC3) 6 - P05 - PD5 (OSC1A) 6 - P05 - PA2 (ADC2) 7 - P06 - PD6 (ICP) 7 - P06 - PA1 (ADC1) 8 - P07 - PD7 (OC2) 8 - P07 - PA0 (ADC0) 9 - P08 - PC0 (SCL) 9 - P08 - PB7 (SX) 10 - P09 - PC1 (SDA) 10 - P09 - PB6 (MISO) 11 - P10 - PC2 (TCK) 11 - P10 - PB5 (MOSI) 12 - P11 - PC3 (TMS) 12 - P11 - PB4 (SS) 13 - P12 - PC4 (TDO) 13 - P12 - PB3 (AIN1/OC0) 14 - P13 - PC5 (TDI) 14 - P13 - PB2 (AIN0/INT2) 15 - P14 - PC6 (TOSC1) 15 - P14 - PB1 (T1) 16 - P15 - PC7 (TISC2) 16 - P15 - PB0 (T0/XCK) 17 - 5V - 5V 17 - 5V - 5V 18 - Reset - RST 18 - Reset - RST 19 - Masse - GND 19 - Masse - GND 20 - 12V - NC 20 - 12V - NC Liste des connexions pour la carte MI-TEST ------------------------------------------ 1 - P00 - Led 1 à la masse via 1K 2 - P01 - Led 2 à la masse via 1K 3 - P02 - Led 3 à la masse via 1K 4 - P03 - Led 4 à la masse via 1K 5 - P04 - Led 5 à la masse via 1K 6 - P05 - Led 6 à la masse via 1K 7 - P06 - Led 7 à la masse via 1K 8 - P07 - Led 8 à la masse via 1K 9 - P08 - Poussoir S3 (CC au +5V, tiré à la masse par 100K) 10 - P09 - Poussoir S4 (CC au +5V, tiré à la masse par 100K) 11 - P10 - Poussoir S5 (CC à la masse, poussé au +5V par 100K) 12 - P11 - Poussoir S6 (CC à la masse, poussé au +5V par 100K) 13 - P12 - Haut-Parleur Piezzo 14 - P13 - Inverseur vers +5V ou masse 15 - P14 - Résistance P10 (2K5) au +5V et condensateur de 47nF à la masse 16 - P15 - Résistance P9 (2K5) à la masse et condensateur de 47nF au +5V 17 - 5V - +5V 18 - Reset - nc 19 - Masse - Mase 20 - 12V - nc La carte "I2C-Analog" est configurée de la manière suivante : JP1 sur 0 & 0, ce qui donne l'adresse $90(144) en écriture et l'adresse $91(145) en lecture pour le PCF8591. Les bornes 1 & 2 de JP6 (SDA & SCL) sont reliées respectivement sur les bornes 10 et 11 de JP7 (connexion vers l'Avr). Puis, 2 potentiomètres de 10K sont connectés entre +5V(JP5) et Masse(JP9) pour les extrémités et les curseurs sont raccordés sur les bornes 12(AD3) et 13(AD4) de JP2. Le protocole I2C du circuit PCF8591 prévoit que pour obtenir les valeurs des entrées analogiques, il suffit d'envoyer l'adresse du circuit en lecture ($91), puis l'octet suivant est la valeur de la conversion précédente, puis les 4 octets qui suivent sont les valeurs de conversion pour les converstisseurs A/D 1 à 4. Donc, après avoir envoyé l'adresse de lecture, il nous faudra lire 5 octets, et les octets qui nous interessent sont les octets 4(AD3) et 5(AD4). La tension de référence (pin14) sera réglée sur 5V. Avec cette configuration, nous aurrons alors pour l'AVR : PA0 (ADC0) - PB07 - MI-TEST Led 8 PA1 (ADC1) - PB06 - MI-TEST Led 7 PA2 (ADC2) - PB05 - MI-TEST Led 6 PA3 (ADC3) - PB04 - MI-TEST Led 5 PA4 (ADC4) - PB03 - MI-TEST Led 4 PA5 (ADC5) - PB02 - MI-TEST Led 3 PA6 (ADC6) - PB01 - MI-TEST Led 2 PA7 (ADC7) - PB00 - MI-TEST Led 1 PB0 (T0/XCK) - PB15 - nc (Enlever le Jumper) PB1 (T1) - PB14 - nc (Enlever le Jumper) PB2 (AIN0/INT2) - PB13 - nc (Enlever le Jumper) PB3 (AIN1/OC0) - PB12 - nc (Enlever le Jumper) PB4 (SS) - PB11 - MI-TEST Poussoir S6 (UP) PB5 (MOSI) - PB10 - MI-TEST Poussoir S5 (DOWN) PB6 (MISO) - PB09 - MI-TEST Poussoir S4 (ON) PB7 (SX) - PB08 - MI-TEST Poussoir S3 (OFF) PC0 (SCL) - PA08 - MI-I2CAnalog SCL (Fil JP6/2->JP7/9) PC1 (SDA) - PA09 - MI-I2CAnalog SDA (Fil JP6/1->JP7/10) PC2 (TCK) - PA10 - nc PC3 (TMS) - PA11 - nc PC4 (TDO) - PA12 - nc PC5 (TDI) - PA13 - nc PC6 (TOSC1) - PA14 - nc PC7 (TISC2) - PA15 - nc PD0 (RXD) - PA00 - vers TXD de l'élément RX PD1 (TXD) - PA01 - vers RXD de l'élément RX PD2 (INT0) - PA02 - nc PD3 (INT1) - PA03 - nc PD4 (OSC1B) - PA04 - nc PD5 (OSC1A) - PA05 - nc PD6 (ICP) - PA06 - nc PD7 (OC2) - PA07 - nc Définition du hardware utilisé pour la carte de puissance (RX) -------------------------------------------------------------- L'élément récepteur (RX) est constitué des éléments suivants : - Carte Alim - Carte Bus - Carte AT-Mega16/32 - Carte Stepper-Servo-LCD Içi, pas de problème. Les cartes sont toutes installées sur le MI-Bus. Liste des connexions pour la carte AVR -------------------------------------- Port A (Grand côté) Port B (Petit côté) ----------------------------------------------- 1 - P00 - PD0 (RXD) 1 - P00 - PA7 (ADC7) 2 - P01 - PD1 (TXD) 2 - P01 - PA6 (ADC6) 3 - P02 - PD2 (INT0) 3 - P02 - PA5 (ADC5) 4 - P03 - PD3 (INT1) 4 - P03 - PA4 (ADC4) 5 - P04 - PD4 (OSC1B) 5 - P04 - PA3 (ADC3) 6 - P05 - PD5 (OSC1A) 6 - P05 - PA2 (ADC2) 7 - P06 - PD6 (ICP) 7 - P06 - PA1 (ADC1) 8 - P07 - PD7 (OC2) 8 - P07 - PA0 (ADC0) 9 - P08 - PC0 (SCL) 9 - P08 - PB7 (SX) 10 - P09 - PC1 (SDA) 10 - P09 - PB6 (MISO) 11 - P10 - PC2 (TCK) 11 - P10 - PB5 (MOSI) 12 - P11 - PC3 (TMS) 12 - P11 - PB4 (SS) 13 - P12 - PC4 (TDO) 13 - P12 - PB3 (AIN1/OC0) 14 - P13 - PC5 (TDI) 14 - P13 - PB2 (AIN0/INT2) 15 - P14 - PC6 (TOSC1) 15 - P14 - PB1 (T1) 16 - P15 - PC7 (TISC2) 16 - P15 - PB0 (T0/XCK) 17 - 5V - 5V 17 - 5V - 5V 18 - Reset - RST 18 - Reset - RST 19 - Masse - GND 19 - Masse - GND 20 - 12V - NC 20 - 12V - NC La carte AVR sera placée sur le MI-Bus par le petit côté. Ceci permetra d'interfacer les ports A et B sur les leds, et de garder les I/O PD0 et PD1 libres (port RS232) pour y connecter les fils venant de la carte de commande. La carte "Stepper-Servo-LCD" est installée pour avoir l'affichage sur les 16 leds. Pour ce faire, il suffit d'installer les jumpers sur JP1, OUT_IC1 & OUT_IC2. Attention toutefois à la position des leds. Le tableau ci-dessous nous montre que les leds seront connectées "en inverse" sur les ports A et B de l'AVR. Il sera donc nécessaire d'inverser les valeurs qui ont été définies dans la liste des différents effets lumineux. Avec cette configuration, nous aurrons alors pour l'AVR : PA0 (ADC0) - PB07 - MI-Stepper-Servo-LCD LED D08 PA1 (ADC1) - PB06 - MI-Stepper-Servo-LCD LED D07 PA2 (ADC2) - PB05 - MI-Stepper-Servo-LCD LED D06 PA3 (ADC3) - PB04 - MI-Stepper-Servo-LCD LED D05 PA4 (ADC4) - PB03 - MI-Stepper-Servo-LCD LED D04 PA5 (ADC5) - PB02 - MI-Stepper-Servo-LCD LED D03 PA6 (ADC6) - PB01 - MI-Stepper-Servo-LCD LED D02 PA7 (ADC7) - PB00 - MI-Stepper-Servo-LCD LED D01 PB0 (T0/XCK) - PB15 - MI-Stepper-Servo-LCD LED D16 PB1 (T1) - PB14 - MI-Stepper-Servo-LCD LED D15 PB2 (AIN0/INT2) - PB13 - MI-Stepper-Servo-LCD LED D14 PB3 (AIN1/OC0) - PB12 - MI-Stepper-Servo-LCD LED D13 PB4 (SS) - PB11 - MI-Stepper-Servo-LCD LED D12 PB5 (MOSI) - PB10 - MI-Stepper-Servo-LCD LED D11 PB6 (MISO) - PB09 - MI-Stepper-Servo-LCD LED D10 PB7 (SX) - PB08 - MI-Stepper-Servo-LCD LED D09 PC0 (SCL) - PA08 - nc PC1 (SDA) - PA09 - nc PC2 (TCK) - PA10 - nc PC3 (TMS) - PA11 - nc PC4 (TDO) - PA12 - nc PC5 (TDI) - PA13 - nc PC6 (TOSC1) - PA14 - nc PC7 (TISC2) - PA15 - nc PD0 (RXD) - PA00 - vers TXD de l'élément TX PD1 (TXD) - PA01 - vers RXD de l'élément TX PD2 (INT0) - PA02 - nc PD3 (INT1) - PA03 - nc PD4 (OSC1B) - PA04 - nc PD5 (OSC1A) - PA05 - nc PD6 (ICP) - PA06 - nc PD7 (OC2) - PA07 - nc Description des tâches de la carte de commande (TX) --------------------------------------------------- Initialisation du programme Configuration de RS232 Définition des variables Initialisation du système - Choix du premier effet - Extinction du système - Intensité max - Vitesse la plus lente - Envoi de ces valeurs par RS232 Début du programme Lecture des entrées Calcul des données à envoyer Si données différentes alors Mise à jour de l'afficheur LED Calcul du checksum Tant que les checksums sont différents Envoi des données par RS232 Vérification du cheksum fin de la boucle test checksum Finsi Bouclage au début du programme Description des tâches de la carte de puissance (RX) ---------------------------------------------------- Initialisation du programme Définition des variables Définition des 8 effets Initialisation du système - Choix du premier effet - Extinction du système - Intensité max - Vitesse la plus lente - Egaliser les checksums Début du programme Lecture de l'entrée série Si valeur présente Calcul du checksum Renvoi du checksum Si checksum égaux Mise à jour des valeurs Finsi Finsi Eventuellement Mise à jour de l'affichage Bouclage au début du programme Programmation structurée pour la carte de commande (TX) ------------------------------------------------------- BEGIN ' Configuration de RS232 ' ---------------------- 'Configurer l'RS232 de la manière suivante : - 19200 Bauds - 8 bits de datas - 1 StartBit - 1 StopBit - Pas de Parité Définir un buffer d'entrée de 24 Octets (8 commandes) Définir un buffer de sortie de 8 Octets (8 Checksums) ' Définition des variables ' ------------------------ ' Toutes les variables seront "Global" DECLARE I AS BYTE ' Variable de travail DECLARE J AS BYTE ' Variable de travail DECLARE K AS BYTE ' Variable de travail DECLARE L AS BYTE ' Variable de travail DECLARE M AS WORD ' Variable de travail DECLARE N AS WORD ' Variable de travail DECLARE RSData1 AS BYTE ' Première valeur envoyée ' Etat, Puissance & n°effet DECLARE RSData2 AS BYTE ' Deuxième valeur envoyée ' Vitesse de défilement DECLARE OldRSData1 AS BYTE ' Ancienne valeur Data1 DECLARE OldRSData2 AS BYTE ' Ancienne valeur Data2 DECLARE RSCheckTX AS BYTE ' Checksum calculé DECLARE RSCheckRX AS BYTE ' Checksum reçu DECLARE Effet AS NIBBLE ' N° de l'effet en cours (de 0 à 7) DECLARE Etat AS BIT ' Etat du Système (0=off - 1=on) DECLARE Puissance AS NIBBLE ' Puissance d'allumage (de 0 à 7) DECLARE Vitesse AS BYTE ' Vitesse de défilement (de 0 à 255) DECLARE RSin AS BYTE ' Valeur lue sur l'RS232 DECLARE RSout AS BYTE ' Valeur envoyée par RS232 DECLARE Leds AS Byte ' Valeur pour les 8 leds d'indication ' d'éffet DECLARE PotVitesse AS BYTE ' Valeur de lecture de vitesse ' (de 0 à 255) DECLARE PotLuminosité AS BYTE ' Valeur de lecture de luminosité ' (de 0 à 255) DECLARE I2Cadresse ' Valeur de l'adresse du module ' I2C-PCF8591 DECLARE RS232Buffer ' Taille du Buffer RS232 DECLARE RS232In ' Premier Caractère du Buffer RS232 DECLARE RS232Out ' Caractère de sortie sur RS232 ' Initialisation du programme ' --------------------------- LET Effet = 0 LET Etat = 0 LET Puissance = 7 LET Vitesse = 0 GOSUB CalcDatas LET OldRSData1 = RSData1 LET OldRSData2 = RSData2 GOSUB CalcCheck GOSUB RS232Ecri ' Programme principal ' ------------------- DO ' Début boucle "infinie" GOSUB I2CLect ' Lecture des pots GOSUB KeyLect ' Lecture des touches GOSUB CalcDatas ' Calcul des valeurs à transmettre IF OldRSData1 <> RSData1 .OR. OldRSData2 <> RSData2 THEN ' Test si Chgt de valeurs LET Leds = 2^Effet ' Mise à jour de l'affichage GOSUB CalcCheck ' Calcul du Checksum DO ' Boucle de test de validité GOSUB RS232Ecri ' Envoit des données GOSUB RS232Lect ' lecture du Checksum LET RSCheckRX = RSin ' Mise à jour du checksum lu WHILE RSCheckRX = RSCheckTX ' Boucle si Checksums différents ENDIF ' Fin du test de Chgt de valeurs WHILE .TRUE. ' Fin de la boucle "infinie" END ' Sous Routines ' ------------- SUB CalcDatas ' Calcul des valeurs RSData1 & RSData2 SUB RS232Ecri ' Ecriture des 3 données sur RS232 SUB RS232Lect ' Lecture d'un octet de RS232 dans RSin SUB CalcCheck ' Calcul du Checksum dans RSCheckTX SUB I2CLect ' Lecture des pots et MAJ Puissance & Vitesse SUB KeyLect ' Lecture des touches et MAJ Etat & Effet ' Routine de calcul des Datas ' --------------------------- SUB CalcDatas 'Variables d'entrées ' Effet : N° de l'effet (0 à 7) ' Etat : Allumé (1) ou éteint (0) ' Puissance : Puissance d'allumage (0 à 7) ' Vitesse : Vitesse de défilement (0 à 255) 'Variables de travail ' Aucune 'Variables de Sortie ' RSData1 : Etat, Puissance & n°effet ' RSData2 : Vitesse de défilement LET RSData1 = Etat*128 + Puissance*16 + Effet LET RSData2 = Puissance ENDSUB ' Routine d'écriture des données sur RS232 ' ---------------------------------------- SUB RS232Ecri 'Variables d'entrée ' RSData1 ' RSData2 ' RSCheckTX 'Variables de Travail ' Aucune 'Variables de Sortie ' Aucune Ouvrir le Port RS232 Envoyer RSData1 ' Etat, Puissance & n°effet Envoyer RSData2 ' Vitesse de défilement Envoyer RSCheckTX ' Checksum ENDSUB ' Routine de lecture RS232 ' ------------------------ SUB RS232Lect 'Variables d'entrée ' Aucune 'Variables de Travail ' RS232Buffer ' RS232Inkey 'Variables de Sortie ' RSin IF RS232Buffer > 0 THEN RSin = RS232Inkey ENDIF ENDSUB ' Routine de lecture des pots et MAJ Puissance & Vitesse ' ------------------------------------------------------ SUB I2CLect 'Variables d'entrée ' I2Cadresse 'Variables de Travail ' PotVitesse ' PotLuminosité 'Variables de Sortie ' Puissance ' Vitesse Prendre le contrôle du bus I2C Envoyer l'adresse I2Cadresse Lire le premier octet Lire le deuxième octet Lire le troisième octet Stocker le quatrième octet dans PotVitesse Stocker le cinquième octet dans PotLuminosité Libérer le bus I2C LET Vitesse = PotVitesse LET Puissance = PotLuminosité/32 ENDSUB ' Routine de Calcul du Checksum ' ----------------------------- SUB CalcCheck 'Variables d'entrées ' RSData1 : donnée n°1 ' RSData2 : donnée n°2 'Variables de travail ' I : Indice de comptage ' J : Nibble Nbre de 0s dans Data1 & 2 ' K : Nibble Nbre de 1s dans Data1 & 2 'Variables de sortie ' RSCheckTX : Checksum calculé LET RSCheckTX = 0 ' Mise à zéro du checksum LET I = 0 ' Mise à zéro des variables de travail LET J = 0 LET K = 0 DO ' Début de la boucle du comptage des 0s et des 1s dans RSData1 IF (RSData1 AND 2^I) = 2^I THEN ' Test si bit I = 1 LET K = K+1 ' Incrémentation de K ELSE ' Test si bit I = 0 LET J = J+1 ' Incrémentation de J ENDIF ' Fin du test des bits LET I = I+1 ' Passage au bit suivant UNTIL I=8 ' Test de sortie après le ' bit 7 LET I = 0 ' Raz du compteur de bits DO ' Début de la boucle du comptage des 0s et des 1s dans RSData2 IF (RSData1 AND 2^I) = 2^I THEN ' Test si bit I = 1 LET K = K+1 ' Incrémentation de K ELSE ' Test si bit I = 0 LET J = J+1 ' Incrémentation de J ENDIF ' Fin du test des bits LET I = I+1 ' Passage au bit suivant UNTIL I=8 ' Test de sortie après le ' bit 7 LET RSCheckTX = K*16 + J ENDSUB ' Routine de lecture des touches et MAJ Etat & Effet ' -------------------------------------------------- SUB KeyLect 'Variables d'entrée ' Aucune 'Variables de Travail ' I 'Variables de Sortie ' Etat ' Effet LET I = Nibble (PB7-PB4)/16 'Off, On, Down, Up IF (I AND 1) = 1 THEN IF (I AND 2) = 2 THEN ELSE LET Effet = Effet-1 IF Effet = 16 THEN LET Effet = 0 ENDIF ENDIF ELSE LET Effet = Effet + 1 IF Effet = 8 THEN LET Effet = 7 ENDIF ENDIF IF (I AND 4) = 4 THEN LET Etat = 1 ELSE IF (I AND 8) = 8 THEN LET Etat = 0 ENDIF ENDIF ENDSUB