Systèmes imbibé PIC24 / programmation en C
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Systèmes imbibé PIC24 / programmation en C



  1. #1
    invite57e688f7

    Systèmes imbibé PIC24 / programmation en C


    ------

    Bonjour, je suis nouveau dans ce forum, et nouveau avec les Pic.
    Je lie un livre en anglais sur le sujet,avec des examples, et j'essaye d'aller plus loin que les exercices du livres.

    Mon obectif en ce moment est de creé un chronomètre où :
    L'utilisateur doit pouvoir faire "reset" redémarrer le système en utilisant un interrupteurs "switch" ou combinaison de 2 interrupteurs.
    L'utilisateur doit pouvoir demarrer le système en utilisant un des interrupteurs
    L'utilisateur doit pouvoir arréter le système en utilisant un interrupteur
    et ainsi successivement (comme un vrai chronomètre sportif)
    En ce moment je n'arrive qu'a le faire arreter (rien de plus). Les maximum ce chronomètre devrais conter est 9.59.9
    Je voudrais peut-être « élargir » vers 23.59.59… mais cela est moins importants pour moi pour le maintenant
    Le "Input capture" m'embrouille un peu.

    Merci d'avance pour votre aide.

    le circuit:




    le code principale:


    #include <p24fj128ga010.h>
    #include "main.h"

    _CONFIG2( FNOSC_FRCPLL & OSCIOFNC_OFF ); //Oscillateur interne- 4xPLL donnant 16 MIPS
    // borne RC15 posséde l'oscillateur
    //Prototypes de fonction
    extern void update_display(const unsigned int min, const unsigned int dix, const unsigned int unite, const unsigned int dixieme);
    extern unsigned int poll_switch_SW3();
    //Global variables
    unsigned int minutes; //Minutes - pour L'ecran électrique 0
    unsigned int units; //Secondes (dix) - pour L'ecran électrique 1
    unsigned int tens; //Secondes (unite) - pour L'ecran électrique 2
    unsigned int tenths; //Dixieme de seconde - pour L'ecran électrique 3
    unsigned int displayOn=0; //Interrupteur pour allumer ou fermer L'ecran électrique - partagé par deux routines d'ISR
    unsigned int IC1BUFFERVAL; //Utiliser pour lire IC1 "timer buffer"


    io_port_A *display = (io_port_A*)&LATA; //Adresse de la sortie du "latch"(qui se relie au PORTA) - il est PLUS SÛR d'écrire vers le "latch"
    io_port_A *inputs = (io_port_A*)&PORTA; // Adresse de PORTA (On ne peu pas lire du LATA)

    //Code Principal
    int main()
    {
    //Configurez le dispositif pour utiliser l'oscillateur interne
    OSCCONbits.COSC = 1u; // Oscillateur interne avec PLL
    CLKDIVbits.RCDIV = 0u; // Oscillateur interne non divisé (8MHz)
    CLKDIVbits.DOZEN =0; // aucune extensibilité
    CLKDIVbits.DOZE =0; //

    //Cunfigurer les "ports"
    TRISA = 0x00F0; //les 4 moins significatif et les 8 bits lesplus significatifs sont des sorties digitaux
    LATA = 0x0000; //Ecrire un zero a PORTA a travers le "latch"

    //initialisation des variables et des ecrans électriques
    minutes = 0;
    unites = 0;
    dix = 0;
    dixiemes = 0;
    update_display(1,2,3,4);
    update_display(minutes, dix, unites, dixiemes);

    //TIMER1 Configuration du Régistre
    T1CON = 0;
    T1CONbits.TCKPS = 0b11; //Prescale = 256
    T1CONbits.TON = 1; //Timer on
    TMR1 = 0; //Redémarre "Timer Counter"

    //Configure TIMER1 interrupt
    _T1IP = 4; //priorité d'interruption = 4
    PR1 = 6250-1; //registre de period- configurer pour 0.1s
    _T1IF = 0; //dégagé le "timer interrupt" flag

    //Configuration du (IC1)
    _IC1IP = 4; //fix la priorité de l'intérrupteur pour le "Input Capture"
    _TRISD9 = 1; //fix RD8 comme une entrée
    IC1CON = 0x0002; //registre InputCaptureCONfiguration - bord en chute
    _IC1IF = 0; //Redémarre le "Input Capture 1 Interrupt Flag"

    //ENABLE INTERRUPTS
    _IC1IE = 1; //Fix le "Input Capture 1 Interrupt Enable"
    _T1IE = 1; //Allume le "timer 1 interrupt enable"



    //boucle mère
    while (1)
    {
    Idle(); //Éteindre "main core" -Continuation des Périphériques informatiques
    asm("nop"); //Réveillé par l'interrupteur (TIMER 1 ou INPUT CAPTURE 1)
    update_display(minutes, dix, unites, dixiemes);

    } //fin de "while"

    return 0;
    }


    //****************************** ****************************** ************
    //********************* INTERRUPT SERVICE ROUTINES (ISR)****************
    //****************************** ****************************** ************

    //ISR Pour le Compteur
    void __attribute__((interrupt, no_auto_psv)) _T1Interrupt()
    {
    //Incrémentez le compteur sur chaque interruption
    dixieme++;

    //Mise à jour minutes, dix, unites and dixiemes pour l'écran élèctrique (BCD)

    //Vérifiez pour un dépassement - ondulez au prochain chiffre
    if (dixieme == 10) {
    dixieme = 0;
    unites++;
    }
    if (unites == 10) {
    unites = 0;
    dix++;
    }
    if (dix == 6) {
    dix = 0;
    minutes++;
    }
    if (minutes == 10) {
    minutes=0;
    }

    //Redémarrer le" interrrupt flag" avant de retourné
    _T1IF = 0;
    }

    //ISR pour le "INPUT CAPTURE"
    void __attribute__((interrupt, no_auto_psv)) _IC1Interrupt()
    {
    IC1CON = 0x0002;
    T1CON = poll_switch_SW3;

    //Lire le tampon du IC1
    IC1BUFFERVAL = IC1BUF; //Celle ci est nécessaire pour empêcher le débordement du Tampon

    _IC1IF = 0; //Redemarer le "interrupt flag"


    }//

    -----

  2. #2
    invitee0bbe70d

    Re : Systèmes imbibé PIC24 / programmation en C

    Bonjour,

    A quel livre sur les PIC fais-tu référence ?
    J'ai utilisé un livre sur les PIC24F que je te recommande. Il est écrit par Lucio di Jasio qui travaille apparemment chez Microchip : http://flyingpic24.com/

    Je ne comprends pas du tout pourquoi tu utilises l'unité de capture pour faire un chronomètre....Moi je ferais cela simplement avec le timer qui est associé au quartz 32kHz externe (le TIMER1 je crois).

    NB : je pense que tu veux parler de système EMBARQUE et non imbibé

  3. #3
    invite57e688f7

    Re : Systèmes imbibé PIC24 / programmation en C

    J'ai lue le "Programming and Customizing the Pic Microcontroller " de Michael Predko.
    j'utilise l'unité de capture pour faire un chronomètre car j'ai compris a travers le livre, et certains site que pour utiliser des interrupteur extern il fallait les utiliser.

    je crois que mon grand probleme en ce moment c'est que je ne suis pas super douee en language C et que le pic m'embrouille encore plus vue qu'on doit utiliser des bornes.

    ca serais sympa si quelqu'un pourais m'aider avec le code et/ ou m'expliquer ce que serais la meilleure method pour utiliser les interrupteurs.

    merci

  4. #4
    invitee0bbe70d

    Re : Systèmes imbibé PIC24 / programmation en C

    Bonsoir,

    Concernant les interrupteurs, si tu veux faire simple pour les gérer je te conseille un circuit RC externe avec chaque interrupteur de facon à gérer les rebonds des boutons poussoirs. Cela peut se faire également par soft mais c'est plus compliqué. Si tu fais cela avec un circuit RC, tu pourras connecter tes interrupteurs à des ports d'Entrée sans t'occuper des des inputs capture.
    ci-joint un excellent document sur les anti-rebonds :
    http://www.ganssle.com/debouncing.pdf

  5. A voir en vidéo sur Futura

Discussions similaires

  1. probleme uart pic24
    Par invite92ed4f10 dans le forum Électronique
    Réponses: 3
    Dernier message: 03/06/2008, 00h07
  2. Systèmes.
    Par invitef2708712 dans le forum Mathématiques du collège et du lycée
    Réponses: 4
    Dernier message: 12/11/2007, 02h07
  3. DM systemes
    Par invite5a7bd524 dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 05/11/2007, 22h07
  4. systèmes d'étoiles >2
    Par invite4021e8ad dans le forum Archives
    Réponses: 7
    Dernier message: 08/03/2007, 22h10
  5. systèmes dynamiques
    Par invitec9750284 dans le forum Physique
    Réponses: 4
    Dernier message: 30/06/2006, 23h44
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...