SERVO MOTOR timer 0 fonksiyonundaki cycle hesabı

aporeis123

Üye
Katılım
11 Eki 2017
Mesajlar
15
Puanları
1
Yaş
26
Öncelikle hepinize kolay gelsin.Serdar Çiçek in ccs c ile pic programlama kitabındaki r\c servomotor örneğini yapmak istedim.Ancak programda anlamadığım bir şey var. Timer 0 fonksiyonunun içini kitapta dediği kadarıyla asm kodlarından buluyor.Anladığım kadarıyla asm kodlarını 1 cycle 2 cycle diye topluyor ve diyor ki yaklaşık 37us oluyor.Bu us değerinide 4Mhz kristal kullandığı için 1us ile çarpın diyor bu cycle i .Sorun şu ki bu 37us nerden geliyor.Pek açık yazamadığım için kusurabakmayın.

/******************************************************
PIC16F877 İle R/C Servo Motor Uygulaması
******************************************/
#include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
// R/C Servo motor dönme açı değerleri
const int8 servo_derece_1[]={8,9,10,11,13,10,14,15,25,17,18};
const int8 servo_derece_2[]={18,17,16,15,14,13,12,11,10,9,8};
const int8 servo_derece_3[]={8,12,18,8,12,18,8,12,18,8,12};
int i=0,pwm=0,duty_0=0,duty_1=0,duty_2=0;
int16 zaman=0; // 16 bitlik değişken tanımlanıyor
#int_timer0 // Timer0 taşma kesmesi
void kesme ()
{
set_timer0(113); // TMR0 kaydedicisine 113 değeri yükleniyor
if (pwm==0) // Eğer PWM değişkeni 0 ise
{
output_high(pin_b0); // RB0 çıkışı lojik-1
output_high(pin_b1); // RB1 çıkışı lojik-1
output_high(pin_b2); // RB2 çıkışı lojik-1
}
if (pwm>=duty_0)// output_low(pin_b0);
if (pwm>=duty_1) output_low(pin_b1);
if (pwm>=duty_2) output_low(pin_b2);
zaman++; // zaman değişkenini 1 arttır
// Servo motor dönüş adımları arası bekleme süresi için
if (zaman>17350) // 17350x114,4µsn=1.984.840µsn, yaklaşık 2msn
{
zaman=0; // zaman değişkenini sıfırla
i++; // i değişkeni değerini 1 arttır
if(i==11) // Eğer i değeri 11 ise-Tüm adımlar bitti ise
i=0; // i değişkenini sıfırla
}
pwm++; // pwm değişkenini 1 arttır
if (pwm>=173) // pwm değeri 173'den büyük ise
pwm=0; // pwm değişkenini sıfırla
}
/********* ANA PROGRAM FONKSİYONU********/
void main ()
{
setup_psp(PSP_DISABLED); // PSP birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4); // Timer0 ayarları belirtiliyor
set_timer0(113); // TMR0 kaydedicisine 113 değeri yükleniyor
enable_interrupts(int_timer0); // Timer0 taşma kesmesi aktif
enable_interrupts(global); // Aktif edilen tüm kesmelere izin ver
output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor
while(1) // Sonsuz döngü
{
duty_0=servo_derece_1; // 1. R/C servo PWM görev saykılı
duty_1=servo_derece_2; // 2. R/C servo PWM görev saykılı
duty_2=servo_derece_3; // 3. R/C servo PWM görev saykılı
}
}
assembly kodları:
CCS PCM C Compiler, Version 5.007, 61971 16-Şub-18 14:11
Filename: C:\Users\Abdurrahman\Desktop\R_C Servo Motor Uygulaması\R_C Servo Motor Uygulaması.lst
ROM used: 221 words (3%)
Largest free fragment is 2048
RAM used: 19 (5%) at main() level
19 (5%) worst case
Stack used: 1 locations (0 in main + 1 for interrupts)
Stack size: 8
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 09F
0003: NOP
0004: MOVWF 7F
0005: SWAPF 03,W
0006: CLRF 03
0007: MOVWF 21
0008: MOVF 0A,W
0009: MOVWF 20
000A: CLRF 0A
000B: MOVF 04,W
000C: MOVWF 22
000D: MOVF 77,W
000E: MOVWF 23
000F: MOVF 78,W
0010: MOVWF 24
0011: MOVF 79,W
0012: MOVWF 25
0013: MOVF 7A,W
0014: MOVWF 26
0015: BCF 03.7
0016: BCF 03.5
0017: BTFSS 0B.5
0018: GOTO 01B
0019: BTFSC 0B.2
001A: GOTO 02C
001B: MOVF 22,W
001C: MOVWF 04
001D: MOVF 23,W
001E: MOVWF 77
001F: MOVF 24,W
0020: MOVWF 78
0021: MOVF 25,W
0022: MOVWF 79
0023: MOVF 26,W
0024: MOVWF 7A
0025: MOVF 20,W
0026: MOVWF 0A
0027: SWAPF 21,W
0028: MOVWF 03
0029: SWAPF 7F,F
002A: SWAPF 7F,W
002B: RETFIE
002C: BCF 0A.3
002D: BCF 0A.4
002E: GOTO 05C
.................... /******************************************************
.................... PIC16F877 İle R/C Servo Motor Uygulaması
.................... ******************************************/
.................... #include <16f877.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
.................... //////// Standard Header file for the PIC16F877 device ////////////////
.................... #device PIC16F877
002F: BCF 0A.0
0030: BCF 0A.1
0031: BCF 0A.2
0032: ADDWF 02,F
0033: RETLW F8
0034: RETLW F7
0035: RETLW 0A
0036: RETLW F5
0037: RETLW 0D
0038: RETLW 0A
0039: RETLW 0E
003A: RETLW 0F
003B: RETLW 19
003C: RETLW 11
003D: RETLW 12
003E: BCF 0A.0
003F: BCF 0A.1
0040: BCF 0A.2
0041: ADDWF 02,F
0042: RETLW 12
0043: RETLW 11
0044: RETLW 10
0045: RETLW 0F
0046: RETLW 0E
0047: RETLW 0D
0048: RETLW 0C
0049: RETLW 0B
004A: RETLW 0A
004B: RETLW 09
004C: RETLW 08
004D: BCF 0A.0
004E: BCF 0A.1
004F: BCF 0A.2
0050: ADDWF 02,F
0051: RETLW 08
0052: RETLW 0C
0053: RETLW 12
0054: RETLW 08
0055: RETLW 0C
0056: RETLW 12
0057: RETLW 08
0058: RETLW 0C
0059: RETLW 12
005A: RETLW 08
005B: RETLW 0C
....................
.................... #list
....................
....................
.................... #fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
....................
.................... #use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
....................
.................... // R/C Servo motor dönme açı değerleri
.................... const int8 servo_derece_1[]={-8,-9,10,-11,13,10,14,15,25,17,18};
.................... const int8 servo_derece_2[]={18,17,16,15,14,13,12,11,10,9,8};
.................... const int8 servo_derece_3[]={8,12,18,8,12,18,8,12,18,8,12};
....................
.................... int i=0,pwm=0,duty_0=0,duty_1=0,duty_2=0;
.................... int16 zaman=0; // 16 bitlik değişken tanımlanıyor
....................
.................... #int_timer0 // Timer0 taşma kesmesi
.................... void kesme ()
.................... {
.................... set_timer0(113); // TMR0 kaydedicisine 113 değeri yükleniyor
005C: MOVLW 71
005D: MOVWF 01
.................... if (pwm==0) // Eğer PWM değişkeni 0 ise
005E: MOVF 28,F
005F: BTFSS 03.2
0060: GOTO 06D
.................... {
.................... output_high(pin_b0); // RB0 çıkışı lojik-1
0061: BSF 03.5
0062: BCF 06.0
0063: BCF 03.5
0064: BSF 06.0
.................... output_high(pin_b1); // RB1 çıkışı lojik-1
0065: BSF 03.5
0066: BCF 06.1
0067: BCF 03.5
0068: BSF 06.1
.................... output_high(pin_b2); // RB2 çıkışı lojik-1
0069: BSF 03.5
006A: BCF 06.2
006B: BCF 03.5
006C: BSF 06.2
.................... }
....................
.................... if (pwm>=duty_0)// output_low(pin_b0);
006D: MOVF 29,W
006E: SUBWF 28,W
006F: BTFSS 03.0
0070: GOTO 079
.................... if (pwm>=duty_1) output_low(pin_b1);
0071: MOVF 2A,W
0072: SUBWF 28,W
0073: BTFSS 03.0
0074: GOTO 079
0075: BSF 03.5
0076: BCF 06.1
0077: BCF 03.5
0078: BCF 06.1
.................... if (pwm>=duty_2) output_low(pin_b2);
0079: MOVF 2B,W
007A: SUBWF 28,W
007B: BTFSS 03.0
007C: GOTO 081
007D: BSF 03.5
007E: BCF 06.2
007F: BCF 03.5
0080: BCF 06.2
....................
.................... zaman++; // zaman değişkenini 1 arttır
0081: INCF 2C,F
0082: BTFSC 03.2
0083: INCF 2D,F
....................
.................... // Servo motor dönüş adımları arası bekleme süresi için
.................... if (zaman>17350) // 17350x114,4µsn=1.984.840µsn, yaklaşık 2msn
0084: MOVF 2D,W
0085: SUBLW 42
0086: BTFSC 03.0
0087: GOTO 096
0088: XORLW FF
0089: BTFSS 03.2
008A: GOTO 08F
008B: MOVF 2C,W
008C: SUBLW C6
008D: BTFSC 03.0
008E: GOTO 096
.................... {
.................... zaman=0; // zaman değişkenini sıfırla
008F: CLRF 2D
0090: CLRF 2C
.................... i++; // i değişkeni değerini 1 arttır
0091: INCF 27,F
.................... if(i==11) // Eğer i değeri 11 ise-Tüm adımlar bitti ise
0092: MOVF 27,W
0093: SUBLW 0B
0094: BTFSC 03.2
.................... i=0; // i değişkenini sıfırla
0095: CLRF 27
.................... }
....................
.................... pwm++; // pwm değişkenini 1 arttır
0096: INCF 28,F
.................... if (pwm>=173) // pwm değeri 173'den büyük ise
0097: MOVF 28,W
0098: SUBLW AC
0099: BTFSS 03.0
.................... pwm=0; // pwm değişkenini sıfırla
009A: CLRF 28
009B: BCF 0B.2
009C: BCF 0A.3
009D: BCF 0A.4
009E: GOTO 01B
.................... }
....................
.................... /********* ANA PROGRAM FONKSİYONU********/
....................
.................... void main ()
009F: CLRF 27
00A0: CLRF 28
00A1: CLRF 29
00A2: CLRF 2A
00A3: CLRF 2B
00A4: CLRF 2D
00A5: CLRF 2C
00A6: BSF 03.5
00A7: BSF 1F.0
00A8: BSF 1F.1
00A9: BSF 1F.2
00AA: BCF 1F.3
00AB: BCF 03.7
00AC: MOVLW 1F
00AD: ANDWF 03,F
.................... {
.................... setup_psp(PSP_DISABLED); // PSP birimi devre dışı
00AE: BCF 09.4
.................... setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
00AF: BCF 03.5
00B0: CLRF 10
.................... setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
00B1: MOVLW 00
00B2: MOVWF 78
00B3: MOVWF 12
00B4: MOVLW 00
00B5: BSF 03.5
00B6: MOVWF 12
.................... setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
00B7: BSF 1F.0
00B8: BSF 1F.1
00B9: BSF 1F.2
00BA: BCF 1F.3
.................... setup_adc(ADC_OFF); // ADC birimi devre dışı
00BB: BCF 03.5
00BC: BCF 1F.0
.................... setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
00BD: MOVLW F0
00BE: ANDWF 17,F
.................... setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
00BF: ANDWF 1D,F
....................
....................
.................... setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4); // Timer0 ayarları belirtiliyor
00C0: BSF 03.5
00C1: MOVF 01,W
00C2: ANDLW C0
00C3: IORLW 01
00C4: MOVWF 01
.................... set_timer0(113); // TMR0 kaydedicisine 113 değeri yükleniyor
00C5: MOVLW 71
00C6: BCF 03.5
00C7: MOVWF 01
....................
.................... enable_interrupts(int_timer0); // Timer0 taşma kesmesi aktif
00C8: BSF 0B.5
.................... enable_interrupts(global); // Aktif edilen tüm kesmelere izin ver
00C9: MOVLW C0
00CA: IORWF 0B,F
....................
.................... output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor
00CB: BSF 03.5
00CC: CLRF 06
00CD: BCF 03.5
00CE: CLRF 06
....................
.................... while(1) // Sonsuz döngü
.................... {
.................... duty_0=servo_derece_1; // 1. R/C servo PWM görev saykılı
00CF: MOVF 27,W
00D0: CALL 02F
00D1: MOVWF 78
00D2: MOVWF 29
.................... duty_1=servo_derece_2; // 2. R/C servo PWM görev saykılı
00D3: MOVF 27,W
00D4: CALL 03E
00D5: MOVWF 78
00D6: MOVWF 2A
.................... duty_2=servo_derece_3; // 3. R/C servo PWM görev saykılı
00D7: MOVF 27,W
00D8: CALL 04D
00D9: MOVWF 78
00DA: MOVWF 2B
00DB: GOTO 0CF
.................... }
.................... }
00DC: SLEEP
Configuration Fuses:
Word 1: 3F3A HS NOWDT NOPUT NOBROWNOUT NOLVP NOCPD NOWRT NODEBUG NOPROTECT
 

Forum istatistikleri

Konular
128,162
Mesajlar
915,577
Kullanıcılar
449,921
Son üye
TursuBidonu

Yeni konular

Geri
Üst