Help in this montage ''anemometer based on PIC16F88''

Status
Not open for further replies.

youse2013

Newbie level 2
Joined
Apr 23, 2013
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Visit site
Activity points
1,380
This montage works on the program isis
But in real there is a problem see photo


File. Rar
Where (isis-hex-c)
View attachment anemo_v1.zip

PHP:
#include "header_anemo.h"
unsigned long temps,v,vmax,tampon,tampon2,nb_timer,var_temps;
unsigned long var_2s,moyenne_1,tab_10[10],moyenne10,moyenne_av1,moyenne_av2,moyenne_av3;
char v0,v1,v2,v3,v4,i,a,tmr,valid_it,var_tampon,h,bit_h_lect,bit_l_lect;
char i_1Min,i_tab,tampon_s;
float temps_ms,fl_temp;
//******************************************************************
//Programme d'interruption
#pragma origin 4
interrupt ils(void){
        int_save_registers
        tmr=TMR0;
        TMR0=3;
        if(TMR0IF){
                TMR0IF=0;
                nb_timer++;
                var_2s++;
                if(nb_timer>TEMPS_MAX){
                        var_temps=TEMPS_MAX;
                        nb_timer=TEMPS_MAX;
                        if(valid_it==0){
                                valid_it=1;
                        }
                }
        
        }
        if(INT0IF){
                INT0IF=0;
                var_temps=nb_timer;
                var_tampon=tmr-2;
                nb_timer=0;
                valid_it=1;
                PORT_DEL=!PORT_DEL;
        }
        int_restore_registers
}
#pragma sharedAllocation
//******************************************************************



//******************************************************************
//Programme principal
void main(void){
        TRISA=0b00110000;
        ANSEL=0;
        PORT_DATA=0;
        TRISB=0b00000001;
        PORTB=0;
        OPTION_REG=0b11000001;                 //front montant sur RB0 et TMR0=TCycle*4
        init_lcd();                                        //Initialisation du LCD
        genere_car();                                //Genere les caractères
        clear();
        tempo_l();
        ecrire_donnee_horloge(105,0x90);        //Instruction de charge de la capa de sauvegarde
        if(BP_Horloge){                                //Activation de la fonction écriture de l'horloge si demandé
                ecrire_heure();
                clear();
                tempo_l();
        }
        // Lecture et affichage de l'heure
        affichage_heure(0x8F);
        
        //Affichage des caractère nécessaire
        curseur(0x80);
        affich_chaine("V=---.-Km/h",11);//"---.-Km/h"
        curseur(0xC0);
        affich_chiffre(210);
        for(h=0;h<10;h++){
                affich_chiffre(211);                //Barre des Bfts
        }
        affich_chiffre(212);
        affich_chaine("  0 Bft",7);
        curseur(0x94);
        affich_chaine("Moy=---.-Km/h",13);
        curseur(0xD4);
        affich_chaine("Max=---.-Km/h",13);
        for (a=0;a<255;a++){
                tempo_l();
        }
        for (a=0;a<255;a++){
                tempo_l();
        }

        //Initialisation des variables
        TMR0=0;
        var_2s=0;
        vmax=0;
        valid_it=1;
        nb_timer=TEMPS_MAX;
        var_temps=TEMPS_MAX;
        i_1Min=0;
        i_tab=0;
        moyenne_1=0;
        moyenne_av3=0;
        moyenne_av2=0;
        moyenne_av1=0;
        moyenne10=0;
        for(i=0;i<10;i++){
                tab_10[i]=0;
        }

        INTCON=0b10110000;// Validation des interruption, sur RB0 et TMR0
        for(;;){
                if(valid_it==1){
                        //Calcul de la vitesse        
                        temps_ms=(float)var_temps*0.2048; //Temps en ms
                        tampon_s=var_tampon-3;
                        fl_temp=tampon_s*0.00080314;// calcul des dixièmes de milliseconde
                        fl_temp+=temps_ms;
                        fl_temp=11309.8/fl_temp;
                        v=fl_temp;
                        affichage_vitesse(0x82,v);

                        if(v>=vmax){
                                vmax=v;
                                affichage_vitesse(0xD8,vmax);
                                affichage_heure(0xE3);
                        }

                        if(var_temps>=TEMPS_MAX) {        //Empeche le retour dans la boucle si V=0
                                valid_it=3;
                        }
                        else{                                        //Empeche le retour dans la boucle
                                valid_it=0;
                        }

                        echelle_bft(v);
                }// Fin du traitement d'interruption sur la vitesse.


                if(var_2s>9730){
                        PORT_2S=!PORT_2S;
                        var_2s=0;
                        moyenne_1+=v;                
                        i_1Min++;
                        if(i_1Min==30){
                                i_1Min=0;
                                moyenne_1/=30;
                                tab_10[i_tab]=moyenne_1;
                                moyenne_1=0;
                                if(i_tab==9){i_tab=0;}
                                else{i_tab++;}
                                tampon=0;
                                for(i=0;i<10;i++){
                                        tampon2=tab_10[i];
                                        tampon+=tampon2;
                                }
                                moyenne_av3=moyenne_av2;
                                moyenne_av2=moyenne_av1;
                                moyenne_av1=moyenne10;
                                moyenne10=tampon/10;
                                tampon_s=3;
                                if(moyenne_av2>moyenne_av3){
                                        tampon_s++;
                                }
                                else if(moyenne_av2<moyenne_av3){
                                        tampon_s--;
                                }
                                if(moyenne_av1>moyenne_av2){
                                        tampon_s++;
                                }
                                else if(moyenne_av1<moyenne_av2){
                                        tampon_s--;
                                }
                                if(moyenne10>moyenne_av1){
                                        tampon_s++;
                                        }
                                else if(moyenne10<moyenne_av1){
                                        tampon_s--;
                                }
                                curseur(0xA3);
                                if(tampon_s>4){
                                        affich_chiffre(208);
                                }
                                else if(tampon_s<2){
                                        affich_chiffre(209);
                                }
                                else{
                                        affich_chiffre(0x7E-48);
                                }
                                affichage_vitesse(0x98,moyenne10);
                                //Lecture de l'heure
                                affichage_heure(0x8F);
        
                        }//Moyenne sur 1min
                }//Fin moyenne
                if(BP_Gene){
                        vmax=0;
                        affichage_vitesse(0xD8,vmax);
                        curseur(0xE3);
                        affich_chaine("     ",5);
                }
        }// Fin for
}// Fin Main










