74HC595 ile yapılan PWM frekansı nasıl sabitlenir?

Başlatan silver_wolf, 28 Nisan 2022, 13:09:48

silver_wolf

Selam Arkadaşlar;
PIC12F675 ile sürülen 74HC595'teki bütün portlardan 10Hz sabit frekans almak istiyorum.

Şeması ve Çalışma şekli

#include <12F675.h>
#use delay(internal=4000000)
#fuses INTRC_IO, NOMCLR, NOBROWNOUT, NOPROTECT, NOCPD, NOPUT, NOWDT
unsigned int8 i=0, in_byte=255, out_byte=0, dutyQ0=50, dutyQ1=50, dutyQ2=50, dutyQ3=50, dutyQ4=50, dutyQ5=50, dutyQ6=50, dutyQ7=50;
const  unsigned int8 t0_byte=195;
/*************** Timer0 Kesmesi****************/
#int_timer0
void timer0_kesme(){
  unsigned int8 j=8;
  
  set_timer0(t0_byte);
  // Buton okuyan ve çıkış gönderen kısım
  output_low(PIN_A4);
  #asm
  nop
  #endasm
  output_high(PIN_A4);
  do{
      j--;
      /// 74165 SO'dan data oku ///////////////////////////////
      if(input(PIN_A5)){
    bit_set(in_byte,j);
      }else{
    bit_clear(in_byte,j);
      }
      ////////////////////////////////////////////////
      // 74595 DS'ye data yaz
      output_bit(PIN_A1,bit_test(out_byte,j));
      
      output_high(PIN_A0);
      #asm
      nop
      #endasm
      output_low(PIN_A0);
  }while(j>0);
  output_high(PIN_A2);
  #asm
  nop
  #endasm
  output_low(PIN_A2);
  ///////////////////////////////////////////////////
  
  if(i<=dutyQ0 && dutyQ0!=0 || dutyQ0==100){
      bit_set(out_byte,0);
  }else if(i>dutyQ0 && dutyQ0!=100 || dutyQ0==0 ){
      bit_clear(out_byte,0);
  }

  if(i<=dutyQ1 && dutyQ1!=0 || dutyQ1==100){
      bit_set(out_byte,1);
  }else if(i>dutyQ1 && dutyQ1!=100 || dutyQ1==0 ){
      bit_clear(out_byte,1);
  }
  
  if(i<=dutyQ2 && dutyQ2!=0 || dutyQ2==100){
      bit_set(out_byte,2);
  }else if(i>dutyQ2 && dutyQ2!=100 || dutyQ2==0 ){
      bit_clear(out_byte,2);
  }
  
  if(i<=dutyQ3 && dutyQ3!=0 || dutyQ3==100){
      bit_set(out_byte,3);
  }else if(i>dutyQ3 && dutyQ3!=100 || dutyQ3==0 ){
      bit_clear(out_byte,3);
  }
  
  if(i<=dutyQ4 && dutyQ4!=0 || dutyQ4==100){
      bit_set(out_byte,4);
  }else if(i>dutyQ4 && dutyQ4!=100 || dutyQ4==0 ){
      bit_clear(out_byte,4);
  }
  
  if(i<=dutyQ5 && dutyQ5!=0 || dutyQ5==100){
      bit_set(out_byte,5);
  }else if(i>dutyQ5 && dutyQ5!=100 || dutyQ5==0 ){
      bit_clear(out_byte,5);
  }
  
  if(i<=dutyQ6 && dutyQ6!=0 || dutyQ6==100){
      bit_set(out_byte,6);
  }else if(i>dutyQ6 && dutyQ6!=100 || dutyQ6==0 ){
      bit_clear(out_byte,6);
  }
  
  if(i<=dutyQ7 && dutyQ7!=0 || dutyQ7==100){
      bit_set(out_byte,7);
  }else if(i>dutyQ7 && dutyQ7!=100 || dutyQ0==7 ){
      bit_clear(out_byte,7);
  }
  
  i++;
  if(i==101) i=0;
}
void main(void)
 { 
  setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16); // Timer0 ayarları yapılıyor
  set_timer0(t0_byte);  // TMR0 değeri belirleniyor


  enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar
  enable_interrupts(GLOBAL);    // Aktif edilen kesmelere izin ver
  while(TRUE){
      if(in_byte==0b11111110){
        dutyQ0=100;
      }
      if(in_byte==0b11111101){
        dutyQ0=75;
      }
      if(in_byte==0b11111011){
        dutyQ0=50;
      }
      if(in_byte==0b11110111){
        dutyQ0=25;
      }
      if(in_byte==0b11101111){
        dutyQ0=0;
      }
  }
 }