Je pensais que le feux No2 sur B était sur bit 0, bit1, bit2 ?
NON ?
Code:bsf statut,RP0 ;selection de bank1 movlw B'11111000' movwf trisA movlw B'11111000' movwf trisB
-----
Je pensais que le feux No2 sur B était sur bit 0, bit1, bit2 ?
NON ?
Code:bsf statut,RP0 ;selection de bank1 movlw B'11111000' movwf trisA movlw B'11111000' movwf trisB
A+, pat
utilisé du code !bit0=1 de portA portB bit0=1
bit1=2 bit1=2
bit2=4 bit2=4
bit3=8 bit3=8
Si la logique est 1 allumé on allume toutCode:bsf portA,0 ; bit0=1 bsf portB,0 ; bit0=1 bsf PORTA,1 ; bit1=2 bsf PORTB,1 ; bit1=2 bsf PORTA,2 ; bit2=4 bsf PORTB,2 ; bit2=4 ; ???? bit3=8 bit3=8 ???
au début on fait un clrf porta et clrf portb pour éteindre.
On allume tout ! Pourquoi ?
L'instruction bsf ou bcf set ou reset un bit
Le chiffre derriere indique ce bit
Il ne s'agit pas d'un poid comme avec un AND , OR ou MOVF !
Pour le 4 iem bit je comprend pas on a que 3 leds !
En plus les TrisA et TrisB sont en sortie sur 3 !!!
La LED selon sa connection a la masse ou au + , s'allume avec un 1 ou un 0, donc déterminer le sens allumer ou éteind avec 0 et 1 !
A éclaircir tous ça !
A+, pat
oui tu as raison alors j ai fait 1 pour allumer et 0 pour etteind j ai fait pour bit0=1
bit1=2
bit2=4
car je donner ma solution à mon prof il m as dit il y as six possibilite
allum feux roug1et feu vert2 et on etteint les autres
allum feu roug1 et orang2 "
allum feuroug 1 et feu feu roug2
allum feu vert1 et feu feu roug2
allume orang1 et feu roug2
allume feu roug1et feu rouge2
si je met
bsf portA,0 ;feu rouge1
bsf portb,2 ;feu vert2
bcf portA,1
bcf portA,2
bcf portB,0
bcf portB,1
call my tempo
mais j allum le feu rouge pour 5s et feu vert pour 3s
alors comment je fait une seul call tempo
ou bien je fait
bsf portA,0
call my temp ;5s
bsf portB,2
call my tempo
car comme ça le feu rouge sur le bit0=1
il allum seulement pour 1us et moi j ai besoin de 5s;
comme tu as tous les états possibles de ton système, et les temps d'allumage de chaque feu, il faut que tu calcule les temps entre chacun des états.
par exemple pour les 3 états suivant:
-feux rouge1 et feu vert2 allumé
-feux rouge1 et orange2 allumé
-feux rouge1 et feux rouge2 allumé
et que tu sais que le feu vert 2 doit duré 3s, le orange 2, 1secondes
Tu peux faire:
Code:bsf feux_rouge1 bsf feux_vert2 call tempo_3s ;tempo de 3s correspondant à la durée du feux vert2 (ici tu peux aussi appeler 3 fois tempo_1s à la place ;)) bcf feux_vert2 bsf faux_orange2 call tempo_1s ; tempo de 1s correspondant à la durée du feux orange2 ...
merci pour tout mais le feu rouge dure pour 5s et feu vert 3s
bsf feu roug1
call my temp;5s
bsf feu vert2
call my tempo;3s
ou je fait ;
bsf feuroug1
bsf feuvert2
call my tempo;5s
j apprend seulement le temps feu rouge car il est long
freepibasic il y a 4 possibilite ou six de possibilite
pour allumage des leds
allum feux roug1et feu vert2 et on etteint les autres
allum feu roug1 et orang2 "et on etteids les autres
allum feuroug 1 et feu feu roug2 et on etteids les autres
allum feu vert1 et feu feu roug2;on etteids les autres
allume orang1 et feu roug2;on etteids les autres
allume feu roug1et feu rouge2;etteids les autres
Je pense qu'il est préférable de raisonner en évènements et non pas en états.
tu devrais faire une liste correspondant aux évènements
comme ceci;
feu Rouge 1 ON
feu Vert 2 ON
3s
feu vert 2 OFF
feu orange 2 ON
2s
feu Rouge 1 OFF
feu orange 2 OFF
feu Vert 1 ON
feu Rouge 2 ON
3s
etc...
le complèter, puis transformer en code
A+, pat
routine de tempo en secondes
MOVLW secondes
CALL mytempoSec
Code:; temps de base 3µs (compt) ; x 256 = 768 (compt1) ; x 256 = 196 608 (compt2) ; si compt3 = 5 ~1 seconde ; 5 x 196 608 = 983040µs ~ 1 seconde ; commentaire; ; Notre routine ne pourra pas dépasser 51 secondes ; puisque sa base de temps est de 5 256/5 =~ 51 ; car nous utiliserons le même octet x 5 ; W comptient le nombre de seconde mytempoSec ; nous devons multiplier par 5 le chiffre des secondes ; contenu dans W ; pour avoir notre compteur clrf compt3 ; efface le compteur movwf compt1; sauve temporairement le chiffre à multiplier (les secondes) movlw 5 ; valeur de base pour 1 seconde Mult5 addwf compt3,f decfsz compt1 goto Mult5 clrf compt1 ; chargement par 256 (0-1=255) clrf compt2 ; chargement par 256 clrf compt ; chargement par 256 ; boucle de 3µS avec quartz 4MHZ T3 decfsz compt,1 goto T3 decfsz compt1,1 ; x 256 goto T3 descfz compt2,1 ; x 65536 goto T3 descfz compt3,1 ; secondes x 983040µs goto T3 return
Dernière modification par freepicbasic ; 20/04/2007 à 07h53.
A+, pat
pour quoi le feu roug allumer et feu vert allumer on utilise le tempo de vert qui egale 3s ou lieu le feu roug 5s
il y a un chevauchement
le rouge reste 5 sec pendant que le vert reste 3 sec puis 2 sec à l'orange.
Donc raisonner en événements !
pendant les 5 secondes il y a 2 événements.
Le temps rouge sera 3s vert + 2s orange.
en résumé;
Il n'y a pas de tempo 5 secondes
A+, pat
alors pour faire tempo de nuit pour des heures je change la valeur de base
pas clair , explique mieux !alors pour faire tempo de nuit pour des heures je change la valeur de base
Je vois pas trop des heures à la place de secondes...
A+, pat
Avant de vouloir changer les temps, as-tu bien compris le chevauchement des états et quelles tempos utiliser à chaque fois ?
Si tu as encore des doutes, traces sur une feuille les 6 chronogrammes des feux tricolores l'un en dessous de l'autre en utilisant, par exemple, 1 carreau pour une seconde. Ensuite pour avoir les tempos à utiliser, regarde le temps qui sépare 2 changements d'état successif de n'importe quel feu.
le tempo de la nuit pour le feu orange1 et orang2
quand RB4=1
on a dis bsf portA,1
v bsf portB,1
call tempo nuit
et j ai pas compris bien quand il passe le chevechement
ce que tu appelle tempo de nuit correspond en fait au clignotement de 2 feux oranges?
donc si les 2 doivent clignoter en même temps il faut faire:
PS: essai d'éviter les faute d'orthographes en prenant ton temps pour écrire, ça rendra tes posts plus lisibleCode:; déja éteindre tous les feux rouge et vert bcf rouge1 bcf rouge2 bcf vert1 bcf vert2boucle_nuit; ensuite allumer les feux orange bsf orange1 bsf orange2 ; ensuite la tempo pendant laquelle les feux sont allumé call tempo_orange_ON_nuit ;tempo de x secondes ; éteindre les feux oranges bcf orange1 bcf orange2 call tempo_orange_OFF_nuit; tempo de y secondes (on peut envisager un temps d'extinction différent de celui d'allumage) goto boucle_nuit ; bien sûr il faudrait tester si on est repasser en cycle de jour![]()
pour le chevauchement voir le dessin l'orange arrive alors que le rouge ne change pas.
pour le clignotement de l'orange quelle est le temps du clignotement ?
mettre une étiquette au dessus de clrd compt1 en mettant la valeur dans compt3 comme "clignote" par exemple.
Code:movlw 2 ; 2/5em de seconde movwf compt3 call clignoteCode:... clignote clrf compt1 ; chargement par 256 (0-1=255) clrf compt2 ; chargement par 256 clrf compt ; chargement par 256 .... etc... ....
A+, pat
Avec le code de umfred
J'ai prévu 2/5 de seconde pour le clignotement , des secondes me paraissent beaucoup....
La procedureCode:.... call tempo_orange_ON_nuit ;tempo de x secondes ....
Code:tempo_orange_ON_nuit movlw 2 ; 2/5em de seconde movwf compt3 call clignote return
A+, pat
Ces 2 lignes ;
Peuvent être remplacés par une seule !Code:call clignote return
Code:goto clignote
A+, pat
merci pour tout et le tempo de clignotement je fait 2us à base 4MHz
si le feu roug1 et feu roug2 sont allumer alors je peux pas faire tempo 5s
je n'ai pas compris ta question mais si tu regardes la pièce jointe (freepicbasic merci pour ton image) peut-être comprendra tu mieux:
Tu verra que pendant les 5 s de feux rouge n°1, il y a pendant 3s le feu vert n°2 suivi de 2s de feu orange n°2, donc pour faire cela, il suffit d'allumer au début le feu rouge n°1 et le feu vert n°2 , d'attendre 3s pour ensuite éteindre le feu vert n°2 et allumer le feu orange n°2 sans toucher au feu rouge n°1 car son état n'a pas bouger. Ensuite on attend 2s avant de poursuivre la séquence .
On aura donc le feu rouge n°1 allumé pendant 3s+2s=5s.
J'espère que ca t'éclaircira un peu les choses.
![]()
alors on 4 evenement dans la sèquence
allum feu roug1 et feu vert2
allum feu roug1et feu orang2
allume feu roug2 et feu ver1
allume feu roug2 et feu orang1
alors pour le clignote de tempo nuit de led orange sera durè de 2s c est 2microt seconde à quartz 4MHZ
Je pense que tu as compris le truc, maintenant écris ton code et montre le nous pour qu'on le corrige si besoin.
Question subsidiaire (piège ?): comment détermines-tu si on est en fonctionnement de jour (séquence de feu vert-orange-rouge) et fonctionnement de nuit (orange clignotant) ?
temp_nuit sera durè pour des heures si je calcule tempo nuit
alors je pense je vais faire un compteur de combien sequence faudra il pour passe une 12h de sequences(orang;roug;vert) et je test si il dura 12h alors je passe à tempo nuit
Si l'on veut une horloge précise dans le programme, il faudra passer par le Timer...
Je pensais qu'il y avait un bouton pour passer en mode nuit !
A+, pat
oui il y as bouton poussoir
si je veux faire tempo_nuit je fait laboucle 2microt seconde à base de quartez de led orang; mais le timer est dificile pour faire
oui #define BP portB,4
et je feit
btfss portB,4
goto etiquet
etiquet:la sequence de tempo_nuit
si non je vais à la sequence(vert,roug,orang)
N'oublie qu'à chaque fois que tu as fini une séquence, il faut revenir au test du bouton.
A mon avis, il faut un bouton à 2 positions fixes plutôt qu'un simple poussoir![]()
Est-ce que le code que tu as écrit fonctionne comme tu le souhaite maintenant ? Si non, post le, qu'on essai ed voir ce qui va pas![]()
j ai fait le programmation à base de pic pour mon proget feu tricolère bà base de pic16F84 j ai fait des tableau dans mon organigramme comment je traduit ça dans mon programme comme
T resoit tab[i]
A resoit tab[i+1]
B resoit tab[i+2]
portA resoit A
portB resoit B
incremente i
comment je traduit ça en language assembleur de pic16f84
Utiliser le registre indirect pour pointer le tableau.
puis incrémenter le pointeur FSR afin d'avoir l'octet suivant.
Noter que l'incrémentation à la fin de i est suspect.Code:; adresse de tab[0] movlw tab[0]; ici le movlw permet de lire l'adresse ; et non pas son contenu ; mettre dans le pointeur de registre indirect movwf FSR ; lire i movf i,w ; pointer sur tab[i] addwf FSR,f ;T reçoit tab[i] movf INDF,w ; charger le contenu movwf T ; incremente FSR pour faire i+1 incf FSR,f ;A reçoit tab[i+1] movf INDF,w ; charger le contenu movwf A ; incremente FSR pour faire i+2 incf FSR,f ;B reçoit tab[i+2] movf INDF,w ; charger le contenu movwf T ;portA reçoit A movf A,w movwf PORTA ;portB reçoit B movf B,w movwf PORTB ;incremente i incf i,f
Peut être fallait il faire "i = i + 3"
A+, pat
salut freepicbasic ,
voici mon organigramme de mon proget de feux tricolère ;
;debut
;congiguration et initialisation
T3_ cp=5;
i=0
T1
si rb0=1
goto sequence de nuit
;sequence de nuit
i1=0;
i1=2;
rs-T reçoit tab0[i1]
A reçoit tab[i1+1]
B reçoit tab[i1+2]
portA reçoit A
portB reçoit B
tempo(T)
incremente i
dec cpt
si cpt=0 ;no
goto rs
cpt =5
i=0
goto T1
;equenquence de jour
T reçoit tab[i]
A reçoit tab[i+1]
B reçoit tab[i+2]
portA reçoit A
portB reçoit B
tempo (T)
incr i
dec cpt
si cpt=0;
goto T3
goto T1