Étape 5: Écrire, télécharger et exécuter votre Code AVR
Avez-vous se demande encore comment le 74C922 distille des 8 bits de données dans des lignes de données seulement quatre ? Si vous avez lu mes autres instructable vous aurait probablement avoir pensé à elle. Eh bien, peut-être que vous avez déjà pensé à elle. Une fois que vous avez fait une table de vérité vous avez fait tous, droit ? :) Les 8 broches à partir du tableau est codée en binaire en utilisant les broches de quatre données. J’ai fait une table de vérité pour vous.
Si vous n’êtes pas clair ce que cela signifie, jetez un oeil à mes autres instructables, ou effectuez une recherche pour « table de vérité » ou « logique binaire » sur votre moteur de recherche favori.
Logique du code
Je ne sais pas entrer dans les détails de mon code, lorsqu’il est disponible pour vous à télécharger est approprié, mais je vais vous présenter quelques petites choses ici et si vous êtes un vieux sel à ce genre de choses que vous pouvez sauter devant elle, dans le cas contraire, j’espère que je peux vous apprendre quelque chose.
- Recherchez un indicateur global indiquant les données sont prêtes au processus
- Quand la broche de données disponible change à haute
- Lire les broches de données
- Définissez les bits dans un registre d’usage général ci-dessous 0xFF
- Définir « disponibles pour le traitement de données » indicateur
- Traiter les données et faire tout ce que nous voulons avec elle
Sections de code
J’ai inclus un fichier zip pour cette section qui contient le fichier principal et un couple de fichiers axillaires. Vous êtes libre de retirer l’étoffe de l’USART et compiler le fichier principal ou ce que vous voulez. Donc, j’aborderai brièvement comment le code fonctionne.
Déclarations
Cet article est assez explicite, je ne vais pas aller dedans, pas plus, sauf au attirer l’attention sur les fichiers d’en-tête locale que j’ai compris que vous pouvez ou ne pouvez utiliser ou supprimer.
#include "common.h"#include "uart.h"#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>#define DATA1 PIND2#define DATA2 PIND3#define DATA3 PIND4#define DATA4 PIND5#define DATA_AVAIL PIND6void Interrupt_init(void);volatile uint8_t bDataReady = 0;
Initialisation
Il y a deux paragraphes pour initialiser dans ce programme :
1. le système USART
2. l’interruption système de manutention
Il est sécuritaire d’enlever les trucs USART si vous supprimez toutes les références à elle et ne veux pas communiquer via le câble USB ou d’une console série externe via une puce max232. Donc, je ne l’inclure ci-dessous car il est hors de portée de ce guide.
voidInterrupt_init(void){ BSET(PCICR,PCIE2); // Enable Pin Change Interrupt 2 BSET(PCMSK2,PCINT22); // Enable PCINT22 (that's PD6) BSET(SREG,7); // Set I-bit in Status Register GPIOR0 = 0x00; // Using General Purpose I/O register}
Interruption de Service des gestionnaires
Il s’agit du gestionnaire d’interruption change de broche. Quelques petites choses à noter :
1. il est très court
2. aucune fonction n’est appelées qu’il contient
3. cette interruption sera appelée à n’importe quel changement de niveau de logique, ce qui signifie que lorsque données disponible passe haut (ce que nous voulons) et quand il va faible (ce qui nous ne se soucient).
4. un indicateur global est défini et le gestionnaire d’interruption revient à laisser la boucle principale de gérer le reste.
5. j’utilise un usage général de Registre I/O sous espace 0xFF. Cela signifie que l’accès est très rapide.
ISR(PCINT2_vect){ if (BCHK(PIND,DATA_AVAIL) == 0) return; if (BCHK(PIND,DATA1)) BSET(GPIOR0,GPIOR00); if (BCHK(PIND,DATA2)) BSET(GPIOR0,GPIOR01); if (BCHK(PIND,DATA3)) BSET(GPIOR0,GPIOR02); if (BCHK(PIND,DATA4)) BSET(GPIOR0,GPIOR03); bDataReady = 1;}
Principal
Tout ce que nous avons à faire ici est boucle tout en vérifiant si les données sont disponibles pour traiter. Si c’est le cas, faire notre magie, définir nos drapeaux et registres à zéro et le retour de travail.
int main(){ // Initialize serial subsystem USART_init(BAUD_9600); // Initialize PCI2 Interrupt_init(); uint8_t encoded = 0x00; for (;;) { if (bDataReady) { encoded = GPIOR0; USART_tx(encoded); bDataReady = 0; GPIOR0 = 0x00; } }}