Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

16F876 Et transmission USART



  1. #1
    Peter

    16F876 Et transmission USART


    ------

    Bonjour

    Pour essayer de comprendre le mode USART sur un 16f876 j'essaye d'envoyer au PC un caractére a chaque interruption sur RB0.
    Afin de bien comprendre j'ai fait le plus simple possible sans traiter les erreurs ni la parité.
    Mon pic travaille a 20MGHZ
    Transmission a 9600 Bds, 1 bit start,8 bits données,sans parité,1 bit stop

    J'ai initialisé INTCON,INTE pour RB0
    Je n'ai pas initialisé INTCON,PEIE
    J'ai initialisé INTCON,GIE pour les interruptions

    Ma routine d'interruption sur RB0 fonctionne car elle sert d'interrupteur pour une LED et me postionne un flag pour l'envoi de mon caractére vers le PC
    Voici le code

    intrb0
    bcf STATUS,RP0 ; Sélectionner banque 0
    movlw B'00000100'
    xorwf PORTA , f ; Inverse la LED
    call tempo ; Routine de temporisation
    bsf flagrb0 ; Positionne le flag d'envoi d'un
    ; caractére
    return ; fin d'interruption RB0/INT


    et dans la boucle du programme

    Start

    clrwdt ; effacer watch dog
    btfss flagrb0 ; Test le flag d'interrution
    goto $-2 ; Non boucler

    bcf STATUS,RP0 ; passer en banque 0
    movlw "r" ; Envoie d'un caractére
    movwf TXREG

    ; Lancer l'emission
    ; --------------------------
    bsf STATUS,RP0 ; passer en banque 1
    bsf TXSTA,TXEN ; émission en service.
    bsf PIE1,TXIE ; envoyer l'information

    ; Attendre fin de l'émission
    ; --------------------------
    clrwdt ; effacer watch dog
    btfsc PIE1,TXIE ; reste des caractères à envoyer?
    goto $-2 ; oui, attendre
    btfss TXSTA,TRMT ; buffer de sortie vide?
    goto $-4 ; non, attendre

    ; Preparation pour nouvelle données
    ; -------------------------------
    bcf flagrb0 ; efface flag interruption
    goto start ; boucler

    END ; directive fin de programme

    L'envoie du caractére fonctionne a la premiére interrutions mais pas au suivantes
    Cela fait un moment que je planche la dessus mais je ne trouve pas,il doit y avoir quelque chose que je ne comprend pas.
    La suite logique (pour moi) de cette exercise est que je veux calculer le temps (avec une précision d'une milliseconde) entre chaque interrution sur RB0 et envoyer cette valeur au PC.
    La fréquence des interrutions sur RBO serat au maximun de 3KHZ.
    J'ai encore de longues nuits a bosser .....

    Mais pour l'instant la je suis bloquer

    Cordialement Peter

    -----

  2. Publicité
  3. #2
    Gérard

    Re : 16F876 Et transmission USART

    Le bit INTF de INTCON doit être mis à 0 dans la routine d'interruption.
    Tu ne devrais pas mettre de tempo dans la routine d'interruption, les interruptions doivent aller au plus vite.
    Gérard.

  4. #3
    Peter

    Re : 16F876 Et transmission USART

    Bonjour Gérard

    je remettais bien le bit INTCON,INTF a 0 parce que ma led fonctionne bien c'est un oubli lors de la creation du message .
    Par contre j'envois qu'une seule fois un caractere via USART (lors de la premiere interruption) apres cela ne fonctionne plus,je ne dois pas bien remettre les emissions en service.
    @+ Peter

  5. #4
    Gérard

    Re : 16F876 Et transmission USART

    Bonjour,
    Je ne peux pas t'aider plus, la seule fois que j'ai utilisé la liaison série, c'était en Basic. Rien à voir avec l'assembleur.
    Gérard.

  6. A voir en vidéo sur Futura
  7. #5
    Peter

    Re : 16F876 Et transmission USART

    Re

    Merci quand même pour ton aide, je continu a chercher .

    Cordialement Peter

  8. #6
    Invité

    Re : 16F876 Et transmission USART

    Citation Envoyé par Peter Voir le message
    Re

    Merci quand même pour ton aide, je continu a chercher .

    Cordialement Peter
    Hello,

    ton source n'est pas très lisible sans la balise code

    le retour de la routine d'interruption doit se faire avec un RETFIE, sinon ta pile va être explosée : la vectorisation sur la routine d'interruption marche bien (la led clignote) par contre le return du call tempo envoie n'importe ou car la première interruption n'a pas laissé la pile propre en revenant par return.

    il faut tester le flag de l'origine de l'interruption

    je ne comprend pas ce que tu veux faire en mettant une tempo dans la routine d'interruption
    règle plutôt le prescaler du timer ou alors mets une tempo dans la boucle principale du programme

    A+

    Bruno

  9. Publicité
  10. #7
    Peter

    Re : 16F876 Et transmission USART

    Citation Envoyé par brunog Voir le message
    ton source n'est pas très lisible sans la balise code
    Désolé pour ce désagremmant

    Citation Envoyé par brunog Voir le message
    il faut tester le flag de l'origine de l'interruption
    Je n'ai qu'une interrution sur RB0 donc l'origine ne peut etre que RB0

    Citation Envoyé par brunog Voir le message
    je ne comprend pas ce que tu veux faire en mettant une tempo dans la routine d'interruption
    C'est la tempo pour gerer l'antirebond mais je l'ai deplacer dans la boucle principale du programme.

    Je pense avoir resolu mon probleme qui se trouvé dans la boucle de mon programme
    ; Attendre fin de l'émission
    ; --------------------------
    clrwdt ; effacer watch dog
    btfsc PIE1,TXIE ; reste des caractères à envoyer?
    goto $-2 ; oui, attendre
    btfss TXSTA,TRMT ; buffer de sortie vide?
    goto $-4 ; non, attendre
    Je mettais pas PIE1,TXIE a zero avec l'interruption de fin d'emission USART et je tournais en rond avec
    >>clrwdt
    >>btfsc PIE1,TXIE ; reste des caractères
    >>goto $-2 ; oui, attendre

    Autrement j'aimerais avoir quelque conseils sur la façon de faire pour mesurer le temps passé en milliémes de seconde entre 2 interruptions sur RBO.
    Je pensais calculer le nombre de cycle mais il y a peut être une autre solution???

    Je suis en train de bouquiner de la doc sur les timers et je n'arrive pas trop a cerner le probleme

    Cordialement Peter.

  11. #8
    Gérard

    Re : 16F876 Et transmission USART

    Citation Envoyé par Peter Voir le message

    ....

    Autrement j'aimerais avoir quelque conseils sur la façon de faire pour mesurer le temps passé en milliémes de seconde entre 2 interruptions sur RBO.
    Je pensais calculer le nombre de cycle mais il y a peut être une autre solution???

    Je suis en train de bouquiner de la doc sur les timers et je n'arrive pas trop a cerner le probleme

    Cordialement Peter.
    init : timer = 0
    Lancer le timer dès IRQ sur RB0
    Arrêter le timer dès la 2ème IRQ sur RB0
    Lire le contenu du timer
    Pour de plus longues périodes, prendre TMR1, il compte sur 16 bit.
    Le temps passé dépend de la fréquence du Qz (si c'est le Qz qui est pris pour incrémenter le timer)
    Gérard.

  12. #9
    Peter

    Re : 16F876 Et transmission USART

    Merci gérard pour ta réponse

    Je suis en train de lire la doc de bigonoff pour mettre en pratique ce que tu viens de me dire,on verrat bien.
    Cordialement

  13. #10
    Gérard

    Re : 16F876 Et transmission USART

    Si tu as d'autres questions, n'hésite pas.
    Gérard.

  14. #11
    Peter

    Re : 16F876 Et transmission USART

    Slt

    Oui justement ce soir je butte sur un probleme.

    Je veux envoyer la valeur d'une variable (de 0 a 255) que j'incremente au pc via le port série.

    movlw "1"
    movwf TXREG

    me retourne bien un 1

    mais si cpmt vaut 1 et que je fais

    movlw cmpt ; charger octet à envoyer
    movwf TXREG ; envoyer octet

    je pense que le pc me retourne la valeur ascii de cmpt

    Merci pour ton aide eventuelle

    Cordiallement Peter

  15. #12
    Gérard

    Re : 16F876 Et transmission USART

    Oui, je pense que l'ordi te renvoie la valeur ASCII.
    Gérard.

  16. Publicité
  17. #13
    Peter

    Re : 16F876 Et transmission USART

    Tu ne saurais pas comment faire pour qu'il me renvoi la valeur reelle de ma variable
    Peter

  18. #14
    paulfjujo

    Re : 16F876 Et transmission USART

    bonsoir,

    coté PC
    il faut envoyer, le chr$(valeur) au PIC
    et coté PIC qui renvoit une valeur au PC
    lire coté PC Asc(valeur)

    un petit prog en Qbasic ou vb coté PC
    permettrait cet echange

    sinon traiter la valeurdu cmpt
    en format BCD convertit en 3 caracteres

    un exe ici pour la mise à l'heure d'un RTC géré par un PIC
    et l'envoi de valeur du PIC vers PC

    www.paulfjujo.free.fr voir datalogger

Discussions similaires

  1. USART du PIC16F628
    Par Patrick dans le forum Électronique
    Réponses: 2
    Dernier message: 01/06/2008, 16h28
  2. USART sut ATmega8515
    Par jleclercq6 dans le forum Électronique
    Réponses: 1
    Dernier message: 28/02/2007, 15h59
  3. Usart ou I2C?
    Par srr dans le forum Électronique
    Réponses: 45
    Dernier message: 28/02/2007, 15h19
  4. Usart Avr
    Par McFly dans le forum Électronique
    Réponses: 13
    Dernier message: 21/05/2006, 00h43
  5. pb avec la sortie usart du 16F876
    Par corentin dans le forum Électronique
    Réponses: 2
    Dernier message: 06/02/2005, 15h59
Découvrez nos comparatifs produits sur l'informatique et les technologies.