Aşağıda vereceğim program parçası PIC16F628 de sorunsuz olarak çalışıyor. Ancak ilave edeceğim diğer uygulamalar nedeniyle ADC ve DAC kullanmam gerekiyor. Bu nedenle 16F1827 kullamaya başladım ama bunda da interrupt lile ilgili problemler var. PIC kendisi "Automatic Context Saving" özelliği nedeniye program kesmeye gittikten sonra düzgün çalışmıyor.
ne yapmam gerekir?
( Nokia 1100 ekran TEA 5767 FM radio modull ve PIC'li bir uygulama)
Config1 FOSC_INTOSC, MCLRe_On, WDTE_OFF, BOREN_OFF, PWRTE_OFF, CP_OFF, CLKOUTEN_OFF, FCMEN_OFF' dahili
Config2 LVP_OFF, PLLEN_On, WRT_OFF , STVREN_OFF
Device = 16F1827
Xtal = 4
ANSELA=%00000000
ANSELB=%00000000
TRISB = %00000001
TRISA = %11110101
OSCCON=%11101100
WPUB=%11111111
All_Digital = TRUE ' TÜM PORTLAR DIGITAL
' Kumanda SİSTEM SEC PORTA.2-<1> P <18>- PORTA.1 --> SDA_Pin TEA5767
' Kumanda SINYAL LED PORTA.3-<2> I <17>- PORTA.0 --> SCL_Pin TEA5767
' PORTA.4-<3> C <16>- PORTA.7 --> BUTON1 Yukarı
' MCLR- PORTA.5-<4> 1 <15>- PORTA.6 --> BUTON2 Aşağı
' GND -<5> 6 <14>- Vcc
' IR PIN PORTB.0-<6> F <13>- PORTB.7 --> BUTON3 Tamam/Kayıt
' N1100 sdin PORTB.1-<7> 1 <12>- PORTB.6 --> stereo LED
' N1100 SCLK PORTB.2-<8> 8 <11>- PORTB.5 --> istasyon LED
' N1100 CS PORTB.3-<9> 2 <10>- PORTB.4 --> PORTB.4 --> 1100 rst
' 7
' GND 1- | |
' Vcc-- 100 Ohm--- V+ 2- |-|TSOPXX |
' | |
' Vcc-- 10K --- Out 3- | |
' |-100 nF-- GND
Symbol sclk =LATB.2 'clock
Symbol cs =LATB.3 'chip select
Symbol sdin =LATB.1
Symbol rst =PORTB.4 'reset 1100 '
' data gönderiminde önce cs=0, data için sdin=1 ve 8 bit data gönderilir
' komut gönderiminde önce cs=0, komut için sdin=0 ve 8 bit data gönderilir
Symbol SDA = PORTA.1 'SDA pin
Symbol SCL =PORTA.0 'SCL pin
SDA_Pin = PORTA.1 'SDA pin
SCL_Pin =PORTA.0 'SCL pin
Symbol BUTON1 = PORTA.7 'Yukarı
Symbol BUTON2 =PORTA.6 'aşağı
Symbol BUTON3 = PORTB.7 'Tamam/Kayıt
Symbol LED =PORTB.6 'stereo LED
Symbol LED2 =PORTB.5 'istasyon LED
Symbol tea5767 = %11000000
Symbol tea5767R = %11000001
Dim Frekans As Dword
Dim Frek As Word
'Dim Frekans0 As Word 'Dword toplamada Word ve Byte toplam işlemi hata veriyor
Dim FrekansR As Dword'bu nedenle Frekans0 değişkeni için doğrudan atama yapıldı
Dim FrekR As Word
Dim Pll As Dword
Dim adval As Byte
Dim advaly As Byte
Dim data_yaz[5] As Byte
Dim data_oku[5] As Byte
Dim stereo As Byte
Dim Pll_R As Dword
Dim veri As Byte
Dim dta As Byte
Dim m As Byte
Dim i As Byte
Dim istasyon As Byte
Dim ses As Byte
Sonyin_Pin PORTB.0
RC5In_Pin PORTB.0
Dim IR_Data As Word
Dim SYS_Data As IR_Data.HighByte
Dim COM_Data As IR_Data.LowByte
Dim sistem As Byte
Dim timtim As Word
Dim sinyal As Byte
Dim hane0 As Byte
Dim hane1 As Byte
Dim hane2 As Byte
Dim hane3 As Byte
Dim hane4 As Byte
Dim hane5 As Byte
Dim k As Byte
Dim LcdReg As Byte
Dim x As Byte
Dim y As Byte
Dim a As Byte
Dim PosX As Byte
Dim PosY As Byte
Dim Chr As Byte
Dim LcdData As Byte
Dim Offset As Byte
Dim Char As Byte
Dim ChrData As Byte
Dim dBit As Byte
Dim Lcdmon As Byte
Dim kver As Word
Dim r As Byte
Dim tm As Byte
Dim kyt As Byte
Dim kyt2 As Byte
Dim arti As Byte
Dim eksi As Byte
Dim hane_x As Word
Dim advalm As Byte
On_Hardware_Interrupt GoTo uyar
GoTo aa
uyar: 'kesme programı
Context Save
INTCON.7=0 ' Global interrupt disable
INTCON.4=0
If INTCON.1=1 Then sinyal=1 :PORTA.3=1
If PIR1.1=1 Then tm=tm+1
INTCON.1=0 ' RB0 Kesme bayrağı sıfırlanıyor
PIR1.1=0 ' TMR1 Kesme bayrağı sıfırlanıyor
'PORTA.3=0
Context Restore
aa:
GoSub LCD_Init ' LCD hazırlanması
DelayUS 100
'============================ TEST ========================================
GoSub Test1
'Frekans0 = 870 ; 87,0fm başlangıç frekansı
advaly=123 ' başlangıç değeri
arti=0
eksi=0
advalm=advaly
main:
While 1=1
While adval=advaly
OPTION_REG.6=0 'düşen kenar tetik
INTCON=%10010000 'Genel Interrupt açık RB0 Enable
If BUTON1=0 Then advalm=advalm+1
If BUTON2=0 Then advalm=advalm-1
'
advaly=advalm+arti ' bu satır çalışmıyor veya başka birşeyler oluyor ve sonuç alınmıyor
advaly=advalm-eksi
arti=0
eksi=0
advalm=advaly
If advalm>254 Then advalm=254
If advalm<1 Then advalm=1
If sinyal=1 Then
PORTA.3=1
If PORTA.2=0 Then GoSub SONY
If PORTA.2=1 Then GoSub RC5
sinyal=0
If COM_Data=16 Then arti=1
If COM_Data=17 Then eksi=1
If COM_Data<10 Then
kver=0
T1CON.0=0
TMR1L=0
TMR1H=0
tm=0
T1CON=%00110001 'TMR1 SAYACI AYARLANIYOR FOSC/4 YUKSELEN KENAR 1/8
If COM_Data=1 Then
kver= 1000 '100 MHz ve üzeri için ilk basamak
GoSub while_x 'STCK=4
EndIf
Frek=kver
GoSub Goster1
kver= Kver+COM_Data*100 '100 MHz altı ilk basamak
Frek=kver
GoSub Goster1
GoSub while_x
frekans_oku2:
kver= Kver+COM_Data*10 '100 MHz altı ikinci basamak
Frek=kver
GoSub Goster1
GoSub while_x
kver= Kver+COM_Data 'ondalık basamak
Frek=kver
GoSub Goster1
T1CON.0=0
advalm=kver-870
EndIf
If COM_Data>19 Then GoSub yonlendir ' 20 katı belirlenmiş
DelayMS 200
PORTA.3=0
EndIf
Wend
' adval=advalm
'If adval=advaly Then main
INTCON.7=0 ' Genel interrupt kapalı
INTCON.4=0 ' RB0 Interrupt kapalı
GoSub progtea5767
GoSub LCD_Clear
GoSub Goster
GoSub Sgoster
GoSub kumandag
If stereo.7=1 Then
GoSub stereo1
EndIf
If istasyon.7=1 Then
LED2=1
Else LED2=0
EndIf
DelayMS 10
'GoTo main
Wend
sonrasında alt programlar var... çok uzun
NOt:ISIS te problemsiz çalışıyor. gerçek devrede problem var