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

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#21 Message par djviper16 » lun. 13 févr. 2023 15:10

Ah ! Donc sans pull-up ni open drain j'ai un beau 5V sur RC0 et RC1, et 0V sur RC2.

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#22 Message par satinas » lun. 13 févr. 2023 15:21

Le slave select SS doit avoir plusieurs modes de fonctionnement, on peut aussi le piloter à la main en mode i/o sans PPS.

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#23 Message par satinas » lun. 13 févr. 2023 19:02

J'ai fait un essai rapide, quelle usine ce module SPI !
Avec ton code, j'arrive à envoyer un octet en écrivant le registre SPI1TXB, en faisant SPI1CON2 = 0b00000111;

PS: Par curiosité j'ai testé avec l'open drain activé et la pull-up de tirage à Vdd, on a bien un signal en sortie, pas beau du tout car le temps de montée est grand.

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#24 Message par djviper16 » lun. 13 févr. 2023 21:38

Ah bon ?! Et le signal d'horloge est présent en permanence , même quand tu n'envoies rien n'est-ce pas ?

Si ça fonctionne chez toi et pas chez moi c'est que j'ai quelque chose qui interfère dans une autre fonction ?

Merci d'avoir testé en tout cas !

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#25 Message par djviper16 » mar. 14 févr. 2023 00:00

Dans mon "main", j'ai "SYSTEM_Initialize();" qui m'emmène dans mcc.c. Dans ce dernier j'ai "PIN_MANAGER_Initialize" qui inclue "pin_manager.h".

Et dans le "pin_manager.h" je n'ai pas RC0, RC1, RC2 et RC6. Ça ne peut pas venir de là ?

pin_manager.c :

Code : Tout sélectionner

/**
  Generated Pin Manager File

  Company:
    Microchip Technology Inc.

  File Name:
    pin_manager.c

  Summary:
    This is the Pin Manager file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs

  Description:
    This header file provides implementations for pin APIs for all pins selected in the GUI.
    Generation Information :
        Product Revision  :  PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.7
        Device            :  PIC18F27K42
        Driver Version    :  2.11
    The generated drivers are tested against the following:
        Compiler          :  XC8 2.31 and above
        MPLAB             :  MPLAB X 5.45

    Copyright (c) 2013 - 2015 released Microchip Technology Inc.  All rights reserved.
*/

/*
    (c) 2018 Microchip Technology Inc. and its subsidiaries. 
    
    Subject to your compliance with these terms, you may use Microchip software and any 
    derivatives exclusively with Microchip products. It is your responsibility to comply with third party 
    license terms applicable to your use of third party software (including open source software) that 
    may accompany Microchip software.
    
    THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER 
    EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY 
    IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS 
    FOR A PARTICULAR PURPOSE.
    
    IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, 
    INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND 
    WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP 
    HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO 
    THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL 
    CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT 
    OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS 
    SOFTWARE.
*/

#include "pin_manager.h"





void PIN_MANAGER_Initialize(void)
{
    
/**
    LATx registers
    */
    
LATA 0x00;
    
LATB 0x00;
    
LATC 0x00;

    
/**
    TRISx registers
    */
    
TRISA 0xFF;
    
TRISB 0xFF;
    
TRISC 0x01000000;     //RC6 en input, les autres en output

    /**
    ANSELx registers
    */
    
ANSELC 0x00;
    
ANSELB 0x00;
    
ANSELA 0x00;

    
/**
    WPUx registers
    */
    
WPUE 0x00;
    
WPUB 0x00;
    
WPUA 0x00;
    
WPUC 0x00;

    
/**
    RxyI2C registers
    */
    
RB1I2C 0x00;
    
RB2I2C 0x00;
    
RC3I2C 0x00;
    
RC4I2C 0x00;

    
/**
    ODx registers
    */
    
ODCONA 0x00;
    
ODCONB 0x00;
    
ODCONC 0x00;

    
/**
    SLRCONx registers
    */
    
SLRCONA 0xFF;
    
SLRCONB 0xFF;
    
SLRCONC 0xFF;

    
/**
    INLVLx registers
    */
    
INLVLA 0xFF;
    
INLVLB 0xFF;
    
INLVLC 0xFF;
    
INLVLE 0x08;

    
// Enable IOCI interrupt 
    
PIE0bits.IOCIE 1
    
    
}
  
