IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Programmer timer 0 d'un 16f877


Sujet :

Embarqué

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut Programmer timer 0 d'un 16f877
    Bonjour,
    j'ai viens de commencer à programmer un pic 16f877.
    le sujet est afficher un battement de cœur. je veux recevoir des données chaque 1 ms. Pour cela j'ai pris le timer0 pour le faire en mode Internal pas external (il y'a pas d'interruption ) . sachant que la fréquence F=Foscillateur/4 = 5 MHZ ==> 0,2 µs quelle pré-diviseur faut-il utiliser selon c'est tableau?? Nom : prediviseur.jpg
Affichages : 1904
Taille : 83,6 Ko

    J'utilise le compiler C comme logiciel de programmation.
    que sera t'il la ligne de code à mettre dans mon programme.
    merci à tous.

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Salut,
    Oula ça fait un bail que j'ai pas toucher à un PIC !!!!
    D'après ce que tu as écrit tu as un quartz de 20MHz et il faut donc regarder dans le 3 ème tableau première ligne. Ça t'indique le temps que met le timer0 à déborder suivant le prescaler choisi.

    Sachant que le timer0 du Pic est sur 8 bits et qu'il déborde à 255 si tu prends un prescaler 1:1 il déborder à 51us. (255x200ns)

    Pour le code en C tu ne dis pas sous quel compilateur tu es ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut analyseur de signaux ECG à laide d'un pic 16F788
    bonjour,j'ai un problème dans mon projet de fin d’étude tout d'abord mon sujet est "analyseur des signaux ECG":le but de ce projet et de convertir le signal ECG analogique en numérique à l'aide d'un pic 16f877 puis je veux détecter les pic R de ce signal (le point maximum de ce signal)et de calculer les intervalles des temps entre ces pics R,calculer le temps moyen des intervalles et déduire le fréquence de ce signal ; mon problème est au niveau de calcule des intervalles entre les pic R ,j'utilise comme logiciel le compilateur c compiler ;le résultat obtenu est fausse je besoin de quelqu'un pour m'aider à résoudre ce problème.
    Voici mon code et merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include "C:\Users\issam\issaaaam\pfe\test hyper\mnt.h"
    #use delay (clock=20000000)
    #define LCD_TYPE 1
    #include <lcd.c>
    
    void main()
    {
        double r1,r2,somme,i,val,freq,tmoy,point,t;
        
        lcd_init();
        lcd_init();
        setup_adc_ports(AN0_AN1_VSS_VREF);
        setup_adc(ADC_CLOCK_DIV_2);
        setup_psp(PSP_DISABLED);
        setup_spi(SPI_SS_DISABLED);
        setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
        setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
        setup_timer_2(T2_DISABLED,0,1);
        setup_comparator(NC_NC_NC_NC);
        setup_vref(FALSE);
        set_tris_d(0);
        output_d(0);
        set_timer1(0);
        
        r2=0;
        r1=0;
        i=0;
        somme=0;
        
        setup_adc_ports(AN0_AN1_VSS_VREF);
        setup_adc(ADC_CLOCK_INTERNAL);
        set_adc_channel(0);
        while(t<10000)
        {
            t=t+1;
            point=(float)read_adc();
            point=point*5/1023; //printf(lcd_putc,"\f point:%2.1f", point*4.16);
            if((point>1)&&(point<r2)&&(r2>r1)) /*{val=get_timer1()*12.8*0.000001;
    set_timer1(0);
    printf(lcd_putc,"\f point:%2.1f", val);
    r1=r2; r2=point;
    }
    else {r1=r2; r2=point;
    } }}*/
            {
                val=(get_timer1()*1.6*0.000001);
                set_timer1(0);
                printf(lcd_putc,"\f temps:%2.1f", val);
                r1=r2;
                r2=point;
                i=i+1;
                if(i>1)
                {
                    somme= somme+val;
                }
            }
            else
            {
                r1=r2;
                r2=point;
            }
        }
        tmoy=somme/(i-1);
        freq=(1/tmoy);
        printf(lcd_putc,"\fTM:%2.1f s",tmoy);
        delay_ms(2000);
        printf(lcd_putc,"\ffrequence:%2.1f hz",freq);
        delay_ms(2000);
        if((freq<120)&&(freq>60)) lcd_putc("\f patient sein ");
        else lcd_putc("\f patient malade");
    }

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Salut,
    Je ne connais pas ce compilateur par contre peux tu me poster :
    - une copie d'écran de la tronche du signal analogique.
    - est ce que le signal analogique est conditionné à la pleine échelle du CAN du PIC ? J'entends pas là est ce le maximum du signal analogique est égal a Vref ?
    - as tu un schéma ?

    Je te conseille de travailler avec des "int" et non avec des "float" qui consomme énormément de mémoire. Une simple float pour l'affichage suffira.

    Je suis surpris que tu n'ai pas de fonction d'interruption dans ton programme ?

    A+

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Salut,
    J'ai l'impression qu'il y a des choses qui ne vont pas dans ce que tu veux faire.

    Au vu du rythme cardiaque, échantillonner toutes les 1ms est impossible, tu n'as pas assez de mémoire dans ton PIC pour faire une telle chose.

    Ensuite, ce qui me gêne c'est l'absence d'interruption timer !
    Normalement quant on échantillonne un signal on créait une fonction d'interruption sur débordement du timer. Dans cette fonction d'interruption tu remplis un tableau d'échantillons en lisant l'ADC et tu mets à jours une variable globale qui te servira a compter le temps qui passe.

    Exemple si le timer déborde toutes les 30ms, ton tableau d'échantillons contient des valeurs issues de l'ADC de manière régulière. C'est la fréquence d'échantillonnage.

    Une fois le tableau rempli d'échantillons (à toi de voir combien d'échantillons tu veux en fonction du signal analogique a analyser mais aussi de la mémoire disponible dans ton micro) tu recherches dans ton programme principal le pic "R" dont seul toi connaît la valeur. Si par exemple la 5eme valeur du tableau est ton pic "R" l'avantage est que tu connais aussi le temps précis où il est apparu car ton tableau a été rempli toutes les 30ms.
    Donc la 5eme valeur, de mon exemple, est apparu a (5*30ms=150ms). Tu mémorises ces 2 infos pour affichage ou autres choses que seul toi connaît encore. Tu remarqueras que comme avec cette technique c'est hyper simple de calculer des fréquences (grace à une variable globale qui compte le temps dans la fonction d'interruption) puisque tu sais que chaque élément du tableau a été pris toutes les 30ms (débordement du timer)

    Qu'avec ton code sans plus d'élément, personne ne peut t'aider.
    A+

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut
    merci

Discussions similaires

  1. Lancement régulier d'un programme (timer?)
    Par livinho38 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 20/05/2010, 10h20
  2. Programmation d'un PIC 16F877
    Par AHMED CHAABEN dans le forum C
    Réponses: 1
    Dernier message: 02/01/2010, 13h08
  3. [PIC] Programmation d'un accéléromètre
    Par sani300 dans le forum Autres architectures
    Réponses: 6
    Dernier message: 22/06/2009, 21h51
  4. [PIC] Pause avec les timers
    Par Ekinoks dans le forum Assembleur
    Réponses: 1
    Dernier message: 07/05/2005, 23h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo