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 ---
- 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 ---
Modérateur : Jérémy
[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
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.
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
[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
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 :
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
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.
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
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
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
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)
Je reviens dans pas longtemps avec de nouvelles questions
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
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)
Je reviens dans pas longtemps avec de nouvelles questions
[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
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 :)
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.
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
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 :
Ok compris pour l'I2C, ceci explique cela...
Un aperçu du montage :
[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 40 invités