void PIN_MANAGER_IOC(void)
{   
}

/**
 End of File
*/ 


pin_manager.h :

Code : Tout sélectionner

/**
  @Generated Pin Manager Header File

  @Company:
    Microchip Technology Inc.

  @File Name:
    pin_manager.h

  @Summary:
    This is the Pin Manager file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs

  @Description
    This header file provides APIs for driver for .
    Generation Information :
        Product Revision  :  PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.7
        Device            :  PIC18F27K42
        Driver Version    :  2.11
    The generated drivers are tested against the following:
        Compiler          :  XC8 2.31 and above
        MPLAB               :  MPLAB X 5.45    
*/

/*
    (c) 2018 Microchip Technology Inc. and its subsidiaries. 
    
    Subject to your compliance with these terms, you may use Microchip software and any 
    derivatives exclusively with Microchip products. It is your responsibility to comply with third party 
    license terms applicable to your use of third party software (including open source software) that 
    may accompany Microchip software.
    
    THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER 
    EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY 
    IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS 
    FOR A PARTICULAR PURPOSE.
    
    IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, 
    INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND 
    WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP 
    HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO 
    THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL 
    CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT 
    OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS 
    SOFTWARE.
*/

#ifndef PIN_MANAGER_H
#define PIN_MANAGER_H

/**
  Section: Included Files
*/

#include <xc.h>

#define INPUT   1
#define OUTPUT  0

#define HIGH    1
#define LOW     0

#define ANALOG      1
#define DIGITAL     0

#define PULL_UP_ENABLED      1
#define PULL_UP_DISABLED     0

// get/set IO_RB0 aliases
#define IO_RB0_TRIS                 TRISBbits.TRISB0
#define IO_RB0_LAT                  LATBbits.LATB0
#define IO_RB0_PORT                 PORTBbits.RB0
#define IO_RB0_WPU                  WPUBbits.WPUB0
#define IO_RB0_OD                   ODCONBbits.ODCB0
#define IO_RB0_ANS                  ANSELBbits.ANSELB0
#define IO_RB0_SetHigh()            do { LATBbits.LATB0 = 1; } while(0)
#define IO_RB0_SetLow()             do { LATBbits.LATB0 = 0; } while(0)
#define IO_RB0_Toggle()             do { LATBbits.LATB0 = ~LATBbits.LATB0; } while(0)
#define IO_RB0_GetValue()           PORTBbits.RB0
#define IO_RB0_SetDigitalInput()    do { TRISBbits.TRISB0 = 1; } while(0)
#define IO_RB0_SetDigitalOutput()   do { TRISBbits.TRISB0 = 0; } while(0)
#define IO_RB0_SetPullup()          do { WPUBbits.WPUB0 = 1; } while(0)
#define IO_RB0_ResetPullup()        do { WPUBbits.WPUB0 = 0; } while(0)
#define IO_RB0_SetPushPull()        do { ODCONBbits.ODCB0 = 0; } while(0)
#define IO_RB0_SetOpenDrain()       do { ODCONBbits.ODCB0 = 1; } while(0)
#define IO_RB0_SetAnalogMode()      do { ANSELBbits.ANSELB0 = 1; } while(0)
#define IO_RB0_SetDigitalMode()     do { ANSELBbits.ANSELB0 = 0; } while(0)

