;********************************************************************** list p=16f877 ; list directive to define processor #include ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF ; '__CONFIG' directive is used to embed configuration data within .asm file. ; The lables following the directive are located in the respective .inc file. ; See respective data sheet for additional information on configuration word. ;***** VARIABLE DEFINITIONS w_temp EQU 0x7E ; variable used for context saving status_temp EQU 0x7F ; variable used for context saving ;********************************************************************* ORG 0x000 ; processor reset vector clrf PCLATH ; ensure page bits are cleared goto main ; go to beginning of program ORG 0x004 ; interrupt vector location banksel INTCON bcf INTCON,GIE ; Interupts aus banksel OPTION_REG bsf OPTION_REG,T0CS ; TMR 0 Taktquelle wird auf extern umgeschalten um so das Zählen zu stoppen movwf w_temp ; save off current W register contents movf STATUS,w ; move status register into W register movwf status_temp ; save off contents of STATUS register ; --------------------------------------------------------------------------------------------------------------------------------------------- ; isr code can go here or be located as a call subroutine elsewhere isr decf loop,1 ; loop wird decrementiert, und das Ergebniss wieder in loop geschrieben ; --------------------------------------------------------------------------------------------------------------------------------------------- movf status_temp,w ; retrieve copy of STATUS register movwf STATUS ; restore pre-isr STATUS register contents swapf w_temp,f swapf w_temp,w ; restore pre-isr W register contents banksel INTCON bcf INTCON,T0IF ;TMR 0 IR- Flag wird zurück gesetzt banksel TMR0 movlw 0x0 movwf TMR0 ; TMR wir auf 0 gesetzt banksel INTCON bsf INTCON,GIE ; Interupts werden wieder erlaubt retfie ; return from interrupt ; ACHTUNG!!! TMR0 BLEIBT NOCH AUSGESCHLTET BIS 0-CHECK VON LOOP ABGESCHLOSSEN IST. ; ERST NACH 0- CHECK WIRD EIN NEUER DURCHLAUF GESTARTET, FALLS ERFORDERLICH main ;*********************************************************************************************** ; KONFIGURATIONEN ; Interupts konfig. INTCON banksel INTCON clrf INTCON movlw b'10100000' ; generelle IR- Erlaubniss ein, periphäre IR aus, TMR0 Overflow IR ein, External IR aus, ; RB Port Change IR aus, TMR0 Overflow IR Flag auf 0, RB0/INT External IR Flag aus, ; RB Port Change Interrupt Flag bit aus movwf INTCON ; Timer 0 konfig. OPTION_REG banksel OPTION_REG clrf OPTION_REG movlw b'10100111' ; PORTB pull-ups are disabled, Interrupt on falling edge of RB0/INT pin,externer taktr Takt (um tmr aus zu schalten), ; Timer arbeitet mit 0 - 1 Flanke, Vorteiler auf Timer 0 schalten,Teilverhältniss von Vorteiler 256 : 1 movwf OPTION_REG ; Ports konfig. banksel TRISD clrf TRISD movlw 0x0 ; alle pins von D sollen output pins werden movwf TRISD banksel TRISB clrf TRISB movlw 0x0 ; alle pins werden als output pins geschaltet movwf TRISB ; Speicherzelle reservieren cblock 0x10 loop endc ;*********************************************************************************************** ; ********************************************************************************************** start movlw .152 movwf loop ; loop wird mit 152 beschrieben banksel TMR0 movlw 0x0 movwf TMR0 ; tmr 0 wird mit 0 beschrieben banksel OPTION_REG bcf OPTION_REG,T0CS ; TMR 0 wird von externem Takt auf internen Takt um geschalten, damit läuft er los check clrz ; Zero Flag wird auf 0 gesetzt tstf loop ; prüfe ob in loop eine 0 steht btfsc STATUS,Z ; prüfe ob das Zero Flag gesetzt ist goto led_ein bcf OPTION_REG,T0CS ; wenn Z-Flag 0, dann schalte den TMR0 für einen erneuten Durchlauf ein (ist ja in ISR... ; ... ausgeschaltet worden um erst eine Prüfung auf 0 von loop zu ermöglichen) goto check led_ein banksel PORTB clrf PORTB movlw b'00001000' ; rb3 (= Anz. 1) wird eingeschaltet movwf PORTB banksel PORTD clrf PORTD movlw 0xff movwf PORTD led_ein2 goto led_ein2 END ; directive 'end of program'