; Programm TELEMET2.asm: Empfangsprogramm ; PIC16F84, f = 4,0 MHz, Eingang: RA0; HEX-Anzeige an Port B ; Dieter Kohtz, Nov. 2001; ; Registerzuweisung RTCC equ 1 PC equ 2 STAT equ 3 FSR equ 4 PORTA equ 5 PORTB equ 6 INTCON equ 0B BIT equ 0C DATAUS equ 0D ZAEHL equ 0E ZAEHL1 equ 0F ZSP equ 10 ; auf Registerseite 1: TRISA equ 05 ; Richtungsregister fuer Port A TRISB equ 06 ; Richtungsregister fuer Port B OPTREG equ 01 ; OPTION-Register ;Ziele: w equ 0 f equ 1 ;Bits Z equ 2 C equ 0 RP0 equ 05 ;Seitenauswahlbit im Statuswort-Register INTF equ 01 ;RB0-Interruptflag in INTCON T0IF equ 02 ;RTCC-Interruptflag im INTCON-Register ;********************************************************************************* ; Makrodefinitionen bank0 macro bcf STAT,RP0 endm bank1 macro bsf STAT,RP0 endm ;********************************************************************************* org 0 goto beginn ;********************************************************************************** ; Initialisierung: RTCC voreinstellen und starten; Vorteiler = 4, SC = 1 us: alle 4 us wird RTCC erhoeht ; Bei RTCC- Ueberlauf wird Interruptflag T0IF gesetzt ;********************************************************************************** init clrf RTCC ; RTCC auf 0 voreingestellt bank1 ; Registerseite 1 movlw b'01000001' ; interner Takt, Vorteiler = 4 an RTCC, steigende Flanke movwf OPTREG ; und Start des RTCC movlw b'11111' movwf TRISA ; PORTA = Eingang movlw b'00000000' movwf TRISB ; PORTB = Ausgang bank0 ; Registerseite 0 return ;********************************************************************************** ; RTCC fuer Bitdauer von ca. 0,84 ms (1200 Baud), Halbbit von 0,42, Viertelbit von 0,21 ms einstellen ;********************************************************************************** viertbit movlw .204 ; 256 - 204 = 52; 52 x 4us = 208 us goto $+4 halbbit movlw .151 ; 256 - 151 = 105; 105 x 4us = 420 us goto $+2 vollbit movlw .46 ; 256 - 46 = 210; 210 x 4us = 840 us movwf RTCC ; RTCC fuer 0,84 ms vorbereiten btfss INTCON,T0IF ; Abfrage des T0-Interrupt-Flags goto $-1 ; 0,84 ms Warten auf T0IF bcf INTCON,T0IF ; T0-Interruptflag wieder loeschen return ;********************************************************************************** ; Erwarten periodischer Impulse: Wenn nacheinander 10 low-Pulse gleicher Dauer auftreten, wird UP verlassen ;********************************************************************************** perwart movlw .10 movwf ZAEHL1 ; ZAEHL1 soll 10 gleiche Laengen zaehlen movlw .125 movwf ZSP ; willkuerlicher Anfangswert lowart btfsc PORTA,0 ; RA0 low? goto $-1 ; nein: weiter warten clrf ZAEHL ; und Zaehlen starten, wenn RA0 = 0 bleibt btfsc PORTA,0 ; RA0 high? goto vergl ; ja: vergleichen, speichern und auf low warten nop ; nein: Zaehlen und auf high warten incf ZAEHL,f ; Zaehlschleife 6 us goto $-4 ; auf high warten vergl movf ZAEHL,w subwf ZSP,w btfss STAT,Z goto ungleich gleich decfsz ZAEHL1,f goto $+4 return ungleich movlw .10 movwf ZAEHL1 ; ZAEHL1 zuruecksetzen movf ZAEHL,w movwf ZSP goto lowart ;********************************************************************************** ; Startimpuls erwarten; RA0 wird auf low getestet und die low-Zeit gezaehlt ; Wenn ZAEHL = 0, ist die low-Zeit > 420 us ; wird danach RA0 = 1, ist Mitte Startbit erreicht ;********************************************************************************** wartstrt btfsc PORTA,0 ; RA0 low? goto $-1 ; nein: weiter warten movlw .125 ; ja: Voreinstellung von ZAEHL movwf ZAEHL ; und Zaehlen starten, wenn RA0 = 0 bleibt btfsc PORTA,0 ; RA0 high? goto $-5 ; ja: auf low warten nop ; nein: Zaehlen und auf high oder ZAEHL = 0 warten incfsz ZAEHL,f ; Zaehlschleife 6 us goto $-4 ; auf high warten nop ; ZAEHL = 0: RA0 = high erwarten btfss PORTA,0 ; RA0 high? goto $-1 ; nein: warten return ; ja: Mitte Startbit erreicht ;********************************************************************************** beginn clrf PORTB clrf DATAUS call init clrf INTCON ; keine Interrupts! ;********************************************************************************** warten call perwart ; Periodisches Signal erwarten call wartstrt ; Startbit erwarten movlw 08 ; Empfang eines Bytes vorbereiten movwf BIT clrf DATAUS call viertbit ; Viertelbit-Pause 210 us nop call halbbit ; Halbbitpause 420 us empfg rrf PORTA,f ; bit 0 von Port A ins Carry schieben rrf DATAUS,f ; Carry nach DATAUS verschieben call vollbit ; Vollbitpause 840 us decfsz BIT,f goto empfg ; naechstes Bit empfangen movf DATAUS,w movwf PORTB ; HEX-Anzeige an Port B goto warten ; naechstes Startbit erwarten ;********************************************************************************** end