Home › Forum › Microcontrôleurs & microprocesseurs › Programmation en C des microcontrôleurs RISC...

Forum

Veuillez vous identifier avant de répondre ou pour vous abonner à cette discussion

Sujet: Programmation en C des microcontrôleurs RISC AVR

Auteur Message

pma75

2 messages

De passage
De passage

Read post 01-07-2010 23:00

Bonjour a tous.
En testant les montages du bouquin, je rencontre des problèmes sur les interruptions serie RX : ISR(USART_RXC_vect) qui ne se déclenche pas.
Existe -t-il un support autre que le site de l'auteur qui est en allemand et les traductions de babel m'embrouillent plus que ne m'aide !!
De plus, le bouquin comporte pas mal d'erreur typographique, y a t-il eu des errata publiées?
merci de vos réponses.

pma75

moderateur

36 messages

De passage
De passage

Read post 02-07-2010 11:49

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)

Modifié par moderateur le 02-07-2010 13:00

Modifié par moderateur le 02-07-2010 13:04

Modifié par moderateur le 02-07-2010 13:05

Modifié par moderateur le 02-07-2010 13:06

Modifié par moderateur le 02-07-2010 13:06

pma75

2 messages

De passage
De passage

Read post 06-07-2010 10:57

Bonjour messieurs.
Merci pour votre reponse tres précise.

J'ai été un peu imprécis dans le message car c'etait un peu une bouteille à la
mer étant la première fois que je postai dans un forum..

Voici quelque éléments:

Architecture:

++++++++++++
+ Atmega32 +- PORTC --> LCD 2X16
+ 8Mhz + +++++++++++
+ + + ATmega8 + - CAN
+ +- PD0/RX ----------- TX/PD1 + 8Mhz +
+ +- PD1/TX ----------- RX/PD0 + +
++++++++++++ +++++++++++

L'idée était de tester la communication entre un emetteur et un recepteur
par la liaison serie à partir des éléments du projet 7: "Transfer sériel des
données" .

Quand je dis que l'interruption ne se déclenche pas, ce n'est pas exact:
car pour tester, j'ai incrémenter un variable dont la valeur est affichée sur
l'ecran (suivant l'exemple du projet 9.2). La valeur s'incrémente à "l'infini".
J'en conclu donc que le programme ne "ressort" jamais de l'interruption.
Or l'interruption est RXC (réception complétée:1bit start, 8bits, 1bit stop).

Les parametres d'initialisation sont rigoureusement identique sur les deux
micro-pro.

Les routines d'interruption étant implémentées sur l'ATmega32, j'ai utilisé:
#include et
#include + explicitement. ce qui n'a rien
changé.
Parmis mes nombreux essais, j'ai également positionné l'instruction 'sei()'
avant ou apres le paramétrage du registre RXCEN et rien ne change.


Je précise que le programme modifié pour ne plus utiliser les interruptions
fonctionne à peu près (probleme de décalage à la réception des données).

Je vais refaire une serie de tests à partir de vos conseils afin d'etre plus
précis.
Encore merci de vos conseils éclairés !
Cordialement
pma75

Veuillez vous identifier avant de répondre ou pour vous abonner à cette discussion

Elektor 6/2012 en kiosque

Elektor-Hebdo gratuit !

Mon adresse électronique :

Unités de crédit Elektor

Nos blogs-ateliers