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

Programmation sous Flowcode d'un PIC 16F84



  1. #1
    bboytom

    Programmation sous Flowcode d'un PIC 16F84


    ------

    Bonjour,

    Je suis en Terminale Ssi et dans le cadres de mes PPE, je souhaite réaliser un support rotatif de caméra commandé par un PIC 16F84.

    Pour ceci je doit commander un hacheur, et cette commande doit me permettre de faire varier la vitesse de mon moteur.

    0r je me trouve confronté à un problème... Souhaitant obtenir un signal carré de frequence 1kHz dont la durée de la partie haute (t1) variable me permettrait de faire varier cette vitesse, il m'est impossible d'entrer une valeur de moins d'1ms dans une pause. Et cette valeur est celle de ma période totale...

    Dois utiliser autre chose que des pauses dans mon programme?
    J'ais entendu parler d'interruptions sur Flowcode, ou d'horloge?

    Merci d'avance de me donner quelques pistes de réflexion...

    PS : mon programme est pour l'instant de la forme suivante :

    Valeur de la vitesse à traiter => PW=entrée
    Boucle tant que PW>0
    Pause : X ms
    Calcul : PW=PW-1
    Sortie =1
    Fin Boucle
    Bouble tant que t0>0
    Pause : X ms
    Calcul : t0 = t0-1
    Sortie =0
    Fin Boucle

    X est une durée élémentaire prédéfinie

    -----

  2. Publicité
  3. #2
    Gérard

    Re : Programmation sous Flowcode d'un PIC 16F84

    Bonjour,
    Je ne sais pas si Flowcode est bien adapté à ton problème (peut-être trop lent).

    Il existe des compilateurs (Basic, Pascal et C) en démo ici en bas de page
    http://www.lextronic.fr/mikro/PP2.htm

    D'autres PIC que le 84 ont un module PWM intégré et donc plus facile à gérer (16F876 par ex).
    Gérard.

  4. #3
    bboytom

    Re : Programmation sous Flowcode d'un PIC 16F84

    Bonjour,
    Merci de ta réponse.
    Depuis mon précédant message, j'ai réfléchi !!!
    Saurais-tu comment incrémenter un compteur à chaque cycle d'horloge du PIC ? ou alors comment déterminer le temps nécessaire pour le traitement d'un bloc (sous flowcode ) par le PIC ?
    Je pense maintenant à un programme de la forme :


    Boucle infinie
    C=0
    Boucle tant que C<Valeur1
    C=C+1
    Sortie = 1
    Fin boucle
    Boucle tant que C<Période
    C=C+1
    Sortie = 0
    Fin Boucle
    Fin boucle infinie

    Merci d'avance... et bonne fin de journée

  5. #4
    electrome

    Re : Programmation sous Flowcode d'un PIC 16F84

    Salut. On peux réaliser cette fonction avec une interruption, celle du débordement de TMR0.
    Si tu veux plus d'info ... N'hésite pas.
    @+

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    freepicbasic

    Re : Programmation sous Flowcode d'un PIC 16F84

    Generer du PWM avec Mon compilateur FREEPICBASIC
    http://perso.wanadoo.fr/pat.deaubonne/pic/index.htm


    Code:
    @@@@@@@@ CODE SOURCE @@@@@@@@@
    ' v************** debut d'entète **************v
    ' nom           : PWM.bas
    ' Alias         :
    ' créer   le    : 04/04/2002
    ' Modifier le   : 23/08/2006
    ' Créé Par      : Deaubonne Patrick
    '
    ' commentaire:
    '
    '
    ' ^*************** fin d'entète **************^
    
    define PORTB 6
    
    
            device  16f84
    ASM { __CONFIG  03FFBH }
    Dim atmp, ctmp, sens, i, nb
    
    '==============================
    Init portA = 11111111
    Init portb = 11111011
    
    sens = 0
    atmp = 50
    
    loop1:
    For nb = 0 To 3
    For i = 0 To atmp
            bsf portb, 2
            DelayUs (200)
    Next i
    
    loop2:
            bcf portb, 2
            DelayUs (200)
            i = i + 1
    If i < 100 Then GoTo loop2
    Next nb
    
    c = portb And 2
    If sens = 0 Then
            If ctmp = 0 Then atmp = atmp + 1
    Else
            If ctmp = 0 Then atmp = atmp - 1
    End If
    
    If a = 1 Then
            sens = 0
            atmp = 2
    End If
    
    If atmp > 100 Then
            sens = 1
            atmp = 98
    End If
    
    GoTo loop1
    
    End
    
    
    @@@@@@@@@@@ CODE ASM GENERE @@@@@@@@
    
    ;*******************************************
    ;* FREE_PIC_C_BAS version 4.00 (Win32 Console)  du 01/03/2006
    ;* Partiellement Compatible Basic Stamp
    ;C and Basic Compiler for Microchip Pic series
    ;* Auteur: Deaubonne Patrick 
    ;* url:
    ;*   http://perso.wanadoo.fr/pat.deaubonne
    ;*        ' '              /pic/index.htm
    ;*******************************************
    ;* C:\PIC\PICBASIC\PWM.ASM
    ;*******************************************
    
    W	equ	00
    F	equ	01
    
    CY	equ	00
    Z	equ	02
    ;' v * * * * * * * * * * * * * * debut d'entète * * * * * * * * * * * * * * v
    ;' nom           : PWM.bas
    ;' Alias                 : 
    ;' créer   le    : 0 4/ 0 4/ 2002
    ;' Modifier le   : 2 3/ 0 8/ 2006
    ;' Créé Par      : Deaubonne Patrick
    ;' 
    ;' commentaire: 
    ;'
    ;'
    ;' ^ * * * * * * * * * * * * * * * fin d'entète * * * * * * * * * * * * * * ^
    ;-------- define PORTB 6 --------
    PORTB	EQU	6
    ;-------- device  16f84 --------
    
    	List	p=16F84 ,r=DEC
    
    #include <P16F84.INC>
    
    bnk0	macro
    	bcf	STATUS,RP0
    	bcf	STATUS,RP1
    	endm
    
    bnk1	macro
    	bsf	STATUS,RP0
    	bcf	STATUS,RP1
    	endm
    
    bnk2	macro
    	bcf	STATUS,RP0
    	bsf	STATUS,RP1
    	endm
    
    bnk3	macro
    	bsf	STATUS,RP0
    	bsf	STATUS,RP1
    	endm
    
    w_temp  	EQU 071H ; svg registre W
    status_temp	EQU 072H ; svg status swappé
    FSR_temp	EQU 073H ; svg FSR
    PCLATH_temp	EQU 074H ; svg PCLATH
    
    	goto _START_PIC
    	nop
    	nop
    	nop
    	GOTO _INT_PIC
    _START_PIC
    ;-------- ASM { __CONFIG  03FFBH } --------
     __CONFIG  03FFBH 
    ;-------- Dim atmp,ctmp,sens,i,nb --------
    ATMP	equ	22
    CTMP	equ	23
    SENS	equ	24
    ITMP	equ	25
    NB	equ	26
    ;' ============================== 
    ;-------- Init portA = 11111111 --------
    	bsf	STATUS,RP0
    	movlw	255
    	movwf	TRISA
    	bcf	STATUS,RP0
    ;-------- Init portb = 11111011 --------
    	bsf	STATUS,RP0
    	movlw	251
    	movwf	TRISB
    	bcf	STATUS,RP0
    ;-------- sens = 0 --------
    	clrw
    	movwf	SENS
    ;-------- atmp = 50 --------
    	movlw	50
    	movwf	ATMP
    ;-------- loop1:  --------
    LOOP1
    ;-------- for nb = 0 to 3 --------
    	clrf	NB
    pb_lab1
    ;-------- for i = 0 to Atmp --------
    	clrf	ITMP
    pb_lab2
    ;-------- bsf PORTB,2 --------
    	bsf	PORTB, 2
    ;-------- DelayUs( 200 ) --------
    	movlw	50
    	movwf	12
    pb_lab3
    	nop
    	decfsz	12,F
    	goto	pb_lab3
    pb_lab4
    	nop
    	nop
    ;-------- next i --------
    	incf	ITMP,F
    	movf	ITMP,W
    	subwf	ATMP
    	btfss	STATUS,Z
    	goto	pb_lab2
    ;-------- loop2:  --------
    LOOP2
    ;-------- bcf PORTB,2 --------
    	bcf	PORTB, 2
    ;-------- DelayUs( 200 ) --------
    	movlw	50
    	movwf	12
    pb_lab5
    	nop
    	decfsz	12,F
    	goto	pb_lab5
    pb_lab6
    	nop
    	nop
    ;-------- i = i + 1 --------
    	incf	ITMP,F
    ;-------- if i< 100 then goto loop2 --------
    	movlw	100
    	subwf	ITMP,W
    	btfsc	STATUS,CY
    	goto	pb_lab7
    	goto	LOOP2
    pb_lab7
    ;-------- next nb --------
    	incf	NB,F
    	movlw	3
    	movwf	12
    	movf	NB,W
    	subwf	12,W
    	btfss	STATUS,Z
    	goto	pb_lab1
    ;-------- c = portb and 2 --------
    	movf	PORTB,W
    	andlw	2
    	movwf	CTMP
    ;-------- if sens = 0 then --------
    	movlw	0
    	subwf	SENS,W
    	btfss	STATUS,Z
    	goto	pb_lab9
    ;-------- if ctmp = 0 then Atmp = atmp + 1 --------
    	movlw	0
    	subwf	CTMP,W
    	btfss	STATUS,Z
    	goto	pb_lab10
    	incf	ATMP,F
    pb_lab10
    ;-------- else --------
    	goto	pb_lab12
    pb_lab9
    ;-------- if ctmp = 0 then Atmp = Atmp - 1 --------
    	movlw	0
    	subwf	CTMP,W
    	btfss	STATUS,Z
    	goto	pb_lab13
    	decf	ATMP,F
    pb_lab13
    ;-------- endif --------
    pb_lab12
    ;-------- if a = 1 then  --------
    	movlw	1
    	subwf	ATMP,W
    	btfss	STATUS,Z
    	goto	pb_lab15
    ;-------- sens = 0 --------
    	clrw
    	movwf	SENS
    ;-------- atmp = 2 --------
    	movlw	2
    	movwf	ATMP
    ;-------- endif --------
    pb_lab15
    ;-------- if atmp> 100 then  --------
    	movlw	100
    	subwf	ATMP,W
    	btfss	STATUS,CY
    	goto	pb_lab16
    ;-------- sens = 1 --------
    	movlw	1
    	movwf	SENS
    ;-------- atmp = 98 --------
    	movlw	98
    	movwf	ATMP
    ;-------- endif --------
    pb_lab16
    ;-------- goto loop1 --------
    	goto	LOOP1
    ;-------- end --------
    	sleep
    	goto	_START_PIC
    ;**************************
    ;****** Library Area ******
    ;******* No Library ******
    _RAM equ 12
    _RAM1 equ 13
    _RAM2 equ 14
    _RAM3 equ 15
    _RAM4 equ 16
    _RAM5 equ 17
    _RAM6 equ 18
    _RAM7 equ 19
    _FLAGS equ 20
    _PIN equ 21
    ;****** Library Area ******
    ;**************************
    ;
    
    ;
    ;***************************
    ;******* PRINT AREA *******
    ;******* PRINT AREA *******
    ;******* STRING AREA *******
    ;=======  No String  =======
    ;******* STRING AREA *******
    ;***************************
    ;
    
    _INT_PIC
    	RETFIE
    	end
    @@@@@@@@@@ HEX @@@@@@@@
    
    :1000000005280000000000005A288316FF308500F4
    :1000100083128316FB308600831200019800323071
    :1000200096009A019901061532308C0000008C0B65
    :10003000162800000000990A19081602031D13284B
    :10004000061132308C0000008C0B232800000000C9
    :10005000990A6430190203182E2820289A0A0330BE
    :100060008C001A080C02031D12280608023997009A
    :1000700000301802031D422800301702031D4128DA
    :10008000960A472800301702031D472896030130BF
    :100090001602031D4F2800019800023096006430BC
    :1000A0001602031C57280130980062309600112870
    :0600B000630005280900B1
    :02400E00FB3F76
    :00000001FF
    Dernière modification par monnoliv ; 25/08/2006 à 21h08.

  9. #6
    Invité

    Re : Programmation sous Flowcode d'un PIC 16F84

    Hello,

    un p16f84 convient si tu as besoin d'une fréquence PWM inférieure à 20Khz environ, mais tu ne pourras pas de toutes façons gérer avec précision le rapport cyclique, sauf en tombant à des fréquences de quelques centaines de Hz.

    si tu utilise un pic qui a une sortie PWM, voici un lien sur mon site pour la configurer sans prise de tête (fréquence et rapport cyclique) :

    http://www.micro-examples.com/public...alculator.html

    A+,

    Bruno

  10. Publicité
  11. #7
    misterzinzin

    Re : Programmation sous Flowcode d'un PIC 16F84

    j'ai un problème du même genre... mais avec pcw c compiler (ccs)
    mon code simpliste est le suivant (dans la fonction main):
    while(1)
    {
    if(cpt<pwm) output_high(OUT);
    else output_low(OUT);
    cpt++;
    if(cpt==100) cpt=0;
    }
    j'ai connecté une led mais elle est toujours éteinte (même avec pwm=100)
    j'avoue que je n'ai pas compris sur ce coup la...

  12. #8
    freepicbasic

    Re : Programmation sous Flowcode d'un PIC 16F84

    mettre pwm=50; avant
    vérifier si OUT correspond bien à la pin connectée !
    vérifier si OUT est bien en sortie!

    0 pour sortie et 1 pour entrée sur TRISA TRISB.

    vérifier le type de cpt et pwm !
    vérifier le type de µc !
    vérifier les bits de config !
    vérifier le programmateur et sa tension d'alime !
    A+, pat

  13. #9
    misterzinzin

    Re : Programmation sous Flowcode d'un PIC 16F84

    merci pour l'info
    ca marche mnt.
    je laisse mon code pour ceux à qui ça pourrais servir.

    rem: #use fast_io(a) pour pouvoir utiliser set_tris_a() (voir l'aide de ccs)

    le code suivant fait varier la luminosité de 2 led branchée sur les pin A0 et A1 d'un 16f84 et affiche la valeur (de 0 à 9) de "l'intensité" de la led sur A0 sur un 7seg (à anode commune)
    ps: le code d'affichage sur 7seg pourrais être facilement optimisable en utilisant des OUTPUT_B au lieu des OUTPUT_LOW... mais bon

    #include <16F84A.h>
    #use delay(clock=20000000)
    #fuses NOWDT,HS, NOPUT, NOPROTECT
    #use fast_io(a)
    //definition des pin
    #define OUT PIN_A0
    #define OUT2 PIN_A1

    #define SEGa PIN_B5
    #define SEGb PIN_B4
    #define SEGc PIN_B2
    #define SEGd PIN_B1
    #define SEGe PIN_B0
    #define SEGf PIN_B6
    #define SEGg PIN_B7
    #define SEGdp PIN_B3
    void setOut(char valeur);

    void main()
    {
    char pwm=70;
    char pwm2=20;
    char cpt=0,div=0;
    signed char sens=1,sens2=1;
    set_tris_a(0x0C);//A0,A1 out A2,A3 in
    while(1)
    {
    if(cpt<pwm) output_high(OUT);
    else output_low(OUT);
    if(cpt<pwm2) output_high(OUT2);
    else output_low(OUT2);
    delay_us(10);
    cpt++;
    if(cpt==100)
    {//debordement toute les millisecondes
    cpt=0;
    div++;
    if(div==10)
    {//100 fois par secondes
    div=0;
    pwm=pwm+sens;
    pwm2=pwm2+sens2;
    if(pwm==0) sens=1;
    if(pwm==100) sens=-1;
    if(pwm2==0) sens2=1;
    if(pwm2==100) sens2=-1;
    setOut(pwm/10);
    }
    }
    }
    }

    void setOut(char valeur)
    {
    OUTPUT_B(0xff);
    switch(valeur)
    {
    case 0: OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    //OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 1: //OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    //OUTPUT_LOW(SEGd);
    //OUTPUT_LOW(SEGe);
    //OUTPUT_LOW(SEGf);
    //OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 2: OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    //OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    //OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 3: OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    //OUTPUT_LOW(SEGe);
    //OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    brEak;
    case 4: //OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    //OUTPUT_LOW(SEGd);
    //OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 5: OUTPUT_LOW(SEGa);
    //OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    //OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 6: OUTPUT_LOW(SEGa);
    //OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 7: OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    //OUTPUT_LOW(SEGd);
    //OUTPUT_LOW(SEGe);
    //OUTPUT_LOW(SEGf);
    //OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 8: OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 9: OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    //OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 10: OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    //OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 11: //OUTPUT_LOW(SEGa);
    //OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 12: OUTPUT_LOW(SEGa);
    //OUTPUT_LOW(SEGb);
    //OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    //OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 13: //OUTPUT_LOW(SEGa);
    OUTPUT_LOW(SEGb);
    OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    //OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 14: OUTPUT_LOW(SEGa);
    //OUTPUT_LOW(SEGb);
    //OUTPUT_LOW(SEGc);
    OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    case 15: OUTPUT_LOW(SEGa);
    //OUTPUT_LOW(SEGb);
    //OUTPUT_LOW(SEGc);
    //OUTPUT_LOW(SEGd);
    OUTPUT_LOW(SEGe);
    OUTPUT_LOW(SEGf);
    OUTPUT_LOW(SEGg);
    OUTPUT_LOW(SEGdp);
    break;
    }
    }

  14. #10
    FoxDeltaSierra

    Re : Programmation sous Flowcode d'un PIC 16F84

    Salut bboytom,

    Peux tu m'expliquer comment tu as fait pour gérer le PWM sous Flowcode avec ce PIC ? Moi dans la fenêtre verte de Flowcode, il y a écrit "unavailable" et je ne sais pas trop comment ca marche... voir ce sujet : http://forums.futura-sciences.com/el...ml#post2251557

    Merci d'avance !

Discussions similaires

  1. Générer un signal carré 500hz avec flowcode sur pic 16f84
    Par lacostebizu dans le forum Électronique
    Réponses: 2
    Dernier message: 09/02/2007, 20h25
  2. Programmation PIC 16F84 avec Flowcode
    Par Pierrot_si dans le forum Électronique
    Réponses: 1
    Dernier message: 25/03/2006, 21h19
  3. Demande d'aide pour la programmation sous Flowcode
    Par R3|30rN dans le forum TPE / TIPE et autres travaux
    Réponses: 0
    Dernier message: 13/03/2006, 15h18
  4. programmation de PIC(16F84)avec ICPROG
    Par jo-electrons dans le forum Électronique
    Réponses: 2
    Dernier message: 24/10/2005, 22h04
  5. [ Programmation PIC 16F84 (asm) ]
    Par reman dans le forum Électronique
    Réponses: 1
    Dernier message: 23/10/2003, 19h55
Découvrez nos comparatifs produits sur l'informatique et les technologies.