// get/set IO_RB1 aliases
#define IO_RB1_TRIS                 TRISBbits.TRISB1
#define IO_RB1_LAT                  LATBbits.LATB1
#define IO_RB1_PORT                 PORTBbits.RB1
#define IO_RB1_WPU                  WPUBbits.WPUB1
#define IO_RB1_OD                   ODCONBbits.ODCB1
#define IO_RB1_ANS                  ANSELBbits.ANSELB1
#define IO_RB1_SetHigh()            do { LATBbits.LATB1 = 1; } while(0)
#define IO_RB1_SetLow()             do { LATBbits.LATB1 = 0; } while(0)
#define IO_RB1_Toggle()             do { LATBbits.LATB1 = ~LATBbits.LATB1; } while(0)
#define IO_RB1_GetValue()           PORTBbits.RB1
#define IO_RB1_SetDigitalInput()    do { TRISBbits.TRISB1 = 1; } while(0)
#define IO_RB1_SetDigitalOutput()   do { TRISBbits.TRISB1 = 0; } while(0)
#define IO_RB1_SetPullup()          do { WPUBbits.WPUB1 = 1; } while(0)
#define IO_RB1_ResetPullup()        do { WPUBbits.WPUB1 = 0; } while(0)
#define IO_RB1_SetPushPull()        do { ODCONBbits.ODCB1 = 0; } while(0)
#define IO_RB1_SetOpenDrain()       do { ODCONBbits.ODCB1 = 1; } while(0)
#define IO_RB1_SetAnalogMode()      do { ANSELBbits.ANSELB1 = 1; } while(0)
#define IO_RB1_SetDigitalMode()     do { ANSELBbits.ANSELB1 = 0; } while(0)

// get/set IO_RB2 aliases
#define IO_RB2_TRIS                 TRISBbits.TRISB2
#define IO_RB2_LAT                  LATBbits.LATB2
#define IO_RB2_PORT                 PORTBbits.RB2
#define IO_RB2_WPU                  WPUBbits.WPUB2
#define IO_RB2_OD                   ODCONBbits.ODCB2
#define IO_RB2_ANS                  ANSELBbits.ANSELB2
#define IO_RB2_SetHigh()            do { LATBbits.LATB2 = 1; } while(0)
#define IO_RB2_SetLow()             do { LATBbits.LATB2 = 0; } while(0)
#define IO_RB2_Toggle()             do { LATBbits.LATB2 = ~LATBbits.LATB2; } while(0)
#define IO_RB2_GetValue()           PORTBbits.RB2
#define IO_RB2_SetDigitalInput()    do { TRISBbits.TRISB2 = 1; } while(0)
#define IO_RB2_SetDigitalOutput()   do { TRISBbits.TRISB2 = 0; } while(0)
#define IO_RB2_SetPullup()          do { WPUBbits.WPUB2 = 1; } while(0)
#define IO_RB2_ResetPullup()        do { WPUBbits.WPUB2 = 0; } while(0)
#define IO_RB2_SetPushPull()        do { ODCONBbits.ODCB2 = 0; } while(0)
#define IO_RB2_SetOpenDrain()       do { ODCONBbits.ODCB2 = 1; } while(0)
#define IO_RB2_SetAnalogMode()      do { ANSELBbits.ANSELB2 = 1; } while(0)
#define IO_RB2_SetDigitalMode()     do { ANSELBbits.ANSELB2 = 0; } while(0)

