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

Feu tricolore



  1. #1
    invite8763273
    Invité

    Feu tricolore

    Bonjour ,

    j'aimerai pouvoir faire un circuit avec 3 led afin de faire un feu tricolore .

    Le programme devra etre en .asm

    le pic est un PIC16F84A de chez Microchip


    Le probleme est que les led's restent allumes trop longtemps .

    Rouge -->2 Minutes

    Vert ---> 2.20

    Orange --> 2.33


    Je voudrai que les led s'alument :

    Rouge ---> 6 secondes

    Orange--->5 secondes

    Vert -->4 secondes

    Voici le programme qui "plante"


    ;***************************** **
    ;* Gestion d'un feu tricolore *
    ;***************************** **


    ; Gestion de 2 feux
    ; Feu tricolore sur portB
    ; Feu rouge bit 1, orange bit 2 et vert bit 3.
    ; V O R V O R
    ; 7 6 5 4 3 2 1 0
    ; 8 4 2 1 8 4 2 1
    ;
    ; Device = 16F84 ; Utilisation du circuit 16F84A
    ; Horloge = XT ; Déclaration et config du Circuit

    ; Equivalence registres
    ;***********************

    PORTB equ 0x0006 ; Adresse du portb
    TRISB equ 0x0086 ; Adresse du registre de direction du porta
    STATUS equ 0x0003 ; Le bit 5 permet d'acceder à la Banque 1 ou 0
    ; ce qui donne acces au TRIS ou au PORT
    ; Constantes
    ;************

    DUREE2R equ 02h ; 02 secondes
    DUREEO equ 04h ; 4 secondes
    DUREEV equ 20h ; 32 secondes

    ;* Reservation memoire *
    ;***********************

    ; Les registres occupent la RAM jusqu'en OBh

    COMPT equ 0Ch
    COMPT1 equ 0Dh
    COMPT2 equ 0Eh
    DUREE equ 0Fh


    ;***************
    ;Initialisation*
    ;***************
    org 00h ; Apres le reset le PC pointe l'adresse 00

    goto debut ; On saute les 5 premiers octets car à l'adresse
    ; 04 on a l'adresse d'interruption
    ; On prend l'habitude de ne pas ecrire sur ce segment
    ; en sautant simplement jusqu'apres ce segment


    org 05h


    debut
    clrf PORTB
    bsf STATUS,05 ; Selection de Bank 1 pour l'accès au TRIS
    movlw 00h ;
    movwf TRISB ; Declaration du portb en sortie
    bcf STATUS,05 ; Selection de Bank 0 pour l'accès au PORT
    clrf PORTB ; Extinction de toutes les LEDS

    ;*********************
    ;Programme principal *
    ;*********************

    ; On allume le feu rouge 1 et le feu vert 2 et on eteint les autres feux

    boucle
    movlw 82h ; FR1 et FV2 sont allumes
    movwf PORTB
    movlw DUREEV ;
    movwf DUREE ; duree des feux
    call tempo

    ; On allume le feu rouge 1 et le feu orange 2 et on eteint les autres feux

    movlw 42h ; FR1 et FO2 sont allumes
    movwf PORTB
    movlw DUREEO ;
    movwf DUREE ; duree des feux
    call tempo

    ; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux

    movlw 22h ; FR1 et FO2 sont allumes
    movwf PORTB
    movlw DUREE2R ;
    movwf DUREE ; duree des feux
    call tempo

    ; On allume le feu vert 1 et le feu rouge 2 et on eteint les autres feux

    movlw 28h ; FR1 et FO2 sont allumes
    movwf PORTB
    movlw DUREEV ;
    movwf DUREE ; duree des feux
    call tempo

    ; On allume le feu orange 1 et le feu rouge 2 et on eteint les autres feux

    movlw 24h ; FR1 et FO2 sont allumes
    movwf PORTB
    movlw DUREEO ;
    movwf DUREE ; duree des feux
    call tempo

    ; On allume le feu rouge 1 et le feu rouge 2 et on eteint les autres feux

    movlw 22h ; FR1 et FO2 sont allumes
    movwf PORTB
    movlw DUREE2R ;
    movwf DUREE ; duree des feux
    call tempo

    goto boucle ; feu permanent


    ;******************
    ; SOUS PROGRAMME *
    ;******************

    ; SP tempo par passage de parametre duree est en seconde *
    ;***************************** ****************************** **************

    tempo

    movlw 0x000A ; chargement de COMPT2 DE 10
    movwf COMPT2 ;
    delai2
    movlw 0x00C8 ; chargement de COMPT1 DE 200
    movwf COMPT1 ;
    delai1
    movlw 0x00A5 ; chargement de COMPT de 165
    movwf COMPT
    delai
    decfsz COMPT,1 ; Le temps de decompter 165 valeurs
    goto delai ; calcul du temps : 1 instruction =Tquartz/4=1µs =1 cycle
    ; l'instruction decfz est de 2 cycles
    ; 2 instructions = 3 µs repeter 165 fois t=495 µs + 2 inst =497µs
    decfsz COMPT1,1 ; ON execute la boucle de 497µs 200 fois + 2 instr dont 1 à 2 cycle
    goto delai1 ; calcul du temps : 500µs*200=100ms on neglige les 5µs rstant

    decfsz COMPT2,1 ; ON execute les boucles de 100 ms 10 fois
    goto delai2 ; calcul du temps : 100ms*10=1s

    decfsz DUREE,1 ; ON execute les boucles de la valeur de duree
    goto tempo ; calcul du temps : duree*100ms

    return


    end




    En vous remerciant par avance

    -----


  2. #2
    freepicbasic

    Re : Feu tricolore

    decfsz DUREE,1 ; ON execute les boucles de la valeur de duree
    goto tempo ; calcul du temps : duree*100ms
    deja une erreur mettre delai au lieu de tempo

    Code:
    decfsz DUREE,1 ; ON execute les boucles de la valeur de duree
    goto delai ; calcul du temps : duree*100ms
    A+, pat

  3. #3
    Gérard

    Re : Feu tricolore

    Bonjour,
    Ci-dessous quelques S/P de tempos (QZ = 4MHz)

    ;***************************** ****************************** *************
    ; S/P TEMPO 1 MS
    ;***************************** ****************************** *************

    ;duree totale : 1004 µs
    ;l'erreur est de 4 µs sur 1 ms
    ;ce s/p utilise 1 variable (C1)
    ;1 niveau de pile est utilise

    TMP1MS ;appel 2 µs 2
    movlw 250 ;1 1
    movwf C1 ;1 1

    loop0tmp
    nop ;1x249 249
    decfsz C1,f ;1x249 + 2x1 251
    goto loop0tmp ;2x249 498
    retlw 0 ;2 2

    ;***************************** ****************************** *************
    ; S/P TEMPO 100 MS
    ;***************************** ****************************** *************

    ;duree totale : 100 ms
    ;ce s/p utilise 2 variables (C1 et C2)
    ;1 niveau de pile est utilise

    TMP100MS ;appel 2 µs 2
    movlw 199 ;1 1
    movwf C2 ;1 1

    loop2tmp
    movlw 167 ;1+1x198 199
    movwf C1 ;1+1x198 199

    loop1tmp
    decfsz C1,f ;(1x166 + 2x1)x198 33264
    goto loop1tmp ;(2x166) x198 65736
    decfsz C2,f ;1x198 + 2x1 200
    goto loop2tmp ;2x198 396
    retlw 0 ;2 2

    ;***************************** ****************************** *************
    ; S/P TEMPO 200 MS
    ;***************************** ****************************** *************

    ;duree totale : 200,011 ms
    ;l'erreur est de 11 µs sur 200 ms
    ;ce s/p utilise 3 variables C1, C2 et C3
    ;2 niveaux de pile sont utilises

    TMP200MS ;appel 2 µs 2
    movlw 2 ;1 1
    movwf C3 ;1 1
    loop3tmp
    call TMP100MS ;2x100 000 200 000
    decfsz C3,f ;1x1 + 2x1 3
    goto loop3tmp ;2x1 2
    retlw 0 ;2 2

    ;***************************** ****************************** *************
    ; S/P TEMPO 500 MS
    ;***************************** ****************************** *************

    ;duree totale : 500,02 ms
    ;l'erreur est de 20 µs sur 500 ms
    ;ce s/p utilise 3 variables C1, C2 et C3
    ;2 niveaux de pile sont utilises

    TMP500MS ;appel 2 µs 2
    movlw 5 ;1 1
    movwf C3 ;1 1
    loop4tmp
    call TMP100MS ;5 x 100 000 500 000
    decfsz C3,F ;1x4 + 2x1 6
    goto loop4tmp ;2x4 8
    retlw 0 ;2 2

    ;***************************** ****************************** *************
    ; S/P TEMPO 1S
    ;***************************** ****************************** *************

    ;duree totale : 1 000,035 ms
    ;l'erreur est de 35 µs sur 1 s
    ;ce s/p utilise 3 variables C1, C2 et C3
    ;2 niveaux de pile sont utilises

    TMP1S ;appel 2 µs 2
    movlw 10 ;1 1
    movwf C3 ;1 1
    loop5tmp
    call TMP100MS ;10 x 100 000 1 000 000
    decfsz C3,f ;1x9 + 2x1 11
    goto loop5tmp ;2x9 18
    retlw 0 ;2 2

    ;***************************** ****************************** *************
    ; S/P TEMPO 15S
    ;***************************** ****************************** *************

    ;duree totale : 15,000 455 s
    ;l'erreur est de 455 µs sur 15 s
    ;ce s/p utilise 3 variables C1, C2 et C3
    ;2 niveaux de pile sont utilises

    TMP15S ;appel 2 µs 2
    movlw 150 ;1 1
    movwf C3 ;1 1
    loop6tmp
    call TMP100MS ;150x0,1 15 000 000
    decfsz C3,f ;1x149 + 2x1 151
    goto loop6tmp ;2x149 298
    retlw 0 ;2 2

    ;***************************** ****************************** *************
    ; S/P TEMPO 5 min
    ;***************************** ****************************** *************

    ;duree totale : 300,009 165 s
    ;l'erreur est de 9,165 ms sur 5 min
    ;ce s/p utilise 4 variables C1, C2, C3 et C4
    ;3 niveaux de pile sont utilises

    TMP5MIN ;appel 2 µs 2
    movlw 20 ;1 1
    movwf C4 ;1 1
    loop7tmp
    call TMP15S ;20x15,000 455 300,009 1
    decfsz C4,f ;1x19 + 2x1 21
    goto loop7tmp ;2x19 38
    retlw 0 ;2 2

    Pour faire la tempo que tu veux, il suffit d'appeler la tempo de durée juste inférieure le nombre de fois nécessaire pour arriver au résulta escompté.
    J'espère avoir été clair.
    Gérard.
    Dernière modification par Gérard ; 20/10/2006 à 22h18. Motif: Ajout fréquence Qz

  4. #4
    Gérard

    Re : Feu tricolore

    Et pourquoi le prog doit être en asm ?
    Gérard.

Sur le même thème :

Discussions similaires

  1. Feux tricolore
    Par Blackmouse dans le forum Électronique
    Réponses: 37
    Dernier message: 13/08/2007, 19h37
  2. led tricolore
    Par mik777 dans le forum Électronique
    Réponses: 5
    Dernier message: 23/10/2004, 12h36
  3. le feu
    Par the strange dans le forum Physique
    Réponses: 7
    Dernier message: 21/07/2004, 12h23
  4. Feu
    Par king_ae dans le forum Chimie
    Réponses: 13
    Dernier message: 19/07/2004, 15h50
  5. Combattre le feu avec le feu ;-)
    Par [RV] dans le forum Internet - Réseau - Sécurité générale
    Réponses: 1
    Dernier message: 26/08/2003, 02h30