// Temporisation courte 40µs
void tempo_c(void){
        for(i=0;i<20;i++);
}

//Tempo pour clignotement des heures et autres...
void tempo_longue(void){
        for(h=0;h<200;h++){
                tempo_l();
                tempo_l();
        }
}

// Temporisation longue 1.64 ms
void tempo_l(void){
        for(i=0;i<255;i++);
        for(i=0;i<255;i++);
        for(i=0;i<255;i++);
        for(i=0;i<255;i++);
}

// Impulsion E pour l'envoie de données 
void impuls(void){
        PORT_E=1;
        nop();
        nop();
        nop();
        PORT_E=0;
        tempo_c();
}

//Affiche une caîne de caractère
void affich_chaine(const char * chaine,char nb){
char count;
for(count=0;count<nb;count++)
        {
        char tempon;
        tempon=chaine[count];
        PORT_DATA=tempon>>4;
        impuls();
        PORT_DATA=chaine[count];
        impuls();
        }
}
//Affiche un chiffre
void affich_chiffre(char chiff){
chiff=chiff+48;
PORT_DATA=chiff>>4;
impuls();
PORT_DATA=chiff;
impuls();
}

//Efface l'écran        
void clear(void){
PORT_RS=0;
PORT_DATA=0;
impuls();
PORT_DATA=1;
impuls();
tempo_l();
PORT_RS=1;
curseur(0x80);
}


//Position le curseur dans la RAM/CG-RAM
void curseur(char place){
char temp;
temp=place;
PORT_RS=0;
PORT_DATA=place>>4;
impuls();
PORT_DATA=temp;
impuls();
PORT_RS=1;
}

