ISD1760 seri iletişim Pic mi kitleniyor acaba

Başlatan fryrmnd, 27 Haziran 2011, 20:34:19

fryrmnd

Merhaba arkadaşlar gene ben. Fazla uzatmadan direk dalayım isterseniz. ISD 1760 için internetten bulduğum kodu biraz değiştirip entegreye 10 kayıt yaptırmak istedim. Her bir kayıttan sonra yaptığım aynı kaydı dinlemek istedim. Programı başlatıyorum bazen 1. mesaj çalmaya geçince bazen 5. mesajı bazen 9. mesaj yani anlayacağınız nerde takılcağı belli olmuyorBirkaç kez de 1 turu tamamladı yani . Acaba  watchdog timer ile ilgi bir sorunmudur. Kayıt kısmında  lcdye "1. mesaj" yazıyor,kayıttan sonra çalmaya geçince "1. mesaj play"  yazıyor. Sürekli play kısmında taklıp kalıyor lcd(yani galiba pic). Çalıştığım yerde beti nin (easypic di sanırım kusura bakmayın araçların isimlerini ezberlememe gibi bir hastalığım var, takıyom programlıyo ya hani) geliştirme kartı var. Sigorta ayarlarını orda ne varsa öyle kullanıyom sadece XT kristal ayarlımı diye bakıyorum genelde.Acaba WDT den mi olabilir. Biraz aradım forumuda.Bazı arkadaşlar flash memory kısmında da bozulma olabilir gibisinde ifadeler yazmış.Programın yüklendiği kısım sanırım flash memory dimi. http://portal.knowledgebase.net/display/2n/articleDirect/index.asp?aid=87183&r=0.926388 linkte de bu sıkıntı için alınabilecek önlemlerden bahsetmiş sanırım.  Böyle  bir sıkıntı da olabilirmi.Birkaç pici ufak program değişikliği yapıp denedim gene aynı sıkıntı.Picim 16F877A. Kod da aşağıda.Arkadaşlar lütefen yardım edin.Sona geldim gibi hissediyom:Hepbir sıkıntı hepbir sıkıntı.Teşekkürler
DEFINE LCD_DREG      PORTD   
DEFINE LCD_DBIT         4      
DEFINE LCD_EREG      PORTD   
DEFINE LCD_EBIT         3      
DEFINE LCD_RSREG   PORTD   
DEFINE LCD_RSBIT      2            
DEFINE LCD_BITS         4   
DEFINE LCD_LINES      2

ADCON1=7
CMCON=7


temp_bit    VAR BIT

temp      VAR BYTE
spi_cnt                 var byte   ' counter for SPI transfer
bSPI       var byte    ' the byte being transferred on SPI

s_addr      VAR WORD   ' Start Address
e_addr      VAR WORD   ' End Address

ISD_Data    var byte[7]   ' This array contains data to/from ISD

SR0a       var ISD_Data[0]
SR0b       var ISD_Data[1]
SR1       var ISD_Data[2]    ' only valid after ReadStatus

isCmdErr    var SR0a.0                ' 1=previous command failed/ignored
isFull       var SR0a.1   ' 1=memory full
isPU      var SR0a.2   ' 1=ISD powered up
isEOM      VAR SR0a.3   ' 1=EOM detected (clear by CLR_INT command)
isINT       var SR0a.4   ' 1=current operation completed (clear by CLR_INT command)

isReady    var SR1.0   ' 1=Ready to receive SPI command (only valid after ReadStatus)
                    ' Some SPI commands can still be sent when isReady=0
                   
                   
Symbol ss      = PORTC.3         'ISD1760 SLAVE SELECT 
Symbol sclk      = PORTC.4         'ISD1760 SPI CLOCK
Symbol mosi    = PORTC.5            'ISD1760 SPI MOSI
Symbol miso      = PORTC.6         'ISD1760 SPI MISO




TRISD=0
TRISA=0            ' port a ilk 4 bacak butonlar
TRISB=0
TRISC=%01000000
TRISE=0
PORTD=0
PORTA=0
PORTB=0
PORTE=0

HIGH ss         'start with Slave Select HIGH
   HIGH sclk      'start with SPI Clock HIGH
   LOW MOSI      'start with MOSI LOW

PAUSE 300
LCDOUT $FE,1

