LIST P=18F4685 ; Prozessortyp PIC18F2685 #include ; benoetigte Deklarationen fuer Prozessor CONFIG OSC=IRCIO7 ; internen Frequenzgeber aktivieren CONFIG WDT=OFF ; Watchdog ausschalten CONFIG CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CP4=OFF,CP5=OFF,CPB=OFF,CPD=OFF ; Code Protection ausschalten CONFIG WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF CONFIG WRT4=OFF,WRT5=OFF,WRTB=OFF,WRTC=OFF,WRTD=OFF ; Schreibschutz deaktivieren CONFIG PBADEN=OFF ; Port B als Digitalport nutzen CONFIG BOREN=OFF ; Brown Out Reset deaktivieren CONFIG LVP=OFF ; Low Voltage Programming deaktivieren UDATA_ACS ;Parameter fuer can_func.inc canMsg RES 1 ; Ueber CAN zu sendendes Byte ;Parameter fuer func.inc cms RES 1 ; Counter in Subroutine wms cxms RES 1 ; Counter in Subroutine wxms xms RES 1 ; Parameter fuer Subroutine wxms cbyte RES 1 ; aktuelles Ausgabebyte ORG 0x0000 goto Main ;go to start of main code Main: ORG 0x0100 rcall Init ;Prozessor initialisieren rcall canInit ;Can Modul configurieren MainLoop: movlw 0xAA movwf canMsg ; Inhalt der Nachricht rcall canSendMsga ; canMsg auf den Bus senden rcall wopt ; 0,5 Sekunden warten movlw 0x55 movwf canMsg ; Inhalt der Nachricht rcall canSendMsgb ; canMsg auf den Bus senden bsf LATD,0 ; movff canMsg,LATC ; debug: canMsg auf PortB rcall wopt ; 0,5 Sekunden warten bcf LATD,0 goto MainLoop Init: ; Allgemeine Einstellungen des Prozessors movlw 0x70 ; 0111 0000 movwf OSCCON ; 8MHz als interne Frequenz clrf TRISA clrf LATA movlw 0x08 ; RB3/CanRx als Input, Rest Output movwf TRISB clrf LATB clrf TRISC ; Port C als Output clrf LATC ; Alle digitalen Ausgaenge von PortC auf 0 clrf TRISD clrf LATD return canInit: ; Konfiguration der CAN-Schnittstelle bcf LATB,4 ; MCP2551 einschalten movlw 0x88 ; 1000 1000 movwf CANCON ; Config-Mode, TxB0-Buffer auf AccessBank WaitForCfg: btfss CANSTAT,7 ; Konfiguratonsmodus erreicht? goto WaitForCfg ; nein, warten... movlw 0x04 movwf BRGCON1 ; Baudrate einstellen clrf BRGCON2 clrf BRGCON3 clrf RXB0CON clrf RXB1CON movlw 0x08 ; 0000 1000 movwf CANCON ; Normalen Can-Mode aktivieren return canSendMsga: banksel TXB0CON movff canMsg,TXB0D0 ; Message in Uebertragungsbuffer laden clrf TXB0SIDH movlw 0x20 ; 0010 0000 -> SID ist 01h!!! movwf TXB0SIDL ; MsgID festlegen movlw 0x01 movwf TXB0DLC movlw 0x08 ; Sendeanforderung movwf TXB0CON canSendLoopa: bsf LATD,1 btfsc TXB0CON,3 ; Byte gesendet? goto canSendLoopa ; nein, warten... bcf LATD,1 return canSendMsgb: banksel TXB0CON movff canMsg,TXB0D0 ; Message in Uebertragungsbuffer laden clrf TXB0SIDH movlw 0x60 ; 0010 0000 -> SID ist 01h!!! movwf TXB0SIDL ; MsgID festlegen movlw 0x01 movwf TXB0DLC movlw 0x08 ; Sendeanforderung movwf TXB0CON canSendLoopb: bsf LATD,1 btfsc TXB0CON,3 ; Byte gesendet? goto canSendLoopb ; nein, warten... bcf LATD,1 return ;****************************************************************************** ; Warteschleife fuer optisches Blinken von 0,5 Sekunden wopt: movlw 0xFA movwf xms rcall wxms ; 250 Millisekunden warten movlw 0xFA movwf xms rcall wxms ; nochmal 250 Millisekunden warten return ;****************************************************************************** ; Warteschleife fuer x Millisekunden in xms wxms: movff xms,cxms ; Parameter xms an Counter cxms uebergeben wxms_loop: rcall wms decf cxms bnz wxms_loop return ;****************************************************************************** ; Warteschleife fuer eine Millisekunde wms: movlw 0xF9 ; getesteter Wert, ergibt mit nops zusammen movwf cms ; genau eine Millisekunde wms_loop: decf cms nop nop nop nop nop bnz wms_loop return ;****************************************************************************** ; Ausgabe eines Bytes auf einem Digitalport ShowByte: movff cbyte,LATB ; Wert in Parameter cbyte auf PortB legen return END