//Initialisation du LCD
void init_lcd(void){
for(a=0;a<255;a++){//On attend que le LCD s'allume
        tempo_l();
        }
PORT_DATA=3;//mode 8 bits
impuls();

PORT_DATA=3;//mode 8 bits
impuls();

PORT_DATA=3;//mode 8 bits
impuls();

PORT_DATA=2;//mode 4 bits
impuls();

PORT_DATA=2;//mode 4 bits + 1 ligne + caractère 5*7
impuls();
PORT_DATA=8;
impuls();

PORT_DATA=0;//allumage affichage + cache curseur
impuls();
PORT_DATA=12;
impuls();

PORT_DATA=0;//le curseur bouge vers la droite
impuls();
PORT_DATA=4;
impuls();

PORT_DATA=0;//Incrémentation du curseur a chaque nouvelle donnée
impuls();
PORT_DATA=6;
impuls();

PORT_RS=1;//On passe en mode "données"
clear();
tempo_l();
}

//Affichage d'une vitesse "v_affiché"
void affichage_vitesse(unsigned position,unsigned long v_affich){
        curseur(position);
        v1=v_affich/1000;
        tampon=v_affich%1000;
        v2=tampon/100;
        tampon=v_affich%100;
        v3=tampon/10;
        v4=v_affich%10;
        if(v1==0){
                v1=112;
        }
        if(v2==0){
                v2=112;
        }
        affich_chiffre(v1);
        affich_chiffre(v2);
        affich_chiffre(v3);
        curseur(position+4);
        affich_chiffre(v4);
}

void ecrire_heure(void){
        unsigned heure_h,minute_h;
        unsigned adresse;
        curseur(0x80);
        affich_chaine("REGLAGE HORLOGE...",18);
        curseur(0xC0);
        affich_chaine("APPUYEZ POUR CHANGER",20);
        curseur(0x94);
        affich_chaine("LES MINUTES",11);
        curseur(0xD4);
        affich_chaine("00:00",5);
        while(!PORTA.5){
                curseur(0xD7);
                affich_chaine("  ",2);
                tempo_longue();
                curseur(0xD7);
                affich_chaine("00",2);
                tempo_longue();
        }
        minute_h=255;
        heure_h=255;
        while(PORTA.5){
                minute_h++;
                curseur(0xD7);
                affich_chiffre(minute_h/10);
                affich_chiffre(minute_h%10);
                if(minute_h==59){minute_h=0;}
                tempo_longue();        
        }
        curseur(0x94);
        affich_chaine("LES HEURES ",11);
        while(!PORTA.5){
                curseur(0xD4);
                affich_chaine("  ",2);
                tempo_longue();
                curseur(0xD4);
                affich_chaine("00",2);
                tempo_longue();
        }
        while(PORTA.5){
                heure_h++;
                curseur(0xD4);
                affich_chiffre(heure_h/10);
                affich_chiffre(heure_h%10);
                if(heure_h==24){heure_h=0;}
                tempo_longue();        
        }
        ecrire_donnee_horloge(0,0x80);                        //ecriture des secondes
        ecrire_donnee_horloge(minute_h,0x82);        //ecriture des minutes
        ecrire_donnee_horloge(heure_h,0x84);        //ecriture des heures
}//fin reglage_heure






void ecrire_donnee_horloge(unsigned data_h,unsigned adresse_ecriture)
{
        unsigned bit_h_ecr;
        unsigned bit_l_ecr;
        bit_h_ecr=data_h/10;        
        bit_l_ecr=data_h%10;
        data_h=bit_h_ecr;
        data_h<<=4;
        data_h=bit_l_ecr+data_h;
        TRISB.7=0;
        nop();
        PORTB.7=0;
        nop();
        PORTB.6=0;
        nop();
        PORTB.5=0;
        nop();
        nop();
        PORTB.5=1;
        for(i=0;i<8;i++){
                PORTB.6=0;
                PORTB.7=adresse_ecriture.0;
                nop();
                PORTB.6=1;
                adresse_ecriture=adresse_ecriture>>1;
        }
        for(i=0;i<8;i++){
                PORTB.6=0;
                PORTB.7=data_h.0;
                nop();
                PORTB.6=1;
                data_h=data_h>>1;
        }
        PORTB&=0b00011111; //Mise à zéro de Rb7 Rb6 Rb5
        
}
        
