Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

PIC16F84A + XC8 = écrire sur le port série
gwion
Amateur
Amateur
Messages : 192
Enregistré en : février 2022

#1 Message par gwion » mer. 14 déc. 2022 13:26

Bonjour tout le monde,

Je continue ma découverte du monde PIC :)
Je cherche un exemple simple qui tourne en C façon XC8 pour envoyer des messages vers un port série d'un PC (câble FTDI).
Autant on en trouve partout en assembleur, autant cela semble rare en C.
Si vous avez un lien, je vous en remercie !

Bruno
Modifié en dernier par gwion le mer. 14 déc. 2022 16:38, modifié 1 fois.

PIC16F + XC8 = écrire sur le port série
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » mer. 14 déc. 2022 15:53

bonjour,

il faudrait definir sur quel type de MCU ?

exemple avec 16F1619
Apparament le Zip complet 1,5MO ne peut pas etre chargé ..trop gros ?
j'ai donc mis uniquement le main et les fichier generés par MCC
tu peux virer la partie qui ne t'interesse pas..

contrairement à MikroC, XC8 demande beaucoup plus de ressources eu tout un tas de fichiers
surtout si on utilise MCC !
J'ai beaucoup d'exempes sur maPageweb ,mais principalement en MikroC ..
un exemple MikroC est aisement adaptable en XC8 ( sans utiliser MCC)


16F1619_OLED_Uart_DAC_test.X.zip




sinon l'essentiel

Code : Tout sélectionner



#include <xc.h>
#include <stdio.h>
#include "usart.h"

void
putch
(unsigned char byte)
{
    /* output one byte */
    while(!TXIF)    /* set when register is empty */
        continue;
    TXREG = byte;
}

unsigned char
getch
() {
    /* retrieve one byte */
    while(!RCIF)    /* set when register is not empty */
        continue;
    return RCREG;
}

unsigned char
getche
(void)
{
    unsigned char c;
    putch(= getch());
    return c;
}

 


pour PIC16F1827.
uart_demo_xc8.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

PIC16F84A + XC8 = écrire sur le port série
gwion
Amateur
Amateur
Messages : 192
Enregistré en : février 2022

#3 Message par gwion » mer. 14 déc. 2022 16:12

Merci Paul.
Dans mon cas le MCU cible est un tout petit et antique 16F84A (pour cause de récup de quelques exemplaires...)
L'include du usart.h génère une erreur, ça commence mal :cry: mais c'est normal puisque ce petit PIC n'a pas d'UART embarqué.

PIC16F84A + XC8 = écrire sur le port série
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#4 Message par paulfjujo » mer. 14 déc. 2022 18:54

dans ce cas, il faut un UART SOFTWARE

:eek: avec un peu d'assembleur !

