Здравейте, нов съм във форума

От извесно време се опитвам да направя програма за ISD4003. Изчетох доста из нета разгледах добре даташейта и на ISD-то и на PIC-а. Опитвам се да симулирам програмата оято написъх със Протеус но определено не се получава искам да попитам дали някой се е занимавал с подобна схема и ако може малко помощ. Ето това което аз написах и само да добавя времевите интервали не са по даташейта 25 и 50мс направил съм ги само за проба както и командата за СТОП също е за проба и не отговаря на изискванията.
list p=16F877A
include"P16F877A.INC"
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;********************* Дефиниране на константи и променливи **************************
W EQU 0
f EQU 1
CBLOCK 0x20 ;0 RAM starts at address 20h
Counter
Counter1
ENDC
;--------------------- Дефиниране на входно-изходните портове ------------------------
#define SCK PORTC,3 ;Изход Тактова честота
#define SDI PORTC,4 ;SDI за SPI
#define SDO PORTC,5 ;SDO за SPI
#define SS PORTA,5 ;SS за SPI
#define REC PORTB,0 ;Бутон за запис
#define PLAY PORTB,1 ;Бутон за възпроизвеждане
#define STOP PORTB,2 ;Бутон за стоп
#define SV_REC PORTB,3 ;Светодиод за запис
#define SV_PLAY PORTB,4 ;Светодиод за възпроизвеждане
#define SV_STOP PORTB,5 ;Светодиод за стоп
;*************************************************************************************
; Потребителска програма
;*************************************************************************************
ORG 0x0000 ;start address = 0000h
goto start
;*************************************************************************************
; Начало на програмата
;*************************************************************************************
start
bcf STATUS,RP1 ;Избор на Банка 1
bsf STATUS,RP0
movlw B'10010110' ;Нулиране на 7 бит от регистър OPTION_REG-
movwf OPTION_REG ;разрешава включване на PULL-UP резистори
bcf STATUS,RP1
bcf STATUS,RP0 ;Избор на Банка 0
clrf PORTA ;Нулиране на PORTA
clrf PORTB ;Нулиране на PORTB
clrf PORTC ;Нулиране на PORTC
bcf STATUS,RP1 ;Избор на Банка 1
bsf STATUS,RP0
MOVLW 0x06
MOVWF ADCON1 ;Настроиване на изходите само като цифрови
movlw b'11011111' ;
movwf TRISA ;RA0-RA4-Входове,RA5-Изход за SS(SLAVE Select)
movlw B'00000111'
movwf TRISB ;RB0-RB2-Входове,RB3-RB7-Изход
bcf TRISC,3 ;SCK изводи на SPI.
bsf TRISC,4 ;SDI
bcf TRISC,5 ;SDO
MOVLW B'11000000'
MOVWF SSPSTAT ;инициализация на СПИ
bcf STATUS,RP1
bcf STATUS,RP0 ;Избор на Банка 0
MOVLW B'00100001'
MOVWF SSPCON ;инициализация на СПИ
goto main
;*************************************************************************************
; Използвани подпрограми
;*************************************************************************************
;--------------- Подпрограма "Wait_Tpud" формира времезадръжка от Xms --------------------
Wait_Tpud
movlw D'10' ;Задава времето
movwf Counter ;
clrf TMR0 ;Нулира TMR0
again ;Изпълни цикъла отново
bcf INTCON,T0IF ;Нулира бит T0IF
loop
btfss INTCON,T0IF ;Бит T0IF=1
goto loop ;Не,повтори отново
decfsz Counter,f ;
goto again ;Изпълни цикъла отново
return ;Връща към главна програма докадето е прекратена
;*************************************************************************************
;--------------- Подпрограма "Wait" формира времезадръжка от Xms --------------------
Wait
movlw D'7' ;Задава времето
movwf Counter ;
clrf TMR0 ;Нулира TMR0
again1 ;Изпълни цикъла отново
bcf INTCON,T0IF ;Нулира бит T0IF
loop1
btfss INTCON,T0IF ;Бит T0IF=1
goto loop1 ;Не,повтори отново
decfsz Counter,f ;
goto again1 ;Изпълни цикъла отново
return ;Връща към главна програма докадето е прекратена
;*************************************************************************************
; Главна програма
;*************************************************************************************
main
movlw B'11111111' ;
movwf PORTB
bsf SS ;Забрана на SS(PORTA,0)
check_butons
btfss PLAY ;Провери PORTB,1 задействаи при 0
goto play1 ;Да,започни възпроизвеждане
btfss REC ;Провери PORTB,0 задействаи при 0
goto rec1 ;Да,започни записа
btfss STOP ;Провери PORTB,2 задействаи при 0
goto stop1 ;Да,спри
goto check_butons ;Започни сканирането отначало
play1
call Wait ;Елиминира смущения
play_again1
btfsc PLAY ;Още ли има сигнал?
goto check_butons ;Не, връщане към предходна проверка
bcf SS ;Да, избери и разреши SLAVE
movlw B'00100000' ;Зареди код за POWERUP(00100000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
call Wait_Tpud ;Извикване на подпрограма Wait_Tpud времезадръжка
movlw B'11100000' ;Зареди код за SETPLAY(11100000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
movlw B'11110000' ;Зареди код за PLAY(11100000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
movlw B'11101111' ;Светни SV_PLAY индикация за начало на възпроизвеждането
movwf PORTB
goto main ;Отиди на main
rec1
call Wait ;Елиминира смущения
rec_again1
btfsc REC ;Още ли има сигнал?
goto check_butons ;Не, връщане към предходна проверка
bcf SS ;Да, избери и разреши SLAVE
movlw B'00100000' ;Зареди код за POWERUP(00100000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
call Wait_Tpud ;Извикване на подпрограма Wait_Tpud времезадръжка
movlw B'00100000' ;Зареди код за POWERUP(00100000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
call Wait_Tpud ;Извикване на подпрограма Wait_Tpud времезадръжка
call Wait_Tpud ;Извикване на подпрограма Wait_Tpud времезадръжка
movlw B'10100000' ;Зареди код за SETREC(10100000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
movlw B'10110000' ;Зареди код за REC(10110000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
movlw B'11011111' ;Светни SV_REC индикация за начало на записа
movwf PORTB
goto main ;Отиди на main
stop1
call Wait ;Елиминира смущения
stop_again1
btfsc STOP ;Още ли има сигнал?
goto check_butons ;Не, връщане към предходна проверка
bcf SS ;Да, избери и разреши SLAVE
movlw B'00100000' ;Зареди код за POWERUP(00100000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
call Wait_Tpud ;Извикване на подпрограма Wait_Tpud времезадръжка
movlw B'11100000' ;Зареди код за SETPLAY(11100000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
movlw B'11110000' ;Зареди код за PLAY(11100000)в работния регистър W
movwf SSPBUF ;Взима дани от работния регистър W и ги зареди в регистър SSPBUF
BANKSEL SSPSTAT ;Избор на Банка 1
call Char1 ;Извикване на подпрограма Char1 за проверка на бит BF
movlw B'11101111' ;Светни SV_PLAY индикация за начало на възпроизвеждането
movwf PORTB
goto main ;Отиди на main
;----------------------------------------------------------------------------------------
Char1
btfss SSPSTAT,BF ;трансфера на дани приключил ли е? (Buffer пълен ли е ?)
goto Char1 ;ако не, провери отново
BANKSEL SSPBUF ;Да, избор на Банка 0
movf SSPBUF,W ;прочети регистър SSPBUF
return
END