Vous ne précisez pas si la compilation se passe normalement.
Si le compilateur ne trouve pas le vecteur (USART_RXC_vect), vérifiez dans les fichiers en-tête (.h).
Exemple pour le MEGA16 (que vous utilisez probablement) :
dans le répertoire /../../avr/include/avr (ou un autre, suivant votre installation), on trouve le fichier iom16.h qui contient les définitions des registres et vecteurs.
L'interruption de réception sérielle peut porter des noms différents :
/* USART, Rx Complete */
#define USART_RXC_vect _VECTOR(11)
#define SIG_USART_RECV _VECTOR(11)
#define SIG_UART_RECV _VECTOR(11)
Vérifiez que votre fichier en-tête contient le nom que vous utilisez (USART_RXC_vect), dans le cas contraire utilisez un nom existant ou bien ajoutez une ligne avec le nom que vous utilisez (et le même numéro de vecteur, bien sûr).
Ce point réglé, le programme compilé et chargé normalement, il peut y avoir plusieurs raisons pour que l'interruption de réception sérielle ne se déclenche pas :
Matériel
- coupure électrique dans le chemin du signal, erreur de brochage de la fiche etc.
- niveaux électriques décalés, masse déconnectée
Logiciel
- utilisation d'un fichier en-tête différent du modèle de µC utilisé
- discordance entre le format et le débit reçus et ceux de la configuration
oubli de :
- #include interrupt.h
Nota bene: dans la ligne ci-dessus interrupt.h doit être placé entre les signes «plus petit que» et «plus grand que»
- validation de l'interruption sur réception sérielle (RXCIE bit 7 dans UCSRB)
- validation de la réception sérielle (RXEN bit 4 dans UCSRB)
- validation globale des interruptions (fonction sei() dans main() après les instructions de configuration), est-ce que d'autres interruptions fonctionnent ?
- ?
Débogage :
vérification électrique, oscilloscope (ou terminal avec adaptation TTL-RS232) sur la broche du micro
routine d'interruption ramenée au plus simple : basculement de l'état d'une broche de sortie (instruction OU exclusif PORTx ^= broche) sans recours au programme principal ni à une autre fonction vérification avec une LED ou à l'oscilloscope
Cela pour savoir si l'interruption est déclenchée ou pas.
Quand vous dites « des problèmes », voulez-vous dire que l'interruption ne produit pas les effets escomptés ?
Le problème tient-il à la suite du traitement du caractère reçu, à un tampon de réception, à un pointeur du tampon ?
Le programme est-il planté après l'interruption ?
Sur les erreurs typographiques : elles sont rigoureusement exclues en ce qui concerne la partie fonctionnelle des sources, TOUS les programmes ont été recompilés après traduction des commentaires, textes et étiquettes.
Par contre, le fonctionnement n'a pas été testé pour tous les programmes, il reste donc le risque d'une erreur de programmation.
S'il devait y avoir une différence entre le papier et le fichier, c'est le fichier qui a raison, parce que le papier ne se compile pas.
Notez que chaque programme est compilé dans son propre répertoire avec son Makefile et les modules correspondants. Ces modules peuvent avoir été adaptés au programme de test, tout en portant le même nom que des modules différents dans des répertoires différents.
Quoi qu'il en soit, faites-nous savoir précisément avec quel programme vous rencontrez des difficultés. Nous allons le tester pour trouver une erreur de programmation éventuelle.
Tenez-nous au courant.
Jean-Paul Brodier (traducteur) & Denis Meyer (éditeur)