PIC16F1827 ve interrupt

Başlatan ferit06, 02 Ocak 2014, 16:48:32

ferit06

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