// get/set IO_RC3 aliases
#define IO_RC3_TRIS                 TRISCbits.TRISC3
#define IO_RC3_LAT                  LATCbits.LATC3
#define IO_RC3_PORT                 PORTCbits.RC3
#define IO_RC3_WPU                  WPUCbits.WPUC3
#define IO_RC3_OD                   ODCONCbits.ODCC3
#define IO_RC3_ANS                  ANSELCbits.ANSELC3
#define IO_RC3_SetHigh()            do { LATCbits.LATC3 = 1; } while(0)
#define IO_RC3_SetLow()             do { LATCbits.LATC3 = 0; } while(0)
#define IO_RC3_Toggle()             do { LATCbits.LATC3 = ~LATCbits.LATC3; } while(0)
#define IO_RC3_GetValue()           PORTCbits.RC3
#define IO_RC3_SetDigitalInput()    do { TRISCbits.TRISC3 = 1; } while(0)
#define IO_RC3_SetDigitalOutput()   do { TRISCbits.TRISC3 = 0; } while(0)
#define IO_RC3_SetPullup()          do { WPUCbits.WPUC3 = 1; } while(0)
#define IO_RC3_ResetPullup()        do { WPUCbits.WPUC3 = 0; } while(0)
#define IO_RC3_SetPushPull()        do { ODCONCbits.ODCC3 = 0; } while(0)
#define IO_RC3_SetOpenDrain()       do { ODCONCbits.ODCC3 = 1; } while(0)
#define IO_RC3_SetAnalogMode()      do { ANSELCbits.ANSELC3 = 1; } while(0)
#define IO_RC3_SetDigitalMode()     do { ANSELCbits.ANSELC3 = 0; } while(0)

// get/set IO_RC4 aliases
#define IO_RC4_TRIS                 TRISCbits.TRISC4
#define IO_RC4_LAT                  LATCbits.LATC4
#define IO_RC4_PORT                 PORTCbits.RC4
#define IO_RC4_WPU                  WPUCbits.WPUC4
#define IO_RC4_OD                   ODCONCbits.ODCC4
#define IO_RC4_ANS                  ANSELCbits.ANSELC4
#define IO_RC4_SetHigh()            do { LATCbits.LATC4 = 1; } while(0)
#define IO_RC4_SetLow()             do { LATCbits.LATC4 = 0; } while(0)
#define IO_RC4_Toggle()             do { LATCbits.LATC4 = ~LATCbits.LATC4; } while(0)
#define IO_RC4_GetValue()           PORTCbits.RC4
#define IO_RC4_SetDigitalInput()    do { TRISCbits.TRISC4 = 1; } while(0)
#define IO_RC4_SetDigitalOutput()   do { TRISCbits.TRISC4 = 0; } while(0)
#define IO_RC4_SetPullup()          do { WPUCbits.WPUC4 = 1; } while(0)
#define IO_RC4_ResetPullup()        do { WPUCbits.WPUC4 = 0; } while(0)
#define IO_RC4_SetPushPull()        do { ODCONCbits.ODCC4 = 0; } while(0)
#define IO_RC4_SetOpenDrain()       do { ODCONCbits.ODCC4 = 1; } while(0)
#define IO_RC4_SetAnalogMode()      do { ANSELCbits.ANSELC4 = 1; } while(0)
#define IO_RC4_SetDigitalMode()     do { ANSELCbits.ANSELC4 = 0; } while(0)

// get/set IO_RC5 aliases
#define IO_RC5_TRIS                 TRISCbits.TRISC5
#define IO_RC5_LAT                  LATCbits.LATC5
#define IO_RC5_PORT                 PORTCbits.RC5
#define IO_RC5_WPU                  WPUCbits.WPUC5
#define IO_RC5_OD                   ODCONCbits.ODCC5
#define IO_RC5_ANS                  ANSELCbits.ANSELC5
#define IO_RC5_SetHigh()            do { LATCbits.LATC5 = 1; } while(0)
#define IO_RC5_SetLow()             do { LATCbits.LATC5 = 0; } while(0)
#define IO_RC5_Toggle()             do { LATCbits.LATC5 = ~LATCbits.LATC5; } while(0)
#define IO_RC5_GetValue()           PORTCbits.RC5
#define IO_RC5_SetDigitalInput()    do { TRISCbits.TRISC5 = 1; } while(0)
#define IO_RC5_SetDigitalOutput()   do { TRISCbits.TRISC5 = 0; } while(0)
#define IO_RC5_SetPullup()          do { WPUCbits.WPUC5 = 1; } while(0)
#define IO_RC5_ResetPullup()        do { WPUCbits.WPUC5 = 0; } while(0)
#define IO_RC5_SetPushPull()        do { ODCONCbits.ODCC5 = 0; } while(0)
#define IO_RC5_SetOpenDrain()       do { ODCONCbits.ODCC5 = 1; } while(0)
#define IO_RC5_SetAnalogMode()      do { ANSELCbits.ANSELC5 = 1; } while(0)
#define IO_RC5_SetDigitalMode()     do { ANSELCbits.ANSELC5 = 0; } while(0)

