Étape 1: Fonctionnement du programme.
La section suivante va discuter comment fonctionne le programme. Section 3.1 risque de dépasser la partie de l’initialisation du code qui se trouve avant la boucle principale. Une fois que le programme entre dans la boucle principale est crie à 4 fonctions différentes : potread, keypress, bankchange et RVB. Les sections 3.2, 3.3, 3.4 et 3.5 discuteront séparément ces fonctions. Veuillez vous référer au code à l’étape 6.
3.1 l’initialisation
N’importe quel microcontrôleur doit être configuré tout d’abord, avant d’entrer dans une boucle principale du programme. Cela inclut la mise en place de la direction des broches, mettant les valeurs correctes dans tous les registres de contrôle et définir l’horloge principale qui va utiliser le microcontrôleur. La première étape de mon programme consistait à mettre en place des registres de config. Ces registres contrôlent généralement des choses comme le temporisateur, toute réinitialisation claire broches, bruns à détecter et les configurations de l’oscillateur. Dans cet exemple j’ai mis en place afin qu’un cristal oscillateur externe de 20Mhz est utilisé comme l’horloge principale pour le PIC. Le commandant de bord a oscillateurs internes et peut courir jusqu'à 8Mhz, mais en raison de la vitesse des données midi, je devais courir le microcontrôleur à une vitesse supérieure afin d’éviter des erreurs de données. Notez l’emplacement de l’oscillateur sur la disposition principale de Conseil de PCB à l’article 7.1. Ce n’est pas visible sur la figure 2.0, j’ai soudé le cristal directement sous le Conseil d’administration.
Le prochain Registre que j’ai configuré était les registres RCSTA et TXSTA. Ces registres sont chargés de contrôler les commandes de série matériel. J’ai utilisé les commandes série matériel, par opposition aux logiciels de série pour envoyer les commandes midi, est parce que j’envoie les données à la carte de convertisseur de midi à 31250 bauds. J’ai essayé d’envoyer les données à l’aide premier logiciel commandes seulement et j’ai été obtenir des erreurs et l’ordinateur recevait des données qui avaient disparu des morceaux manquant d’informations. Le port série de matériel a une mémoire tampon interne utilisée pour diriger le flux de données et n’est donc plus fiable. La seule limitation de l’aide des commandes de série matériel est que vous sont autorisés à utiliser seulement certaines épingles sur le microcontrôleur où comme si vous envoyez des commandes logicielles, vous pouvez utiliser aucune broche disponible souhaitée. L’écran LCD j’ai utilisé seulement requis les données à envoyer à 9600 bauds, donc je commande que j’ai envoyé à l’écran LCD a été commandes série de logiciel.
J’ai ensuite créé les goupilles qui allaient être utilisés pour contrôler les puces LTC2309. Ces puces sont contrôlées en utilisant I2C épingles de commandes alors que deux sont nécessaires pour contrôler les deux circuits.
Après cela, j’ai défini toutes les variables globales utilisées dans le programme. J’ai configuré puis direction les broches mais chargeant les octets correctes dans les registres TRISA et TRISB TRISC sur le PIC. Chargement d’un zéro définit l’axe de ce port à une sortie. Charger un, il définit en tant qu’entrée. Par exemple : si j’insère la valeur 00000001 dans le registre TRISB, Pin zéro sur le PORTB serait une entrée tout en épingles un à sept sont définis comme des sorties.
Étant donné que le PIC a également intégré des convertisseurs a/n, j’avais besoin de désactiver ceux que c’est la prochaine chose que j’ai fait. L’écran LCD est alors activé et un écran d’introduction s’affiche. La commande de série de logiciels est une fonction intégrée à Picbasic Pro, qui est le compilateur que j’ai utilisé. Chaque fois que j’ai envie d’émettre une commande de série de logiciels, j’ai besoin de spécifier le code pin que je veux envoyer la commande le débit en bauds et les données que je veux envoyer. J’ai découvert comment contrôler l’écran LCD par le biais de sa fiche.
Les boutons Parcourir ensuite les différentes couleurs. Cela vise à s’assurer que tout est correctement connecté. Si toutes les couleurs sont affichent, je sais que les LEDs RVB sont connectés correctement. Le programme insère ensuite la boucle principale.
3.2 Potread
Puisqu’il y a 8 canaux sur chaque LTC2309, j’ai mis en place le programme donc les 8 canaux de IC2 sont lues dans une boucle for, et tous les 8 canaux de IC4 sont lus dans un autre pour la boucle. Puisque ces puces sont contrôlés à l’aide de commandes I2C seulement deux broches sont utilisées. On est une broche d’horloge qui fonctionne a 100Khz, et l’autre axe est une broche bidirectionnel, qui est utilisée pour envoyer et recevoir des données.
Afin de lire la valeur analogique de n’importe quel canal donné, vous devez indiquer l’ADC quelle voie vous voulez lire donc avant de lire n’importe quel canal vous devez tout d’abord envoyer deux octets d’informations à la puce. Le premier octet que du microcontrôleur envoie à l’ADC est le cadre de l’adresse. Il y a deux broches sur la LTC2309, qui vous pouvez de configurer l’adresse. En définissant les AD1 code pin et broche AD0 à haute, basse ou flottant, vous pouvez obtenir jusqu'à 8 adresses différentes, ce qui signifie que vous pouvez connecter jusqu'à 8 différents LTC2309s' sur un bus I2C. Si vous vous référez à la Figure 6.0, vous pouvez visualiser les différentes configurations. J’ai indiqué quelle adresse que j’utilise. 7 bits sont utilisés comme adresse, et le LSB (Bit 0) est utilisée pour indiquer la météo c’est une commande de commande ou écriture lecture. Ce bit affectant une prépare l’ADC pour une commande de lecture et mise à zéro lui attribue une commande "write".
L’octet suivant, envoyé à l’ADC est un peu 6 mot « Din ». Il est responsable de la configuration des canaux. Voir Figure 8.0 pour les configurations de Din. J’ai mis en évidence les différents mots que j’ai utilisé. Dans mon programme, le bit S/D est toujours défini parce que j’ai fais seule Mensurations terminées. Le bit de l’UNI est également toujours défini parce que je suis seulement en utilisant la puce en mode unipolaire. Figure 7.0 est le diagramme de temps pour une commande "write" inclus dans la feuille de données.
Ensuite, l’ADC envoie la valeur analogique au microcontrôleur. Cependant, n’importe quel moment tout renseignement échangé de l’ADC au microcontrôleur, vous devez toujours envoyer la trame de l’adresse, sauf le LSB dans le cadre de l’adresse est changé en un, ce qui signifie que c’est une commande de lecture. La valeur analogique 12 bits est envoyée en deux octets. Figure 9.0 est que le format des données intervient. J’ai lu la valeur analogique dans deux variables différentes. Une variable contient les 8 bits les plus significatifs et l’autre octet contient les 4 bits les moins significatifs de la variable. Cependant les bits les moins significatifs sont emplacement 4 places vers la gauche dans cette variable, et les 4 bits vers la droite sont juste des zéros. Afin d’obtenir cette valeur en une forme utilisable, j’ai déplacer les 8 lieux bits 4 vers la gauche. Je suis capable de faire cela puisque la variable que j’utilise est un mot de 16 bits. J’ai ensuite déplacer la variable avec les 4 spots moins significatifs de bits 4 vers la droite. Ces deux valeurs sont alors opérateur or ensemble et le résultat est une variable 16 bits d’une valeur analogique 12 bits. Cependant, je dois encore réduire la valeur une valeur de signal de commande midi étant uniquement un seul octet. La valeur max d’ADC est 4095 sous forme décimale et doit donc être revus à la baisse à 128. Pour ce faire j’ai multiplier la valeur de l’ADC par 4095 puis fracture est de 128. J’ai une autre variable, dont je me sers pour enregistrer la valeur précédente de ADC. Lorsque la boucle arrive encore une fois, il vérifie si la nouvelle valeur de l’ADC a changé. Si elle a changé plus d’une certaine valeur seuil, il envoie alors un signal midi avec la nouvelle valeur de l’ADC. Si elle est inférieure à cette valeur, il saute il tous ensemble et continue de lire le prochain canal. J’ai enregistrer la valeur non à l’échelle, ce seuil est de 50. Je devais choisir une valeur qui était assez grande pour être au-dessus du bruit, mais ne pas si grand que les valeurs analogiques transmis au contrôleur midi sont vraiment loin de l’autre, donnant ainsi un son saccadé. Une commande de contrôle midi est une série de 3 octets. Le premier octet spécifie que c’est une commande qui est envoyée. Le deuxième octet est quel canal, la commande est expédiée. Le dernier octet est la valeur analogique. Ainsi, par exemple, permet de dire, dans le cadre de mon logiciel de musique, j’attribue un volume sur un certain canal pour accepter des signaux midi entrants du canal 16. Que je tourne le potentiomètre, le contrôleur midi envoie en permanence ces 3 octets à un rythme très rapide. Deux premiers octets restent les mêmes chaque fois que ces octets sont envoyés, mais la dernière valeur vont être modifiées. L’idée est que vous recherchez cette valeur à déplacer vers le haut ou vers le bas par petits incréments. Les incréments qui changent d’est la valeur de seuil a été discutée plus tôt. J’incrémente le canal 1, après chaque boucle, donc tous les potentiomètres écrivez à leur propre canal du midi. Cette boucle est alors continue 7 fois plus pour que ADC puce. Je continue une boucle différente, un autre 8 fois pour lire les valeurs de l’autre puce ADC. La seule différence entre les deux boucles est l’adresse que j’utilise pour communiquer avec la puce et les numéros de canaux qui sont mises à jour.