; ; +++++++++++++++++ DATEINAME: J:\MPLAB\PIC16F84-ISD1016.ASM ; ; PIC16F84 ; ____________________ ; ISD1016 A3 -|1 RA2 RA1 18|- ISD1016 A0 ; ISD1016 A2 -|2 RA3 RA0 17|- ISD1016 A1 ; frei oder Taster-|3 RA4 16|- XT oscillator 2MHz (nicht kritisch) ; R=10K to VDD-|4 MCLR 15|- XT oscillator ; VSS-|5 14|- VDD(+5V) ; ISD1016 A4 -|6 RB0 RB7 13|- frei oder Taster ; ISD1016 A5 -|7 RB1 RB6 12|- ISD1016 end (EOM) ; ISD1016 A6 -|8 RB2 RB5 11|- ISD1016 start (CE) ; ISD1016 A7 -|9 RB3 RB4 10|- ISD1016 reset (PD) ; -------------------- ; __CONFIG H'3FF1' ;WDT aus, PWRT an, XT-Oszillator include P16F84A.inc ; errorlevel -302 ;Fehlermeldungen unterdrücken ;------------------------------------------------------------------------------- ; cblock 0x10 (Alternative, falls man die Register nicht manuell zuweisen will) TMR0 equ 01h ;Timer COUNT equ 0Ch ;RAM-Register COUNT2 equ 0Dh ;RAM-Register COUNT3 equ 0Eh ;RAM-Register PORTB equ 06h ; PORTA equ 05h ; INTCON equ 0Bh ;INTERRUPT CONTROL REGISTER (wird nicht gebraucht) GIE equ 07h ;GLOBAL INTERRUPT CONTROL VARIABLE (wird nicht gebraucht) TRISA equ 85h ;PORT A I/O SELECT REGISTER TRISB equ 86h ;PORT B I/O SELECT REGISTER OPTION_REG equ 081h ; STATUS equ 03h ; PCLATH equ 0Ah ; ; endc ;----------------------------------------------------------------------------- #DEFINE RBPU 81,7h ; interne Pull-up Widerstände von PORTB aktivieren #DEFINE ZERO 03,2h ; BIT SETZEN WENN ERGEBNIS = 0 ;-------------------------------------------------------------------------- ORG 0x00 ; INIT CLRF PORTB ;PORT B löschen CLRF PORTA ;PORT A löschen BSF STATUS,RP0 ;auf Bank 1 schalten MOVLW b'11000000' ;RB0 - RB5 sind Ausgänge, RB6 (EOM vom ISD) = Eingang, RB7 =Eingang MOVWF TRISB MOVLW b'10000' ;RA0 - RA3 sind Ausgänge, RA4 = Eingang MOVWF TRISA BCF RBPU ;die Pull-ups an PORTB auf high legen BCF STATUS,RP0 ;wieder auf Bank 0 zurückschalten BSF PORTB,4 ;ISD1016 reset (PD)auf high BSF PORTB,5 ;ISD1016 start (CE*) auf high CLRF COUNT3 ;RAM löschen BSF PORTB,4 ;ISD1016 reset (PD) auf low CALL DELAY ;Wartezeit BCF PORTB,4 ;ISD1016 reset (PD) auf low CALL DELAY GOTO BEDINGUNG1 ; ; der ISD1016 muß für dieses Beispiel in Adressblöcke von 13 x 1,2 Sekunden aufgeteilt sein (siehe Excel-Tabelle) ; beim Besprechen aufpassen, daß keinesfalls die Zeit von 1,2 Sekunden pro Block überschritten wird, weil sonst die ; Ziffer im nächsten Adressblock nicht oder nur unvollständig wiedergegeben wird. ; BEDINGUNG1 BTFSC PORTB,7 ; prüfen, ob RB7 auf low geht (RB7 ist durch Pull-up auf high) CALL DELAY ; sicherheitshalber ein bißchen warten RETURN ; RB7 ist noch auf high, also nochmal prüfen GOTO START ; RB7 ist jetzt auf low ; START CALL DELAY CALL DELAY CALL DELAY CALL EINS ; erster gesprochener Text CALL ZWEI CALL DREI CALL VIER CALL FUENF CALL SECHS CALL SIEBEN CALL ACHT CALL NEUN CALL NULL CALL NORD CALL OST CALL GKG CALL DELAY CALL DELAY CALL DELAY GOTO BEDINGUNG2 ; BEDINGUNG2 BTFSC PORTA,4 ; Warten, bis RA4 auf low geht; Pullup 10K nicht vergessen! RETURN ; RA4 ist noch auf low, also nochmal prüfen GOTO NKOOR ; RA4 ist jetzt auf high ; NKOOR CALL DELAY CALL DELAY CALL DELAY CALL GKG ; zweiter gesprochener Text CALL NORD CALL FUENF CALL EINS CALL SIEBEN CALL NULL CALL ACHT CALL FUENF CALL SIEBEN CALL DELAY CALL DELAY CALL DELAY GOTO OKOOR ; OKOOR ; dritter gesprochener Text CALL DELAY CALL DELAY CALL DELAY CALL GKG CALL OST CALL ACHT CALL FUENF CALL EINS CALL NULL CALL SIEBEN CALL ZWEI CALL NEUN CALL NULL CALL NULL GOTO BEDINGUNG1 ; und wieder mit dem ersten Text anfangen, falls RB7 auf low ist ;-------------------------------------------------------------------------- EINS BCF PORTB,5 ; CE auf high CALL DELAY BSF PORTB,5 ; CE wieder auf low CALL DELAY RETURN ; ZWEI BSF PORTA,2 ; CALL DELAY BSF PORTA,3 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTA,2 ; CALL DELAY BCF PORTA,3 ; CALL DELAY RETURN ; DREI BSF PORTB,0 ; CALL DELAY BSF PORTA,2 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,0 ; CALL DELAY BCF PORTA,2 ; CALL DELAY RETURN ; VIER BSF PORTB,1 ; CALL DELAY BSF PORTA,3 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,1 ; CALL DELAY BCF PORTA,3 ; CALL DELAY RETURN ; FUENF BSF PORTB,0 ; CALL DELAY BSF PORTB,1 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,0 ; CALL DELAY BCF PORTB,1 ; CALL DELAY RETURN ; SECHS BSF PORTB,1 ; CALL DELAY BSF PORTB,0 ; CALL DELAY BSF PORTA,2 ; CALL DELAY BSF PORTA,3 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,1 ; CALL DELAY BCF PORTB,0 ; CALL DELAY BCF PORTA,2 ; CALL DELAY BCF PORTA,3 ; CALL DELAY RETURN ; SIEBEN BSF PORTB,2 ; CALL DELAY BSF PORTA,2 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,2 ; CALL DELAY BCF PORTA,2 ; CALL DELAY RETURN ; ACHT BSF PORTB,0 ; CALL DELAY BSF PORTB,2 ; CALL DELAY BSF PORTA,3 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,0 ; CALL DELAY BCF PORTB,2 ; CALL DELAY BCF PORTA,3 ; CALL DELAY RETURN ; NEUN BSF PORTB,1 ; CALL DELAY BSF PORTB,2 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,1 ; CALL DELAY BCF PORTB,2 ; CALL DELAY RETURN ; NULL BSF PORTB,1 ; CALL DELAY BSF PORTB,2 ; CALL DELAY BSF PORTA,2 ; CALL DELAY BSF PORTA,3 ; CALL DELAY BSF PORTA,0 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,1 ; CALL DELAY BCF PORTB,2 ; CALL DELAY BCF PORTA,2 ; CALL DELAY BCF PORTA,3 ; CALL DELAY BCF PORTA,0 ; CALL DELAY RETURN ; NORD BSF PORTB,2 ; CALL DELAY BSF PORTB,1 ; CALL DELAY BSF PORTB,0 ; CALL DELAY BSF PORTA,2 ; CALL DELAY BSF PORTA,0 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,2 ; CALL DELAY BCF PORTB,1 ; CALL DELAY BCF PORTB,0 ; CALL DELAY BCF PORTA,2 ; CALL DELAY BCF PORTA,0 ; CALL DELAY RETURN ; OST BSF PORTB,3 ; CALL DELAY BSF PORTA,3 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,3 ; CALL DELAY BCF PORTA,3 ; CALL DELAY RETURN ; GKG BSF PORTB,3 ; CALL DELAY BSF PORTB,0 ; CALL DELAY BCF PORTB,5 ; CALL DELAY BSF PORTB,5 ; CALL DELAY BCF PORTB,3 ; CALL DELAY BCF PORTB,0 ; RETURN ; ;*************************************************************************** ;RSTISD ; BSF PORTB,4 ;wird nur bei Überlauf (Speicherende) gebraucht ; CALL DELAY ; BCF PORTB,4 ;wird nur bei Überlauf (Speicherende) gebraucht ; CALL DELAY ; RETURN ; DELAY MOVLW 0B4h ;äußere Warteschleife; max. Wert 0FFh = 255 ;nicht zu klein wählen, sonst verhaspelt sich der ISD MOVWF COUNT D1 MOVLW 0B4h ;äußere Warteschleife, die die innere aufruft MOVWF COUNT2 D2 DECF COUNT2,1 ;innere Warteschleife BTFSS ZERO ;prüfen, ob die innere Schleife abgelaufen ist GOTO D2 ;falls nein, nochmal zu D2 gehen DECFSZ COUNT,1 ;falls ja, äußere Schleife decrementieren und auf Ablauf prüfen GOTO D1 ;falls die äußere Schleife noch nicht abgelaufen ist, die innere Schleife starten RETLW 00h ;andernfalls die Subroutine verlassen ;--------------------------------------------------------------------------- END