/**
   @Param
    none
   @Returns
    none
   @Description
    GPIO and peripheral I/O initialization
   @Example
    PIN_MANAGER_Initialize();
 */
void PIN_MANAGER_Initialize (void);

/**
 * @Param
    none
 * @Returns
    none
 * @Description
    Interrupt on Change Handling routine
 * @Example
    PIN_MANAGER_IOC();
 */
void PIN_MANAGER_IOC(void);



#endif // PIN_MANAGER_H
/**
 End of File
*/ 

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#26 Message par satinas » mar. 14 févr. 2023 05:23

Bonjour,
Que ce soient le SPI ou l'I2C l'horloge n'est pas émise en permanence par le host/master, 8 coups d'horloge (9 pour l'I2C) sont produits chaque fois qu'on veut envoyer/recevoir un octet. Sur les anciens modules SPI on déclenchait cela en écrivant un registre, SPI1TXB ici. Dans la config tu n'as pas activé les bits TXR et RXR (transmit et receive) cela peut expliquer qu'il soit muet. Sur ce pic il y a comme pour l'I2C des fonctionnalités étendues qui rendent sa mise en oeuvre plus difficile.
Tu t'attaques à un gros morceau. Je n'ai pas trouvé d'exemple SPI sur le net avec ce pic, la doc fait peur. La solution serait d'utiliser MCC pour générer les fonctions SPI. Je voulais le faire, mais maintenant il faut se connecter pour utiliser MPLAB Xpress Online.

Soit tu utilises MCC, il fait tout, tu essayes de comprendre et utiliser les fonctions qu'il produit, soit tu ne l'utilises pas du tout, car ce pic démarre sans avoir à écrire un registre ou presque, soit un mix des deux. Je préfère la deuxième solution, chacun ses gouts :)

J'ai repris ton code avec quelques modifs, la ligne avec le second while est commentée car il bloque, il faudrait mettre une tempo avant de lire l'octet reçu. En attendant mieux.

Code : Tout sélectionner

  SPI1CON0bits.EN = 0;      //desactive le module SPI
 
  SPI1CLK = 0x00;           //config horloge en FOSC (SPI CLOCK SELECTION REGISTER p.543)
  SPI1BAUD = 0xff;          //64Mhz/(2x256) = 125KHz (SPI BAUD RATE REGISTER p.539)
  SPI1TWIDTH = 0x00;        //8bits (SPI TRANSFER WIDTH REGISTER p.538)
  SPI1INTE = 0x00;          //SPI INTERRUPT ENABLE REGISTER p.536
  SPI1INTF = 0x00;          //SPI INTERRUPT FLAG REGISTER p.535
 
  SPI1CON0 = 0b00000011;
  SPI1CON1 = 0b00000000;
  SPI1CON2 = 0b00000111;
 
  SPI1CON0bits.EN = 1;      //active le module SPI, (faire la config avant)

  while (1) {
    while (!SPI1TXBE) { }
    SPI1TXB = 0x81;         // envoi octet 0x81
//  while (!SPI1RXBF) { }
    i = SPI1RXB;            // lecture octet reçu
    wait_ms(100);
  } 

Tu peux te documenter ici https://www.microchip.com/en-us/product/PIC18F27K42
https://ww1.microchip.com/downloads/en/ ... 03192A.pdf (nous y sommes)
https://ww1.microchip.com/downloads/en/ ... lick.X.zip

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#27 Message par djviper16 » mar. 14 févr. 2023 10:28

