merhaba arkadaşlar hayirli cumalar.
ccs c kullanarak pic12f675 den kare dalga frekans nasıl uretebiliriz. Yardimci olabilirmisiniz.
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);
}
12f675 pwm yok. ama mantıken olabilir. mikro c ile vermiş biz if icerisine yazcaz ki. o kesmeyi anlasın. tesekkurler
pic in 5. bacagini 2 birim olarak ayni anda kullanabilirmiyiz. timer0 ve comparator olarak.
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.
kardeşim timer0 ile zaman farkini nasil ölçebilirim.
Burası işinize yarar umarım.
https://sveerakumar.blogspot.com/2011/10/pic-timer-0-tutorial.html?m=1
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
CCS C bilmiyorum.
Eskiden foruma birsey yazildiginda hemen çözum bulunurdu. şimdi biraz yavaşlamıs gibi.. Teşekkurler
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.
}
}
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.
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.
#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.
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.
yardimci olabilecek arkadas var mi.
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.
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 😀