Bonjour monsieur,
J’ai écrit le code pour lire la valeur ADC et l’ai transmis au PC en utilisant UART en utilisant pic16f688. Mais je suis confronté au problème de communication. J’ai trouvé que la transmission fonctionne correctement parce que j’obtiens la chaîne d’initiation UART côté PC. Le problème est à la réception. Parce que lorsque je donne le personnage à lire et à la trasmite de la valeur ADC, je ne reçois rien.
Aidez-moi à résoudre ce problème. J’ai donné le code ci-dessous:
Code pic:
#inclure
__Config (fosc_hs & wdte_off & pwrte_off & mclre_off & fcmen_off & ieso_off & boren_off & cpd_off);
#define _xtal_freq 20000000
#define baud_rate 9600
int k, résultat;
tableau de flotteur[7];
float réf;
// *** Initialisation du module UART pour pic16f877a *** //
void initialize_uart (void)
{
// **** Définition des broches d’E / S pour UART **** //
TRISC4 = 0; // TX PIN SET comme sortie
TRISC5 = 1; // RX PIN SET comme entrée
// ________ Épingles d’E / S ensemble __________ //
/ ** Initialiser le registre SPBRG pour requis
BAUD RATE et définissez BRGH pour FAST BAUD_RATE ** /
SPBRG = ((_ xtal_freq / 16) / baud_rate) – 1;
Brgh = 1; // pour High Baud_rate
// _________ Fin du réglage de Baud_rate _________ //
// **** Activer le port de série asynchrone ******* //
Sync = 0; // asynchrone
Spen = 1; // activer les broches de port série
// _____ port série asynchrone activé _______ //
// ** Préparez-vous à la transmission et à la réception ** //
Txen = 1; // Activer la transmission
Creren = 1; // Activer la réception
// __ Module UART et prêt pour la transmission et la réception __ //
// ** Sélectionnez le mode 8 bits ** //
Tx9 = 0; // réception 8 bits sélectionnée
Rx9 = 0; // mode de réception 8 bits sélectionné
// __ mode 8 bits sélectionné __ //
}
// ________ Module UART initialisé __________ //
// ** fonction pour envoyer un octet de date à UART ** //
void uart_send_char (char bt)
{
tandis que (! txif); // Tenez le programme jusqu’à ce que le tampon TX soit gratuit
Txreg = bt; // Chargez le tampon de l’émetteur avec la valeur reçue
}
// _____________ fin de fonction ________________ //
// ** fonction pour obtenir un octet de date de UART ** //
char uart_get_char ()
{
if (oerr) // vérifiez l’erreur
{
Creren = 0; // Si l’erreur -> réinitialiser
Creren = 1; // Si l’erreur -> réinitialiser
}
tandis que (! rcif); // Tenez le programme jusqu’à ce que le tampon RX soit gratuit
retour rcreg; // recevoir la valeur et l’envoyer à la fonction principale
}
// _____________ fin de fonction ________________ //
// ** fonction pour convertir la chaîne en octet ** //
void uart_send_string (char * st_pt)
{
tandis que (* st_pt) // s’il y a un char
UART_SEND_CHAR (* ST_PT ++); // les traitent comme des données d’octets
}
// ___________ fin de fonction ______________ //
// ********** Début de la fonction principale ************** //
vide Main (vide)
{
char get_value;
int a;
Ansel = 0xff; // canal analogique
Trisa = 0b000011; // Porta comme entrée
TRISC = 0B100000;
Initialize_uart (); // Initialiser le module UART
UART_SEND_STRING (« Module UART initialisé et actif »); // Texte d’introduction
tandis que (1) // boucle infinie
{
get_value = uart_get_char ();
Adcon0 = 0x80;
Adcon1 = 0x20;
Adon = 1;
__delay_ms (500);
Go_ndone = 1;
while (go_ndone);
a = ((ADRESH << 8) + ADRESL); // Stockage Résultat
__delay_ms (100); // attendez 500 millisecondes
pour (k = 0; k <= 3; k ++) / * convertir le résultat en entier en ASCII * /
{
tableau[k] = un% 10; / * Séparez chaque chiffre de l’entier * /
a = a / 10;
}
if (get_value == ‘a’) // si l’utilisateur envoie « 1 »
{
RA2 = 1; // Allumez la LED
UART_SEND_STRING (« LED rouge -> on »); // Envoi de la notification à l’ordinateur
UART_SEND_STRING (« ADC: »);
pour (k = 4; k> = 0; k–)
{
UART_SEND_CHAR (tableau[k]+ ‘0’);
}
UART_SEND_CHAR (10); // La valeur ASCII 10 est utilisée pour le retour du chariot (à imprimer en nouvelle ligne)
}
if (get_value == ‘b’) // Si l’utilisateur envoie « 0 »
{
RA2 = 0; // éteindre la LED
Uart_send_string (« red -> off »); // Envoi de la notification à l’ordinateur
UART_SEND_STRING (« ADC: »);
pour (k = 4; k> = 0; k–)
{
UART_SEND_CHAR (tableau[k]+ ‘0’);
}
UART_SEND_CHAR (10); // La valeur ASCII 10 est utilisée pour le retour du chariot (à imprimer en nouvelle ligne)
}
}
}
// ********** Fin de la fonction principale ************** //
Retrouvez l’histoire de Raspberry Pi dans cette vidéo :

-
Cosiki Carte de Développement de Microcontrôleur PIC16F877A avec Interface RS232, Cristal 4M, 8 LED, pour Débutants et étudiants
-
Kit de module de reconnaissance vocale à monter soi-même, 80 commandes vocales, précision de 99 %, interface 5 V TTL UART GPIO