BASLA:


   LCDOUT $FE,$80,"ACILIYO"
   GOSUB isd_pu
   pause 50
   gosub isd_wait_rdy    'komut almaya hazırmı
   GOSUB isd_clr_int
   
   GOSUB isd_g_erase
   LCDOUT $FE,1
   LCDOUT $FE,$80,"G ERASE"
   PAUSE 500
   GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
   
   GOSUB isd_wr_apc   'APC YE VOL 3  VEYA 4 VER
   LCDOUT $FE,1
   LCDOUT $FE,$80,"VOL AYARI"
   PAUSE 500
   GOSUB isd_wait_rdy
   GOSUB isd_clr_int
   
   
       s_addr=$010
       e_adDr=$041 
       GOSUB isd_set_rec
       LCDOUT $FE,1
       LCDOUT $FE,$80,"1. MSJ"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
       
       
       
       s_addr=$010
       e_adDr=$041       
       GOSUB isd_set_play
       LCDOUT $FE,1
       LCDOUT $FE,$80,"1. MSJ PLAY"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
       
       
       s_addr=$042
       e_addr=$073
       GOSUB isd_set_rec
       LCDOUT $FE,1
       LCDOUT $FE,$80,"2. MSJ"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
       
       

       s_addr=$042
       e_addr=$073
       GOSUB isd_set_play
       LCDOUT $FE,1
       LCDOUT $FE,$80,"2. MSJ PLAY"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy


       s_addr=$074
       e_addr=$0A5
       GOSUB isd_set_rec
       LCDOUT $FE,1
       LCDOUT $FE,$80,"3. MSJ"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy


       s_addr=$074
       e_addr=$0A5
       GOSUB isd_set_play
       LCDOUT $FE,1
       LCDOUT $FE,$80,"3. MSJ PLAY"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy


       s_addr=$0A6
       e_addr=$0D7
       GOSUB isd_set_rec
       LCDOUT $FE,1
       LCDOUT $FE,$80,"4. MSJ"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy


       s_addr=$0A6
       e_addr=$0D7
       GOSUB isd_set_play
       LCDOUT $FE,1
       LCDOUT $FE,$80,"4. MSJ PLAY"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
       
       
       s_addr=$0D8
       e_addr=$109
       GOSUB isd_set_rec
       LCDOUT $FE,1
       LCDOUT $FE,$80,"5. MSJ"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
       

       s_addr=$0D8
       e_addr=$109
       GOSUB isd_set_play
       LCDOUT $FE,1
       LCDOUT $FE,$80,"5. MSJ PLAY"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy


       s_addr=$10A
       e_addr=$13B
       GOSUB isd_set_rec
       LCDOUT $FE,1
       LCDOUT $FE,$80,"6. MSJ"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy


       s_addr=$10A
       e_addr=$13B
       GOSUB isd_set_play
       LCDOUT $FE,1
       LCDOUT $FE,$80,"6. MSJ PLAY"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
   
   
   
       s_addr=$13C
       e_addr=$16D
       GOSUB isd_set_rec
       LCDOUT $FE,1
       LCDOUT $FE,$80,"7. MSJ"
       PAUSE 5000
      GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
       
       
   
       s_addr=$13C
       e_addr=$16D
       GOSUB isd_set_play
       LCDOUT $FE,1
       LCDOUT $FE,$80,"7. MSJ PLAY"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
       
       
       s_addr=$16E
       e_addr=$19F
       GOSUB isd_set_rec
       LCDOUT $FE,1
       LCDOUT $FE,$80,"8. MSJ"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
       
       

       s_addr=$16E
       e_addr=$19F
       GOSUB isd_set_play
       LCDOUT $FE,1
       LCDOUT $FE,$80,"8. MSJ PLAY"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
 
 
       s_addr=$1A0
       e_addr=$1D1
       GOSUB isd_set_rec
       LCDOUT $FE,1
       LCDOUT $FE,$80,"9. MSJ"
       PAUSE 5000
      GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
 
 
 
       s_addr=$1A0
       e_addr=$1D1
       GOSUB isd_set_play
       LCDOUT $FE,1
       LCDOUT $FE,$80,"9. MSJ PLAY"
       PAUSE 5000
       GOSUB isd_wait_int
      GOSUB isd_clr_int
      GOSUB isd_wait_rdy
       
     
       
       
       GOSUB isd_pd
       
       GOTO BASLA
       
       
          isd_pu:            
      LOW ss
   
      bSPI=%00010001      'Power Up Command
      GoSub isd_spi
      ISD_Data[0] = bSPI    'SR0a
   
      bSPI=$00
      GoSub isd_spi
      ISD_Data[1] = bSPI    'SR0b
   
      HIGH ss
   
      RETURN
   
   
