2016-04-08 3 views
1

Salut J'ai écrit un code UART pour PIC16F877A. Le code ne fonctionne pas et son montrant l'erreur comme pointeur nécessaire au MP LAB IDE.I veulent envoyer et recevoir les personnages PC hyper terminal.any de vous me HEP pour résoudre les problèmespic16f877a uart embedded c code

#include<pic.h> 

void pic_init(void) 
{ 
    TRISC7=1; 
    TRISC6=0; 
} 

void uart_init(void) 
{ 
    TXSTA=0x20; 
    RCSTA=0x90; 
    SPBRG=15; 
} 

void tx(unsigned char byte) 
{ 
    int i; 
    TXREG=byte; 
    while(!TXIF); 
    for(i=0;i<400;i++); 
} 

void string_uart(char *q) 
{ 
    while(*q) 
    { 
     *(*q++); 
    } 
} 

unsigned char rx() 
{ 
    while(!RCIF); 
    return RCREG; 
} 

void main() 
{ 
    char *q; 
    pic_init(); 
    uart_init(); 
    tx('N'); 
    rx(); 
    string_uart("test program"); 
} 
+0

Jetez un coup d'œil à [ce guide] (https://electrosome.com/uart-pic-microcontroller-mplab-xc8/). Au moins, vous devez définir le débit en bauds pour faire ce que vous voulez faire. Un petit conseil. Essayez de raccourcir les broches TX et RX et commencez à le faire fonctionner. Pour le connecter à un PC, vous avez également besoin d'au moins un câble usb to TTL UART (5V). – LPs

+1

Si votre compilateur émet un message de diagnostic, vous devez inclure le message exact dans la question et indiquer exactement sur quelle ligne le message a été émis. – Clifford

+0

@LPs: Les PC avec ports série hérités sont toujours disponibles. Bien qu'un pilote de ligne 232 sera alors nécessaire. Si HyperTerminal est installé par défaut sur son PC, il doit être assez ancien et peut contenir 232 ports. – Clifford

Répondre

3

La déclaration dans votre boucle while n'a pas de sens:

while(*q) { 
    *(*q++); 
} 

Il en résulte la error: (981) pointer required erreur que vous obtenez, puisque vous déréférencement un non-pointeur: *q++ retourne un char, d'où vous essayez de déréférencer un char avec l'extérieur *.

, vous voudrez probablement lieu de transmettre le caractère auquel le pointeur pointe actuellement (*q), puis incrémenter le pointeur (q++):

while(*q) { 
    tx(*q); 
    q++; 
} 

Cela pourrait aussi être écrit comme

while(*q) { 
    tx(*q++); 
} 

Avec cela, votre code compile (avec xc8), mais je n'ai pas vérifié votre configuration SFR - si le code ne correspond pas travail, vérifiez que vous avez correctement configuré les SFR. Voir le lien fourni par @LPs pour plus d'informations: https://electrosome.com/uart-pic-microcontroller-mplab-xc8/

+0

Merci.J'ai compilé le code sans erreur.Je vais vérifier protéous et et revenir à vous monsieur. - – user1811790

2

Dans l'expression:

*(*q++) ; 

Vous déréférencer le pointeur pour obtenir un char, auquel vous alors déréférencer (*) à nouveau; mais vous ne pouvez pas déréférencer un non-pointeur. En dehors de cela, vous avez probablement aussi l'intention d'appeler tx() dans uart_string() pour qu'il fasse quelque chose d'utile.