Bonjour,

Génial ! J'ai réussi à générer des signaux, ou plutôt devrais-je dire "TU" as réussi ! Merci, encore une fois :-D

Je vois bien que je m'attaque à un gros morceau mais c'est indispensable pour que j'avance dans mon projet. Les MCP3002 ne connaissent que ce protocole.

Je préfère essayer de comprendre ce que je fais avec les registres, plutôt qu'utiliser MCC. Et puis je n'ai pas encore trouvé comment récupérer une ancienne config de MCC pour la modifier, ce qui fait que je dois tout reparamétrer à chaque fois que je veux ajouter un module ?

Pour le signal d'horloge, je pensais que c'était permanent, du coup j'étais persuadé que mon SPI ne fonctionnait pas. J'ai fini par tomber sur les graph p.523 par exemple dans la doc, et j'ai compris...

J'ai remplacé SPI1TXB = 0x81 par 0xB9 pour que ce soit plus parlant au niveau de la trame.

SCK en jaune / SDO en rose.
La fréquence est bien de 125KHz, comme prévu donc super. (contrairement à l'I2C qui tourne à 100KHZ au lieu de 500KHz sans que je sache pourquoi)
Image

Je reviens dans pas longtemps avec de nouvelles questions :lol:

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#28 Message par satinas » mar. 14 févr. 2023 12:39

Il aurait fallu tomber plus tôt sur la note citée plus haut "Using the SPI Module on 8-Bit PIC® Microcontrollers".
C'est très bien expliqué, avec la routine ci-dessous qui va bien. Mais batailler un peu, cela fait pas de mal pour découvrir le contenu de chaque registre.

On écrit SPI1TXB, puis on attend que SPI1RXIF passe à 1, on lit SPI1RXB, ce qui a pour effet de remettre à zéro SPI1RXIF.
Je vois pas pourquoi il met à 1 TXR et RXR à chaque envoi, on doit pouvoir l'enlever de la fonction. D'après le datasheet SPI1TCNT = 1 n'est pas obligatoire en mode full-duplex et si BMODE à 1. Il va plus rester grand chose dans cette fonction :)

Code : Tout sélectionner

uint8_t SPI1_Master_FullDuplex (uint8_t data)
{
  SPI1CON2bits.TXR = 1;           // Transmit Data-Required Bit;
  SPI1CON2bits.RXR = 1;           // Receive FIFO Space-Required Bit;
  SPI1TCNT = 1;                   // Load SPI Transfer Counter;
  SPI1TXB = data;                 // Load data into SPI transmit buffer;
  while (PIR2bits.SPI1RXIF == 0); // Check for any SPI Receive Interrupts;
  return SPI1RXB;
}

Pour l'I2C tout est dans les registres. I2C1CLK est à 500kHz, ce n'est pas encore la vitesse réelle I2C. Le flag FME du registre I2C1CON2 est un diviseur par 4 ou 5, et après division on obtient Fscl. Cette fréquence I2cClk doit être liée au fonctionnement interne du module I2C, il surveille les lignes SCL et SDA pour détecter des erreurs ou pour attendre que le bus soit libre.

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#29 Message par djviper16 » mar. 14 févr. 2023 14:04

Oui je vais étudier attentivement cette doc ce soir. Et pourquoi pas tenter une communication avec le MCP3002, mais je vois que j'ai un soucis avec mon optocoupleur, le signal qui en sort est bien trop faible. J'ai peut-être mis des résistances de trop forte valeur en entrée.
Ok compris pour l'I2C, ceci explique cela...

Un aperçu du montage :
Image
Image
Image

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#30 Message par paulfjujo » mer. 15 févr. 2023 13:33

bonjour,


djviper16 a écrit :... J'ai peut-être mis des résistances de trop forte valeur en entrée.



elles font combien ?

perso, j'aurais mis 1K...
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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