isd_set_play:
   LOW ss

   bSPI = %10010000      'Set Play Command (7 bytes)
   GoSub isd_spi
   ISD_Data[0] = bSPI   'SR0a

   bSPI = $00
   GoSub isd_spi
   ISD_Data[1] = bSPI    'SR0b

   bSPI = s_addr.LowByte    ' Start Address low byte.
   GoSub isd_spi
   ISD_Data[2] = bSPI   'SR0a

   bSPI = s_addr.HighByte    ' Start Address high byte
   GoSub isd_spi
   ISD_Data[3] = bSPI    'SR0b

   bSPI = e_addr.LowByte    ' End Address low byte
   GoSub isd_spi
   ISD_Data[4] = bSPI    'SR0a

   bSPI = e_addr.HighByte    ' End Address high byte
   GoSub isd_spi
   ISD_Data[5] = bSPI    'SR0b

   bSPI = $00      ' Reserved Address - set to "0"
   GoSub isd_spi
   ISD_Data[6] = bSPI    'SR0a

   HIGH ss

   RETURN
   
   isd_set_rec:
      LOW ss
   
      bSPI = %10010001                 'Set Record Command (7 bytes)
      GoSub isd_spi
      ISD_Data[0] = bSPI          'SR0a
   
      bSPI = $00
      GoSub isd_spi
      ISD_Data[1] = bSPI           'SR0b
   
      bSPI = s_addr.LowByte       'Start Address low byte.
      GoSub isd_spi
      ISD_Data[2] = bSPI          'SR0a
   
      bSPI = s_addr.HighByte       'Start Address high byte
      GoSub isd_spi
      ISD_Data[3] = bSPI           'SR0b
   
      bSPI = e_addr.LowByte       'End Address low byte
      GoSub isd_spi
      ISD_Data[4] = bSPI           'SR0a
   
      bSPI = e_addr.HighByte       'End Address high byte
      GoSub isd_spi
      ISD_Data[5] = bSPI           'SR0b
   
      bSPI = $00                 'Reserved Address - set to "0"
      GoSub isd_spi
      ISD_Data[6] = bSPI           'SR0a
   
      HIGH ss
   
      RETURN
   

   isd_Set_Erase:
      LOW ss
   
      bSPI = %10010010                 'Set Erase Command (7 bytes)
      GoSub isd_spi
      ISD_Data[0] = bSPI           'SR0a
   
      bSPI = $00
      GoSub isd_spi
      ISD_Data[1] = bSPI           'SR0b
   
      bSPI = s_addr.LowByte       'Start Address low byte.
      GoSub isd_spi
      ISD_Data[2] = bSPI          'SR0a
   
      bSPI = s_addr.HighByte       'Start Address high byte
      GoSub isd_spi
      ISD_Data[3] = bSPI           'SR0b
   
      bSPI = e_addr.LowByte       'End Address low byte
      GoSub isd_spi
      ISD_Data[4] = bSPI           'SR0a
   
      bSPI = e_addr.HighByte       'End Address high byte
      GoSub isd_spi
      ISD_Data[5] = bSPI           'SR0b
   
      bSPI = $00                 'Reserved Address - set to "0"
      GoSub isd_spi
      ISD_Data[6] = bSPI           'SR0a
   
      HIGH ss
   
      RETURN   
   
isd_stop:               ' Stop Immediately  interrupt oluşur temizlemeyi unutma
   LOW ss                  'erase,G_erase ve set_erase esnasında gelirse cmd_err=0 olur hata verir uyarı ver

   bSPI=$02      'Stop Command
   gosub isd_spi
   ISD_DATA[0]=BSPI
   

   bSPI=$00
   gosub isd_spi
   ISD_DATA[1]=BSPI
   

   HIGH ss

RETURN   

isd_rd_dvcid:
  low ss
 
  bSPI=$09
  gosub isd_spi
  ISD_DATA[0]=bSPI

  bSPI=$00
  gosub isd_spi
  ISD_DATA[1]=bSPI

  bspi=$00
  gosub isd_spi
  ISD_Data[4]=bspi   'device ıd

high ss   

return
   
