Guest User

Untitled

a guest
Jul 20th, 2018
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pic 16 7.65 KB | None | 0 0
  1. ; *****************************************************************
  2. ; * dmx.asm - Ansteuerung eines DMX-Gesteuerten RGB-LED-Strahlers *
  3. ; *****************************************************************
  4. ;
  5. ;Channel    DMX     Value                       Characteristic
  6. ;1      0-63        RGB Control,CH2=red,CH3= green,CH4=blue
  7. ;       64-127      7 color fade,Ch5=speed control
  8. ;       128-191 7 color change,Ch5=speed control
  9. ;       192-255 3 color change,CH5=speed control
  10. ;2      0-255       R 0-100%                    Dimmer
  11. ;3      0-255       G 0-100%                    Dimmer
  12. ;4      0-255       B 0-100%                    Dimmer
  13. ;5      0-10        no function -no speed
  14. ;       11-100      value 11 to 100,fast speed to low speed
  15. ;       101-150 no function -no speed
  16. ;       151-255 speed controll by unit,by music or VAR
  17. ;
  18. ; DMX-Paket:
  19. ;
  20. ; 1) Break ('0' mit 88us < T < 1s)
  21. ; 2) Mark-after_break ('1' mit 8us < T < 1s)
  22. ; 3) Startbyte (11 Bit: Startbit,8 Datenbit (alle '0'),2 Stoppbit) mit Tbit=4us
  23. ; 4) Zwischen 1 - 512 Kanalbytes (je 11 Bit: Startbit,8 Datenbit,2 Stoppbit) mit Tbit=4us
  24. ;    Zwischen Kanalbytes kann eine Pause von 0us <= T < 1s liegen
  25. ;
  26. ; Kanalbyte:
  27. ;
  28. ;      S 0 1 2 3 4 5 6 7 E E
  29. ;     |0|X|X|X|X|X|X|X|X|1|1|
  30. ;      | |_____________| | |
  31. ;      |        |        | |
  32. ;  Startbit     |       Stoppbits
  33. ;           Datenbits  
  34. ;
  35. ;
  36. ; AUSGéNGE:
  37. ;
  38. ; PORTB,0 -> DMX-Signal)
  39. ;
  40.  
  41. ;***************************************************************************
  42. ;* Bestimmung des Prozessortyps fÅr den Assembler und das ProgrammiergerÑt *
  43. ;***************************************************************************
  44. LIST    P=18F2550               ;der Typ des Prozessors
  45.  
  46. ;*********************************************************************
  47. ;* Includedatei fÅr den P18F2550 einbinden (vordef.Reg.und Konst.) *
  48. ;*********************************************************************
  49.  
  50. #include <p18f2550.inc>         ;processor-spezifische Variablendefinitionen
  51. ; Diese Datei enthÑlt Vordefinitionen fÅr wichtige Register und Konstanten.
  52.  
  53.  
  54.  
  55. ;***********************************
  56. ;* Register / Variablen  festlegen *
  57. ;***********************************
  58.     CBLOCK 0x000
  59.         CounterByte1
  60.         Temp
  61.         Byte1               ; aktueller Masterwert  (Kanal 1)
  62.         Byte2               ; aktueller Rotwert     (Kanal 2)
  63.         Byte3               ; aktueller GrÅnwert   (Kanal 3)
  64.         Byte4               ; aktueller Blauwert    (Kanal 3)
  65.         Byte5               ; aktueller Strobewert  (Kanal 5)
  66.         d1              ; ZÑhlvariable fÅr Warteschleife
  67.         d2              ; ZÑhlvariable fÅr Warteschleife
  68.     ENDC
  69.  
  70.  
  71. #DEFINE out PORTB,RB0           ; DMX-Signal
  72.  
  73.     ORG     0x0800
  74.     GOTO    init                ; Springe zur Grundinitialisierung
  75.  
  76. init
  77.     MOVLW   B'00000000'     ; RB0-RB7 AusgÑnge
  78.     MOVWF   TRISB
  79.  
  80.     CLRF        PORTB       ;Port B lîschen
  81.  
  82.     BCF     TRISC,6     ; PIC TX-Pin (PC RX)
  83.     BSF     TRISC,7     ; PIC RX-Pin (PC TX
  84.  
  85.     NOP
  86.  
  87.     MOVLW   H'0F'
  88.     MOVWF   ADCON1
  89.     MOVLW   H'07'
  90.     MOVWF   CMCON
  91.    
  92.     CALL        UP_init_eusart  ; Eusart Initialisierung aufrufen
  93.  
  94. ; Programm Start
  95.    
  96. EUSART_empfang
  97.  
  98.     CLRF        PORTB       ; LED Anzeige als Statusanzeige
  99.     CLRF        Byte2           ; Werte in der Variable lîschen
  100.     CLRF        Byte3           ; Werte in der Variable lîschen
  101.     CLRF        Byte4           ; Werte in der Variable lîschen
  102.     CLRF        Byte5           ; Werte in der Variable lîschen
  103.    
  104.  
  105.  
  106.  
  107. eusart_byte_1                   ;rot
  108.  
  109.     BTFSS   PIR1,RCIF       ; warten,bis Datenbyte vollstÑndig empfangen ist
  110.     GOTO        eusart_byte_1
  111.     BCF     PIR1,RCIF       ; Empfangsbit lîschen
  112.     MOVFF   RCREG,Byte2 ; Empfangenes Datenbyte uebernehmen und in                      ; Byte2 schreiben
  113.     BSF     PORTB,RB1       ; LED 2 einschalten
  114.  
  115.    
  116. eusart_byte_2                   ; grÅn
  117.  
  118.     BTFSS   PIR1,RCIF       ; warten,bis Datenbyte vollstÑndig empfangen ist
  119.     GOTO        eusart_byte_2      
  120.     BCF     PIR1,RCIF       ; Empfangsbit lîschen
  121.     MOVFF   RCREG,Byte3 ; Empfangenes Datenbyte uebernehmen und in
  122.                         ; Byte 3 schreiben
  123.     BSF     PORTB,RB2       ; LED 3 einschalten
  124.  
  125.  
  126. eusart_byte_3                   ;  blau
  127.  
  128.     BTFSS   PIR1,RCIF       ; warten,bis Datenbyte vollstÑndig empfangen ist
  129.     GOTO        eusart_byte_3
  130.     BCF     PIR1,RCIF       ; Empfangsbit lîschen
  131.     MOVFF   RCREG,Byte4 ; Empfangenes Datenbyte uebernehmen und in
  132.                         ; Byte 3 schreiben
  133.     BSF     PORTB,RB3       ; LED 4 einschalten
  134.  
  135. eusart_byte_4                   ; stroboskop
  136.  
  137.     BTFSS   PIR1,RCIF       ; warten,bis Datenbyte vollstÑndig empfangen ist
  138.     GOTO        eusart_byte_4
  139.     BCF     PIR1,RCIF       ; Empfangsbit lîschen
  140.  
  141.     MOVFF   RCREG,Byte5 ; Empfangenes Datenbyte uebernehmen und in
  142.                         ; Byte 3 schreiben
  143.  
  144.     BSF     PORTB,RB4       ; LED 5 einschalten
  145.  
  146. starthier
  147.  
  148. ;reset
  149.     BCF     out         ; ausgang auf logisch 0 setzten
  150.     CALL        delay_88us      ; pause von 88us
  151.  
  152.     NOP
  153.     NOP
  154.  
  155. ;reset fertig
  156.  
  157.  
  158. ;mark zw.reset und startbyte  (min8?s max1s)
  159.     CALL        highbit         ; unterprogramm highbit aufrufen
  160.     CALL        highbit
  161.  
  162. ;mark fertig
  163.    
  164. bytes_senden_8
  165. ;Anfangs byte alles "0"
  166.  
  167.     MOVLW   D'0'            ; 0 in das Arbeitsregister schreiben und
  168.     MOVWF   Temp            ; Variable Temp uebernehmen
  169.     CALL        sendebyte       ; Unterprogramm sendebyte aufrufen
  170.  
  171.    
  172. ;byte senden    Byte1
  173.  
  174.     MOVFF   Byte1,Temp      ; Inhalt der Variable Byte1 in Temp schreiben
  175.     CALL        sendebyte       ; Unterprogramm sendebyte aufrufen
  176.    
  177.  
  178. ;bytesenden Byte2   ROT
  179.  
  180.     MOVFF   Byte2,Temp
  181.     CALL        sendebyte
  182.  
  183. ;bytesenden Byte3   GRöN
  184.  
  185.     MOVFF   Byte3,Temp
  186.     CALL        sendebyte
  187.    
  188. ;bytesenden Byte4   BLAU
  189.  
  190.     MOVFF   Byte4,Temp
  191.     CALL        sendebyte
  192.  
  193. ;bytesenden Byte5   STROBOSKOB
  194.  
  195.     MOVFF   Byte5,Temp
  196.     CALL        sendebyte
  197.  
  198.  
  199.     CALL        delay_88us
  200.     GOTO        EUSART_empfang  ; begin
  201.  
  202.  
  203.    
  204. sendebyte
  205.     CALL        lowbit          ; starbit
  206.     MOVLW   D'9'
  207.     MOVWF   CounterByte1
  208. schleife1
  209.     DECFSZ  CounterByte1,F
  210.     GOTO        byte8bitsenden
  211.    
  212.     CALL        highbit         ; stopbit
  213.     CALL        highbit         ; stopbit
  214.     RETURN
  215.  
  216. byte8bitsenden
  217.     RRCF        Temp,F      ; im register der Variable Temp rotieren und
  218.     BTFSS   STATUS,C        ; auf 0 oder 1 prÅfen
  219.     GOTO        lowbit2         ; wenn 0 dann lowbit2
  220.     GOTO        highbit2        ; wenn 1 dann highbit2
  221.  
  222. highbit2
  223.     BSF     out         ; ausgang auf logisch 1 setzten
  224.     CALL        delay_4us_bit       ; 4us pause aufrufen
  225.     GOTO        schleife1       ;zurÅck zu schleife 1
  226.  
  227. lowbit2
  228.     BCF     out         ; ausgang auf logisch 0 setzten
  229.     CALL        delay_4us_bit       ; 4us pause aufrufen
  230.     GOTO        schleife1       ; zurÅck zu schleife1
  231.  
  232.  
  233. highbit
  234.     BSF     out         ; ausgang auf logisch 1 setzten
  235.     CALL        delay_4us_bit       ; 4us pause aufrufen
  236.     RETURN              ; zurÅck zum Aufruf
  237.  
  238. lowbit
  239.     BCF     out         ; ausgang auf logisch 0 setzten
  240.     CALL        delay_4us_bit       ; 4us pause aufrufen
  241.     RETURN              ; zurÅck zum Aufruf
  242.  
  243. ;**********************************************************************
  244.  
  245. delay_88us
  246.                         ; 1056Cycles
  247.     MOVLW   D'0'   
  248.     MOVWF   d1
  249. loop_88us
  250.     NOP                 ; 256
  251.     NOP                 ; ??               
  252.     DECFSZ  d1,f            ; 257
  253.     GOTO        loop_88us       ;510
  254.            
  255.     RETURN              ; 2
  256. ;**********************************************************************
  257.  
  258. delay_4us_bit
  259.     MOVLW   D'11'           ; 1
  260.     MOVWF   d1          ; 1
  261. delay_4us_1
  262.     DECFSZ  d1,F            ; 12
  263.     GOTO        delay_4us_1     ; 20
  264.                         ; 34
  265.     RETURN 
  266.  
  267. ;**********************************************************************
  268.  
  269. ; UP_init_eusart
  270. ;**********************************************************************
  271. ; Initialisierung des PIC-internen Eusart als bidirektionale RS232-
  272. ; Schnittstelle mit:
  273. ; 9660 Baud,1 Startbit,8 Datenbit,1 Stopbit,keine ParitÑt
  274.  
  275. UP_init_eusart
  276.  
  277. ; BAUD-Raten-Generator fuer EUSART konfigurieren
  278. ; hier: 9600 Baud,fosc=48MHz
  279. ; Berechnungsgrundlage:
  280. ; Baudrate = 9600 = fosc/(64*([SPBRGH:SPBRG]+1))
  281. ; [SPBRGH:SPBRG] = ((fosc/9600)/64)-1
  282. ;                = ((48000000/9600)/64)-1
  283. ;                = 77.125 -> SPBRGH=0:SPBRG=77
  284. ; Fehler: 48MHz/(64*(77+1)) = 9615.38 statt 9600 (ca.0.16%)
  285.    
  286.     BCF     TXSTA,BRGH      ; Low-Speed Baudrate-Generator
  287.     BCF     BAUDCON,BRG16   ; 8-Bit Baudrate-Generator
  288.     CLRF        SPBRGH      ; Baudraten-Generator Register High-Byte
  289.     MOVLW   D'77'           ; Baudraten-Generator Register Low-Byte
  290.     MOVWF   SPBRG
  291.  
  292. ; EUSART konfigurieren
  293. ; asynchrone Uebertragung 8N1
  294.  
  295.     BCF     TXSTA,SYNC      ; EUSART in asynchronen Modus schalten
  296.     BSF     RCSTA,SPEN      ; Seriellen Port einschalten
  297.     BSF     TXSTA,TXEN      ; Sendemodul einschalten
  298.     BSF     RCSTA,CREN  ; Empfangsmodul einschalten
  299.  
  300.     RETURN
  301. END
Add Comment
Please, Sign In to add comment