frekans uretimi

Başlatan sifirzero, 16 Aralık 2022, 08:52:17

sifirzero

merhaba arkadaşlar hayirli cumalar.
ccs c kullanarak pic12f675 den kare dalga frekans nasıl uretebiliriz. Yardimci olabilirmisiniz.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

yucatar

#1
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);
}

sifirzero

12f675 pwm yok. ama mantıken olabilir. mikro c ile vermiş biz if icerisine yazcaz ki. o kesmeyi anlasın. tesekkurler
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sifirzero

pic in 5. bacagini 2 birim olarak ayni anda kullanabilirmiyiz. timer0 ve comparator olarak.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

mehmet

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.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

sifirzero

kardeşim timer0 ile zaman farkini nasil ölçebilirim.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

sifirzero

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
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

mehmet

CCS C bilmiyorum.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

sifirzero

Eskiden foruma birsey yazildiginda hemen çözum bulunurdu. şimdi biraz yavaşlamıs gibi.. Teşekkurler
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

zuzunin

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. 
  } 

}

Mr.Thinking

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.
ego=1/Knowledge

sifirzero

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.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sifirzero

#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.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sifirzero

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.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir