Nouvelles:

Le Forum est maintenant chiffré (préambule https). Bien sûr, des liens externes insérés dans les sujets vont demeurer inchangés. Mais la composition des pages du Forum est désormais sécurisée. Si des problèmes d'affichage surviennent, veillez à vider votre cache pour ce site.

Menu principal

Pic18F1220 serial i2c

Démarré par maximeh, Mars 31, 2025, 07:41:45 AM

« précédent - suivant »

maximeh

Bonjour,

voici mon problème:
je suis avec un pic18f1220
j'ai réussi a envoyer depuis le pic un message en uart sur un arduino nano
j'ai réussi a faire fonctionner un lcd i2c sur le pic qui affiche un message

mais si je veux envoyer un message par uart ou si j'inscrit le pic en esclave il je réagit pas


sur le datasheet je vois que interrupt existe pour les pic18f1220

j'ai tenté avec version payante chat gpt et claude ai malheureusement pas de résultat

Est il possible de faire du rx tx avec un pic18f1220 ou déclarer une pin en input et qui fonctionne?

Voici le code qui a été injecté dans le pic

#include <xc.h>

// Configuration des bits
#pragma config OSC = INTIO2    // Oscillateur interne
#pragma config WDT = OFF       // Watchdog timer désactivé
#pragma config LVP = OFF       // Low Voltage Programming désactivé
#pragma config PWRT = ON       // Power-up timer activé
#pragma config BOR = OFF       // Brown-out reset désactivé

#define _XTAL_FREQ 4000000     // Fréquence de l'oscillateur interne (4MHz)
#define LED_PIN LATAbits.LATA0 // LED sur RA0

// Variable globale pour compter les impulsions
volatile unsigned char pulseCount = 0;

// Routine d'interruption
void __interrupt() ISR(void)
{
    // Vérifier l'interruption INT0
    if(INTCONbits.INT0IF)
    {
        // Incrémenter le compteur d'impulsions
        pulseCount++;
       
        // Effacer le drapeau d'interruption
        INTCONbits.INT0IF = 0;
    }
}

void main(void)
{
    unsigned char i, count;
   
    // Configuration de l'oscillateur interne
    OSCCON = 0x60;  // 4MHz
   
    // Configuration des ports
    TRISA = 0x00;   // PORTA tout en sortie
    TRISB = 0x01;   // RB0 en entrée
   
    // Désactiver les fonctions analogiques
    ADCON1 = 0x0F;  // Toutes les broches en mode numérique
   
    // Pour le PIC18F1220, utiliser une résistance externe de pull-up
    // ou configurer le front descendant sans pull-up interne
   
    // Initialisation des sorties
    LATA = 0x00;
    LATB = 0x00;
   
    // Configuration de l'interruption externe INT0
    INTCONbits.INT0IF = 0;     // Effacer le drapeau d'interruption
    INTCON2bits.INTEDG0 = 0;   // Front descendant pour INT0
    INTCONbits.INT0IE = 1;     // Activer l'interruption INT0
   
    // Activer les interruptions globales
    INTCONbits.GIE = 1;
   
    // Boucle principale
    while(1)
    {
        // Si des impulsions ont été reçues
        if(pulseCount > 0)
        {
            // Désactiver temporairement les interruptions
            INTCONbits.GIE = 0;
           
            // Copier le nombre d'impulsions
            count = pulseCount;
            pulseCount = 0;
           
            // Réactiver les interruptions
            INTCONbits.GIE = 1;
           
            // Faire clignoter la LED le nombre de fois correspondant
            for(i = 0; i < count; i++)
            {
                LED_PIN = 1;         // Allumer la LED
                __delay_ms(300);     // Attendre
                LED_PIN = 0;         // Éteindre la LED
                __delay_ms(300);     // Attendre
            }
        }
       
        // Petit délai dans la boucle principale
        __delay_ms(10);
    }
}