void lecture_donnee_horloge(char adresse_lecture)
{
        TRISB.7=0;
        PORTB.7=0;
        PORTB.6=0;
        PORTB.5=0;
        PORTB.5=1;
        for(i=0;i<8;i++){
                PORTB.6=0;
                PORTB.7=adresse_lecture.0;
                PORTB.6=1;
                adresse_lecture=adresse_lecture>>1;
        }
        TRISB.7=1;
        PORTB.6=0;
        tampon_s.7=PORTB.7;
        for(i=0;i<7;i++){
                PORTB.6=1;
                tampon_s>>=1;
                PORTB.6=0;
                tampon_s.7=PORTB.7;
        }
        bit_l_lect=0b00001111&tampon_s;
        bit_h_lect=0b01110000&tampon_s;
        bit_h_lect>>=4;
        bit_h_lect=bit_h_lect*10;
        tampon_s=bit_h_lect+bit_l_lect;
        TRISB.7=0;
        PORTB.7=0;
        PORTB.6=0;
        PORTB.5=0;
}

void affichage_heure(unsigned adresse){
        tampon_s=0;
        lecture_donnee_horloge(0x85);
        curseur(adresse);
        affich_chiffre(tampon_s/10);
        affich_chiffre(tampon_s%10);
        affich_chaine(":",1);
        lecture_donnee_horloge(0x83);
        affich_chiffre(tampon_s/10);
        affich_chiffre(tampon_s%10);
}


void genere_car(void)
{
        static const char car_1[] = {0x0,0xf,0x3,0x5,0x9,0x10,0x0,0x0};                        //fleche haut
        static const char car_2[] = {0x0,0x10,0x9,0x5,0x3,0xf,0x0,0x0};                        //fleche bas
        static const char car_3[] = {0x1f,0x10,0x10,0x10,0x10,0x10,0x1f,0x0};        //debut barre
        static const char car_4[] = {0x1f,0x0,0x0,0x0,0x0,0x0,0x1f,0x0};                //milleu barre
        static const char car_5[] = {0x1f,0x1,0x1,0x1,0x1,0x1,0x1f,0x0};                //fin barre
        static const char car_6[] = {0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0};        //barre pleine
        unsigned i_car_a;
        PORT_RS=1;
        curseur(0x40);
        tempo_c();
        for (i_car_a=0;i_car_a<8;i_car_a++){
                affich_chiffre(car_1[i_car_a]-48);
        }
        for (i_car_a=0;i_car_a<8;i_car_a++){
                affich_chiffre(car_2[i_car_a]-48);
        }
        for (i_car_a=0;i_car_a<8;i_car_a++){
                affich_chiffre(car_3[i_car_a]-48);
        }
        for (i_car_a=0;i_car_a<8;i_car_a++){
                affich_chiffre(car_4[i_car_a]-48);
        }
        for (i_car_a=0;i_car_a<8;i_car_a++){
                affich_chiffre(car_5[i_car_a]-48);
        }
        for (i_car_a=0;i_car_a<8;i_car_a++){
                affich_chiffre(car_6[i_car_a]-48);
        }
}
#pragma codepage 1
void echelle_bft(unsigned long v_comp){
        unsigned bft;
        bft=0;
        curseur(0xC0);
        if(v_comp>10){
                affich_chiffre(213);
                bft=1;
        }
        else{
                affich_chiffre(210);
                bft+=0;
        }
        if(v_comp>60){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>120){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>200){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>290){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>390){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>500){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>620){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>750){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>890){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>1030){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(211);
        }
        if(v_comp>1180){
                affich_chiffre(213);
                bft++;
        }
        else{
                affich_chiffre(212);
        }
        
        curseur(0xCD);
        if(bft<10){
                affich_chiffre(112);
        }
        else{
                affich_chiffre(bft/10);
        }
        affich_chiffre(bft%10);
}
 
Last edited:

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…