isd_rd_status:            'read status of ISD1700
   LOW ss

   bSPI=%00010101      'Read Status Command  HEX 5
   gosub isd_spi
   ISD_DATA[0] = bSPI   'SR0a

   bSPI=$00
   gosub isd_spi
   ISD_DATA[1]= bSPI   'SR0b

   bSPI=$00
   gosub isd_spi
   ISD_DATA[2] = bSPI   'SR1

   HIGH ss

   RETURN
   
   
   isd_clr_int:               ' CLEAR INTERRUPT AND EOM BITS
      LOW SS
      
      bSPI=%00010100                  'Clear Interrupt Command
      gosub isd_spi
      ISD_Data[0] = bSPI            'SR0a
   
      bSPI=$00
      gosub isd_spi
      ISD_Data[1] = bSPI            'SR0b
   
      HIGH SS
   
      RETURN   
   
isd_wait_rdy:
    gosub isd_rd_status
    if isready=0 then isd_wait_rdy
   
return   
         
isd_wait_int:
   GOSUB isd_rd_status
   IF isINT=0 THEN isd_wait_int

   RETURN           

isd_spi:                    ' shift SPI data out and into SPI byte
   FOR spi_cnt = 0 to 7        '
      MOSI = bSPI.0           ' shift LSB of byte onto MOSI line
      LOW SCLK               ' clock MISO data out to uC (Falling Edge)
      temp_bit = miso         '
      HIGH SCLK              ' clock MOSI into ISD1700 (Rising Edge)
      bSPI = bSPI >> 1       ' shift SPI byte Right
      bSPI.7 = temp_bit
   NEXT spi_cnt

   RETURN
   
end

isd_pd:               ' Stop Immediately
   LOW ss

   bSPI=%00010111  'Power Down Command   HEX 7
   gosub isd_spi
   ISD_Data[0] = bSPI    'SR0a

   bSPI=$00
   gosub isd_spi
   ISD_Data[1] = bSPI    'SR0b

   HIGH ss

   RETURN

isd_g_erase:
    LOW SS
   
    BSPI=%01010011      'DEC 67 HEX 43
    GOSUB ISD_SPI
    ISD_DATA[0]=BSPI
   
    BSPI=$00
    GOSUB ISD_SPI
    ISD_DATA[1]=BSPI
   
    HIGH SS
   
   
RETURN   




isd_wr_apc:         'Write to APC Register using bits D2:D0 to set Volume
   LOW ss

   bSPI = %01110100      'Write APC2
   GoSub isd_spi
   ISD_Data[0] = bSPI    'SR0a

   bSPI = %01000011   'Volume set by D2:D0 (000=Max)
            'Output set by D7 (0=Aud, 1=Aux)
   GoSub isd_spi
   ISD_Data[1] = bSPI    'SR0b
               
   bSPI = %00000100    'PWM Speaker Output D8 (0=Enable, 1=Disable)
            
   GoSub isd_spi
   ISD_Data[2] = bSPI    'SR0a

   HIGH ss

   RETURN
   
   
   isd_rd_apc:
    LOW SS
   
    BSPI=%01010100
    GoSub isd_spi
    ISD_Data[0] = bSPI    'SR0a
      
      bSPI=$00
      gosub isd_spi
      ISD_DATA[1]=bSPI

     bspi=$00
     gosub isd_spi
     ISD_Data[4]=bspi   'device ıd
   
      bSPI=$00
      gosub isd_spi
      ISD_DATA[5]=bSPI
     
      HIGH SS
   
   
   
   
   RETURN


Hayırlı akşamlar arkadaşlar. Bu tip bir problem için tavsiyesi olabilecek yok mu. Isd 1760 için değil de ne bileyim 2 pic arası için benzer bir problem yaşamış olan mesala . Birden kitlenip kalıveriyor.Birkaç 16F877a denedim gene aynı. Tıkanınca ISD1760 a dışardan buton bacağından müdahale ediyorum çalıyor. Yani pic kitleniyora benziyo.WDT da on yaptım gene yok.

erbek34

Merhaba,
Ana döngüde kayıt yapıp okuduğun bölümlerde  ısd stop alt programını çağırman gerekiyor sanırım.ısd'ye görevin bittiğini bildirmeden
yeni bir komut vermişsin.

fryrmnd

hocam sağol konuyu çözdüm iyi kötü. kayıtlardan sonra zaten 5 sn lik bekleme yapıyordum. bu da stop kullanmadan devam edebilmemi sağılıyor.