tu as lu ce que j'ai écris plus haut ?
Pourquoi chercher quelque chose de compliqué alors que je t'ai donné une solution simple ?
et ta fonction pause ne donnera pas satisfaction car les deux boucles ne sont pas imbriquées...
-----
tu as lu ce que j'ai écris plus haut ?
Pourquoi chercher quelque chose de compliqué alors que je t'ai donné une solution simple ?
et ta fonction pause ne donnera pas satisfaction car les deux boucles ne sont pas imbriquées...
Dernière modification par Forhorse ; 24/12/2012 à 19h26.
Tout projet flou conduit à une connerie précise !
bonjout,
pour ecrire en memoire si cela peut t'aider ?
http://claude.dreschel.free.fr/comme.../RW_EEPROM.htm
cordialement
Alain
pas besoin de lire/écrire un eeprom pour une telle application. Sur quelque chose qui donne une fonction aléatoire, quel intérêt de mémoriser le dernier état des sorties ?
Tout projet flou conduit à une connerie précise !
salut a tous
Dans lordre des post
1 Si j'ai bien compris , le fait de declarer une variable, crée un emplacement memoire en ram pour cette variable. de ce fait on a qu'a la lire??
2 j'ai bien lu ton post Forhorse mais je l'ai mal réecrit pour la fonction pause
3 merci alainav1 pour le lien
4 Le fait de mettre en eeprom l'etat des 1 led avant extinction, permet de reprendre le cycle la ou il etait au lieu de remettre les led a 0 ou 1 (initialisation) et de repartir avec l'aleatoire. l'effet est que 2 maisons cote a cote par exemple sont sures a la mise sous tension de n'avoir toutes les led allumées ou etteintes avant de passer sur le cycle aleatoire. pour faire court on initialise l'etat de chaque bit des 2 ports par leur ancien etat au lieu de tous les initialiser a 0 ou a 1.
La suite demain aujourd'hui c'est repos!!!!!
christophe
Ouais c'est bien ce que je dis, ça sert à rien !4 Le fait de mettre en eeprom l'etat des 1 led avant extinction, permet de reprendre le cycle la ou il etait au lieu de remettre les led a 0 ou 1 (initialisation) et de repartir avec l'aleatoire. l'effet est que 2 maisons cote a cote par exemple sont sures a la mise sous tension de n'avoir toutes les led allumées ou etteintes avant de passer sur le cycle aleatoire. pour faire court on initialise l'etat de chaque bit des 2 ports par leur ancien etat au lieu de tous les initialiser a 0 ou a 1.
a la mise sous tension ton programme génère un nombre aléatoire afin d'allumer une led aléatoirement parmi un certain nombre. A ton avis combien de temps va t-il se passer entre l'initialisation et l'allumage de la première led ? donc pendant combien de temps les led vont restée éteinte ?
Tu cherches vraiment les complications là où il n'y en a pas du tout besoin.
J'ai pas franchement l'impression que tu test les programmes que tu écris...
Dernière modification par Forhorse ; 25/12/2012 à 20h21.
Tout projet flou conduit à une connerie précise !
salut a tous
Forhorse, j'ai ecrit plus haut que je n'avais pas encore de quoi pour faire le debugg. c'a arrive demain
ci joint la nouvelle version du soft
j'ai ajouter une routine interuption qui fige toute mes led a 1 mais apresa voir lu la doc du pic il est conseiller de sauvgarder les registre au debut de l'interuption et de les restaurer a la fin . pouvez vous me dire comment on ecrit cela. je n'ai rien trouver dans la doc du compilateur. sur le net j'ai vu int_save_regiters et int_restore_regiters mais le compilateur ne reconnait pas
merci d'avance christophe
/*
* File: ecl_12_pieces.c
* Author: christophe
*
* Created on 26 décembre 2012, 21:00
*/
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
/*
*
*/
#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))
static bit LED0 @ PORTBIT(PORTC, 0);
static bit LED1 @ PORTBIT(PORTC, 1);
static bit LED2 @ PORTBIT(PORTC, 2);
static bit LED3 @ PORTBIT(PORTC, 3);
static bit LED4 @ PORTBIT(PORTC, 4);
static bit LED5 @ PORTBIT(PORTC, 5);
static bit LED6 @ PORTBIT(PORTC, 6);
static bit LED7 @ PORTBIT(PORTC, 7);
static bit LED8 @ PORTBIT(PORTA, 4);
static bit LED9 @ PORTBIT(PORTA, 5);
static bit LED10 @ PORTBIT(PORTA, 6);
static bit LED11 @ PORTBIT(PORTA, 7);
static bit couloir @ PORTBIT(PORTA, 0);
unsigned int i; //Pour la boucle de pause
unsigned int j; //Pour la 2eme boucle de pause
unsigned int NA = 0; //nonbre aleatoire correspondant a une led
unsigned int NA2 = 0; //nonbre aleatoire correspondant a tempo aleatoire
int NARAM; //nombre aleatoire lu en RAM
//pause functions et interruptions
void pause_1();
void interupt();
//main function
void main(void)
{
OSCCON = 0b01100001; //oscillateur intern utilisé a 4 mhz
ANSEL = 0b00000000; //met tous les ports en numérique
INTCON = 0b10000100; //autorise les interruption sur pin RB0 A 7 sur un niveau
TRISA = 0b00000100; //bit0,1,2,4,5,6,7 en sortie, bit 3 en entrée (force par config du Pic)
TRISB = 0b00000001; //bit0 en entrée (ext Interrup) et bit 1 a 7 en sortie
TRISC = 0b00000000; //bit0 a 7 en sortie
PORTA = 0b00000000; //Bit 0 ,1, 4 a 7 port A a 0
PORTB = 0b00000000; //Bit 1 a 7 port B a 0 (reserve de led a piloter en plus)
PORTC = 0b00000000; //Bit 0 a 7 port C a 0
while(OSCCON,HTS= 0) // attente stabilisation oscillateur
{
}
srand(NARAM); // initialisation de rand
NA = (rand()%12);
switch(NA)
{
case 0: LED0 = !LED0;
pause_1();
break;
case 1: LED1 = !LED1;
pause_1();
break;
case 2: LED2 = !LED2;
pause_1();
break;
case 3: LED3 = !LED3;
pause_1();
break;
case 4: LED4 = !LED4;
pause_1();
break;
case 5: LED5 = !LED5;
pause_1();
break;
case 6: LED6 = !LED6;
pause_1();
break;
case 7: LED7 = !LED7;
pause_1();
break;
case 8: LED8 = !LED8;
pause_1();
break;
case 9: LED9 = !LED9;
pause_1();
break;
case 10: LED10 = !LED10;
pause_1();
break;
case 11: LED11 = !LED11;
pause_1();
break;
}
}
void pause_1()
{
srand(NARAM);
NA2 = (rand()%60); //génération du nombre de boucle à faire (par exemple entre 0 et 60)
for(j=0;j<NA2;j++); // on va compter entre 0 et 60 tempo aléatoire
{
for(i=0; i<4000; i++); // 2emem tempo fixe a ajuster
}
}
void interupt()
{
//sauvegarde registtres??? a ecrire
if(RBIF=1); // flag detection interuption sur port B
LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
LED8 = 1;
LED9 = 1;
LED10 = 1;
LED11 = 1;
couloir = 1;
RBIF=0; // remise du flag a 0 pour nouvelle interuption
//restauration des registres????? a ecrire
}
Avant d'ajouter des complications inutiles tu ferrais mieux de tester déjà quelque chose de simple.
Et il faut aussi que tu te renseignes sur ce qu'est une interruption, parce que là tu pars dans un délire qui n'a ni queue ni tête !
Tout projet flou conduit à une connerie précise !
Bonjour,
A quoi ça sert de faire simple quand on peut faire compliqué !
cordialement
Alain
bonjour a tous
SI j'essaye d'ecrire une routine d'interuption c'est que j'ai besoin dans mon application de figer toute les led a 1 quand je le veux et sans a voir a ettendre la fin de la boucle principale du programme. (2 mn maximun de la tempo). j'essaye de faire avance mon projet et si vous avez autre chose a proposer dite le mais sans envoyer des post qui ne servent a rien sauf a faire monter la mayonnaise et a casser la personne entre autre moi.
christophe
La "bonne" méthode (ce qui se fait habituellement) c'est de gerer les tempo avec une interruption, et de surveiller l'entrée dans la scrutation du programme principal. Ainsi le processeur n'est pas "englué" dans une boucle de temporisation qui ne "fait rien" et peux ainsi réagir rapidement (instantanément du point de vue humain)
Une autre méthode, vu ton application, serait d'inclure la scrutation de l'entrée dans la boucle de temporisation. On évite de se casser la tête avec une interruption et le résultat est identique.
Par exemple (sans doute des trucs à corriger, je ne connais pas le C)Code:void pause_1() { srand(NARAM); NA2 = (rand()%60); //génération du nombre de boucle à faire (par exemple entre 0 et 60) for(j=0;j<NA2;j++); // on va compter entre 0 et 60 tempo aléatoire { for(i=0; i<4000; i++) // 2emem tempo fixe a ajuster { if (PORTBIT(PORTB,0) == 1) { hold() } } } } void hold() { while ((PORTBIT(PORTB,0) == 1) { LED0 = 1; LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; LED5 = 1; LED6 = 1; LED7 = 1; LED8 = 1; LED9 = 1; LED10 = 1; LED11 = 1; couloir = 1; } }
enfin bref, en programmation, quand on est face à un problème on cherche ce qui bloque, pourquoi ça bloque, et comment débloquer. Il faut réfléchir, chercher, optimiser plutôt que d'essayer de bricoler des solutions qui alourdissent encore les choses.
Moi je suis loin d'être un bon programmeur. Quand je bosse sur un projet, il m'arrive de compiler et de tester 75 ou 80 fois un bout de programme pour trouver une solution.
Alors si tu crois que tu vas t'en sortir en codant virtuellement sur un forum tu te fourre le doigt dans l’œil.
coder->compiler->tester->observer->coder->compiler->tester->observer->coder->compiler->tester->observer->coder->compiler->tester->observer->...
Perso ce sujet commence à me fatiguer, quand on veut aider on se prend des remarques ingrates ! C'était ma dernière intervention.
Tout projet flou conduit à une connerie précise !
Bonjour,
Je reviens avec mon programme basic picaxe.
Pas pour te forcer à faire du basic ni du picaxe, mais parce que je pense que ce programme répond au besoin exprimé.
Et à en garder le principe. Refait une simulation (accéléré x 10) et regarde.
Il y a une génération de 2 nombres aléatoires, un pour la sortie (b0) et un pour la tempo (b1)
12 sorties et 20 tempo = 240 combinaisons
tempo max 20 secondes > temps statistique moyen =10s
Pour des paliers de 1 seconde > temps moyen de 12 cycles = 120 secondes
temps minimum d'allumage d'une led =1 s
temps maximun = ? (plusieurs minutes)
Modif: ajout d'une interruption.
Sur la fenêtre simulation, tu cliques sur C.1 et toutes les leds s'allument. Tu recliques et elles s'éteignent de façon aléatoire.
IL est certainement possible de faire la même chose en C. J'ai vu un "delay_ms(x)", avec un x=aléatoire de 1000 à 20000
MMCode:#picaxe 20M2 setint %00000010,%00000010 dirsB =%11111111 dirsC =%10111000 Do random W0 b0=b0//12 w1= b1//20*100 select case b0 case 0 pause w1 toggle C.3 case 1 pause w1 toggle C.4 case 2 pause w1 toggle C.5 case 3 pause w1 toggle C.7 case 4 pause w1 toggle B.0 case 5 pause w1 toggle B.1 case 6 pause w1 toggle B.2 case 7 pause w1 toggle B.3 case 8 pause w1 toggle B.4 case 9 pause w1 toggle B.5 case 10 pause w1 toggle B.6 case 11 pause w1 toggle B.7 end select loop interrupt: outpinsB =%11111111 outpinsC =%10111000 pause 1000 setint %00000010,%00000010 return
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
bonjour,
pour revenir au sujet de depart "simulation d'une maison de modelisme "le realisme c'est de compresser le temps .
c'est a dire de creer un environnement du reseau avec un extinction progressive de l'environement du reseau et d'allumer une à une les maison en fonction de la luminosité ambiante .
donc quelques LDR sur le reseau une simulation de l'evolution de la luminosite en 30minutes si tu es en 1/87 par exemple avec l'horloge de la gare en accceleré par exemple .
(un allumage aléatoire n'est pas le reflet de la réalité ).
mais ce n'est que mon avis !
cordialement
Alain
Salut a tous
J'ai recu mon kit de debugg jeudi soir et depuis je travail dessus
resultat.(par rapport au programme ci joint)
la boucle principale fonctionne bien, reste a initialiser le Srand avec autre chose que le registre osccon ou status (il ya bien une difference de scenario entre les 2 registres, mais il faut que je trouve le moyen d'voir une "graine (srand) totalement aleatoire. avec quoi. Forhorse tu a proposer de lire la tension sur une patte en l'air mais comme tout bon electronicien, je 'naime pas les patte en l'air. si on utilise un pont diviseur il faut lire en analogique sur une patte du convertisseur A/N ?
ForHorse, j'ai fait comme tu me l'a dit de tester> observer> coder (mais je le sais depuis longtemps et comme je n'avais pas le debugger...........
Mag 1 en effet c'est ce que je recherche et je vais y arrive mais cela doit etre transposable dans n'inporte quel pic 16F886 /887 pour pouvoir minituriser et utiliser a d'autre fin.
Alainav1, ce que je recherche n'ai pas l'allumage aleatoire des maisons mais l'alummage aleatoir des pieces d'une maison, dans un groupe de 5 maisons, qui peuvent en effet s'allumées en fonction des heures ou de la luminositée ambiante
ci joint le soft
. Pour une photo ou video, me la demande en direct par mail car je n'ai pas la permission d'en inserer
a plus christophe
/*
* File: ecl_12_pieces.c
* Author: christophe
*
* Created on 29 décembre 2012, 11:05
*/
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include <conio.h>
#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))
static bit LED0 @ PORTBIT(PORTC, 0);
static bit LED1 @ PORTBIT(PORTC, 1);
static bit LED2 @ PORTBIT(PORTC, 2);
static bit LED3 @ PORTBIT(PORTC, 3);
static bit LED4 @ PORTBIT(PORTC, 4);
static bit LED5 @ PORTBIT(PORTC, 5);
static bit LED6 @ PORTBIT(PORTC, 6);
static bit LED7 @ PORTBIT(PORTC, 7);
static bit LED8 @ PORTBIT(PORTA, 0);
static bit LED9 @ PORTBIT(PORTA, 1);
static bit LED10 @ PORTBIT(PORTA, 2);
static bit LED11 @ PORTBIT(PORTA, 3);
static bit couloir @ PORTBIT(PORTA, 5);
//#define )
// ANSEL = 0b00000000; //met tous les ports en numérique
// INTCON = 0b10000100; autorise les interruption sur pin RB0 A 7 sur un niveau
unsigned int i; //Pour la boucle de pause
unsigned int j; //Pour la 2eme boucle de pause
unsigned int NA2; //nonbre aleatoire correspondant a tempo aleatoire
unsigned int NA; //nonbre aleatoire correspondant a tempo aleatoire
int alea (int iMin, int iMax) // generation mot aleatoire borné
{
return (iMin + (rand () % (iMax-iMin+1)));
}
//pause functions et interruptions
void pause_1();
void main(void)
{
OSCCON = 0b01100001; //oscillateur intern utilisé a 4 mhz
PORTA = 0b00000000; //Bit 0 ,1, 4 a 7 port A a 0
PORTB = 0b00000000; //Bit 1 a 7 port B a 0 (reserve de led a piloter en plus)
PORTC = 0b00000000; //Bit 0 a 7 port C a 0
TRISA = 0b00000100; //bit0,1,2,4,5,6,7 en sortie, bit 3 en entrée (force par config du Pic)
TRISB = 0b00000001; //bit0 en entrée (ext Interrup) et bit 1 a 7 en sortie
TRISC = 0b00000000; //bit0 a 7 en sortie
srand(STATUS);
while(1)
{
NA = alea (1,12);
if(NA==1)
LED0 = !LED0;
pause_1();
if(NA==2)
LED1 = !LED1;
pause_1();
if(NA==3)
LED2 = !LED2;
pause_1();
if(NA==4)
LED3 = !LED3;
pause_1();
if(NA==5)
LED4 = !LED4;
pause_1();
if(NA==6)
LED5 = !LED5;
pause_1();
if(NA==7)
LED6 = !LED6;
pause_1();
if(NA==8)
LED7 = !LED7;
pause_1();
if(NA==9)
LED8 = !LED8;
pause_1();
if(NA==10)
LED9 = !LED9;
pause_1();
if(NA==11)
LED10 = !LED10;
pause_1();
if(NA==12)
LED11 = !LED11;
pause_1();
}
}
void pause_1()
{
NA2 = alea(1,12);
for(j=0;j<NA2;j++); // on va compter entre 0 et 60 tempo aléatoire
{
for(i=0; i<40000; i++); // 2emem tempo fixe a ajuster
}
}
bonjour,
pour le realisme tu allume donc les pieces dans l'ordre
couloir puis cuisine salon , le soir chambretc
c'est plus aleatoire c'est organisé mais plus realiste
cordialement
Alain
bonsoir a tous
Mon programme est fini avec 2 interuptions pour le controle l'eclairage aleatoire et l'eclairage fixe. Interuptions necessaires pour passer d'un mode a l'autre sans avoir a attendre la fin de la double tempo pour l'allumage des led(jusqu'a 3mn au max de tempo). En effet meme en intercallant dans la boucle de la double tempo une scrutation des 2 commandes celles ci etaient activées au bout de quelques secondes ce qui ne me convenait pas alors qu'avec les 2 interuptions c'est instantané
merci a tous christophe
dernier message