Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Incremental Quadrature Encoder

Başlatan ipek, 24 Ocak 2017, 01:49:43

ipek

net'ten bulduğum bir projeyi yapmaya çalışıyorum,
bıraktığım pozizyondan açılmıyor bu önemli bir eksiklik,bunu gidermeme yardımcı olurmusunuz ?

ikinci kusur encoder mekanik olarak öyle bir pozizyonda kalabiliyor ,her iki pin'ide High oluyor,bu durumda basmalı encoderin üstünde ki button'a bastığımda vazife yapmıyor,
isis adam gibi encoder vazifesi yapamadığı için, 12F675 ile Emulator kullanıyorum normal devre direkt Encoder bağlı..simulasyon ve dosyalar ektedir,

#include <Encoder_628A.h>

//Variables
int ROTATION=2;            //Encoder direction: 0=CCW, 1=CW, 2=STOP
int1 PUSH=0;               //Encoder switch status: 0=OFF, 1=ON
int GREEN=0;               //Counter for green LEDs
int1 RED=0;                //Counter for red LED

#int_EXT
void  EXT_isr(void){ 
   if(input(PIN_B2)==1)ROTATION=!input(PIN_B1); //If switch not pressed,
   else{                                        //detect the direction
      PUSH=1;                                   //If switch is pressed, set it
      ROTATION=2;                               //and indicate no rotation
   }   
}

void main(){
   enable_interrupts(GLOBAL);                   //Global interrupt enable
   enable_interrupts(INT_EXT);                  //External interrupt enabled
   ext_int_edge(H_TO_L);                        //Detection on falling edge
   
   while(TRUE){
      if((GREEN>=1)&&(ROTATION==0)){            //CCW rotation detected
         GREEN=GREEN-1;                         //Decrease counter (up to 0)
         ROTATION=2;                            //Back to rest position
      }
      if((GREEN<=14)&&(ROTATION==1)){           //CW rotation detected
         GREEN=GREEN+1;                         //Increase counter (up to 15)
         ROTATION=2;                            //Back to rest position
      }
      if(PUSH==1){                              //Switch pushed
         RED=1-RED;                             //Toggle red LED status
         PUSH=0;                                //Back to open position
      }
      output_A(GREEN);                          //Output GREEN to green LEDs
      output_bit(PIN_B7,RED);                   //Output RED to red LED
   }
}




#include <16F628A.h>

#FUSES NOWDT      //No Watch Dog Timer
#FUSES HS         //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP      //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=20000000)

#use FIXED_IO( A_outputs=PIN_A4,PIN_A3,PIN_A2,PIN_A1,PIN_A0 )
#use FIXED_IO( B_outputs=PIN_B7 )



http://s3.dosya.tc/server10/kr3vlo/16F628_Encoder_Button.rar.html

sadogan

Hocam green değişkenini saklamanız lazım. Hızlıca şöyle bir şey yaptım.
#include <Encoder_628A.h>

//Variables
int ROTATION=2;            //Encoder direction: 0=CCW, 1=CW, 2=STOP
int1 PUSH=0;               //Encoder switch status: 0=OFF, 1=ON
int GREEN=0;               //Counter for green LEDs
int1 RED=0;                //Counter for red LED

#int_EXT
void  EXT_isr(void){
   if(input(PIN_B2)==1)ROTATION=!input(PIN_B1); //If switch not pressed,
   else{                                        //detect the direction
      PUSH=1;                                   //If switch is pressed, set it
      ROTATION=2;                               //and indicate no rotation
   }   
}

void main(){
   enable_interrupts(GLOBAL);                   //Global interrupt enable
   enable_interrupts(INT_EXT);                  //External interrupt enabled
   ext_int_edge(H_TO_L);                        //Detection on falling edge
   GREEN=read_eeprom(3);
   while(TRUE){
      if((GREEN>=1)&&(ROTATION==0)){            //CCW rotation detected
         GREEN=GREEN-1;                         //Decrease counter (up to 0)
         ROTATION=2;
         write_eeprom(3,GREEN);//Back to rest position
      }
      if((GREEN<=14)&&(ROTATION==1)){           //CW rotation detected
         GREEN=GREEN+1;                         //Increase counter (up to 15)
         ROTATION=2;  //Back to rest position
         write_eeprom(3,GREEN);
      }
      if(PUSH==1){                              //Switch pushed
         RED=1-RED;                             //Toggle red LED status
         PUSH=0;                                //Back to open position
      }
      output_A(GREEN);                          //Output GREEN to green LEDs
      output_bit(PIN_B7,RED);                   //Output RED to red LED
   }
}

#include <16F628A.h>

#FUSES NOWDT      //No Watch Dog Timer
#FUSES HS         //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP      //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=20000000)

#use FIXED_IO( A_outputs=PIN_A4,PIN_A3,PIN_A2,PIN_A1,PIN_A0 )
#use FIXED_IO( B_outputs=PIN_B7 )
#rom  0x2100={255,255 ,255 ,255 ,0 ,255 ,255 ,255,255,255,255 ,255 ,255,255,15,1}

ipek

@ sadogan hocam ilginize sağolun

açılırken hep F değerinden açılıyor aslında eprom'a bir şeyler yazıyor isiste gözlemliyprum,birde yukarı sınırı F'te bitiyor ,alt sınırın 0'da durması gerekiyordu en azından orijimali böyleydi buradan tekrar F'e dalıyor ,olacak gibi bir kez daha bakarsanız sevinirim.

Not Proton Basic eeprom uygulamasını isis çalıştıramıyor,fakat gerçek devrede kusursuz çalışıyor acaba CCSC'dede böyle bir şeymi var ?

sadogan

#rom  0x2100={255,255 ,255 ,0,0 ,255 ,255 ,255,255,255,255 ,255 ,255,255,15,1}
Hocam rom içerigini bu şekilde yapın, eeprom adresi 3 ,baslangıc 255 olmus şimdi "0" burayı ne ile başlamasını istiyorsanız onla değiştirin.
İsis de eerom içeriği değişitginde, çalışma süresince koruyor. Similasyon durdurulp tekrar başlatınca ilk değere dönüyor.
Gerçekte eepromdan alacağı için kaldığı yerden başlayacak.

ipek

@Sadoğan
hocam teşekkürler,Cumartesi devreyi kuracağım,son verdiğiniz parametre ile 1'den açılıyor bu işin sırrını çözebilmem algoritmayı yakalayabilmem için ,birde 3 yada 5 örneğini paylaşabilirseniz sevinirim..