Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; *****************************************************************
- ; * dmx.asm - Ansteuerung eines DMX-Gesteuerten RGB-LED-Strahlers *
- ; *****************************************************************
- ;
- ;Channel DMX Value Characteristic
- ;1 0-63 RGB Control,CH2=red,CH3= green,CH4=blue
- ; 64-127 7 color fade,Ch5=speed control
- ; 128-191 7 color change,Ch5=speed control
- ; 192-255 3 color change,CH5=speed control
- ;2 0-255 R 0-100% Dimmer
- ;3 0-255 G 0-100% Dimmer
- ;4 0-255 B 0-100% Dimmer
- ;5 0-10 no function -no speed
- ; 11-100 value 11 to 100,fast speed to low speed
- ; 101-150 no function -no speed
- ; 151-255 speed controll by unit,by music or VAR
- ;
- ; DMX-Paket:
- ;
- ; 1) Break ('0' mit 88us < T < 1s)
- ; 2) Mark-after_break ('1' mit 8us < T < 1s)
- ; 3) Startbyte (11 Bit: Startbit,8 Datenbit (alle '0'),2 Stoppbit) mit Tbit=4us
- ; 4) Zwischen 1 - 512 Kanalbytes (je 11 Bit: Startbit,8 Datenbit,2 Stoppbit) mit Tbit=4us
- ; Zwischen Kanalbytes kann eine Pause von 0us <= T < 1s liegen
- ;
- ; Kanalbyte:
- ;
- ; S 0 1 2 3 4 5 6 7 E E
- ; |0|X|X|X|X|X|X|X|X|1|1|
- ; | |_____________| | |
- ; | | | |
- ; Startbit | Stoppbits
- ; Datenbits
- ;
- ;
- ; AUSGéNGE:
- ;
- ; PORTB,0 -> DMX-Signal)
- ;
- ;***************************************************************************
- ;* Bestimmung des Prozessortyps fÅr den Assembler und das ProgrammiergerÑt *
- ;***************************************************************************
- LIST P=18F2550 ;der Typ des Prozessors
- ;*********************************************************************
- ;* Includedatei fÅr den P18F2550 einbinden (vordef.Reg.und Konst.) *
- ;*********************************************************************
- #include <p18f2550.inc> ;processor-spezifische Variablendefinitionen
- ; Diese Datei enthÑlt Vordefinitionen fÅr wichtige Register und Konstanten.
- ;***********************************
- ;* Register / Variablen festlegen *
- ;***********************************
- CBLOCK 0x000
- CounterByte1
- Temp
- Byte1 ; aktueller Masterwert (Kanal 1)
- Byte2 ; aktueller Rotwert (Kanal 2)
- Byte3 ; aktueller GrÅnwert (Kanal 3)
- Byte4 ; aktueller Blauwert (Kanal 3)
- Byte5 ; aktueller Strobewert (Kanal 5)
- d1 ; ZÑhlvariable fÅr Warteschleife
- d2 ; ZÑhlvariable fÅr Warteschleife
- ENDC
- #DEFINE out PORTB,RB0 ; DMX-Signal
- ORG 0x0800
- GOTO init ; Springe zur Grundinitialisierung
- init
- MOVLW B'00000000' ; RB0-RB7 AusgÑnge
- MOVWF TRISB
- CLRF PORTB ;Port B lîschen
- BCF TRISC,6 ; PIC TX-Pin (PC RX)
- BSF TRISC,7 ; PIC RX-Pin (PC TX
- NOP
- MOVLW H'0F'
- MOVWF ADCON1
- MOVLW H'07'
- MOVWF CMCON
- CALL UP_init_eusart ; Eusart Initialisierung aufrufen
- ; Programm Start
- EUSART_empfang
- CLRF PORTB ; LED Anzeige als Statusanzeige
- CLRF Byte2 ; Werte in der Variable lîschen
- CLRF Byte3 ; Werte in der Variable lîschen
- CLRF Byte4 ; Werte in der Variable lîschen
- CLRF Byte5 ; Werte in der Variable lîschen
- eusart_byte_1 ;rot
- BTFSS PIR1,RCIF ; warten,bis Datenbyte vollstÑndig empfangen ist
- GOTO eusart_byte_1
- BCF PIR1,RCIF ; Empfangsbit lîschen
- MOVFF RCREG,Byte2 ; Empfangenes Datenbyte uebernehmen und in ; Byte2 schreiben
- BSF PORTB,RB1 ; LED 2 einschalten
- eusart_byte_2 ; grÅn
- BTFSS PIR1,RCIF ; warten,bis Datenbyte vollstÑndig empfangen ist
- GOTO eusart_byte_2
- BCF PIR1,RCIF ; Empfangsbit lîschen
- MOVFF RCREG,Byte3 ; Empfangenes Datenbyte uebernehmen und in
- ; Byte 3 schreiben
- BSF PORTB,RB2 ; LED 3 einschalten
- eusart_byte_3 ; blau
- BTFSS PIR1,RCIF ; warten,bis Datenbyte vollstÑndig empfangen ist
- GOTO eusart_byte_3
- BCF PIR1,RCIF ; Empfangsbit lîschen
- MOVFF RCREG,Byte4 ; Empfangenes Datenbyte uebernehmen und in
- ; Byte 3 schreiben
- BSF PORTB,RB3 ; LED 4 einschalten
- eusart_byte_4 ; stroboskop
- BTFSS PIR1,RCIF ; warten,bis Datenbyte vollstÑndig empfangen ist
- GOTO eusart_byte_4
- BCF PIR1,RCIF ; Empfangsbit lîschen
- MOVFF RCREG,Byte5 ; Empfangenes Datenbyte uebernehmen und in
- ; Byte 3 schreiben
- BSF PORTB,RB4 ; LED 5 einschalten
- starthier
- ;reset
- BCF out ; ausgang auf logisch 0 setzten
- CALL delay_88us ; pause von 88us
- NOP
- NOP
- ;reset fertig
- ;mark zw.reset und startbyte (min8?s max1s)
- CALL highbit ; unterprogramm highbit aufrufen
- CALL highbit
- ;mark fertig
- bytes_senden_8
- ;Anfangs byte alles "0"
- MOVLW D'0' ; 0 in das Arbeitsregister schreiben und
- MOVWF Temp ; Variable Temp uebernehmen
- CALL sendebyte ; Unterprogramm sendebyte aufrufen
- ;byte senden Byte1
- MOVFF Byte1,Temp ; Inhalt der Variable Byte1 in Temp schreiben
- CALL sendebyte ; Unterprogramm sendebyte aufrufen
- ;bytesenden Byte2 ROT
- MOVFF Byte2,Temp
- CALL sendebyte
- ;bytesenden Byte3 GRöN
- MOVFF Byte3,Temp
- CALL sendebyte
- ;bytesenden Byte4 BLAU
- MOVFF Byte4,Temp
- CALL sendebyte
- ;bytesenden Byte5 STROBOSKOB
- MOVFF Byte5,Temp
- CALL sendebyte
- CALL delay_88us
- GOTO EUSART_empfang ; begin
- sendebyte
- CALL lowbit ; starbit
- MOVLW D'9'
- MOVWF CounterByte1
- schleife1
- DECFSZ CounterByte1,F
- GOTO byte8bitsenden
- CALL highbit ; stopbit
- CALL highbit ; stopbit
- RETURN
- byte8bitsenden
- RRCF Temp,F ; im register der Variable Temp rotieren und
- BTFSS STATUS,C ; auf 0 oder 1 prÅfen
- GOTO lowbit2 ; wenn 0 dann lowbit2
- GOTO highbit2 ; wenn 1 dann highbit2
- highbit2
- BSF out ; ausgang auf logisch 1 setzten
- CALL delay_4us_bit ; 4us pause aufrufen
- GOTO schleife1 ;zurÅck zu schleife 1
- lowbit2
- BCF out ; ausgang auf logisch 0 setzten
- CALL delay_4us_bit ; 4us pause aufrufen
- GOTO schleife1 ; zurÅck zu schleife1
- highbit
- BSF out ; ausgang auf logisch 1 setzten
- CALL delay_4us_bit ; 4us pause aufrufen
- RETURN ; zurÅck zum Aufruf
- lowbit
- BCF out ; ausgang auf logisch 0 setzten
- CALL delay_4us_bit ; 4us pause aufrufen
- RETURN ; zurÅck zum Aufruf
- ;**********************************************************************
- delay_88us
- ; 1056Cycles
- MOVLW D'0'
- MOVWF d1
- loop_88us
- NOP ; 256
- NOP ; ??
- DECFSZ d1,f ; 257
- GOTO loop_88us ;510
- RETURN ; 2
- ;**********************************************************************
- delay_4us_bit
- MOVLW D'11' ; 1
- MOVWF d1 ; 1
- delay_4us_1
- DECFSZ d1,F ; 12
- GOTO delay_4us_1 ; 20
- ; 34
- RETURN
- ;**********************************************************************
- ; UP_init_eusart
- ;**********************************************************************
- ; Initialisierung des PIC-internen Eusart als bidirektionale RS232-
- ; Schnittstelle mit:
- ; 9660 Baud,1 Startbit,8 Datenbit,1 Stopbit,keine ParitÑt
- UP_init_eusart
- ; BAUD-Raten-Generator fuer EUSART konfigurieren
- ; hier: 9600 Baud,fosc=48MHz
- ; Berechnungsgrundlage:
- ; Baudrate = 9600 = fosc/(64*([SPBRGH:SPBRG]+1))
- ; [SPBRGH:SPBRG] = ((fosc/9600)/64)-1
- ; = ((48000000/9600)/64)-1
- ; = 77.125 -> SPBRGH=0:SPBRG=77
- ; Fehler: 48MHz/(64*(77+1)) = 9615.38 statt 9600 (ca.0.16%)
- BCF TXSTA,BRGH ; Low-Speed Baudrate-Generator
- BCF BAUDCON,BRG16 ; 8-Bit Baudrate-Generator
- CLRF SPBRGH ; Baudraten-Generator Register High-Byte
- MOVLW D'77' ; Baudraten-Generator Register Low-Byte
- MOVWF SPBRG
- ; EUSART konfigurieren
- ; asynchrone Uebertragung 8N1
- BCF TXSTA,SYNC ; EUSART in asynchronen Modus schalten
- BSF RCSTA,SPEN ; Seriellen Port einschalten
- BSF TXSTA,TXEN ; Sendemodul einschalten
- BSF RCSTA,CREN ; Empfangsmodul einschalten
- RETURN
- END
Add Comment
Please, Sign In to add comment