Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: sifirzero - 16 Aralık 2022, 08:52:17

Başlık: frekans uretimi
Gönderen: sifirzero - 16 Aralık 2022, 08:52:17
merhaba arkadaşlar hayirli cumalar.
ccs c kullanarak pic12f675 den kare dalga frekans nasıl uretebiliriz. Yardimci olabilirmisiniz.
Başlık: Ynt: frekans uretimi
Gönderen: yucatar - 16 Aralık 2022, 09:15:42
pwm ile yapılabilir.
https://pic-microcontroller.com/pic12f675-pwm-code-and-proteus-simulation/

yada ana döngüde veya timer kesmesinde pini aç ve kapa yaparak olabilir ama en iyisi pwm.

%50 dolulukta 10Hz kare dalga örneği
void main()
{
  pin_high;
  delay_ms(50);
  pin_low;
  delay_ms(50);
}
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 16 Aralık 2022, 10:33:49
12f675 pwm yok. ama mantıken olabilir. mikro c ile vermiş biz if icerisine yazcaz ki. o kesmeyi anlasın. tesekkurler
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 17 Aralık 2022, 00:23:32
pic in 5. bacagini 2 birim olarak ayni anda kullanabilirmiyiz. timer0 ve comparator olarak.
Başlık: Ynt: frekans uretimi
Gönderen: mehmet - 17 Aralık 2022, 19:27:59
Alıntı yapılan: sifirzero - 17 Aralık 2022, 00:23:32pic in 5. bacagini 2 birim olarak ayni anda kullanabilirmiyiz. timer0 ve comparator olarak.
Muhtemelen.
Bir zaman komparatör, bir zaman T0
sayma girişi sırayla kullanılabilir
diye düşünüyorum.
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 17 Aralık 2022, 21:45:27
kardeşim timer0 ile zaman farkini nasil ölçebilirim.
Başlık: Ynt: frekans uretimi
Gönderen: mehmet - 17 Aralık 2022, 22:45:24
Burası işinize yarar umarım.

https://sveerakumar.blogspot.com/2011/10/pic-timer-0-tutorial.html?m=1
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 18 Aralık 2022, 12:11:37
Alıntı yapılan: mehmet - 17 Aralık 2022, 22:45:24Burası işinize yarar umarım.

https://sveerakumar.blogspot.com/2011/10/pic-timer-0-tutorial.html?m=1

mickro c de cok kolay olan iş. ccs c den daha zor anlamadım.ccs c hazir kod var ise frekans sayma paylaşabilirmisin
Başlık: Ynt: frekans uretimi
Gönderen: mehmet - 18 Aralık 2022, 12:18:33
CCS C bilmiyorum.
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 18 Aralık 2022, 12:20:37
Eskiden foruma birsey yazildiginda hemen çözum bulunurdu. şimdi biraz yavaşlamıs gibi.. Teşekkurler
Başlık: Ynt: frekans uretimi
Gönderen: zuzunin - 20 Aralık 2022, 10:42:54
Alıntı yapılan: sifirzero - 18 Aralık 2022, 12:11:37mickro c de cok kolay olan iş. ccs c den daha zor anlamadım.ccs c hazir kod var ise frekans sayma paylaşabilirmisin
Count.c  hazır kodu ile 12f675'in istediğiniz bacağından frekans sayımı yapabilirsiniz.

// Count.c

#define BYTE_PTR(x) &(int8 *)(x)

#define COUNT_DELAY ((int16)(getenv("CLOCK") / 80000))

// ASM definitions
#define W  0
#define F  1

// Status Register Bits
#define Z  2
#define C  0

// Register addresses (16F)
#byte INDF   = 0x00
#byte STATUS = 0x03
#byte FSR    = 0x04