exemple à adapter ( difference d'appelation MikroC et XC8 pour les registres du PIC)

Code : Tout sélectionner

//declarations
// la Pin de sortie est definie dans le main program
 sbit TX3_Pin at LATA.B2;
 sbit TX3_Pin_Direction at TRISA.B2;

unsigned char c3 absolute 0x0020;
unsigned char RS_Count;
unsigned char  RS_tmp;
unsigned char RS_Delay  


void UART3_Write_CText
(const char *txt3)
 {
   while (*txt3)
     {
     UART3_Write(*txt3++);
    // Delay_us(500);
     }
}

void UART3_Write_Text(unsigned char *T)    // at adress  0x002 taille 42 bytes
{
  while(*(T)>0)     // verif sur VBRAY en mode ASCII
   {
    UART3_Write(*(T++));   // c3 variable globale
   }
}

void CRLF3()
{
 UART3_Write(CR);
 UART3_Write(LF);
}


void UART3_Write(unsigned char cc)      // 16MHz 19200 bauds
{
    c3=~cc;    // complement du caractere !
    // avec TX3_PIN => RA2
  _asm{
    RSsend2:
        movlw   8                ; 8 bits
        movwf   _RS_Count        
; compteur de bits envoyés
        bcf     LATA
,2            ; bit de start
        call    RSdelai2        
; tempo
       
//   rrf        _c1,f        ; on recupere dans C le bit à envoyer
       //  syntaxe à revoir en fonction du PIC utilisé   rrcf avec 18F87J50
    L00:
        rrcf    _c3,1        ; on recupere dans C le bit à envoyer
        btfsc   STATUS
,C        ; bit à envoyer = 1 ?
        goto    L10                ; oui
        bsf     LATA
,2          ; sinon 0
        goto    L20                
; on continue sur la tempo
    L10
:
        bcf     LATA,2          ; bit à 1
    L20
:
        call    RSdelai2                ; tempo
        decfsz  _RS_Count
,1        ; on decremente le compteur de bits envoyés
        goto    L00                
; on continue sur les bits suivants
        bsf     LATA
,2         ; bit de stop
        call    RSdelai2        
; tempo pour bit de stop
         call    RSdelai2        
; tempo pour bit de stop
        goto    LA1

    RSdelai2
:                 // 52µS / bit at 19200 bauds
         MOVLW 28 ;
         MOVWF _RS_tmp ;
    RS00:
         NOP;                ; fait parti de la tempo!
         NOP;
         NOP;
         NOP;
        // NOP;
         DECFSZ _RS_tmp,;
         GOTO   RS00 ;
         NOP;
         NOP;
         NOP;
         RETURN ;

    LA1:    nop;
   }
 }
 
 void main
()
 {
   ....
  PORTA = 0b00000011;
  ANSELA=0;
  ANSELA.ANSA0=1;    //  analog input on Port A   voir page 154
  ANSELA.ANSA1=1;
  TRISA = 0b00000011 ;   // PORTA is RA0,1= analog input  RA2=sortie DAC RA3,4,5=Digital output
  PORTA=0;
  Led_On_RA4_Direction=0;
  Led_On_RA4=OFF;
  TX3_Pin_Direction=0;
  ..
   
   c3
=0;
   RS_Count=0;
   RS_tmp=0;
   RS_Delay=0;
   p1=0;
   Step=0;
    ...
  CRLF3();
  UART3_Write_CText(" UART3 bit bang 19200 bds Tx sur RA2 --> terminal YAT \r\n");

....
    etc 


 
}
 



nota MikroC propose une librairie SoftUart !
Aide toi, le ciel ou FantasPic t'aidera

PIC16F84A + XC8 = écrire sur le port série
gwion
Amateur
Amateur
Messages : 192
Enregistré en : février 2022

#5 Message par gwion » mer. 14 déc. 2022 19:03

Ah c'est vraiment nickel, merci Paul :bravo:

J'avais vu que MikroC est plus complet que XC8, et c'était mon choix de départ. Mais finalement il m'a semblé que XC8 se marie mieux avec MPLAB X et PROTEUS. Mais je me trompe peut-être ? Si c'est le cas il n'est pas trop tard pour changer :-)

PIC16F84A + XC8 = écrire sur le port série
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » jeu. 15 déc. 2022 09:12

gwion a écrit :Ah c'est vraiment nickel, merci Paul :bravo:

J'avais vu que MikroC est plus complet que XC8, et c'était mon choix de départ. Mais finalement il m'a semblé que XC8 se marie mieux avec MPLAB X et PROTEUS. Mais je me trompe peut-être ? Si c'est le cas il n'est pas trop tard pour changer :-)


pour un 16F84, 16F628 ou 16F88
MikroC est ideal et Gratuit ( si code < 2Ko)
et aussi bien plus simple que XC8 , et prend nettement moins de place ...


par contre pour pouvoir utiliser les PIC derniere generation il faut passer par XC8
car MikroC ne les gere plus ..meme avec la (derniere) version Pro 7.60 payante !
il faut Necto Studio .. qui est aussi une usine à gaz ! (payante !)
C'est pourquoi je suis passé moi aussi à XC8 pour le 18F27K42 ou 18F47Q10 ..
Aide toi, le ciel ou FantasPic t'aidera

PIC16F84A + XC8 = écrire sur le port série
gwion
Amateur
Amateur
Messages : 192
Enregistré en : février 2022

#7 Message par gwion » jeu. 15 déc. 2022 11:09

Bonjour,

Merci encore pour toutes ces explications Paul.
En attendant de tester MikroC, je tente de porter ton exemple pour XC8. Le moins que je puisse dire est que je ne suis pas très à l'aise, et que je joue un peu à l'apprenti sorcier :sifflotte:
J'ai une erreur de compilation sur : asm ("btfsc STATUS , C") ; //bit à envoyer = 1 ?
Est-ce que je peux par exemple remplacer comme dans mon extrait de code ou alors je n'ai rien compris du tout ?
Si c'est bon dans le raisonnement une autre approche serait de supprimer le test et de faire juste : RA2 = STATUSbits.CARRY;

Code : Tout sélectionner

    asm("L00:");  
        asm
("rrcf    _c3 , 1")     ; //on recupere dans C le bit à envoyer
       // asm("btfsc   STATUS , C")  ; //bit à envoyer = 1 ?
        if (STATUSbits.CARRY==1) {
            RA2 = 1;
        }  
        else 
{
            RA2 = 0;
        }
        // asm("goto    L10")         ; //oui
        //asm("bsf     PORTA , 2")   ; //sinon 0
        asm("goto    L20")         ; //on continue sur la tempo     

PIC16F84A + XC8 = écrire sur le port série
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#8 Message par paulfjujo » jeu. 15 déc. 2022 20:53

ou
"btfsc STATUS , 0"

le C est le bit 0

je refais actuellement ce projet XC8 16F84
il me faut ressortir mon programmateur POK508 + DB9/USB TSU-9 + ICProgr 105D
et montage sur Carte BlueElektronics Electronics ( avec un filtre 4MHz)

pas encore testé en reel

16F84_Tests_XC8.zip


ICProgr_POK508_Ok_2022-12.jpg


testé OK ce matin !
UART à 4800bds, car j'ai un filtre ceramique 4MHz sur ma carte
#define _XTAL_FREQ 4000000
soft prevu pour 16MHz 19200 ! ..mais divisé par 4 => 4800bds
test Carry OK nota : MikroC reconnait le Carry C !
__asm(" btfsc STATUS,0 ");

nota led sur RA4 pour verifier que le programme tourne
envoi sur l'uart (RA2) en sequence de '0' à '9' chaque seconde
Avec ce PIC on ne va pas pouvoir en envoyer des tonnes sur l'UART !
on est Rick Rack en RAM..

un 16F88 apporterait déja un confort avec un Uart hardware
ou mieux 16F1847
avant de passer au 18Fxxxxxx

resultat sur terminal
YAT_Terminal_resultat_UART_4800bds.jpg


test avec analyser SQA
SQA_Capture_chiffre_6_UART_4800bds.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

PIC16F84A + XC8 = écrire sur le port série
gwion
Amateur
Amateur
Messages : 192
Enregistré en : février 2022

#9 Message par gwion » ven. 16 déc. 2022 18:29

Bonjour Paul, bonjour tout le monde,

Merci encore pour toutes ces infos.
Ma version portée tourne en simulation :-)
J'ai donc fait une maquette pour vérifier le fonctionnement réel. Le PIC est monté sur une breadboard car je n'ai pas (encore) de platine d'expérimentation. J'ai réussi à le programmer sans aucun souci, mais rien à faire pour le faire tourner. J'ai changé le PIC pour voir : même constat. J'ai vérifié que l'oscillateur fonctionne et j'ai bien un sinus à 4MHz. J'ai également une LED qui doit s'allumer/s'éteindre en appuyant sur un bouton-poussoir : elle ne veut rien savoir non plus :cry:
Par contre je trouve du 4MHz qui se balade un peu partout sur les pin's, et je me demande si la breadboard est judicieuse avec un oscillateur à quartz...

PIC16F84A + XC8 = écrire sur le port série
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » ven. 16 déc. 2022 20:53

j'ai un doute sur le zip fourni precedement
voir sur ma page
Package exporté :
16F84_Tests.XC8.zip


la led sur RA4 doit clignoter si le programme tourne..

no probleme avec un quartz sur bread board ..
testé ok jusqu'à meme Q=32Mhz ( avec d'autres PIC !)
il y a <1,2pF entre 2 lignes verticales breadboard
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par paulfjujo le sam. 17 déc. 2022 09:12, modifié 3 fois.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 21 invités