//---------------------------------------
int16 count(int8 ccs_pin, int16 period)
{
int8 const bitmask_table[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int8  io_port;
int8  bitmask;
int16 R0;
int16 R1;
int16 R2;
int16 R3;
int32 loop_count;

// These variables are used in the ASM code
// and must be located in the same RAM bank.
#locate R0      = 0x30
#locate R1      = 0x32
#locate R2      = 0x34
#locate R3      = 0x36
#locate io_port = 0x38 
#locate bitmask = 0x39

// Extract the Port address and bitmask from
// the CCS pin number.
io_port = ccs_pin >> 3;
bitmask = bitmask_table[ccs_pin & 7];

// Set the pin to be an input pin.
output_float(ccs_pin);

// Calculate the number of loop iterations to do.
loop_count = _mul(period, COUNT_DELAY);

// Put loop_count into R0 (msb), R2+1 (mid), R2 (lsb)
R0 = make8(loop_count, 2);  // msb
(int8)R2 = make8(loop_count, 1);  // Get mid into  R2
R2 <<= 8;  // Move mid into R2+1
(int8)R2 = make8(loop_count, 0); // lsb

#asm   
    movf    io_port, W         ; Get port
    movwf   FSR
    incf    R0, F              ; Bump up high and mid for dec
    incf    BYTE_PTR(R2) +1, F
    clrf    R1                 ; Zero counter
    clrf    BYTE_PTR(R1) +1
    movf    INDF, W            ; Read pin
    andwf   bitmask, W         ; Isolate it
    movwf   R3                 ; Save starting state as last

countloop:                     ; 20 usec loop (at 4 MHz)
    nop                        ; 1
    movf    INDF, W            ; 1 Read pin
    andwf   bitmask, W         ; 1 Isolate it
    movwf   BYTE_PTR(R3) +1    ; 1 Save state
    xorwf   R3, W              ; 1 Compare with last time
    andwf   BYTE_PTR(R3) +1, W ; 1 Only count high states
    xorwf   bitmask, W         ; 1 Flip for next test
    btfsc   STATUS, Z          ; 1 / 2
    incf    R1, F              ; 1 / 0 Count pulse
    btfsc   STATUS, Z          ; 1 / 2
    incf    BYTE_PTR(R1) +1, F ; 1 / 0
    movf    BYTE_PTR(R3) +1, W ; 1 Set new last state
    movwf   R3                 ; 1
    decf    R2, F              ; 1 Count time
    btfsc   STATUS, Z          ; 1 / 2
    decf    BYTE_PTR(R2) +1, F ; 1 / 0
    btfsc   STATUS, Z          ; 1 / 2
    decfsz  R0, F              ; 1 / 2
    goto    countloop          ; 2 / 0
    movf    R1, W              ; Result to W
#endasm

return(R1);  // R1 holds the result
}




Örnek kod şu şekilde.



#include <12F675.H>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc
#FUSES NOCPD //No EE protection
#FUSES PROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_A5)

#include "count.c"

//======================================
void main()
{
int16 result;

// Measure the number of counts in one second
// from the input signal on Pin B2.  This will
// be the frequency (in Hz) of that signal.
while(1)
  {
   result = count(PIN_A4, 1000);   // count period = 1000 ms
   printf("%lu \n\r", result); // 1 saniye aralıkla gelen frekansı A4 pininden oku ve yazdır.
  }

}
Başlık: Ynt: frekans uretimi
Gönderen: Mr.Thinking - 20 Aralık 2022, 11:04:44
PIC12F675 mikrodenetleyicisinin C dilinde kare dalga frekans üretme kodlarını aşağıdaki gibidir:

Öncelikle, PIC12F675 mikrodenetleyicisinin kare dalga üretme pinlerini ve frekansı ayarlamak için kullanılacak registerleri tanımlayın. Örneğin:
#include <xc.h>

#define _XTAL_FREQ 8000000
#define LED GP0

Daha sonra, kare dalga üretmek için TRIS registerını ayarlayın. Örneğin:
void main(void) {
TRISGP0 = 0; // GP0 pinini çıkış olarak ayarlayın

Ardından, kare dalga üretmek için T0CON registerını ayarlayın. Örneğin:
T0CON = 0b10000010; // Timer 0 modülünü açın ve prescaler ayarlayın

Son olarak, kare dalga üretmek için TMR0 registerını ayarlayın. Örneğin:
TMR0 = 0; // TMR0 registerını sıfırlayın
while(1) {
LED = 1; // LED'i açın
__delay_ms(500); // 500 milisaniye bekleyin
LED = 0; // LED'i kapatın
__delay_ms(500); // 500 milisaniye bekleyin
}
Bu şekilde, LED 500 milisaniye açık, 500 milisaniye kapalı olarak düzenli bir şekilde yanıp sönmeye devam edecektir. Bu yöntemle istediğiniz frekanslarda kare dalga üretebilirsiniz.

Dikkat etmeniz gereken nokta, __delay_ms() fonksiyonunun kullanımıdır. Bu fonksiyon, belirtilen milisaniye cinsinden bir süre bekletir. Örneğin, __delay_ms(500) fonksiyonu 500 milisaniye bekletir. Bu fonksiyonun kullanımı, CCS C derleyicisi tarafından desteklenmektedir.

Bu kodları kullanarak PIC12F675 mikrodenetleyicisinden kare dalga frekans üretebilirsiniz. Uygulama detaylarına göre kodları düzenleyerek istediğiniz özelliklerde kare dalga üretebilirsiniz.
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 20 Aralık 2022, 15:36:31
Teşekkurlee bilgiler icin. delay_us(25); ile high low yaparak 19khz urettim ama bunu. timer0 ile takibi galiba count.c paylasmis arkadas onunla yapabilirmiyim deneyim.
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 17 Ocak 2023, 22:59:24
#include <12F683.h>
#fuses hs,mclr,nowdt
#use delay(clock=20m)
#use rs232(baud=9600,parity=N,xmit=PIN_A0,bits=8,stream=PORT1)
int16 zaman=0,say=0,sayi=0;

#int_timer0
void kes()
{
set_timer0(255);
zaman++;

}

#int_timer1
void zam()
{
set_timer1(34290);
say++;

if(say == 20 )
{
say=0;
DISABLE_INTERRUPTS(int_timer0);

}
}


void main()
{

SETUP_TIMER_0(T0_EXT_H_TO_L | T0_DIV_1);
set_timer0(255);

SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8);
set_timer1(34290);


enable_interrupts(int_timer0);
enable_interrupts(int_timer1);



enable_interrupts (global);
while(true)
{
printf("\rFrekans : %lu \n",zaman);
}
}


Merhaba arkadaşlar konu dallanmasın diye buraya devam etmek istedim.
Bu kodlar bir defaya mahsus frekansı ölçüyor ama frekans değişince değişim yapmıyor. ilk ölçtüğü değeri veriyor.
Yardımcı olurmusunuz.
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 17 Ocak 2023, 23:08:32
Alıntı yapılan: zuzunin - 20 Aralık 2022, 10:42:54Count.c  hazır kodu ile 12f675'in istediğiniz bacağından frekans sayımı yapabilirsiniz.

// Count.c

#define BYTE_PTR(x) &(int8 *)(x)

#define COUNT_DELAY ((int16)(getenv("CLOCK") / 80000))

// ASM definitions
#define W  0
#define F  1

// Status Register Bits
#define Z  2
#define C  0

// Register addresses (16F)
#byte INDF   = 0x00
#byte STATUS = 0x03
#byte FSR    = 0x04

//---------------------------------------
int16 count(int8 ccs_pin, int16 period)
{
int8 const bitmask_table[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int8  io_port;
int8  bitmask;
int16 R0;
int16 R1;
int16 R2;
int16 R3;
int32 loop_count;

// These variables are used in the ASM code
// and must be located in the same RAM bank.
#locate R0      = 0x30
#locate R1      = 0x32
#locate R2      = 0x34
#locate R3      = 0x36
#locate io_port = 0x38 
#locate bitmask = 0x39

// Extract the Port address and bitmask from
// the CCS pin number.
io_port = ccs_pin >> 3;
bitmask = bitmask_table[ccs_pin & 7];

// Set the pin to be an input pin.
output_float(ccs_pin);

// Calculate the number of loop iterations to do.
loop_count = _mul(period, COUNT_DELAY);

// Put loop_count into R0 (msb), R2+1 (mid), R2 (lsb)
R0 = make8(loop_count, 2);  // msb
(int8)R2 = make8(loop_count, 1);  // Get mid into  R2
R2 <<= 8;  // Move mid into R2+1
(int8)R2 = make8(loop_count, 0); // lsb

#asm   
    movf    io_port, W         ; Get port
    movwf   FSR
    incf    R0, F              ; Bump up high and mid for dec
    incf    BYTE_PTR(R2) +1, F
    clrf    R1                 ; Zero counter
    clrf    BYTE_PTR(R1) +1
    movf    INDF, W            ; Read pin
    andwf   bitmask, W         ; Isolate it
    movwf   R3                 ; Save starting state as last

countloop:                     ; 20 usec loop (at 4 MHz)
    nop                        ; 1
    movf    INDF, W            ; 1 Read pin
    andwf   bitmask, W         ; 1 Isolate it
    movwf   BYTE_PTR(R3) +1    ; 1 Save state
    xorwf   R3, W              ; 1 Compare with last time
    andwf   BYTE_PTR(R3) +1, W ; 1 Only count high states
    xorwf   bitmask, W         ; 1 Flip for next test
    btfsc   STATUS, Z          ; 1 / 2
    incf    R1, F              ; 1 / 0 Count pulse
    btfsc   STATUS, Z          ; 1 / 2
    incf    BYTE_PTR(R1) +1, F ; 1 / 0
    movf    BYTE_PTR(R3) +1, W ; 1 Set new last state
    movwf   R3                 ; 1
    decf    R2, F              ; 1 Count time
    btfsc   STATUS, Z          ; 1 / 2
    decf    BYTE_PTR(R2) +1, F ; 1 / 0
    btfsc   STATUS, Z          ; 1 / 2
    decfsz  R0, F              ; 1 / 2
    goto    countloop          ; 2 / 0
    movf    R1, W              ; Result to W
#endasm

return(R1);  // R1 holds the result
}




Örnek kod şu şekilde.



#include <12F675.H>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc
#FUSES NOCPD //No EE protection
#FUSES PROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_A5)

#include "count.c"

//======================================
void main()
{
int16 result;

// Measure the number of counts in one second
// from the input signal on Pin B2.  This will
// be the frequency (in Hz) of that signal.
while(1)
  {
   result = count(PIN_A4, 1000);   // count period = 1000 ms
   printf("%lu \n\r", result); // 1 saniye aralıkla gelen frekansı A4 pininden oku ve yazdır.
  }

}


pin_a2 olarak değiştirebilirmiyiz.
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 19 Ocak 2023, 11:06:25
yardimci olabilecek arkadas var mi.
Başlık: Ynt: frekans uretimi
Gönderen: Mr.Thinking - 19 Ocak 2023, 16:34:01
Alıntı yapılan: sifirzero - 19 Ocak 2023, 11:06:25yardimci olabilecek arkadas var mi.
Yapay zekaya bir sor bakalım ne diyecek? Yazdığın kodu ona ver ve sorunu yaz. Belki bir çözüm bulur.
Başlık: Ynt: frekans uretimi
Gönderen: sifirzero - 20 Ocak 2023, 11:23:11
Alıntı yapılan: Mr.Thinking - 19 Ocak 2023, 16:34:01Yapay zekaya bir sor bakalım ne diyecek? Yazdığın kodu ona ver ve sorunu yaz. Belki bir çözüm bulur.
yapay zekaya soruyu direk sormustum.verdigi kodu denedim olmadi 😀