Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   746 / 746
(#) csabeszq válasza kapu48 hozzászólására (») Aug 9, 2016 /
 
Egyébként lehet C-t és C++-t keverni.
(#) kapu48 válasza csabeszq hozzászólására (») Aug 9, 2016 /
 
Próbálkoztam a kevert módszerrel, de előjött egy rakat hibajelzés!

És ez a formátum, hogy tetszik?:
  1. void LCD_printCharC(char c, u8 color);
  2.     void LCD_printChar(char c);
  3.     void LCD_printStringC(char *string, u8 color);
  4.     void LCD_printString(char *string);
  5.     void LCD_printIntC(int i, u8 color);
  6.     void LCD_printInt(int i);
  7.     void LCD_println(void);
  8.     void LCD_printlnCharC(char c, u8 color);
  9.     void LCD_printlnChar(char c);
  10.     void LCD_printlnStringC(char *string, u8 color);
  11.     void LCD_printlnString(char *string);
  12.     void LCD_printlnIntC(int i, u8 color);
  13.     void LCD_printlnInt(int i);
  14.  
  15.     void LCD_moveCursorW(u8 x, u8 y, u8 width);
  16.     void LCD_moveCursor(u8 x, u8 y);

A hozzászólás módosítva: Aug 9, 2016
(#) csabeszq válasza kapu48 hozzászólására (») Aug 10, 2016 /
 
Nincs C alatt olyan kódolási sztenderd, mint java, vagy C++ alatt.

Úgy írod, ahogy jól esik, de egy projekten belül próbáld ugyanazt a formátumot végig tartani.
(#) kapu48 válasza csabeszq hozzászólására (») Aug 10, 2016 /
 
Köszönöm!

Végül a jobb olvashatóság kedvéért belekerültek a _ karakterek.
  1. void LCD_print_Char(char c);
  2. ...
  3. void LCD_println_Char(char c);
(#) Szabi1 hozzászólása Aug 11, 2016 /
 
Sziasztok! Nem tudja valaki, hogy miért irja ki ezt az avrdude? Egy arduino uno-val akartam felprogramozni egy ATMEGA8515-ost.

avrdude.PNG
    
(#) Sick-Bastard válasza Szabi1 hozzászólására (») Aug 12, 2016 / 1
 
Hibásan adtad meg a parancsot.
avrdude -P COM3 -b 19200 -c arduino -p m8515 -F flash:w:board.hex
-F helyett -U kell
avrdude -P COM3 -b 19200 -c arduino -p m8515 -U flash:w:board.hex
(#) Szabi1 válasza Sick-Bastard hozzászólására (») Aug 12, 2016 /
 
Köszönöm a segítséget! Volna itt még valami, kompilálni kellene egy assembly kódot, nem én írtam, csak módosítottam benne a portbiteket, és kéne egy hex amit felprogramoznák:
Továbbá azt hiszem hogy az eredeti kód 16 Mhz-re van írva, nekem 8Mhz-es quatzom van, ez számít-e, mert az UART-on kellene fogadja a jeleket!?

  1. /**** A P P L I C A T I O N   N O T E   ************************************
  2. *
  3. * Title   : DMX512 reception library
  4. * Version              : v2.5
  5. * Last updated  : 29.11.06
  6. * Target                : Botex, SP1500-DMX [ATmega8515]
  7. * Clock   : 16MHz
  8. *
  9. * written by hendrik hoelscher, www.hoelscher-hi.de
  10. ***************************************************************************
  11. This program is free software; you can redistribute it and/or
  12. modify it under the terms of the GNU General Public License
  13. as published by the Free Software Foundation; either version2 of
  14. the License, or (at your option) any later version.
  15.  
  16. This program is distributed in the hope that it will be useful,
  17. but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. General Public License for more details.
  20.  
  21. If you have no copy of the GNU General Public License, write to the
  22. Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  
  24. For other license models, please contact the author.
  25.  
  26. ;***************************************************************************/
  27.  
  28.  
  29. .include "m8515def.inc"
  30.  
  31. ;Register and Pin definitions
  32.  
  33. .def TempA = r16
  34. .def TempB= r17
  35. .def TempC= r18
  36. .def TempD= r3
  37. .def MainFlags= r19
  38. .def ErrFlags=r20
  39. .def StroboHeatH=r21
  40. .def StroboHeatL=r22
  41. .def HeatInc= r9
  42. .def DmxState= r23
  43. .def TCNT0H = r8
  44. .def null= r2
  45. .def SREG_buf= r10
  46.  
  47.  
  48. ;Mod by me
  49.  
  50. ;.equ LED=            PB3
  51. ;.equ CNTRL_LED=  PD7
  52. ;.equ Strobo=    PB7
  53.  
  54. .equ LED=              PD7
  55. .equ CNTRL_LED=  PE0
  56. .equ Strobo=     PA0
  57.  
  58.  
  59. ;Endmod
  60.  
  61.  
  62. .equ ONTIME= 800         ;Time the strobe is triggered
  63.  
  64. ;** vars in SRAM
  65.  
  66. .equ SPEEDraw=   0x61 ;Buffer for Speed
  67. .equ BRIGHTraw=  0x62 ;Buffer for Brightness
  68. .equ MODEraw=    0x63 ;Buffer for strobe mode
  69.  
  70. .equ SPEEDclcH=  0x64 ;Buffer for Speed
  71. .equ SPEEDclcL=  0x65
  72. .equ FIREclcH=   0x66 ;Buffer for Brightness
  73. .equ FIREclcL=   0x67 ;Buffer for Brightness
  74. .equ QUENCHclcH= 0x68 ;Buffer for Brightness
  75. .equ QUENCHclcL= 0x69 ;Buffer for Brightness
  76. .equ MODEclc=    0x6A ;Buffer for strobe mode
  77.  
  78. .equ ERRCODE=    0x6B ;error LED pattern
  79. .equ ERRprescaler= 0x6D ;prescaler for error indicator
  80. .equ RANDSEED=   0x70
  81.  
  82.  
  83. ;***** special flags
  84.  
  85. .equ  OVERHEAT    =0                ;Error Flags
  86. .equ  VALID_DMX  =1
  87. .equ  SIGNAL_COMING =2
  88. .equ  MANUAL        =4    ;use THIS for checking current mode!
  89. .equ  XOP_OFF      =5
  90. .equ  ZChigh        =6    ;for old board's polling
  91. .equ  REV_5_2      =7
  92.  
  93. .equ  doSPEED      =0  ;Main Flags
  94. .equ  doBRIGHT      =1
  95. .equ  doMODE        =2
  96. .equ  doIndicate        =3
  97. .equ  wasLOW        =4          ;used for single flash 
  98. .equ  DMXisSTANDBY      =5
  99. .equ  isREADY      =6
  100. .equ  doFLASH      =7
  101.  
  102. .equ  NORMAL_MODE       =0
  103. .equ  BLINDING_MODE =1
  104. .equ  RANDOM_MODE   =2
  105. .equ  SINGLE_FLASH  =3
  106. .equ  SYNC_MODE  =4              
  107.  
  108. ;interrupt vectors
  109.  
  110. .org 0
  111.        
  112.         rjmp reset                     ;reset vector address
  113.         rjmp zero_crossing            ;External Interrupt0 Vector Address
  114.         reti                    ;External Interrupt1 Vector Address
  115.         reti                    ;Input Capture1 Interrupt Vector Address
  116.         rjmp fire                            ;Output Compare1A Interrupt Vector Address
  117.         rjmp quench                    ;Output Compare1B Interrupt Vector Address
  118.         reti                    ;Overflow1 Interrupt Vector Address
  119.         rjmp dmx_flash    ;Overflow0 Interrupt Vector Address
  120.         reti                    ;SPI Interrupt Vector Address
  121.         rjmp get_byte         ;UART Receive Complete Interrupt Vector Address
  122.         reti                    ;UART Data Register Empty Interrupt Vector Address
  123.         reti                    ;UART Transmit Complete Interrupt Vector Address
  124.         reti                    ;Analog Comparator Interrupt Vector Address
  125.         reti                    ;External Interrupt2 Vector Address
  126.         reti                ;Output Compare0 Interrupt Vector Address
  127.         reti                    ;EEPROM Interrupt Vector Address
  128.         reti                    ;SPM complete Interrupt Vector Address
  129.         reti                    ;SPM complete Interrupt Vector Address     
  130.  
  131. ;INIT
  132. reset:
  133. cli
  134.  
  135. ;Stack
  136.         ldi          TempA, high(RAMEND)
  137.         out          SPH,TempA
  138.         ldi          TempA, low(RAMEND)
  139.         out          SPL,TempA
  140.  
  141. ;***** WATCHDOG
  142.         wdr
  143.         ldi     tempA, (1<<WDE)|(1<<WDCE)
  144.         out     WDTCR, tempA
  145.         ldi     tempA, (1<<WDE)|(1<<WDCE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0) ;set TimeOut to 2.1s
  146.         out     WDTCR, tempA
  147.         wdr
  148.  
  149.        
  150. ;Mod by me     
  151.        
  152. ;***** set Ports
  153.  
  154.  
  155. ; PortA
  156. ;       clr    TempA                        ;clear TempA register 0x00
  157. ;       out        DDRA, TempA   ;DDRA
  158.        
  159. ;       ser        TempA                            ; TempA equals to 0xFF
  160. ;       out        PortA, TempA                ;DIP-Switches with pullup
  161.        
  162. ; PortB
  163. ;       ldi        TempA, 0b11001000   ;0,1=invers_chck 3=LED 4=ZC 6,7=OUT
  164. ;       out        DDRB, TempA
  165. ;       ldi        TempA, 0b11111011
  166. ;       out        PortB, TempA
  167.  
  168. ; PortC
  169. ;       ldi        TempA, 0b00000000   ;0,1=DIP-switches
  170. ;       out        DDRC, TempA
  171. ;       ldi        TempA, 0b00000011
  172. ;       out        PortC, TempA
  173.  
  174. ; PortD
  175. ;       ldi        TempA, 0b10000000   ;Cntrl-LED
  176. ;       out        DDRD, TempA
  177. ;       ldi        TempA, 0b10000100
  178. ;       out        PortD, TempA
  179.  
  180. ; PortE
  181.         ;*unused*
  182. ;--------------------------------------------------------------------------------------
  183.  
  184.         ; PA0, PA1  for NPN out and PA2 for PNP out instead of PB5 PB6 for NPN and PB7 for PNP
  185.        
  186. ; PortA  OK
  187.         clr     TempA                            ;clear TempA register
  188.         ldi          TempA, 0b11111110
  189.         out          DDRA, TempA      ;DDRA output except PA0 input
  190.         ldi          TempA, 0b11111111    ; PortA on
  191.         out          PortA, TempA  
  192.        
  193.        
  194.         ; PB0, PB1 i dont known (GROUNDED) PB3 ADC for heat check
  195.        
  196. ; PortB
  197.         ldi          TempA, 0b00000000    ;0,1=invers_chck 3=heat
  198.         out          DDRB, TempA      ;all input
  199.         ldi          TempA, 0b11110111  ; no pullup for ADC
  200.         out          PortB, TempA
  201.  
  202.         ; PortC DIP Switches 1 to 8
  203.        
  204. ; PortC OK
  205.         ldi          TempA, 0b00000000    
  206.         out          DDRC, TempA
  207.         ser          TempA                                ; TempA equals to 0xFF
  208.         out          PortC, TempA  ;DIP-Switches with pullup
  209.  
  210.        
  211.         ;PortD PD0 (RXD), PD1 (TXD),  PD2 (RDM) for data I/O,  PD7 for green led
  212. ; PortD  OK
  213.         ldi          TempA, 0b10000100    ;LED
  214.         out          DDRD, TempA
  215.         ldi          TempA, 0b10001000
  216.         out          PortD, TempA
  217.  
  218.         ;PortE  PE0 for Red led, PE1 DIP SWITCH 10 and PE2 DIP SWITCH 9
  219. ; PortE  OK
  220.         ldi          TempA, 0b00000001
  221.         out          DDRE, TempA
  222.         ldi          TempA, 0b00000110
  223.         out          PortE, TempA
  224.        
  225. ;Endmod
  226. ;------------------------------------------------------------------------------------------
  227.  
  228.        
  229.        
  230.        
  231.        
  232.         clr          ErrFlags
  233.  
  234.   EEread_target:                                ;get target board
  235.         sbic    EECR, EEWE
  236.         rjmp    EEread_target
  237.         clr          TempA
  238.         out          EEARH, TempA
  239.         ldi          TempA, 2
  240.         out          EEARL, TempA
  241.         sbi          EECR, EERE
  242.         in            TempA, EEDR
  243.                
  244.         cpi          TempA, 1
  245.         breq    init_trgt         ;old revision
  246.         cpi          TempA, 2
  247.         breq    new_board         ;new revision
  248.         rjmp    get_target
  249.    new_board:
  250.         sbr    ErrFlags, (1<<REV_5_2)
  251.    init_trgt:
  252.  
  253. ; Timers       
  254.         clr          TempA
  255.         out          TCCR1A, TempA
  256.         ldi     TempA, (1<<CS11)    ;set counter1 @clock/8 frequency
  257.         out     TCCR1B, TempA
  258.         ldi     TempA, (1<<CS02)    ;set counter0 @clock/256 frequency
  259.         out     TCCR0, TempA                               
  260.         ldi     TempA, (1<<TOIE0)   ;enable Timer0 overflow interrupt
  261.         out     TIMSK, TempA
  262.  
  263. ; SPI
  264.         clr          TempA
  265.         out          SPCR, TempA      ;disable SPI
  266.  
  267. ;ext interrupt 0 for phase zero-crossing control (just new boards!)
  268.         sbrs    ErrFlags, REV_5_2
  269.         rjmp    no_ext_int   ;old board
  270.        
  271.         ldi     TempA, (1<<ISC01)   ;falling edge
  272.         out     MCUCR, TempA
  273.         ldi          TempA, (1<<INT0)     ;activate
  274.         out     GICR, TempA                 ;              
  275.         ldi          TempA, (1<<INTF0)    ;clear interrupt0 flag
  276.         out     GIFR,  TempA
  277.  
  278. no_ext_int:
  279.                
  280. ;USART
  281.         ldi     TempA, 0x03   ;set USART to 250 kbaud @ 16Mhz
  282.         out  UBRRL, TempA
  283.         ldi  TempA, 0x00
  284.         out  UBRRH, TempA
  285.         ldi  TempA, (1<<URSEL)|(3<<UCSZ0)|(1<<USBS) ; 8n2
  286.         out  UCSRC, TempA               ;
  287.         in            TempA, UDR            ;clear Uart Receive Interrupt Flag
  288.         clr          TempA
  289.        out        UCSRA, TempA                ;clear all error flags, disable U2X and MPCM
  290.         clr     DmxState
  291.  
  292. ; MODE SELECT      
  293.         rcall   get_opmode
  294.         sbrc    ErrFlags, MANUAL
  295.         rjmp    init_1                        ;don't init in manual mode
  296.         ldi          TempA, (1<<RXCIE)|(1<<RXEN) ;enable Uart RX IRQ & Uart RXD in DMX mode
  297.         out          UCSRB, TempA
  298.    init_1:     
  299.         cbi     PortD, LED
  300.        
  301. ; set Register
  302.         ldi     MainFlags, (1<<DMXisSTANDBY)|(1<<isREADY)|(1<<doSPEED)|(1<<doBRIGHT)|(1<<doMODE)   
  303.         ldi     StroboHeatL, 5
  304.         clr          StroboHeatH
  305.         clr     HeatInc
  306.         clr     null
  307.         sts          SPEEDraw, null
  308.         sts          BRIGHTraw, null
  309.         sts          MODEraw,  null
  310.         ldi     TempA, 3
  311.         sts          ERRcode, TempA
  312.         ldi          TempA, 4
  313.         sts          ERRprescaler, TempA
  314.  
  315.         wdr
  316.  
  317.         wdr                                             ;Watchdog-Reset
  318.         sei
  319.  
  320. ;****************************** main (calculations) *****************************
  321.  
  322. main:
  323.                 sbrc    MainFlags, doSPEED    ;should calc new speed?
  324.                 rjmp    calc_speed
  325.                 sbrc   MainFlags, doBRIGHT                ;should calc new brightness?
  326.                 rjmp   calc_brightness
  327.                 sbrc    MainFlags, doMODE      ;should calc new mode?
  328.                 rjmp    calc_mode
  329.                 sbrc    MainFlags, doINDICATE       ;error indicator and heat cntrl (called by zc @10Hz)
  330.                 rjmp    indicate
  331.  
  332.                 sbrc    ErrFlags, REV_5_2
  333.                 rjmp    main                                        ;new boards need no polling
  334.                
  335.                 ;detect ZC !
  336.                 cli
  337.                 sbis    PinD,3                              ;ZC high?
  338.                 rjmp    check_zc                ;no
  339.                 sbr          ErrFlags, (1<<ZChigh)        ;yes  ->neg. half wave
  340.                 rjmp    exit_poll
  341.            check_zc:
  342.                 sbrs  ErrFlags, ZChigh  ;was high before and now low -> zc!!
  343.                 rjmp    exit_poll            ;no (pos. half wave)
  344.                 cbr          ErrFlags, (1<<ZChigh)        ;wait for next neg. half wave
  345.                 rcall   zero_crossing         ;ZC detected!!
  346.                 rjmp    main               
  347.            exit_poll:
  348.                 sei
  349.                 rjmp    main
  350.  
  351.  
  352. ;____________________________________________________________________________________
  353.  
  354.         calc_speed:
  355.                 cbr          MainFlags, (1<<doSPEED)
  356.  
  357.                 lds          TempA,  MODEclc
  358.                 cpi          TempA,  SINGLE_FLASH
  359.                 breq    create_flash
  360.                 cpi          TempA,  BLINDING_MODE
  361.                 breq    blinding_speed
  362.                 cpi          TempA,  RANDOM_MODE
  363.                 breq    random_speed
  364.  
  365.  
  366.    normal_speed: 
  367.                 lds          TempA,       SPEEDraw
  368.  
  369.                 cpi          TempA, 5                    ;val <= 5 -> stand by
  370.                 brsh    spd_1
  371.                 sbr          MainFlags, (1<<DMXisSTANDBY)
  372.                 rjmp    main
  373.            spd_1:
  374.                 subi TempA, 5    ;range: 0-250 (1-14Hz)
  375.                 ldi          ZH, high(flash_rate*2)
  376.                 ldi          ZL, low(flash_rate*2)
  377.                 add          ZL, TempA
  378.                 adc          ZH, null
  379.                 add          ZL, TempA
  380.                 adc          ZH, null
  381.                 lpm          TempA,  Z+            ;get flash rate
  382.                 lpm          TempB, Z
  383.      spd_finish:
  384.                 inc        TempB
  385.                 neg          TempA                                        ;clc T0 offset
  386.                 cli                                        ;atomic operation
  387.                 sts          SPEEDclcL, TempA
  388.                 sts          SPEEDclcH, TempB
  389.                 cp            TempB, TCNT0H   ;soft speed blending
  390.                 brsh    spd_f1
  391.                 mov          TCNT0H, TempB                        ;atomic write   
  392.                 out          TCNT0, TempA
  393.            spd_f1:
  394.             sei
  395.                 cbr          MainFlags, (1<<DMXisSTANDBY)        
  396.                 rjmp    main
  397.  
  398.        
  399.         create_flash:
  400.                 lds          TempA,  SPEEDraw
  401.                 cpi          TempA,  128
  402.                 brsh    rq_flash
  403.                 sbr          MainFlags, (1<<wasLOW)
  404.                 rjmp    main
  405.            rq_flash:
  406.                 sbrs MainFlags, wasLOW                ;flash only, when ch was low before!
  407.                 rjmp    main
  408.                 cbr          MainFlags, (1<<wasLOW)
  409.                 sbr          MainFlags, (1<<doFlash)
  410.                 rjmp    main
  411.  
  412.        
  413.         random_speed:                        ;use SPEEDraw in TimerISR
  414.                 lds          TempA,       SPEEDraw
  415.                 cpi          TempA, 5                              ;val <= 5 -> stand by
  416.                 brsh    rnd_1
  417.                 sbr          MainFlags, (1<<DMXisSTANDBY)
  418.                 rjmp    main
  419.        rnd_1:
  420.                 ldi          TempB,  high(3700)
  421.                 ldi          TempA, low(3700)                    ;use ~16.8Hz as base freq in random mode
  422.                 rjmp    spd_finish
  423.  
  424.  
  425.         blinding_speed:
  426.                 lds          TempA,  SPEEDraw
  427.                 cpi          TempA,  64
  428.                 brsh    bs_1
  429.                 sbr          MainFlags, (1<<DMXisSTANDBY) ;shut down
  430.                 rjmp    main
  431.            bs_1:
  432.             cpi  TempA,  96
  433.                 brsh    bs_2
  434.                 ldi          TempB,  high(4464)            ;14Hz
  435.                 ldi          TempA, low(4464)
  436.                 rjmp    spd_finish 
  437.                
  438.            bs_2:
  439.             cpi  TempA,  128
  440.                 brsh    bs_3
  441.                 ldi          TempB,  high(4167)
  442.                 ldi          TempA, low(4167)                    ;15Hz
  443.                 rjmp    spd_finish
  444.                
  445.            bs_3:
  446.             cpi  TempA,  160
  447.                 brsh    bs_4
  448.                 ldi          TempB,  high(3906)
  449.                 ldi          TempA, low(3906)                    ;16.6Hz
  450.                 rjmp    spd_finish
  451.                
  452.            bs_4:
  453.             cpi  TempA,  192
  454.                 brsh    bs_5
  455.                 ldi          TempB,  high(3125)
  456.                 ldi          TempA, low(3125)                    ;20Hz
  457.                 rjmp    spd_finish
  458.                
  459.            bs_5:
  460.             cpi  TempA,  224
  461.                 brsh    bs_6
  462.                 ldi    TempB,  high(2500)
  463.                 ldi          TempA, low(2500)                    ;25Hz
  464.                 rjmp    spd_finish
  465.             
  466.        bs_6:
  467.                 ldi          TempB,  high(1250)
  468.                 ldi          TempA, low(1250)                    ;50Hz
  469.                 rjmp    spd_finish
  470.             
  471. ;___________________________________________________________________________________________________
  472.                                                                                
  473.         calc_brightness:
  474.                 cbr          MainFlags, (1<<doBRIGHT)
  475.                 rcall   calc_heatInc                     ;calc new inc val. for heat simulation
  476.  
  477.                 lds          TempA, BRIGHTraw
  478.                 cpi          TempA, 5                    ;val <= 5 -> stand by
  479.                 brsh    brt_1
  480.                 sbr          ErrFlags, (1<<XOP_OFF)       ;standby if <5
  481.                 rjmp    main
  482.            brt_1:
  483.                 cbr          ErrFlags, (1<<XOP_OFF)
  484.                 ldi    ZH, high(firing_curve*2);set pointer to base address
  485.                 ldi          ZL, low(firing_curve*2)
  486.                 add          ZL, TempA
  487.                 adc          ZH, null
  488.                 add          ZL, TempA
  489.                 adc          ZH, null
  490.                 lpm          TempA, Z+                ;load brightness
  491.                 lpm          TempB, Z               
  492.  
  493.                 cli                                        ;atomic operation
  494.                 sts          FIREclcL, TempA                 
  495.                 sts          FIREclcH, TempB
  496.  
  497.                 ldi          TempC, high(ONTIME)    ;calc quench time
  498.                 mov          TempD, TempC
  499.                 ldi          TempC, low(ONTIME)
  500.                 add          TempA, TempC
  501.                 adc          TempB, TempD
  502.                 sts          QUENCHclcL, TempA
  503.                 sts          QUENCHclcH, TempB
  504.                 sei     
  505.                 rjmp    main
  506.  
  507.  
  508.         calc_heatInc:
  509.                 lds          TempA, BRIGHTraw
  510.                 swap    TempA
  511.                 lsr          TempA
  512.                 lsr          TempA
  513.                 andi    TempA, 0b00000011
  514.                 inc          TempA
  515.                 inc          TempA
  516.                 mov     HeatInc,        TempA
  517.                 ret
  518.  
  519. ;_______________________________________________________________________________
  520.  
  521.         calc_mode:
  522.                 cbr          MainFlags, (1<<doMODE)
  523.  
  524.                 lds          TempA, MODEraw
  525.                 cpi          TempA, 200
  526.                 brsh    synchronize
  527.                 cpi          TempA, 150
  528.                 brsh    single
  529.                 cpi          TempA, 100
  530.                 brsh    random
  531.                 cpi          TempA, 50
  532.                 brsh    blinder
  533.                 ldi          TempB, NORMAL_MODE            ;0-63 -> normal mode
  534.                 rjmp    mode_finish
  535.            random:
  536.                 sts          RANDSEED, TempA                              ;use raw mode val as new random seed
  537.             ldi  TempB, RANDOM_MODE
  538.                 rjmp    mode_finish
  539.            blinder:
  540.             ldi  TempB, BLINDING_MODE               ;64-127 -> Blinder
  541.                 rjmp    mode_finish
  542.            single:
  543.             ldi  TempB, SINGLE_FLASH                        ;128-190 -> single flash
  544.                 sbr          MainFlags, (1<<DMXisSTANDBY) ;disable T0-speed
  545.                 rjmp    mode_finish
  546.            synchronize:        ;192-255 -> sync multiple Strobos
  547.                 ldi          TempB, SYNC_MODE
  548.  
  549.            mode_finish:
  550.             lds  TempA, MODEclc
  551.                 cp            TempA, TempB
  552.                 breq    mode_exit
  553.             sts  MODEclc, TempB
  554.                 cpi          TempB, SYNC_MODE
  555.                 breq    mode_sync
  556.                 sbr          MainFlags, (1<<doSPEED)                  ;eval new speeds
  557.            mode_exit:
  558.                 rjmp    main
  559.                
  560.        mode_sync:
  561.                 ldi          TempA, 1
  562.                 cli
  563.                 mov          TCNT0H,TempA     ;force instant flash (and get in defined state)
  564.                 ser          TempA
  565.                 out          TCNT0, TempA
  566.                 sei
  567.                 rjmp    main
  568.  
  569.        
  570. ;_______________________________________________________________________________
  571.  
  572.         indicate:
  573.                 cbr          MainFlags, (1<<doINDICATE)
  574.                
  575.                 ldi          TempA, 200                  ;check restart point
  576.                 cp            StroboHeatL, TempA
  577.                 cpc          StroboHeatH, null
  578.                 brlo    ind_go
  579.                 cpi          StroboHeatH, 2                                   ;check shut down point
  580.                 brsh    ind_stop
  581.           ind_ret:
  582.                 ldi      TempA, 3
  583.                 cp        StroboHeatL, TempA
  584.                 cpc          StroboHeatH, null
  585.                 brlo    ind_1                                          
  586.                 sub          StroboHeatL, TempA
  587.                 sbc          StroboHeatH, null
  588.                                
  589.            ind_1:
  590.            ;ErrorLED
  591.                 lds          TempA, ERRcode
  592.                 
  593.                 sbi     PortD, LED
  594.                 sbrc    TempA, 0            ;if 1st bit HI
  595.                 cbi    PortD, LED
  596.  
  597.             lsr         TempA
  598.                 cpi          TempA, 1
  599.                 brne    no_ind      
  600.                        
  601.         ;wenn durchrotiert (ERRpos = 0)
  602.                 ldi          TempA, 0b10000000                ;load empty pattern
  603.                 sbic    UCSRB, RXEN                                         ;if manual mode -> no DMX indication       
  604.                 sbrc    ErrFlags, VALID_DMX
  605.                 rjmp    dmx_ok
  606.                 ldi          TempA, 0b10000101            ;load specific error codes
  607.                 sbrs    ErrFlags, SIGNAL_COMING
  608.                 ldi          TempA, 0b10000001
  609.                 rjmp    dmx_nok
  610.            dmx_ok:
  611.             wdr          ;reset watchdog
  612.            dmx_nok:
  613.                 sbrc    ErrFlags, OVERHEAT
  614.                 ser          TempA
  615.                 cbr     ErrFlags, (1<<VALID_DMX)|(1<<SIGNAL_COMING)
  616.  
  617.            no_ind:
  618.                 sts          ERRcode, TempA
  619.                 rjmp main                              
  620.  
  621.            ind_go:                                   
  622.                 sbrc ErrFlags, OVERHEAT
  623.                 cbr          MainFlags, (1<<doFlash)                  ;cancel flash request if restart
  624.                 cbr          ErrFlags, (1<<OVERHEAT)           ;strobo is ready again
  625.                 rjmp    ind_ret
  626.            ind_stop:
  627.                 sbr    ErrFlags, (1<<OVERHEAT)     ;strobo is too hot -> shut down
  628.                 rjmp    ind_ret
  629.  
  630. ;________________________________________________________________________________
  631.  
  632.         global_mode:
  633.                 ;MANUAL/DMX-SELECT
  634.             rcall       get_opmode                              ;get current operating mode
  635.                 sbrc    ErrFlags, MANUAL                ;manual mode selected?
  636.                 rjmp    man_mode                        ; yes
  637.                 sbic    UCSRB, RXEN                                          ;new in DMX mode?
  638.                 ret                                                  ; no
  639.                 ldi          TempA, (1<<RXCIE)|(1<<RXEN)  ;enable Uart RX IRQ & Uart RXD
  640.                 out          UCSRB, TempA
  641.                 ret
  642.                                
  643.           man_mode:
  644.                 out      UCSRB, null                                                ;disable USART
  645.  
  646.                 ;CHOOSE PARAMETERS
  647.                 rcall   get_address
  648.                 lds          TempB, MODEraw
  649.                 cp            TempB, XL                          ;have DIP settings changed?
  650.                 breq    exit_man                     ;no...
  651.                 sts          MODEraw, XL            ;save new val
  652.                 mov          TempB, XL
  653.  
  654. ;       (->Speed)
  655.                 andi    TempB, 0b00001111            ;mask lower nibble
  656.  
  657.                 cpi          TempB, 0
  658.                 breq    man_single_flash
  659.                 cpi          TempB, 15
  660.                 breq    man_blind
  661.                 inc          TempB
  662.                 push    TempC
  663.                 ldi          TempC, 16
  664.                 mul          TempB, TempC     ;expand val
  665.                 pop          TempC
  666.                 mov          TempB, r0
  667.                 subi    TempB, -10            ;max speed
  668.                 sts          SPEEDraw, TempB                              ;store new val       
  669.                 sbr          MainFlags, (1<<doSpeed)           ;calc new speed in main
  670.                 rjmp    dimm_man
  671.                
  672.            man_single_flash:
  673.             sbr  MainFlags, (1<<doFlash)|(1<<DMXisStandBy) ;request flash
  674.                 rjmp    dimm_man
  675.  
  676.            man_blind:
  677.                 ldi    TempB,  (high(2500) +1)
  678.                 mov          TCNT0H, TempB
  679.                 ldi          TempB, low(2500)                    ;25Hz
  680.                 neg          TempB                                                        ;clc T0 offset
  681.                 cli
  682.                 sts          SPEEDclcL, TempB
  683.                 sts          SPEEDclcH, TCNT0H   
  684.                 out          TCNT0, null
  685.                 sei
  686.                 cbr          MainFlags, (1<<DMXisSTANDBY) 
  687.                                
  688. ;   (->Brightness)
  689.            dimm_man:
  690.             andi        XL, 0b11110000          ;mask higher nibble
  691.                 subi    XL, -10                                   ;prevent black out
  692.                 sts          BRIGHTraw, XL                                     ;store new val       
  693.                 sbr          MainFlags, (1<<doBright)         ;calc new brightness in main
  694.                
  695.            exit_man:
  696.                 ret     
  697.  
  698.  
  699. ;****************************** Fire Timing *************************************
  700.  
  701. fire:            
  702.                 cbi          PortA,       Strobo                                ;FIRE!
  703.                 reti
  704.  
  705.  
  706. quench:
  707.                 in      SREG_buf, SREG
  708.                 push    TempA
  709.  
  710.                 sbi          PortA,       Strobo                                ;quench
  711.  
  712.                 in            TempA,   TIMSK                                ;disable interrupt
  713.                 cbr          TempA,   (1<<OCIE1A)|(1<<OCIE1B)
  714.                 out          TIMSK,        TempA 
  715.    
  716.                 sbr          MainFlags, (1<<isREADY)            ;Ready...
  717.        
  718.                 pop          TempA
  719.                 out     SREG, SREG_buf 
  720.                 reti
  721.  
  722.  
  723. ;****************************** zero crossing ***********************************
  724.  
  725. zero_crossing:
  726.                 in      SREG_buf, SREG
  727.                 push    TempA
  728.                 push    TempB
  729.  
  730.                 sbrs    MainFlags, doFLASH      ;flash request?
  731.                 rjmp    exit_zc                     ; no...
  732.                 ;set up new flash
  733.                 sbrc    ErrFlags, OVERHEAT    ;is strobo too hot?
  734.                 rjmp    exit_zc                              ; no...
  735.                 sbrs    MainFlags, isREADY    ;is strobo ready to fire?
  736.                 rjmp    exit_zc                              ; no...
  737.  
  738.                 cbr          MainFlags, (1<<doFlash)|(1<<isREADY) ;quit flags
  739.  
  740.                 add          StroboHeatL, HeatInc                ;increase heat!
  741.                 adc          StroboHeatH, null
  742.  
  743.                 lds          TempB,        FIREclcH               ;set firing angle
  744.                 lds          TempA,   FIREclcL
  745.                 out          OCR1AH,  TempB       
  746.                 out          OCR1AL,  TempA
  747.  
  748.                 lds          TempB,        QUENCHclcH         ;set quench angle
  749.                 lds          TempA,   QUENCHclcL
  750.                 out          OCR1BH,  TempB
  751.                 out          OCR1BL,  TempA
  752.  
  753.                 out          TCNT1H,  null                                ;clear counter
  754.                 out          TCNT1L,  null
  755.  
  756.                 in            TempB,   TIFR    ;clear irq flags
  757.                 sbr          TempB,   (1<<OCF1A)|(1<<OCF1B)
  758.                 out          TIFR,    TempB
  759.  
  760.                 in            TempB,   TIMSK                                ;enable interrupts
  761.                 sbr          TempB,   (1<<OCIE1A)|(1<<OCIE1B)
  762.                 out          TIMSK,        TempB
  763.  
  764.         exit_zc:
  765.                 lds          TempB,        ERRprescaler
  766.                 dec          TempB
  767.                 brne    zc_finish
  768.                 sbr          MainFlags, (1<<doINDICATE)   ;error indicator and heat cntrl
  769.                 ldi          TempB, 4                         ;10Hz
  770.                 zc_finish:
  771.                 sts          ERRprescaler, TempB
  772.                 rcall   global_mode                                        ;has global mode changed?
  773.                 pop          TempB
  774.                 pop          TempA
  775.                 out     SREG, SREG_buf 
  776.                 reti
  777.  
  778. ;****************************** DMX-Flashrate ***********************************
  779. dmx_flash:
  780.                 in      SREG_buf, SREG
  781.                 push    ZH
  782.                 push    ZL
  783.                 push    TempB
  784.        
  785.                 dec          TCNT0H                                   ; decrement counter extension
  786.                 brne    exit_dflash
  787.                
  788.                 lds          TempB, SPEEDclcL          ; set nxt flash time
  789.                 out          TCNT0, TempB
  790.                 lds          TCNT0H, SPEEDclcH
  791.                
  792.                 sbrc    MainFlags, DMXisSTANDBY     ; if standby -> no flash
  793.                 rjmp    exit_dflash
  794.                
  795.                 lds          TempB, MODEclc
  796.                 cpi          TempB, RANDOM_MODE
  797.                 brne    req_dflash        ; request flash if not in random mode
  798.                
  799.                
  800.                 ldi          ZH, high(random_table*2);set pointer to base address
  801.                 lds          ZL, RANDSEED
  802.                 lpm          TempB, Z+                ;load brightness
  803.                 sts          RANDSEED, ZL
  804.                
  805.                 lds          ZL, SPEEDraw 
  806.                 lsr          ZL      
  807.                 cp            ZL, TempB
  808.                 brlo    exit_dflash 
  809.  
  810.     req_dflash:
  811.                 sbrs    ErrFlags, XOP_OFF
  812.                 sbr          MainFlags, (1<<doFlash)      ; flash request
  813.  
  814.         exit_dflash:
  815.                 pop          TempB
  816.                 pop          ZL
  817.                 pop          ZH
  818.                 out     SREG, SREG_buf 
  819.                 reti
  820.  
  821.                
  822. ;****************************** Empfang *****************************************
  823.  
  824. get_byte:
  825.                 in      SREG_buf, SREG
  826.                 push    TempA
  827.                 push    TempB
  828.                
  829.                 in            TempA, UCSRA
  830.                 in            TempB, UDR
  831.                
  832.                 sbr     ErrFlags, (1<<SIGNAL_COMING);message for indicator...              
  833.  
  834.                 sbrc    TempA,DOR            ;check for overrun -> wait for reset
  835.                 rjmp    overrun     
  836.  
  837.                 sbrc    TempA, FE            ;check 1st stop bit
  838.                 rjmp    gb_break
  839.                
  840.                 cpi          DmxState, 1               ;check for startbyte (else frame error -> reset)
  841.                 breq    startbyte   
  842.  
  843.                 cpi     DmxState, 2             ;check for start adress
  844.                 breq    startadr
  845.  
  846.                 cpi     DmxState, 3               
  847.               breq  get_speed
  848.  
  849.                 cpi          DmxState, 4
  850.                 breq    get_brightness
  851.  
  852.                 cpi          DmxState, 5
  853.                 breq    get_mode
  854.  
  855.                 clr          DmxState                    ;wait for break
  856.         exit_dmx_receive:       
  857.                 pop          TempB
  858.                 pop          TempA
  859.                 out     SREG, SREG_buf 
  860.                 reti       
  861.  
  862.         startbyte:
  863.                 tst     TempB                                ;if null, then Startbyte
  864.                 brne    overrun
  865.                
  866.                 inc     DmxState         ;next -> start address
  867.                
  868.                 rcall   get_address                                ;read start address
  869.           
  870.                 cp            XL, null                        ;Startadresse = 0 is nich!
  871.                 cpc     XH, null
  872.                 brne    exit_dmx_receive   
  873.        
  874.             clr  DmxState                   ;quit receive routine
  875.                 sts          BRIGHTraw, null                ;set brightness to null
  876.                 sbr          MainFlags, (1<<doBRIGHT) ;calc new speed in main          
  877.             rjmp        exit_dmx_receive
  878.  
  879.         startadr:
  880.                 sbiw    XH:XL, 1
  881.                 brne    exit_dmx_receive
  882.                 inc     DmxState               ;next-> Byte-Evaluation
  883.  
  884.         get_speed:
  885.                 inc     DmxState                ;next channel
  886.                 lds     TempA, SPEEDraw                ;load saved speed
  887.                 cp            TempA, TempB     ;has changed?
  888.                 breq    exit_dmx_receive
  889.                 sts          SPEEDraw, TempB          ;store new val     
  890.                 sbr          MainFlags, (1<<doSpeed) ;calc new speed in main     
  891.                 rjmp    exit_dmx_receive
  892.        
  893.         get_brightness:
  894.                 inc     DmxState                ;next channel
  895.                 lds     TempA, BRIGHTraw              ;load saved brightness
  896.                 cp            TempA, TempB     ;has changed?
  897.                 breq    exit_dmx_receive
  898.                 sts          BRIGHTraw, TempB         ;store new val     
  899.                 sbr          MainFlags, (1<<doBRIGHT) ;calc new brightness in main
  900.                 rjmp    exit_dmx_receive
  901.  
  902.         get_mode:
  903.                 clr          DmxState
  904.                 sbr     ErrFlags, (1<<VALID_DMX);message for indicator...
  905.                 lds          TempA, MODEraw
  906.                 cp            TempA, TempB
  907.                 breq    exit_dmx_receive
  908.                 sts          MODEraw, TempB            ;store new val
  909.                 sbr          MainFlags, (1<<doMODE)       ;calc new mode in main
  910.                 rjmp    exit_dmx_receive
  911.                
  912.         gb_break:
  913.                 cbi          UCSRA,FE                    ;clear frame-error flag
  914.                 tst          TempB                                        ;byte must be zero (88µs LO)
  915.                 brne    gb_break1
  916.                 ldi    DmxState, 1                                ;next -> control of start byte
  917.            gb_break1:
  918.                 rjmp    exit_dmx_receive
  919.  
  920.         overrun:
  921.                 clr    DmxState            ;wait for framing error
  922.                 cbi          UCSRA,DOR                ;clear overrun flag !!
  923.                 rjmp    exit_dmx_receive
  924.                
  925.  
  926. ;****************************** DIP states ****************************************
  927. get_address:
  928.                 cli                                        ;atomic operation
  929.                 sbic    PinB, PB0            ;this bridge is open in inverted strobes!
  930.                 rjmp    ga_invert            ;get inverted start address
  931.                 in           XL, PinC                    ;Einlesen der Startadresse      
  932.                 com          XL                  ;Invertierung
  933.                 clr          XH
  934.                 sbis    PinE, PE2            ;9.address bit
  935.                 inc          XH
  936.                 reti
  937.           ga_invert:
  938.                 clr        XH
  939.                 clr          XL
  940.                 sbis    PinC,PC1                ;9th bit
  941.                 inc          XH
  942.                 sbis    PinC,PC2
  943.                 sbr          XL, (1<<7)
  944.                 sbis    PinC,PC3
  945.                 sbr          XL, (1<<6)
  946.                 sbis    PinC,PC4
  947.                 sbr          XL, (1<<5)
  948.                 sbis    PinC,PC5
  949.                 sbr          XL, (1<<4)
  950.                 sbis    PinC,PC6
  951.                 sbr          XL, (1<<3)
  952.                 sbis    PinC,PC7
  953.                 sbr          XL, (1<<2)
  954.                 sbis    PinE,PE2
  955.                 sbr          XL, (1<<1)
  956.                 sbis    PinE,PE1
  957.                 sbr          XL, (1<<0)      
  958.                 reti
  959.  
  960.  
  961. get_opmode:                                        ;operating mode
  962.                 cli                                        ;atomic operation
  963.                 cbr          ErrFlags, (1<<MANUAL)       
  964.                 sbic    PinB, PB0            ;this bridge is open in inverted strobes!
  965.                 rjmp    gopm_invert    ;get inverted start address
  966.                 sbis    PinE, PE1
  967.                 sbr          ErrFlags, (1<<MANUAL)
  968.                 reti
  969.       gopm_invert:
  970.                 sbis  PinC, PC0
  971.                 sbr          ErrFlags, (1<<MANUAL)
  972.                 reti
  973.                
  974.  
  975.  
  976. ;****************************** check Revision *****************************************
  977.  
  978. .equ poll_HI  =0;
  979. .equ irq_HI   =1;
  980.  
  981. get_target:
  982.                 clr     R20
  983.                 ldi     R18, 50       
  984.                 ldi     R19, 50
  985.  
  986.         gt_loop:                               
  987.                ldi    R16, $FF          ; make 16Hz flashing
  988.   trgt1:ldi     R17, $C4
  989.   trgt2:                                                  ; chck zc-source
  990.         sbis     PinB, 4                         ; Poll pin HI?
  991.                 rjmp    poll_low
  992.                 sbr     R20, (1<<poll_HI)
  993.        ret_poll:
  994.                 sbis    PinD, 3                    ; irq pin HI?
  995.                 rjmp    irq_low
  996.                 sbr     R20, (1<<irq_HI)
  997.            ret_irq:
  998.         dec         R17
  999.         brne    trgt2
  1000.                 wdr
  1001.         dec     R16
  1002.         brne    trgt1
  1003.          
  1004.  
  1005.                 sbis    PortD,LED        ;blink
  1006.                 rjmp    trgt_off
  1007.                 cbi          PortD,LED
  1008.                 cbi          PortE,CNTRL_LED
  1009.                 rjmp    gt_loop
  1010.            trgt_off:
  1011.                 sbi     PortD,LED
  1012.                 sbi          PortE,CNTRL_LED
  1013.                 rjmp    gt_loop
  1014.                
  1015.                 poll_low:
  1016.             sbrs        R20, poll_HI
  1017.                 rjmp    ret_poll
  1018.                 cbr          R20, (1<<poll_HI)    ; zc happened
  1019.                 dec          R18          ; dec poll zc counter
  1020.                 brne    ret_poll
  1021.                 ldi          TempA, 1
  1022.                 rjmp    TARGETwrite   ; old board detected
  1023.  
  1024.                 irq_low:
  1025.                 sbrs    R20, irq_HI
  1026.                 rjmp    ret_irq
  1027.                 cbr          R20, (1<<irq_HI)     ; zc happened
  1028.                 dec          R19          ; dec irq zc counter
  1029.                 brne    ret_irq
  1030.                 ldi          TempA, 2               ; new board detected
  1031.  
  1032.            TARGETwrite:
  1033.                 sbic    EECR, EEWE
  1034.                 rjmp    TARGETwrite
  1035.                 clr          TempB
  1036.                 out          EEARH, TempB
  1037.                 ldi          TempB, 2
  1038.                 out          EEARL, TempB
  1039.                 out          EEDR, TempA
  1040.                 sbi          EECR, EEMWE
  1041.                 sbi          EECR, EEWE
  1042.                
  1043.                 rjmp    reset
  1044.  
  1045.           
  1046.  
  1047.  
  1048. nix: rjmp nix
  1049.  
  1050.  
  1051. firing_curve:                              ;firing table for linearization of brightness
  1052. .dw 17963, 17625, 17395, 17215, 17066, 16936, 16821, 16716, 16621, 16533, 16450, 16372, 16299, 16230, 16163, 16100
  1053. .dw 16039, 15981, 15924, 15870, 15817, 15766, 15717, 15668, 15621, 15576, 15531, 15487, 15445, 15403, 15362, 15322
  1054. .dw 15283, 15244, 15206, 15169, 15132, 15096, 15060, 15025, 14991, 14957, 14923, 14890, 14858, 14825, 14793, 14762
  1055. .dw 14731, 14700, 14670, 14640, 14610, 14580, 14551, 14522, 14494, 14465, 14437, 14409, 14382, 14354, 14327, 14300
  1056. .dw 14273, 14247, 14220, 14194, 14168, 14142, 14117, 14091, 14066, 14041, 14016, 13991, 13966, 13942, 13918, 13893
  1057. .dw 13869, 13845, 13821, 13798, 13774, 13750, 13727, 13704, 13680, 13657, 13634, 13611, 13589, 13566, 13543, 13521
  1058. .dw 13498, 13476, 13454, 13431, 13409, 13387, 13365, 13343, 13321, 13299, 13278, 13256, 13234, 13213, 13191, 13170
  1059. .dw 13148, 13127, 13106, 13084, 13063, 13042, 13021, 13000, 12979, 12957, 12936, 12915, 12895, 12874, 12853, 12832
  1060. .dw 12811, 12790, 12769, 12749, 12728, 12707, 12686, 12666, 12645, 12624, 12603, 12583, 12562, 12541, 12521, 12500
  1061. .dw 12479, 12459, 12438, 12417, 12397, 12376, 12355, 12334, 12314, 12293, 12272, 12251, 12231, 12210, 12189, 12168
  1062. .dw 12147, 12126, 12105, 12084, 12063, 12042, 12021, 12000, 11979, 11958, 11937, 11915, 11894, 11873, 11851, 11830
  1063. .dw 11808, 11787, 11765, 11743, 11721, 11700, 11678, 11656, 11633, 11611, 11589, 11567, 11544, 11522, 11499, 11476
  1064. .dw 11454, 11431, 11408, 11385, 11361, 11338, 11314, 11291, 11267, 11243, 11219, 11195, 11170, 11146, 11121, 11096
  1065. .dw 11071, 11046, 11020, 10995, 10969, 10943, 10916, 10890, 10863, 10836, 10808, 10781, 10753, 10724, 10696, 10667
  1066. .dw 10637, 10608, 10577, 10547, 10516, 10484, 10452, 10419, 10386, 10352, 10317, 10282, 10246, 10209, 10171, 10132
  1067. .dw 10092, 10050, 10007, 9963991798699818976597099648958295109428933092048900
  1068.  
  1069. flash_rate:                              ;table for speeds in normal mode
  1070. .dw 64592, 60094, 56479, 53480, 50932, 48729, 46794, 45076, 43534, 42139, 40868, 39703, 38629, 37634, 36708, 35844
  1071. .dw 35034, 34272, 33555, 32877, 32234, 31624, 31044, 30492, 29964, 29459, 28976, 28513, 28068, 27640, 27229, 26832
  1072. .dw 26449, 26080, 25723, 25378, 25044, 24720, 24406, 24102, 23806, 23519, 23240, 22968, 22704, 22446, 22195, 21951
  1073. .dw 21712, 21480, 21252, 21031, 20814, 20602, 20395, 20192, 19994, 19800, 19610, 19423, 19241, 19062, 18887, 18715
  1074. .dw 18546, 18380, 18218, 18058, 17901, 17747, 17596, 17447, 17301, 17158, 17016, 16877, 16740, 16606, 16473, 16343
  1075. .dw 16214, 16088, 15963, 15840, 15720, 15600, 15483, 15367, 15253, 15140, 15029, 14920, 14812, 14705, 14600, 14496
  1076. .dw 14393, 14292, 14192, 14093, 13996, 13900, 13805, 13711, 13618, 13526, 13436, 13346, 13257, 13170, 13083, 12998
  1077. .dw 12913, 12830, 12747, 12665, 12584, 12504, 12425, 12346, 12269, 12192, 12116, 12041, 11966, 11892, 11819, 11747
  1078. .dw 11675, 11605, 11534, 11465, 11396, 11328, 11260, 11193, 11127, 11061, 10996, 10932, 10868, 10804, 10741, 10679
  1079. .dw 10618, 10556, 10496, 10436, 10376, 10317, 10258, 10200, 10142, 10085, 10029, 99729917986198069752
  1080. .dw 9698964495919538948694349382933192809230918091309081903289838935
  1081. .dw 8887884087938746869986538607856185168471842783828338829582518208
  1082. .dw 8165812280808038799679557914787378327791775177117672763275937554
  1083. .dw 7515747774387400736373257288725172147177714071047068703269976961
  1084. .dw 6926689168566821678767536719668566516617658465516518648564536420
  1085. .dw 638863566324629262606229619861676136610560746044
  1086.  
  1087. .org 0x500
  1088. random_table:
  1089. .db 0x18,   0xC7,   0x0B,   0xF6,   0xFF,   0xB0,   0xAF,   0x2E
  1090. .db 0x2D,   0xF7,   0xB1,   0xE2,   0x20,   0x26,   0x45,   0x08
  1091. .db 0x53,   0xE6,   0x3D,   0xB3,   0xD4,   0x16,   0xD1,   0xCF
  1092. .db 0x34,   0x1B,   0x9F,   0x13,   0x76,   0xF0,   0x31,   0x4C
  1093. .db 0x9B,   0x3F,   0x50,   0x01,   0xF4,   0xBB,   0x6D,   0x75
  1094. .db 0xDA,   0x69,   0xB4,   0x60,   0x63,   0x3C,   0x3A,   0x12
  1095. .db 0xCA,   0xD2,   0x55,   0x6B,   0xFD,   0xB2,   0x7D,   0xD5
  1096. .db 0x57,   0x27,   0xE7,   0x82,   0xC9,   0x9D,   0x58,   0xF5
  1097. .db 0x5F,   0x4D,   0x38,   0xC5,   0xE4,   0x1D,   0xE3,   0xC1
  1098. .db 0x54,   0x89,   0x8B,   0x0E,   0xFB,   0x05,   0xA7,   0xF3
  1099. .db 0x1F,   0x62,   0x7E,   0x2B,   0xA6,   0x39,   0x0C,   0xE8
  1100. .db 0xAB,   0x11,   0x03,   0x36,   0x72,   0x49,   0xBF,   0x41
  1101. .db 0x59,   0xDD,   0xDB,   0x6A,   0x98,   0x30,   0xF1,   0x42
  1102. .db 0x52,   0x99,   0x61,   0xA4,   0xBD,   0xB5,   0x2F,   0x0F
  1103. .db 0x33,   0xF9,   0x28,   0x92,   0x77,   0x90,   0x3B,   0x04
  1104. .db 0xD9,   0x15,   0xB8,   0x44,   0xE9,   0x7F,   0xDF,   0xD3
  1105. .db 0x94,   0x81,   0x6E,   0x24,   0xAC,   0xFC,   0x2C,   0xA9
  1106. .db 0x46,   0xDE,   0x65,   0x19,   0x9E,   0x4F,   0xA1,   0x8C
  1107. .db 0xD6,   0xEE,   0xB7,   0xC6,   0x95,   0x85,   0x79,   0x96
  1108. .db 0x43,   0x29,   0x3E,   0x86,   0x5D,   0xFE,   0x51,   0x7A
  1109. .db 0xEC,   0x0A,   0xC3,   0x67,   0xC2,   0xEF,   0xE0,   0x2A
  1110. .db 0x6F,   0xB6,   0x91,   0x47,   0xD0,   0xA8,   0x74,   0x02
  1111. .db 0x87,   0x9C,   0xDC,   0xA2,   0xB9,   0xBA,   0x09,   0x14
  1112. .db 0xCC,   0x7B,   0xAE,   0x70,   0xD7,   0xC0,   0xE5,   0xD8
  1113. .db 0x83,   0x7C,   0x07,   0xF8,   0x71,   0x48,   0x0D,   0x78
  1114. .db 0x1C,   0xAA,   0x97,   0xA0,   0x23,   0xBC,   0x73,   0x1E
  1115. .db 0xF2,   0x93,   0x10,   0xC4,   0x37,   0x56,   0x8D,   0x22
  1116. .db 0x4E,   0xAD,   0x5E,   0x5C,   0x35,   0x9A,   0xED,   0xBE
  1117. .db 0x84,   0xA5,   0xA3,   0xCE,   0x5B,   0x66,   0x06,   0x1A
  1118. .db 0x5A,   0x4B,   0x8A,   0xCD,   0x64,   0xEA,   0x17,   0xC8
  1119. .db 0x8F,   0x8E,   0x88,   0xEB,   0x21,   0x68,   0x4A,   0x32
  1120. .db 0x6C,   0xCB,   0x25,   0x40,   0xFA,   0x80,   0xE1,   0x00
  1121.  
  1122. .org 0x580
  1123. .db "Henne's Sites [www.hoelscher-hi.de] "
  1124. .db "Revision 2.6  "
  1125. .db "GPL Freeware  "
A hozzászólás módosítva: Aug 12, 2016
(#) kapu48 válasza Szabi1 hozzászólására (») Aug 12, 2016 / 1
 
Nem is kell messzire menned:
AVR Assembly kezdőknek
(#) gabi20 válasza Szabi1 hozzászólására (») Aug 12, 2016 / 1
 
Szia 8MHz kristállyal így nem fog működni, vagy szerzel egy 16-osat, vagy módosítanod kell az UBRRL értékét a kódban. Ezzel van beállítva a komunikációs sebesség. Ha jól látom 250kbps sebességgel működik az UART, ha 8MHz-ről akarod járatni, az UBRRL értékét 3-ról írd át 1-re.
A hozzászólás módosítva: Aug 12, 2016
(#) Szabi1 válasza gabi20 hozzászólására (») Aug 12, 2016 /
 
Még volna egy kis problémám: A zöld led (PortE0) állandóan ég. De csak akkor szeretném ha pislogna, ha UART-on kap jelet, és amiatt változtatni kell neki a speed-en vagy a brightness-en, de változás után nemsokkal kikapcsolna
  1. /**** A P P L I C A T I O N   N O T E   ************************************
  2. *
  3. * Title   : DMX512 reception library
  4. * Version              : v2.5
  5. * Last updated  : 29.11.06
  6. * Target                : Botex, SP1500-DMX [ATmega8515]
  7. * Clock   : 16MHz
  8. *
  9. * written by hendrik hoelscher, www.hoelscher-hi.de
  10. ***************************************************************************
  11. This program is free software; you can redistribute it and/or
  12. modify it under the terms of the GNU General Public License
  13. as published by the Free Software Foundation; either version2 of
  14. the License, or (at your option) any later version.
  15.  
  16. This program is distributed in the hope that it will be useful,
  17. but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  19. General Public License for more details.
  20.  
  21. If you have no copy of the GNU General Public License, write to the
  22. Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  
  24. For other license models, please contact the author.
  25.  
  26. ;***************************************************************************/
  27.  
  28.  
  29. .include "m8515def.inc"
  30.  
  31. ;Register and Pin definitions
  32.  
  33. .def TempA = r16
  34. .def TempB= r17
  35. .def TempC= r18
  36. .def TempD= r3
  37. .def MainFlags= r19
  38. .def ErrFlags=r20
  39. .def StroboHeatH=r21
  40. .def StroboHeatL=r22
  41. .def HeatInc= r9
  42. .def DmxState= r23
  43. .def TCNT0H = r8
  44. .def null= r2
  45. .def SREG_buf= r10
  46.  
  47.  
  48. ;Mod by me
  49.  
  50. ;.equ LED=            PB3
  51. ;.equ CNTRL_LED=  PD7
  52. ;.equ Strobo=    PB7
  53.  
  54. .equ LED=              PD7
  55. .equ CNTRL_LED=  PE0
  56. .equ Strobo=     PA0
  57.  
  58.  
  59. ;Endmod
  60.  
  61.  
  62. .equ ONTIME= 800         ;Time the strobe is triggered
  63.  
  64. ;** vars in SRAM
  65.  
  66. .equ SPEEDraw=   0x61 ;Buffer for Speed
  67. .equ BRIGHTraw=  0x62 ;Buffer for Brightness
  68. .equ MODEraw=    0x63 ;Buffer for strobe mode
  69.  
  70. .equ SPEEDclcH=  0x64 ;Buffer for Speed
  71. .equ SPEEDclcL=  0x65
  72. .equ FIREclcH=   0x66 ;Buffer for Brightness
  73. .equ FIREclcL=   0x67 ;Buffer for Brightness
  74. .equ QUENCHclcH= 0x68 ;Buffer for Brightness
  75. .equ QUENCHclcL= 0x69 ;Buffer for Brightness
  76. .equ MODEclc=    0x6A ;Buffer for strobe mode
  77.  
  78. .equ ERRCODE=    0x6B ;error LED pattern
  79. .equ ERRprescaler= 0x6D ;prescaler for error indicator
  80. .equ RANDSEED=   0x70
  81.  
  82.  
  83. ;***** special flags
  84.  
  85. .equ  OVERHEAT    =0                ;Error Flags
  86. .equ  VALID_DMX  =1
  87. .equ  SIGNAL_COMING =2
  88. .equ  MANUAL        =4    ;use THIS for checking current mode!
  89. .equ  XOP_OFF      =5
  90. .equ  ZChigh        =6    ;for old board's polling
  91. .equ  REV_5_2      =7
  92.  
  93. .equ  doSPEED      =0  ;Main Flags
  94. .equ  doBRIGHT      =1
  95. .equ  doMODE        =2
  96. .equ  doIndicate        =3
  97. .equ  wasLOW        =4          ;used for single flash 
  98. .equ  DMXisSTANDBY      =5
  99. .equ  isREADY      =6
  100. .equ  doFLASH      =7
  101.  
  102. .equ  NORMAL_MODE       =0
  103. .equ  BLINDING_MODE =1
  104. .equ  RANDOM_MODE   =2
  105. .equ  SINGLE_FLASH  =3
  106. .equ  SYNC_MODE  =4              
  107.  
  108. ;interrupt vectors
  109.  
  110. .org 0
  111.        
  112.         rjmp reset                     ;reset vector address
  113.         rjmp zero_crossing            ;External Interrupt0 Vector Address
  114.         reti                    ;External Interrupt1 Vector Address
  115.         reti                    ;Input Capture1 Interrupt Vector Address
  116.         rjmp fire                            ;Output Compare1A Interrupt Vector Address
  117.         rjmp quench                    ;Output Compare1B Interrupt Vector Address
  118.         reti                    ;Overflow1 Interrupt Vector Address
  119.         rjmp dmx_flash    ;Overflow0 Interrupt Vector Address
  120.         reti                    ;SPI Interrupt Vector Address
  121.         rjmp get_byte         ;UART Receive Complete Interrupt Vector Address
  122.         reti                    ;UART Data Register Empty Interrupt Vector Address
  123.         reti                    ;UART Transmit Complete Interrupt Vector Address
  124.         reti                    ;Analog Comparator Interrupt Vector Address
  125.         reti                    ;External Interrupt2 Vector Address
  126.         reti                ;Output Compare0 Interrupt Vector Address
  127.         reti                    ;EEPROM Interrupt Vector Address
  128.         reti                    ;SPM complete Interrupt Vector Address
  129.         reti                    ;SPM complete Interrupt Vector Address     
  130.  
  131. ;INIT
  132. reset:
  133. cli
  134.  
  135. ;Stack
  136.         ldi          TempA, high(RAMEND)
  137.         out          SPH,TempA
  138.         ldi          TempA, low(RAMEND)
  139.         out          SPL,TempA
  140.  
  141. ;***** WATCHDOG
  142.         wdr
  143.         ldi     tempA, (1<<WDE)|(1<<WDCE)
  144.         out     WDTCR, tempA
  145.         ldi     tempA, (1<<WDE)|(1<<WDCE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0) ;set TimeOut to 2.1s
  146.         out     WDTCR, tempA
  147.         wdr
  148.  
  149.        
  150. ;Mod by me     
  151.        
  152. ;***** set Ports
  153.  
  154.  
  155. ; PortA
  156. ;       clr    TempA                        ;clear TempA register 0x00
  157. ;       out        DDRA, TempA   ;DDRA
  158.        
  159. ;       ser        TempA                            ; TempA equals to 0xFF
  160. ;       out        PortA, TempA                ;DIP-Switches with pullup
  161.        
  162. ; PortB
  163. ;       ldi        TempA, 0b11001000   ;0,1=invers_chck 3=LED 4=ZC 6,7=OUT
  164. ;       out        DDRB, TempA
  165. ;       ldi        TempA, 0b11111011
  166. ;       out        PortB, TempA
  167.  
  168. ; PortC
  169. ;       ldi        TempA, 0b00000000   ;0,1=DIP-switches
  170. ;       out        DDRC, TempA
  171. ;       ldi        TempA, 0b00000011
  172. ;       out        PortC, TempA
  173.  
  174. ; PortD
  175. ;       ldi        TempA, 0b10000000   ;Cntrl-LED
  176. ;       out        DDRD, TempA
  177. ;       ldi        TempA, 0b10000100
  178. ;       out        PortD, TempA
  179.  
  180. ; PortE
  181.         ;*unused*
  182. ;--------------------------------------------------------------------------------------
  183.  
  184.         ; PA0, PA1  for NPN out and PA2 for PNP out instead of PB5 PB6 for NPN and PB7 for PNP
  185.        
  186. ; PortA  OK
  187.         clr     TempA                            ;clear TempA register
  188.         ldi          TempA, 0b11111110
  189.         out          DDRA, TempA      ;DDRA output except PA0 input
  190.         ldi          TempA, 0b11111111    ; PortA on
  191.         out          PortA, TempA  
  192.        
  193.        
  194.         ; PB0, PB1 i dont known (GROUNDED) PB3 ADC for heat check
  195.        
  196. ; PortB
  197.         ldi          TempA, 0b00000000    ;0,1=invers_chck 3=heat
  198.         out          DDRB, TempA      ;all input
  199.         ldi          TempA, 0b11110111  ; no pullup for ADC
  200.         out          PortB, TempA
  201.  
  202.         ; PortC DIP Switches 1 to 8
  203.        
  204. ; PortC OK
  205.         ldi          TempA, 0b00000000    
  206.         out          DDRC, TempA
  207.         ser          TempA                                ; TempA equals to 0xFF
  208.         out          PortC, TempA  ;DIP-Switches with pullup
  209.  
  210.        
  211.         ;PortD PD0 (RXD), PD1 (TXD),  PD2 (RDM) for data I/O,  PD7 for green led
  212. ; PortD  OK
  213.         ldi          TempA, 0b10000100    ;LED
  214.         out          DDRD, TempA
  215.         ldi          TempA, 0b10001000
  216.         out          PortD, TempA
  217.  
  218.         ;PortE  PE0 for Red led, PE1 DIP SWITCH 10 and PE2 DIP SWITCH 9
  219. ; PortE  OK
  220.         ldi          TempA, 0b00000001
  221.         out          DDRE, TempA
  222.         ldi          TempA, 0b00000110
  223.         out          PortE, TempA
  224.        
  225. ;Endmod
  226. ;------------------------------------------------------------------------------------------
  227.  
  228.        
  229.        
  230.        
  231.        
  232.         clr          ErrFlags
  233.  
  234.   EEread_target:                                ;get target board
  235.         sbic    EECR, EEWE
  236.         rjmp    EEread_target
  237.         clr          TempA
  238.         out          EEARH, TempA
  239.         ldi          TempA, 2
  240.         out          EEARL, TempA
  241.         sbi          EECR, EERE
  242.         in            TempA, EEDR
  243.                
  244.         cpi          TempA, 1
  245.         breq    init_trgt         ;old revision
  246.         cpi          TempA, 2
  247.         breq    new_board         ;new revision
  248.         rjmp    get_target
  249.    new_board:
  250.         sbr    ErrFlags, (1<<REV_5_2)
  251.    init_trgt:
  252.  
  253. ; Timers       
  254.         clr          TempA
  255.         out          TCCR1A, TempA
  256.         ldi     TempA, (1<<CS11)    ;set counter1 @clock/8 frequency
  257.         out     TCCR1B, TempA
  258.         ldi     TempA, (1<<CS02)    ;set counter0 @clock/256 frequency
  259.         out     TCCR0, TempA                               
  260.         ldi     TempA, (1<<TOIE0)   ;enable Timer0 overflow interrupt
  261.         out     TIMSK, TempA
  262.  
  263. ; SPI
  264.         clr          TempA
  265.         out          SPCR, TempA      ;disable SPI
  266.  
  267. ;ext interrupt 0 for phase zero-crossing control (just new boards!)
  268.         sbrs    ErrFlags, REV_5_2
  269.         rjmp    no_ext_int   ;old board
  270.        
  271.         ldi     TempA, (1<<ISC01)   ;falling edge
  272.         out     MCUCR, TempA
  273.         ldi          TempA, (1<<INT0)     ;activate
  274.         out     GICR, TempA                 ;              
  275.         ldi          TempA, (1<<INTF0)    ;clear interrupt0 flag
  276.         out     GIFR,  TempA
  277.  
  278. no_ext_int:
  279.                
  280. ;USART
  281.         ldi     TempA, 0x01   ;set USART to 250 kbaud @ 8Mhz
  282.         out  UBRRL, TempA
  283.         ldi  TempA, 0x00
  284.         out  UBRRH, TempA
  285.         ldi  TempA, (1<<URSEL)|(3<<UCSZ0)|(1<<USBS) ; 8n2
  286.         out  UCSRC, TempA               ;
  287.         in            TempA, UDR            ;clear Uart Receive Interrupt Flag
  288.         clr          TempA
  289.        out        UCSRA, TempA                ;clear all error flags, disable U2X and MPCM
  290.         clr     DmxState
  291.  
  292. ; MODE SELECT      
  293.         rcall   get_opmode
  294.         sbrc    ErrFlags, MANUAL    ; skip next if manual is set
  295.         rjmp    init_1                        ;don't init in manual mode
  296.         ldi          TempA, (1<<RXCIE)|(1<<RXEN) ;enable Uart RX IRQ & Uart RXD in DMX mode
  297.         out          UCSRB, TempA
  298.    init_1:     
  299.         cbi     PortD, LED                  ; kikapcsolja a ledet
  300.        
  301. ; set Register
  302.         ldi     MainFlags, (1<<DMXisSTANDBY)|(1<<isREADY)|(1<<doSPEED)|(1<<doBRIGHT)|(1<<doMODE)   
  303.         ldi     StroboHeatL, 5
  304.         clr          StroboHeatH
  305.         clr     HeatInc
  306.         clr     null
  307.         sts          SPEEDraw, null
  308.         sts          BRIGHTraw, null
  309.         sts          MODEraw,  null
  310.         ldi     TempA, 3
  311.         sts          ERRcode, TempA
  312.         ldi          TempA, 4
  313.         sts          ERRprescaler, TempA
  314.  
  315.         wdr
  316.  
  317.         wdr                                             ;Watchdog-Reset
  318.         sei
  319.  
  320. ;****************************** main (calculations) *****************************
  321.  
  322. main:
  323.                 sbrc    MainFlags, doSPEED    ;should calc new speed?
  324.                 rjmp    calc_speed
  325.                 sbrc   MainFlags, doBRIGHT                ;should calc new brightness?
  326.                 rjmp   calc_brightness
  327.                 sbrc    MainFlags, doMODE      ;should calc new mode?
  328.                 rjmp    calc_mode
  329.                 sbrc    MainFlags, doINDICATE       ;error indicator and heat cntrl (called by zc @10Hz)
  330.                 rjmp    indicate
  331.  
  332.                 sbrc    ErrFlags, REV_5_2
  333.                 rjmp    main                                        ;new boards need no polling
  334.                
  335.                 ;detect ZC !
  336.                 cli
  337.                 sbis    PinD,3                              ;ZC high?
  338.                 rjmp    check_zc                ;no
  339.                 sbr          ErrFlags, (1<<ZChigh)        ;yes  ->neg. half wave
  340.                 rjmp    exit_poll
  341.            check_zc:
  342.                 sbrs  ErrFlags, ZChigh  ;was high before and now low -> zc!!
  343.                 rjmp    exit_poll            ;no (pos. half wave)
  344.                 cbr          ErrFlags, (1<<ZChigh)        ;wait for next neg. half wave
  345.                 rcall   zero_crossing         ;ZC detected!!
  346.                 rjmp    main               
  347.            exit_poll:
  348.                 sei
  349.                 rjmp    main
  350.  
  351.  
  352. ;____________________________________________________________________________________
  353.  
  354.         calc_speed:
  355.                 cbr          MainFlags, (1<<doSPEED)
  356.                 lds          TempA,  MODEclc
  357.                 cpi          TempA,  SINGLE_FLASH
  358.                 breq    create_flash
  359.                 cpi          TempA,  BLINDING_MODE
  360.                 breq    blinding_speed
  361.                 cpi          TempA,  RANDOM_MODE
  362.                 breq    random_speed
  363.  
  364.  
  365.    normal_speed: 
  366.                 lds          TempA,       SPEEDraw
  367.  
  368.                 cpi          TempA, 5                    ;val <= 5 -> stand by
  369.                 brsh    spd_1
  370.                 sbr          MainFlags, (1<<DMXisSTANDBY)
  371.                 rjmp    main
  372.            spd_1:
  373.                 subi TempA, 5    ;range: 0-250 (1-14Hz)
  374.                 ldi          ZH, high(flash_rate*2)
  375.                 ldi          ZL, low(flash_rate*2)
  376.                 add          ZL, TempA
  377.                 adc          ZH, null
  378.                 add          ZL, TempA
  379.                 adc          ZH, null
  380.                 lpm          TempA,  Z+            ;get flash rate
  381.                 lpm          TempB, Z
  382.      spd_finish:
  383.                 inc        TempB
  384.                 neg          TempA                                        ;clc T0 offset
  385.                 cli                                        ;atomic operation
  386.                 sts          SPEEDclcL, TempA
  387.                 sts          SPEEDclcH, TempB
  388.                 cp            TempB, TCNT0H   ;soft speed blending
  389.                 brsh    spd_f1
  390.                 mov          TCNT0H, TempB                        ;atomic write   
  391.                 out          TCNT0, TempA
  392.            spd_f1:
  393.             sei
  394.                 cbr          MainFlags, (1<<DMXisSTANDBY)        
  395.                 rjmp    main
  396.  
  397.        
  398.         create_flash:
  399.                 lds          TempA,  SPEEDraw
  400.                 cpi          TempA,  128
  401.                 brsh    rq_flash
  402.                 sbr          MainFlags, (1<<wasLOW)
  403.                 rjmp    main
  404.            rq_flash:
  405.                 sbrs MainFlags, wasLOW                ;flash only, when ch was low before!
  406.                 rjmp    main
  407.                 cbr          MainFlags, (1<<wasLOW)
  408.                 sbr          MainFlags, (1<<doFlash)
  409.                 rjmp    main
  410.  
  411.        
  412.         random_speed:                        ;use SPEEDraw in TimerISR
  413.                 lds          TempA,       SPEEDraw
  414.                 cpi          TempA, 5                              ;val <= 5 -> stand by
  415.                 brsh    rnd_1
  416.                 sbr          MainFlags, (1<<DMXisSTANDBY)
  417.                 rjmp    main
  418.        rnd_1:
  419.                 ldi          TempB,  high(3700)
  420.                 ldi          TempA, low(3700)                    ;use ~16.8Hz as base freq in random mode
  421.                 rjmp    spd_finish
  422.  
  423.  
  424.         blinding_speed:
  425.                 lds          TempA,  SPEEDraw
  426.                 cpi          TempA,  64
  427.                 brsh    bs_1
  428.                 sbr          MainFlags, (1<<DMXisSTANDBY) ;shut down
  429.                 rjmp    main
  430.            bs_1:
  431.             cpi  TempA,  96
  432.                 brsh    bs_2
  433.                 ldi          TempB,  high(4464)            ;14Hz
  434.                 ldi          TempA, low(4464)
  435.                 rjmp    spd_finish 
  436.                
  437.            bs_2:
  438.             cpi  TempA,  128
  439.                 brsh    bs_3
  440.                 ldi          TempB,  high(4167)
  441.                 ldi          TempA, low(4167)                    ;15Hz
  442.                 rjmp    spd_finish
  443.                
  444.            bs_3:
  445.             cpi  TempA,  160
  446.                 brsh    bs_4
  447.                 ldi          TempB,  high(3906)
  448.                 ldi          TempA, low(3906)                    ;16.6Hz
  449.                 rjmp    spd_finish
  450.                
  451.            bs_4:
  452.             cpi  TempA,  192
  453.                 brsh    bs_5
  454.                 ldi          TempB,  high(3125)
  455.                 ldi          TempA, low(3125)                    ;20Hz
  456.                 rjmp    spd_finish
  457.                
  458.            bs_5:
  459.             cpi  TempA,  224
  460.                 brsh    bs_6
  461.                 ldi    TempB,  high(2500)
  462.                 ldi          TempA, low(2500)                    ;25Hz
  463.                 rjmp    spd_finish
  464.             
  465.        bs_6:
  466.                 ldi          TempB,  high(1250)
  467.                 ldi          TempA, low(1250)                    ;50Hz
  468.                 rjmp    spd_finish
  469.             
  470. ;___________________________________________________________________________________________________
  471.                                                                                
  472.         calc_brightness:
  473.                 cbr          MainFlags, (1<<doBRIGHT)
  474.                 rcall   calc_heatInc                     ;calc new inc val. for heat simulation
  475.  
  476.                 lds          TempA, BRIGHTraw
  477.                 cpi          TempA, 5                    ;val <= 5 -> stand by
  478.                 brsh    brt_1
  479.                 sbr          ErrFlags, (1<<XOP_OFF)       ;standby if <5
  480.                 rjmp    main
  481.            brt_1:
  482.                 cbr          ErrFlags, (1<<XOP_OFF)
  483.                 ldi    ZH, high(firing_curve*2);set pointer to base address
  484.                 ldi          ZL, low(firing_curve*2)
  485.                 add          ZL, TempA
  486.                 adc          ZH, null
  487.                 add          ZL, TempA
  488.                 adc          ZH, null
  489.                 lpm          TempA, Z+                ;load brightness
  490.                 lpm          TempB, Z               
  491.  
  492.                 cli                                        ;atomic operation
  493.                 sts          FIREclcL, TempA                 
  494.                 sts          FIREclcH, TempB
  495.  
  496.                 ldi          TempC, high(ONTIME)    ;calc quench time
  497.                 mov          TempD, TempC
  498.                 ldi          TempC, low(ONTIME)
  499.                 add          TempA, TempC
  500.                 adc          TempB, TempD
  501.                 sts          QUENCHclcL, TempA
  502.                 sts          QUENCHclcH, TempB
  503.                 sei     
  504.                 rjmp    main
  505.  
  506.  
  507.         calc_heatInc:
  508.                 lds          TempA, BRIGHTraw
  509.                 swap    TempA
  510.                 lsr          TempA
  511.                 lsr          TempA
  512.                 andi    TempA, 0b00000011
  513.                 inc          TempA
  514.                 inc          TempA
  515.                 mov     HeatInc,        TempA
  516.                 ret
  517.  
  518. ;_______________________________________________________________________________
  519.  
  520.         calc_mode:
  521.                 cbr          MainFlags, (1<<doMODE)
  522.  
  523.                 lds          TempA, MODEraw
  524.                 cpi          TempA, 200
  525.                 brsh    synchronize
  526.                 cpi          TempA, 150
  527.                 brsh    single
  528.                 cpi          TempA, 100
  529.                 brsh    random
  530.                 cpi          TempA, 50
  531.                 brsh    blinder
  532.                 ldi          TempB, NORMAL_MODE            ;0-63 -> normal mode
  533.                 rjmp    mode_finish
  534.            random:
  535.                 sts          RANDSEED, TempA                              ;use raw mode val as new random seed
  536.             ldi  TempB, RANDOM_MODE
  537.                 rjmp    mode_finish
  538.            blinder:
  539.             ldi  TempB, BLINDING_MODE               ;64-127 -> Blinder
  540.                 rjmp    mode_finish
  541.            single:
  542.             ldi  TempB, SINGLE_FLASH                        ;128-190 -> single flash
  543.                 sbr          MainFlags, (1<<DMXisSTANDBY) ;disable T0-speed
  544.                 rjmp    mode_finish
  545.            synchronize:        ;192-255 -> sync multiple Strobos
  546.                 ldi          TempB, SYNC_MODE
  547.  
  548.            mode_finish:
  549.             lds  TempA, MODEclc
  550.                 cp            TempA, TempB
  551.                 breq    mode_exit
  552.             sts  MODEclc, TempB
  553.                 cpi          TempB, SYNC_MODE
  554.                 breq    mode_sync
  555.                 sbr          MainFlags, (1<<doSPEED)                  ;eval new speeds
  556.            mode_exit:
  557.                 rjmp    main
  558.                
  559.        mode_sync:
  560.                 ldi          TempA, 1
  561.                 cli
  562.                 mov          TCNT0H,TempA     ;force instant flash (and get in defined state)
  563.                 ser          TempA
  564.                 out          TCNT0, TempA
  565.                 sei
  566.                 rjmp    main
  567.  
  568.        
  569. ;_______________________________________________________________________________
  570.  
  571.         indicate:
  572.                 cbr          MainFlags, (1<<doINDICATE)
  573.                
  574.                 ldi          TempA, 200                  ;check restart point
  575.                 cp            StroboHeatL, TempA
  576.                 cpc          StroboHeatH, null
  577.                 brlo    ind_go
  578.                 cpi          StroboHeatH, 2                                   ;check shut down point
  579.                 brsh    ind_stop
  580.           ind_ret:
  581.                 ldi      TempA, 3
  582.                 cp        StroboHeatL, TempA
  583.                 cpc          StroboHeatH, null
  584.                 brlo    ind_1                                          
  585.                 sub          StroboHeatL, TempA
  586.                 sbc          StroboHeatH, null
  587.                                
  588.            ind_1:
  589.            ;ErrorLED
  590.                 lds          TempA, ERRcode
  591.                 
  592.                 sbi     PortD, LED                                        ;set bit in io
  593.                 sbrc    TempA, 0            ;if 1st bit HI
  594.                 cbi    PortD, LED
  595.  
  596.             lsr         TempA
  597.                 cpi          TempA, 1
  598.                 brne    no_ind      
  599.                        
  600.         ;wenn durchrotiert (ERRpos = 0)
  601.                 ldi          TempA, 0b10000000                ;load empty pattern
  602.                 sbic    UCSRB, RXEN                                         ;if manual mode -> no DMX indication       
  603.                 sbrc    ErrFlags, VALID_DMX
  604.                 rjmp    dmx_ok
  605.                 ldi          TempA, 0b10000101            ;load specific error codes
  606.                 sbrs    ErrFlags, SIGNAL_COMING
  607.                 ldi          TempA, 0b10000001
  608.                 rjmp    dmx_nok
  609.            dmx_ok:
  610.             /*blink my led */
  611.             wdr          ;reset watchdog
  612.            dmx_nok:
  613.                 sbrc    ErrFlags, OVERHEAT
  614.                 ser          TempA
  615.                 cbr     ErrFlags, (1<<VALID_DMX)|(1<<SIGNAL_COMING)
  616.  
  617.            no_ind:
  618.                 sts          ERRcode, TempA
  619.                 rjmp main                              
  620.  
  621.            ind_go:                                   
  622.                 sbrc ErrFlags, OVERHEAT
  623.                 cbr          MainFlags, (1<<doFlash)                  ;cancel flash request if restart
  624.                 cbr          ErrFlags, (1<<OVERHEAT)           ;strobo is ready again
  625.                 rjmp    ind_ret
  626.            ind_stop:
  627.                 sbr    ErrFlags, (1<<OVERHEAT)     ;strobo is too hot -> shut down
  628.                 rjmp    ind_ret
  629.  
  630. ;________________________________________________________________________________
  631.  
  632.         global_mode:
  633.                 ;MANUAL/DMX-SELECT
  634.             rcall       get_opmode                              ;get current operating mode
  635.                 sbrc    ErrFlags, MANUAL                ;manual mode selected?
  636.                 rjmp    man_mode                        ; yes
  637.                 sbic    UCSRB, RXEN                                          ;new in DMX mode?
  638.                 ret                                                  ; no
  639.                 ldi          TempA, (1<<RXCIE)|(1<<RXEN)  ;enable Uart RX IRQ & Uart RXD
  640.                 out          UCSRB, TempA
  641.                 ret
  642.                                
  643.           man_mode:
  644.                 out      UCSRB, null                                                ;disable USART
  645.  
  646.                 ;CHOOSE PARAMETERS
  647.                 rcall   get_address
  648.                 lds          TempB, MODEraw
  649.                 cp            TempB, XL                          ;have DIP settings changed?
  650.                 breq    exit_man                     ;no...
  651.                 sts          MODEraw, XL            ;save new val
  652.                 mov          TempB, XL
  653.  
  654. ;       (->Speed)
  655.                 andi    TempB, 0b00001111            ;mask lower nibble
  656.  
  657.                 cpi          TempB, 0
  658.                 breq    man_single_flash
  659.                 cpi          TempB, 15
  660.                 breq    man_blind
  661.                 inc          TempB
  662.                 push    TempC
  663.                 ldi          TempC, 16
  664.                 mul          TempB, TempC     ;expand val
  665.                 pop          TempC
  666.                 mov          TempB, r0
  667.                 subi    TempB, -10            ;max speed
  668.                 sts          SPEEDraw, TempB                              ;store new val       
  669.                 sbr          MainFlags, (1<<doSpeed)           ;calc new speed in main
  670.                 rjmp    dimm_man
  671.                
  672.            man_single_flash:
  673.             sbr  MainFlags, (1<<doFlash)|(1<<DMXisStandBy) ;request flash
  674.                 rjmp    dimm_man
  675.  
  676.            man_blind:
  677.                 ldi    TempB,  (high(2500) +1)
  678.                 mov          TCNT0H, TempB
  679.                 ldi          TempB, low(2500)                    ;25Hz
  680.                 neg          TempB                                                        ;clc T0 offset
  681.                 cli
  682.                 sts          SPEEDclcL, TempB
  683.                 sts          SPEEDclcH, TCNT0H   
  684.                 out          TCNT0, null
  685.                 sei
  686.                 cbr          MainFlags, (1<<DMXisSTANDBY) 
  687.                                
  688. ;   (->Brightness)
  689.            dimm_man:
  690.             andi        XL, 0b11110000          ;mask higher nibble
  691.                 subi    XL, -10                                   ;prevent black out
  692.                 sts          BRIGHTraw, XL                                     ;store new val       
  693.                 sbr          MainFlags, (1<<doBright)         ;calc new brightness in main
  694.                
  695.            exit_man:
  696.                 ret     
  697.  
  698.  
  699. ;****************************** Fire Timing *************************************
  700.  
  701. fire:            
  702.                 cbi          PortA,       Strobo                                ;FIRE!
  703.                 reti
  704.  
  705.  
  706. quench:
  707.                 in      SREG_buf, SREG
  708.                 push    TempA
  709.  
  710.                 sbi          PortA,       Strobo                                ;quench
  711.  
  712.                 in            TempA,   TIMSK                                ;disable interrupt
  713.                 cbr          TempA,   (1<<OCIE1A)|(1<<OCIE1B)
  714.                 out          TIMSK,        TempA 
  715.    
  716.                 sbr          MainFlags, (1<<isREADY)            ;Ready...
  717.        
  718.                 pop          TempA
  719.                 out     SREG, SREG_buf 
  720.                 reti
  721.  
  722.  
  723. ;****************************** zero crossing ***********************************
  724.  
  725. zero_crossing:
  726.                 in      SREG_buf, SREG
  727.                 push    TempA
  728.                 push    TempB
  729.  
  730.                 sbrs    MainFlags, doFLASH      ;flash request?
  731.                 rjmp    exit_zc                     ; no...
  732.                 ;set up new flash
  733.                 sbrc    ErrFlags, OVERHEAT    ;is strobo too hot?
  734.                 rjmp    exit_zc                              ; no...
  735.                 sbrs    MainFlags, isREADY    ;is strobo ready to fire?
  736.                 rjmp    exit_zc                              ; no...
  737.  
  738.                 cbr          MainFlags, (1<<doFlash)|(1<<isREADY) ;quit flags
  739.  
  740.                 add          StroboHeatL, HeatInc                ;increase heat!
  741.                 adc          StroboHeatH, null
  742.  
  743.                 lds          TempB,        FIREclcH               ;set firing angle
  744.                 lds          TempA,   FIREclcL
  745.                 out          OCR1AH,  TempB       
  746.                 out          OCR1AL,  TempA
  747.  
  748.                 lds          TempB,        QUENCHclcH         ;set quench angle
  749.                 lds          TempA,   QUENCHclcL
  750.                 out          OCR1BH,  TempB
  751.                 out          OCR1BL,  TempA
  752.  
  753.                 out          TCNT1H,  null                                ;clear counter
  754.                 out          TCNT1L,  null
  755.  
  756.                 in            TempB,   TIFR    ;clear irq flags
  757.                 sbr          TempB,   (1<<OCF1A)|(1<<OCF1B)
  758.                 out          TIFR,    TempB
  759.  
  760.                 in            TempB,   TIMSK                                ;enable interrupts
  761.                 sbr          TempB,   (1<<OCIE1A)|(1<<OCIE1B)
  762.                 out          TIMSK,        TempB
  763.  
  764.         exit_zc:
  765.                 lds          TempB,        ERRprescaler
  766.                 dec          TempB
  767.                 brne    zc_finish
  768.                 sbr          MainFlags, (1<<doINDICATE)   ;error indicator and heat cntrl
  769.                 ldi          TempB, 4                         ;10Hz
  770.                 zc_finish:
  771.                 sts          ERRprescaler, TempB
  772.                 rcall   global_mode                                        ;has global mode changed?
  773.                 pop          TempB
  774.                 pop          TempA
  775.                 out     SREG, SREG_buf 
  776.                 reti
  777.  
  778. ;****************************** DMX-Flashrate ***********************************
  779. dmx_flash:
  780.                 in      SREG_buf, SREG
  781.                 push    ZH
  782.                 push    ZL
  783.                 push    TempB
  784.        
  785.                 dec          TCNT0H                                   ; decrement counter extension
  786.                 brne    exit_dflash
  787.                
  788.                 lds          TempB, SPEEDclcL          ; set nxt flash time
  789.                 out          TCNT0, TempB
  790.                 lds          TCNT0H, SPEEDclcH
  791.                
  792.                 sbrc    MainFlags, DMXisSTANDBY     ; if standby -> no flash
  793.                 rjmp    exit_dflash
  794.                
  795.                 lds          TempB, MODEclc
  796.                 cpi          TempB, RANDOM_MODE
  797.                 brne    req_dflash        ; request flash if not in random mode
  798.                
  799.                
  800.                 ldi          ZH, high(random_table*2);set pointer to base address
  801.                 lds          ZL, RANDSEED
  802.                 lpm          TempB, Z+                ;load brightness
  803.                 sts          RANDSEED, ZL
  804.                
  805.                 lds          ZL, SPEEDraw 
  806.                 lsr          ZL      
  807.                 cp            ZL, TempB
  808.                 brlo    exit_dflash 
  809.  
  810.     req_dflash:
  811.                 sbrs    ErrFlags, XOP_OFF
  812.                 sbr          MainFlags, (1<<doFlash)      ; flash request
  813.  
  814.         exit_dflash:
  815.                 pop          TempB
  816.                 pop          ZL
  817.                 pop          ZH
  818.                 out     SREG, SREG_buf 
  819.                 reti
  820.  
  821.                
  822. ;****************************** Empfang *****************************************
  823.  
  824. get_byte:
  825.                 in      SREG_buf, SREG
  826.                 push    TempA
  827.                 push    TempB
  828.                
  829.                 in            TempA, UCSRA
  830.                 in            TempB, UDR
  831.                
  832.                 sbr     ErrFlags, (1<<SIGNAL_COMING);message for indicator...              
  833.  
  834.                 sbrc    TempA,DOR            ;check for overrun -> wait for reset
  835.                 rjmp    overrun     
  836.  
  837.                 sbrc    TempA, FE            ;check 1st stop bit
  838.                 rjmp    gb_break
  839.                
  840.                 cpi          DmxState, 1               ;check for startbyte (else frame error -> reset)
  841.                 breq    startbyte   
  842.  
  843.                 cpi     DmxState, 2             ;check for start adress
  844.                 breq    startadr
  845.  
  846.                 cpi     DmxState, 3               
  847.               breq  get_speed
  848.  
  849.                 cpi          DmxState, 4
  850.                 breq    get_brightness
  851.  
  852.                 cpi          DmxState, 5
  853.                 breq    get_mode
  854.  
  855.                 clr          DmxState                    ;wait for break
  856.         exit_dmx_receive:       
  857.                 pop          TempB
  858.                 pop          TempA
  859.                 out     SREG, SREG_buf 
  860.                 reti       
  861.  
  862.         startbyte:
  863.                 tst     TempB                                ;if null, then Startbyte
  864.                 brne    overrun
  865.                
  866.                
  867.                 inc     DmxState         ;next -> start address
  868.                
  869.                 rcall   get_address                                ;read start address
  870.           
  871.                 cp            XL, null                        ;Startadresse = 0 is nich!
  872.                 cpc     XH, null
  873.                 brne    exit_dmx_receive   
  874.        
  875.             clr  DmxState                   ;quit receive routine
  876.                 sts          BRIGHTraw, null                ;set brightness to null
  877.                 sbr          MainFlags, (1<<doBRIGHT) ;calc new speed in main          
  878.             rjmp        exit_dmx_receive
  879.  
  880.         startadr:
  881.                 sbiw    XH:XL, 1
  882.                 brne    exit_dmx_receive
  883.                 inc     DmxState               ;next-> Byte-Evaluation
  884.  
  885.         get_speed:
  886.                 inc     DmxState                ;next channel
  887.                 lds     TempA, SPEEDraw                ;load saved speed
  888.                 cp            TempA, TempB     ;has changed?
  889.                 breq    exit_dmx_receive
  890.                 sts          SPEEDraw, TempB          ;store new val
  891.                 sbr          MainFlags, (1<<doSpeed) ;calc new speed in main     
  892.                 rjmp    exit_dmx_receive
  893.        
  894.         get_brightness:
  895.                 inc     DmxState                ;next channel
  896.                 lds     TempA, BRIGHTraw              ;load saved brightness
  897.                 cp            TempA, TempB     ;has changed?
  898.                 breq    exit_dmx_receive
  899.                 sts          BRIGHTraw, TempB         ;store new val     
  900.                 sbr          MainFlags, (1<<doBRIGHT) ;calc new brightness in main
  901.                 rjmp    exit_dmx_receive
  902.  
  903.         get_mode:
  904.                 clr          DmxState
  905.                 sbr     ErrFlags, (1<<VALID_DMX);message for indicator...
  906.                 lds          TempA, MODEraw
  907.                 cp            TempA, TempB
  908.                 breq    exit_dmx_receive
  909.                 sts          MODEraw, TempB            ;store new val
  910.                 sbr          MainFlags, (1<<doMODE)       ;calc new mode in main
  911.                 rjmp    exit_dmx_receive
  912.                
  913.         gb_break:
  914.                 cbi          UCSRA,FE                    ;clear frame-error flag
  915.                 tst          TempB                                        ;byte must be zero (88µs LO)
  916.                 brne    gb_break1
  917.                 ldi    DmxState, 1                                ;next -> control of start byte
  918.            gb_break1:
  919.                 rjmp    exit_dmx_receive
  920.  
  921.         overrun:
  922.                 clr    DmxState            ;wait for framing error
  923.                 cbi          UCSRA,DOR                ;clear overrun flag !!
  924.                 rjmp    exit_dmx_receive
  925.                
  926.  
  927. ;****************************** DIP states ****************************************
  928. get_address:
  929.                 cli                                        ;atomic operation
  930.                 sbic    PinB, PB0            ;this bridge is open in inverted strobes!
  931.                 rjmp    ga_invert            ;get inverted start address
  932.                 in           XL, PinC                    ;Einlesen der Startadresse      
  933.                 com          XL                  ;Invertierung
  934.                 clr          XH
  935.                 sbis    PinE, PE2            ;9.address bit
  936.                 inc          XH
  937.                 reti
  938.           ga_invert:
  939.                 clr        XH
  940.                 clr          XL
  941.                 sbis    PinC,PC1                ;9th bit
  942.                 inc          XH
  943.                 sbis    PinC,PC2
  944.                 sbr          XL, (1<<7)
  945.                 sbis    PinC,PC3
  946.                 sbr          XL, (1<<6)
  947.                 sbis    PinC,PC4
  948.                 sbr          XL, (1<<5)
  949.                 sbis    PinC,PC5
  950.                 sbr          XL, (1<<4)
  951.                 sbis    PinC,PC6
  952.                 sbr          XL, (1<<3)
  953.                 sbis    PinC,PC7
  954.                 sbr          XL, (1<<2)
  955.                 sbis    PinE,PE2
  956.                 sbr          XL, (1<<1)
  957.                 sbis    PinE,PE1
  958.                 sbr          XL, (1<<0)      
  959.                 reti
  960.  
  961.  
  962. get_opmode:                                        ;operating mode
  963.                 cli                                        ;atomic operation
  964.                 cbr          ErrFlags, (1<<MANUAL)       
  965.                 sbic    PinB, PB0            ;this bridge is open in inverted strobes!
  966.                 rjmp    gopm_invert    ;get inverted start address
  967.                 sbis    PinE, PE1            ; dip 10 bevan kapcsolva?
  968.                 sbr          ErrFlags, (1<<MANUAL)  ; igen
  969.                 reti
  970.       gopm_invert:
  971.                 sbis  PinC, PC0
  972.                 sbr          ErrFlags, (1<<MANUAL)
  973.                 reti
  974.                
  975.  
  976.  
  977. ;****************************** check Revision *****************************************
  978.  
  979. .equ poll_HI  =0;
  980. .equ irq_HI   =1;
  981.  
  982. get_target:
  983.                 clr     R20
  984.                 ldi     R18, 50       
  985.                 ldi     R19, 50
  986.  
  987.         gt_loop:                               
  988.                ldi    R16, $FF          ; make 16Hz flashing
  989.   trgt1:ldi     R17, $C4
  990.   trgt2:                                                  ; chck zc-source
  991.         sbis     PinB, 4                         ; Poll pin HI?
  992.                 rjmp    poll_low
  993.                 sbr     R20, (1<<poll_HI)
  994.        ret_poll:
  995.                 sbis    PinD, 3                    ; irq pin HI?
  996.                 rjmp    irq_low
  997.                 sbr     R20, (1<<irq_HI)
  998.            ret_irq:
  999.         dec         R17
  1000.         brne    trgt2
  1001.                 wdr
  1002.         dec     R16
  1003.         brne    trgt1
  1004.          
  1005.  
  1006.                 sbis    PortD,LED        ;blink
  1007.                 rjmp    trgt_off
  1008.                 cbi          PortD,LED
  1009.                 ;cbi        PortE,CNTRL_LED
  1010.                 rjmp    gt_loop
  1011.            trgt_off:
  1012.                 sbi     PortD,LED
  1013.                 ;sbi        PortE,CNTRL_LED
  1014.                 rjmp    gt_loop
  1015.                
  1016.                 poll_low:
  1017.             sbrs        R20, poll_HI
  1018.                 rjmp    ret_poll
  1019.                 cbr          R20, (1<<poll_HI)    ; zc happened
  1020.                 dec          R18          ; dec poll zc counter
  1021.                 brne    ret_poll
  1022.                 ldi          TempA, 1
  1023.                 rjmp    TARGETwrite   ; old board detected
  1024.  
  1025.                 irq_low:
  1026.                 sbrs    R20, irq_HI
  1027.                 rjmp    ret_irq
  1028.                 cbr          R20, (1<<irq_HI)     ; zc happened
  1029.                 dec          R19          ; dec irq zc counter
  1030.                 brne    ret_irq
  1031.                 ldi          TempA, 2               ; new board detected
  1032.  
  1033.            TARGETwrite:
  1034.                 sbic    EECR, EEWE
  1035.                 rjmp    TARGETwrite
  1036.                 clr          TempB
  1037.                 out          EEARH, TempB
  1038.                 ldi          TempB, 2
  1039.                 out          EEARL, TempB
  1040.                 out          EEDR, TempA
  1041.                 sbi          EECR, EEMWE
  1042.                 sbi          EECR, EEWE
  1043.                
  1044.                 rjmp    reset
  1045.  
  1046.           
  1047.  
  1048.  
  1049. nix: rjmp nix
  1050.  
  1051.  
  1052. firing_curve:                              ;firing table for linearization of brightness
  1053. .dw 17963, 17625, 17395, 17215, 17066, 16936, 16821, 16716, 16621, 16533, 16450, 16372, 16299, 16230, 16163, 16100
  1054. .dw 16039, 15981, 15924, 15870, 15817, 15766, 15717, 15668, 15621, 15576, 15531, 15487, 15445, 15403, 15362, 15322
  1055. .dw 15283, 15244, 15206, 15169, 15132, 15096, 15060, 15025, 14991, 14957, 14923, 14890, 14858, 14825, 14793, 14762
  1056. .dw 14731, 14700, 14670, 14640, 14610, 14580, 14551, 14522, 14494, 14465, 14437, 14409, 14382, 14354, 14327, 14300
  1057. .dw 14273, 14247, 14220, 14194, 14168, 14142, 14117, 14091, 14066, 14041, 14016, 13991, 13966, 13942, 13918, 13893
  1058. .dw 13869, 13845, 13821, 13798, 13774, 13750, 13727, 13704, 13680, 13657, 13634, 13611, 13589, 13566, 13543, 13521
  1059. .dw 13498, 13476, 13454, 13431, 13409, 13387, 13365, 13343, 13321, 13299, 13278, 13256, 13234, 13213, 13191, 13170
  1060. .dw 13148, 13127, 13106, 13084, 13063, 13042, 13021, 13000, 12979, 12957, 12936, 12915, 12895, 12874, 12853, 12832
  1061. .dw 12811, 12790, 12769, 12749, 12728, 12707, 12686, 12666, 12645, 12624, 12603, 12583, 12562, 12541, 12521, 12500
  1062. .dw 12479, 12459, 12438, 12417, 12397, 12376, 12355, 12334, 12314, 12293, 12272, 12251, 12231, 12210, 12189, 12168
  1063. .dw 12147, 12126, 12105, 12084, 12063, 12042, 12021, 12000, 11979, 11958, 11937, 11915, 11894, 11873, 11851, 11830
  1064. .dw 11808, 11787, 11765, 11743, 11721, 11700, 11678, 11656, 11633, 11611, 11589, 11567, 11544, 11522, 11499, 11476
  1065. .dw 11454, 11431, 11408, 11385, 11361, 11338, 11314, 11291, 11267, 11243, 11219, 11195, 11170, 11146, 11121, 11096
  1066. .dw 11071, 11046, 11020, 10995, 10969, 10943, 10916, 10890, 10863, 10836, 10808, 10781, 10753, 10724, 10696, 10667
  1067. .dw 10637, 10608, 10577, 10547, 10516, 10484, 10452, 10419, 10386, 10352, 10317, 10282, 10246, 10209, 10171, 10132
  1068. .dw 10092, 10050, 10007, 9963991798699818976597099648958295109428933092048900
  1069.  
  1070. flash_rate:                              ;table for speeds in normal mode
  1071. .dw 64592, 60094, 56479, 53480, 50932, 48729, 46794, 45076, 43534, 42139, 40868, 39703, 38629, 37634, 36708, 35844
  1072. .dw 35034, 34272, 33555, 32877, 32234, 31624, 31044, 30492, 29964, 29459, 28976, 28513, 28068, 27640, 27229, 26832
  1073. .dw 26449, 26080, 25723, 25378, 25044, 24720, 24406, 24102, 23806, 23519, 23240, 22968, 22704, 22446, 22195, 21951
  1074. .dw 21712, 21480, 21252, 21031, 20814, 20602, 20395, 20192, 19994, 19800, 19610, 19423, 19241, 19062, 18887, 18715
  1075. .dw 18546, 18380, 18218, 18058, 17901, 17747, 17596, 17447, 17301, 17158, 17016, 16877, 16740, 16606, 16473, 16343
  1076. .dw 16214, 16088, 15963, 15840, 15720, 15600, 15483, 15367, 15253, 15140, 15029, 14920, 14812, 14705, 14600, 14496
  1077. .dw 14393, 14292, 14192, 14093, 13996, 13900, 13805, 13711, 13618, 13526, 13436, 13346, 13257, 13170, 13083, 12998
  1078. .dw 12913, 12830, 12747, 12665, 12584, 12504, 12425, 12346, 12269, 12192, 12116, 12041, 11966, 11892, 11819, 11747
  1079. .dw 11675, 11605, 11534, 11465, 11396, 11328, 11260, 11193, 11127, 11061, 10996, 10932, 10868, 10804, 10741, 10679
  1080. .dw 10618, 10556, 10496, 10436, 10376, 10317, 10258, 10200, 10142, 10085, 10029, 99729917986198069752
  1081. .dw 9698964495919538948694349382933192809230918091309081903289838935
  1082. .dw 8887884087938746869986538607856185168471842783828338829582518208
  1083. .dw 8165812280808038799679557914787378327791775177117672763275937554
  1084. .dw 7515747774387400736373257288725172147177714071047068703269976961
  1085. .dw 6926689168566821678767536719668566516617658465516518648564536420
  1086. .dw 638863566324629262606229619861676136610560746044
  1087.  
  1088. .org 0x500
  1089. random_table:
  1090. .db 0x18,   0xC7,   0x0B,   0xF6,   0xFF,   0xB0,   0xAF,   0x2E
  1091. .db 0x2D,   0xF7,   0xB1,   0xE2,   0x20,   0x26,   0x45,   0x08
  1092. .db 0x53,   0xE6,   0x3D,   0xB3,   0xD4,   0x16,   0xD1,   0xCF
  1093. .db 0x34,   0x1B,   0x9F,   0x13,   0x76,   0xF0,   0x31,   0x4C
  1094. .db 0x9B,   0x3F,   0x50,   0x01,   0xF4,   0xBB,   0x6D,   0x75
  1095. .db 0xDA,   0x69,   0xB4,   0x60,   0x63,   0x3C,   0x3A,   0x12
  1096. .db 0xCA,   0xD2,   0x55,   0x6B,   0xFD,   0xB2,   0x7D,   0xD5
  1097. .db 0x57,   0x27,   0xE7,   0x82,   0xC9,   0x9D,   0x58,   0xF5
  1098. .db 0x5F,   0x4D,   0x38,   0xC5,   0xE4,   0x1D,   0xE3,   0xC1
  1099. .db 0x54,   0x89,   0x8B,   0x0E,   0xFB,   0x05,   0xA7,   0xF3
  1100. .db 0x1F,   0x62,   0x7E,   0x2B,   0xA6,   0x39,   0x0C,   0xE8
  1101. .db 0xAB,   0x11,   0x03,   0x36,   0x72,   0x49,   0xBF,   0x41
  1102. .db 0x59,   0xDD,   0xDB,   0x6A,   0x98,   0x30,   0xF1,   0x42
  1103. .db 0x52,   0x99,   0x61,   0xA4,   0xBD,   0xB5,   0x2F,   0x0F
  1104. .db 0x33,   0xF9,   0x28,   0x92,   0x77,   0x90,   0x3B,   0x04
  1105. .db 0xD9,   0x15,   0xB8,   0x44,   0xE9,   0x7F,   0xDF,   0xD3
  1106. .db 0x94,   0x81,   0x6E,   0x24,   0xAC,   0xFC,   0x2C,   0xA9
  1107. .db 0x46,   0xDE,   0x65,   0x19,   0x9E,   0x4F,   0xA1,   0x8C
  1108. .db 0xD6,   0xEE,   0xB7,   0xC6,   0x95,   0x85,   0x79,   0x96
  1109. .db 0x43,   0x29,   0x3E,   0x86,   0x5D,   0xFE,   0x51,   0x7A
  1110. .db 0xEC,   0x0A,   0xC3,   0x67,   0xC2,   0xEF,   0xE0,   0x2A
  1111. .db 0x6F,   0xB6,   0x91,   0x47,   0xD0,   0xA8,   0x74,   0x02
  1112. .db 0x87,   0x9C,   0xDC,   0xA2,   0xB9,   0xBA,   0x09,   0x14
  1113. .db 0xCC,   0x7B,   0xAE,   0x70,   0xD7,   0xC0,   0xE5,   0xD8
  1114. .db 0x83,   0x7C,   0x07,   0xF8,   0x71,   0x48,   0x0D,   0x78
  1115. .db 0x1C,   0xAA,   0x97,   0xA0,   0x23,   0xBC,   0x73,   0x1E
  1116. .db 0xF2,   0x93,   0x10,   0xC4,   0x37,   0x56,   0x8D,   0x22
  1117. .db 0x4E,   0xAD,   0x5E,   0x5C,   0x35,   0x9A,   0xED,   0xBE
  1118. .db 0x84,   0xA5,   0xA3,   0xCE,   0x5B,   0x66,   0x06,   0x1A
  1119. .db 0x5A,   0x4B,   0x8A,   0xCD,   0x64,   0xEA,   0x17,   0xC8
  1120. .db 0x8F,   0x8E,   0x88,   0xEB,   0x21,   0x68,   0x4A,   0x32
  1121. .db 0x6C,   0xCB,   0x25,   0x40,   0xFA,   0x80,   0xE1,   0x00
  1122.  
  1123. .org 0x580
  1124. .db "Henne's Sites [www.hoelscher-hi.de] "
  1125. .db "Revision 2.6  "
  1126. .db "GPL Freeware  "
A hozzászólás módosítva: Aug 12, 2016
(#) Szabi1 válasza Szabi1 hozzászólására (») Aug 14, 2016 /
 
Már megoldottam, ha kell valakinek posztolom a kódot! Köszönöm mindenki segítségét!
(#) Szabi1 válasza Szabi1 hozzászólására (») Aug 15, 2016 /
 
Csak volna még egy gubanc a kóddal. A neten találtam egy 9CH Led Dimmer kódot ehez az MCU-hoz assemblyben, a fényerőt lehet állítani külön külön 9 darab portbiten, és lehet stroboszkópként is vezérelni, de sajnos egyszerre mind a 9 portbitet. Módosítottam a kódon, csak két DMX csatornát használ, nekem az kellene hogy a stroboszkóp üzemmód csak egy portbitre legyen érvényes, és egy másik portbit, led dimmerként működjön, a fényerőt "(DMX_FIELD)+1" kellene megadja
  1. /**** A P P L I C A T I O N   N O T E   ************************************
  2. *
  3. * Title   : 9ch DMX LED PWM-Dimmer
  4. * Last updated          : 2016.Aug.15
  5. * Target                : Transceiver Rev.3.02 [ATmega8515]
  6. *
  7. * written by hendrik hoelscher, www.hoelscher-hi.de
  8. ***************************************************************************
  9. This program is free software; you can redistribute it and/or
  10. modify it under the terms of the GNU General Public License
  11. as published by the Free Software Foundation; either version2 of
  12. the License, or (at your option) any later version.
  13.  
  14. This program is distributed in the hope that it will be useful,
  15. but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. General Public License for more details.
  18.  
  19. If you have no copy of the GNU General Public License, write to the
  20. Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. For other license models, please contact the author.
  23.  
  24. ;***************************************************************************/
  25.  
  26. .include "m8515def.inc"
  27.  
  28. ;Register and Pin definitions
  29.  
  30. .def tempL                     = r16
  31. .def tempH                        = r17
  32. .def Flags                        = r18
  33. .def DMXstate         = r19
  34. .def null                            = r2
  35. .def status                    = r21
  36. .def ind_count      = r3
  37. .def blink                        = r4
  38. .def PwmCnt                    = r20
  39. .def SREGbuf            = r5
  40. .def ChaseFine      = r6
  41. .def ChaseRes         = r7
  42.  
  43. .equ StrobeFreqH                = 0x80
  44. .equ StrobeFreqL                = 0x81
  45. .equ StrobeBuf      = 0x82
  46.  
  47. .equ OldStepH         = 0x83
  48. .equ OldStepL         = 0x84
  49. .equ NewStepH         = 0x85
  50. .equ NewStepL         = 0x86
  51. .equ StepCnt            = 0x87
  52. .equ ChaseCnt         = 0x88
  53. .equ ChaseSeed      = 0x89
  54.  
  55. .equ LED1= PD7
  56. .equ LED2= PE0
  57. .equ BIT9= PE2
  58.  
  59. .equ DMX_FIELD=      0x60             ;SRAM-Beginn
  60. .equ DMX_CHANNELS=   2
  61. .equ PWM_FIELD=      0x70              
  62. .equ F_OSC=          8000
  63. .equ FLASH_DURATION= 400
  64. .equ IND_OFFSET=     12          ;Offset für indicator-Timer (14Hz)
  65.  
  66. #define CHS_SPD   (0x600)
  67. #define RATE         (0x500)
  68. #define PAT0         (0x400)
  69. #define PAT1         (PAT0 +0xA)
  70. #define PAT2         (PAT1 +0xA)
  71. #define PAT3         (PAT2 +0xA)
  72. #define PAT4         (PAT3 +0xA)
  73. #define PAT5         (PAT4 +0xA)
  74. #define PAT6         (PAT5 +0xA)
  75. #define PAT7         (PAT6 +0xA)
  76.  
  77.  
  78. ;***** special Flags
  79.  
  80. #define  VALID_DMX          (0)
  81. #define  SIGNAL_COMING  (1)
  82.  
  83. #define  doIND      (5)
  84. #define  BLACK_OUT            (6)
  85. #define  DATA_REFRESHED (7)
  86.  
  87.  
  88. ;interrupt vectors
  89. .org 0 
  90.         rjmp init             ;reset vector address
  91.         reti            ;External Interrupt0 Vector Address
  92.         reti            ;External Interrupt1 Vector Address
  93.         reti            ;Input Capture1 Interrupt Vector Address
  94.         rjmp strobe          ;Output Compare1A Interrupt Vector Address
  95.         reti            ;Output Compare1B Interrupt Vector Address
  96.         reti            ;Overflow1 Interrupt Vector Address
  97.         rjmp pwm                ;Overflow0 Interrupt Vector Address
  98.         reti            ;SPI Interrupt Vector Address
  99.         rjmp get_byte   ;UART Receive Complete Interrupt Vector Address
  100.         reti            ;UART Data Register Empty Interrupt Vector Address
  101.         reti            ;UART Transmit Complete Interrupt Vector Address
  102.         reti            ;Analog Comparator Interrupt Vector Address
  103.         reti            ;External Interrupt2 Vector Address
  104.         reti            ;Output Compare0 Interrupt Vector Address
  105.         reti            ; EEPROM Interrupt Vector Address
  106.         reti            ; SPM complete Interrupt Vector Address
  107.         reti            ; SPM complete Interrupt Vector Address
  108.  
  109. ; INIT
  110.  
  111. init:
  112.  
  113. ; Stack
  114.         ldi          tempH,high(RAMEND)
  115.         ldi          tempL,low(RAMEND)
  116.         out          SPH,tempH
  117.         out          SPL,tempL
  118.  
  119. ; WATCHDOG
  120.         wdr
  121.         ldi     tempL, (1<<WDE)|(1<<WDCE)
  122.         out     WDTCR, tempL
  123.         ldi     tempL, (1<<WDE)|(1<<WDCE)|(1<<WDP2)|(1<<WDP1)
  124.         out     WDTCR, tempL
  125.         wdr                                                            ;set prescaler @0,5s
  126.  
  127. ; PortA
  128.         ser     tempL
  129.         out     DDRA, tempL
  130.         clr     tempL
  131.         out     PortA, tempL                                                  ;low Outputs
  132.  
  133. ; PortB
  134.         ldi          tempL, 0b00000011
  135.         out          DDRB, tempL
  136.         ldi          tempL, 0b11110100
  137.         out          PortB, tempL
  138.  
  139. ; PortD
  140.         ldi     tempL, 0b10000100
  141.         out     DDRD, tempL
  142.         ldi     tempL, 0b01111000
  143.         out     PortD, tempL                                                  ;DMX & Spare , LED1 on
  144.  
  145. ; PortE
  146.         ldi     tempL, 0b00000001
  147.         out     DDRE, tempL
  148.         ser          tempL
  149.         out     PortE, tempL                                                  ;LED2 off, BIT9 & OPTION Pullup
  150.  
  151. ; Timers
  152.         ldi     tempL, (1<<CS01)                        ;set counter0 @clock/8 frequency
  153.         out     TCCR0, tempL
  154.         clr          tempL
  155.         out          TCCR1A, tempL
  156.         ldi     tempL, (1<<CS12)|(1<<WGM12)                         ;set counter1 @clock/256 frequency, CTCmode
  157.         out     TCCR1B, tempL
  158.         ldi     tempL,      (1<<TOIE0)                  ;aktivate overflow interrupt
  159.         out     TIMSK, tempL
  160.                
  161.         rcall   init_dmx
  162.        
  163.        
  164. ; set Register
  165.         clr null
  166.         clr blink
  167.         com blink
  168.         mov     ChaseFine, blink
  169.         ldi tempL, IND_OFFSET
  170.         mov ind_count, tempL
  171.         ldi PwmCnt, 0xFF
  172.         ldi     Flags, 0                                             ;clear Flags
  173.        
  174.         sts StepCnt, null
  175.         sts     NewStepH, null
  176.         sts NewStepL, null
  177.         ldi     tempL, 1
  178.         sts ChaseCnt, tempL
  179.         sts ChaseSeed, tempL
  180.         mov     ChaseRes, tempL           
  181.  
  182.         wdr
  183.         sei
  184.  
  185. main:   sbrc      Flags, doIND
  186.                 rcall   indicate
  187.  
  188.                 rcall   eval_strobe_freq
  189. ;rcall chase
  190.                 rjmp    main
  191.  
  192.  
  193.  
  194. ;****************************** LED INDICATOR ***********************************
  195. indicate:
  196.                 cbr          Flags, (1<<doIND)    ;clear flag
  197.                 rcall   chase
  198.                 dec          ind_count
  199.                 breq    ind_a
  200.                 ret
  201.      
  202.           ind_a:
  203.                 wdr                                   ;reset Watchdog
  204. ;working LED
  205.                 sbrc    Flags, DATA_REFRESHED       ;should flash?
  206.                 rjmp    data_flash 
  207.                 sbi          PortE, LED2      ; LED off
  208.  
  209. Error_LED:
  210.                 sbrc    blink, 0      ;wenn erstes bit HI
  211.                 rjmp    on
  212.                 sbi     PortD, LED1
  213.                 rjmp    ind_tst
  214.          on:
  215.                 cbi    PortD, LED1
  216.  
  217.      ind_tst:
  218.             lsr         blink
  219.                 ldi          tempL, 1
  220.                 cp            blink, tempL
  221.                 brne    no_ind
  222.                              
  223. ;wenn durchrotiert (blink = 0)
  224.                 ldi          tempL, 0b10000000       
  225.                 sbrs    Flags, VALID_DMX
  226.                 ldi          tempL, 0b10001010
  227.                 sbrs    Flags, SIGNAL_COMING
  228.                 ldi          tempL, 0b10000010
  229.                 mov     blink, tempL
  230.  
  231.                 cbr     Flags, (1<<VALID_DMX)|(1<<SIGNAL_COMING)
  232.        
  233.         no_ind:
  234.                 ldi          tempL, IND_OFFSET
  235.                 mov          ind_count, tempL          ;plant prescaler
  236.                 ret
  237.         data_flash:
  238.                 cbr          Flags, (1<<DATA_REFRESHED)
  239.             sbis        PortE,LED2                    ;blinken grün
  240.                 rjmp    off
  241.                 cbi          PortE,LED2
  242.                 rjmp    Error_LED
  243.                 off:
  244.                 sbi     PortE,LED2
  245.                 rjmp    Error_LED
  246.  
  247.  
  248.  
  249.  
  250. ;****************************** strobe frequency ***********************************
  251. eval_strobe_freq:
  252.                 lds          tempL, DMX_FIELD                         ;get 1st DMX ch
  253.  
  254.                 rjmp    esf_2
  255.  
  256.  
  257.                 ret
  258.         esf_2:
  259.                 sts          StrobeBuf, tempL
  260.                 cpi          tempL, 32
  261.                 brlo    esf_no_strobe
  262.                 ;cpi        tempL, 245
  263.                 ;brsh   esf_sync
  264.  
  265.                 subi    tempL, 45                     ;0-200 allowed
  266.                 ldi          ZL, low(RATE*2)                                    ;get freq from table
  267.                 ldi          ZH, high(RATE*2)
  268.                 add          ZL, tempL            ;add low byte
  269.                 adc          ZH, null               ;add with carry high byte
  270.                 add          ZL, tempL            ;add low byte
  271.                 adc          ZH, null               ;add with carry low byte
  272.                 lpm          tempL, Z+
  273.                 lpm          tempH, Z
  274.                 cli               ; clear global interrupt flag
  275.                 sts          StrobeFreqL, tempL               ;atomic store
  276.                 sts          StrobeFreqH, tempH
  277.                
  278.                 in            tempL, TIMSK
  279.                 sbr          tempL, (1<<OCIE1A)               ;enable irq
  280.                 out          TIMSK, tempL
  281.                 in            tempL, TIFR
  282.                 sbr          tempL, (1<<OCF1A)                    ;enable irq
  283.                 out          TIFR, tempL
  284.                 reti   
  285.  
  286.  
  287.         esf_no_strobe:
  288.                 in            tempL, TIMSK
  289.                 cbr          tempL, (1<<OCIE1A)               ;disable irq
  290.                 out          TIMSK, tempL
  291.                 ;cbr        Flags, (1<<BLACK_OUT)                            ;enable pwm
  292.                 // black out on
  293.                 ret
  294.        
  295. ;       esf_sync:
  296. ;              in          tempL, TIMSK
  297. ;              sbrs   tempL, OCIE1A                                    ;only when strobing
  298. ;              ret
  299. ;              cli
  300. ;              sbr        Flags, (1<<BLACK_OUT)                            ;blank!
  301. ;              lds        ZH, StrobeFreqH
  302. ;              lds        ZL, StrobeFreqL
  303. ;              out        OCR1AH, ZH
  304. ;              out        OCR1AL, ZL
  305. ;              sbiw   ZH:ZL, 20
  306. ;              out        TCNT1H, ZH
  307. ;              out        TCNT1L, ZL   
  308. ;              reti
  309.  
  310.  
  311. ;****************************** manual chaser mode ***********************************
  312. chase:                        ;called by indicator
  313.                 sbis    PinE, PE1
  314.                 rjmp    chs_a
  315.                 sbic    UCSRB,RXEN
  316.                 ret                                                       ;enable DMX reception
  317.                 sbi          UCSRB, RXEN
  318.                 clr          DMXstate
  319.                 ret
  320.  
  321.         chs_exit:
  322.                 sts          ChaseCnt, tempH
  323.                 ret
  324.  
  325.     chs_a:
  326.                 cbi          UCSRB,RXEN                     ;disable DMX
  327.                 sbr          Flags, (1<<VALID_DMX)|(1<<SIGNAL_COMING)
  328.                 lds          tempH, ChaseCnt                                    ;load prescaler
  329.                 dec          tempH
  330.                 brne    chs_exit
  331.                 lds          tempL, ChaseSeed                         ;reseed prescaler
  332.                 sts          ChaseCnt, tempL
  333.  
  334.                 add          ChaseFine, ChaseRes        ;up-fade val
  335.                 adc          tempH, null              ;(tempH was 0)
  336.                 mov          tempL, ChaseFine
  337.                 com          tempL                                                                ;down-fade val
  338.  
  339.                 tst          tempH
  340.                 brne    chs_step
  341.           chs_step_ret:
  342.                 ldi          XL, low(DMX_FIELD +1)
  343.                 ldi     XH, high(DMX_FIELD)
  344.                 ldi          ZL, 1
  345.            chase_fade:                  ;ch1..8
  346.                 clr          tempH
  347.                 lds          ZH, OldStepL
  348.                 and          ZH, ZL
  349.                 breq    cf_no_old
  350.                 mov          tempH, tempL
  351.            cf_no_old:
  352.             lds  ZH, NewStepL
  353.                 and          ZH, ZL
  354.                 breq    cf_no_new
  355.         add          tempH, ChaseFine
  356.        cf_no_new:
  357.             st    X+, tempH
  358.                 lsl          ZL
  359.                 brne    chase_fade
  360.                
  361.                 clr          tempH                                                                ;9th ch
  362.                 lds          ZH, OldStepH
  363.                 sbrc    ZH, 0
  364.                 mov          tempH, tempL
  365.                 lds          ZH, NewStepH
  366.                 sbrc    ZH, 0
  367.                 add          tempH, ChaseFine
  368.                 st            X, tempH
  369.  
  370.                 ret
  371.                
  372.                
  373.         chs_step:
  374.                 sbr          Flags, (1<<DATA_REFRESHED)
  375.                 clr          ChaseFine                            ;reset fader
  376.                 ser          tempL
  377.  
  378.                 lds          tempH, NewStepL                                    ;change steps
  379.                 sts          OldStepL, tempH
  380.                 lds          tempH, NewStepH
  381.                 sts          OldStepH, tempH
  382.  
  383.                 ldi          ZH, high(CHS_SPD*2)          ;get speed
  384.                 in            ZL, PinC
  385.                 com          ZL
  386.                 swap    ZL
  387.                 andi    ZL, 0b00001111                                    ;isolate pattern
  388.                 lpm          ZH, Z
  389.                 ldi          tempH, 1
  390.                
  391.                 cpi          ZL, 5                                                                ;switch between resolution and prescale
  392.                 brsh    chs_decres
  393.                 mov          ChaseRes, tempH
  394.                 sts          ChaseSeed, ZH
  395.                 rjmp    chs_strb
  396.        chs_decres:
  397.             mov  ChaseRes, ZH
  398.                 sts          ChaseSeed, tempH
  399.            chs_strb:
  400.  
  401.                 clr          ZH                           ;add strobe
  402.                 sbis    PinE, PE2
  403.                 ldi          ZH,  220
  404.                 sts          DMX_FIELD, ZH
  405.  
  406.                 ldi          ZH, high(PAT0*2)                         ;get next step
  407.                 lds          tempH, StepCnt
  408.                 mov          ZL, tempH
  409.                 lsl          ZL
  410.                 inc          tempH
  411.                 sts          StepCnt, tempH
  412.                 lpm          tempH, Z+
  413.                 sts          NewStepL, tempH
  414.                 lpm          tempH, Z
  415.                 sts          NewStepH, tempH
  416.                
  417.                 sbrs    tempH, 1                            ;reset pattern?     
  418.                 rjmp    chs_step_ret
  419.                
  420.                 in            ZL, PinC
  421.                 com          ZL
  422.                 andi    ZL, 0b00000111                                    ;isolate pattern
  423.                 ldi          tempH, 10
  424.                 mul          ZL, tempH   
  425.                 sts          StepCnt, r0              ;save pattern
  426.  
  427.                 rjmp    chs_step_ret               
  428.                
  429.                
  430.                
  431.                        
  432.  
  433.  
  434. ; ***************************9ch 8bitpwm-Ausgabe ****************************************
  435. pwm:                       
  436.                 in      SREGbuf, SREG
  437.                 push    tempL
  438.  
  439.                 sbrc  Flags, BLACK_OUT          ;blanked by strobe?
  440.                 rjmp    pwm_bo_exit
  441.                        
  442.                 lds          tempL, PWM_FIELD
  443.                 cp            tempL, PwmCnt
  444.                 ror          status
  445.           
  446.                 lds      tempL, (PWM_FIELD+1)
  447.                 cp            tempL, PwmCnt
  448.                 ror          status
  449.  
  450.                 lds        tempL, (PWM_FIELD+2)
  451.                 cp            tempL, PwmCnt
  452.                 ror          status
  453.                         
  454.                 lds          tempL, (PWM_FIELD+3)
  455.                 cp            tempL, PwmCnt
  456.                 ror          status
  457.  
  458.                 lds          tempL, (PWM_FIELD+4)
  459.                 cp            tempL, PwmCnt
  460.                 ror          status
  461.  
  462.                 lds      tempL, (PWM_FIELD+5)
  463.                 cp            tempL, PwmCnt
  464.                 ror          status
  465.                
  466.                 lds          tempL, (PWM_FIELD+6)
  467.                 cp            tempL, PwmCnt
  468.                 ror          status
  469.  
  470.                 lds      tempL, (PWM_FIELD+7)
  471.                 cp            tempL, PwmCnt
  472.                 ror          status
  473.                                                                                                     ;9th bit
  474.                 sbis PinD, PD4                                                        ;invert option
  475.               rjmp  pwm9_pos              ; no invert
  476.                
  477.                 lds          tempL, (PWM_FIELD+8)
  478.                 sbi          PortB, 0
  479.                 cp            tempL, PwmCnt
  480.                 brlo    pwm_exit
  481.                 cbi          PortB, 0
  482.                 rjmp    pwm_exit
  483.  
  484.            pwm9_pos:
  485.             com  status
  486.                 lds      tempL, (PWM_FIELD+8)
  487.                 cbi          PortB, 0
  488.                 cp            tempL, PwmCnt
  489.                 brlo    pwm_exit
  490.                 sbi          PortB, 0
  491.                 rjmp    pwm_exit
  492.  
  493.         pwm_bo_exit:
  494.                 sbis    PinD, PD4                     ;invert option
  495.               rjmp  pwm_bo_pos                                                        ; no invert
  496.                 ser          status                                                        ;all ch off (inverted)
  497.                 sbi          PortB, 0
  498.                 rjmp    pwm_exit
  499.            pwm_bo_pos:
  500.                 clr    status                                ;all ch off
  501.                 cbi          PortB, 0     
  502.  
  503.         pwm_exit:
  504.                 out          PortA, status                                                ;output
  505.                 mov          tempL, PwmCnt                                                ;set next compare time
  506.                 lsr          tempL
  507.                 lsr          tempL
  508.                 lsr          tempL
  509.                 ldi          status, 250
  510.                 sub          status, tempL
  511.                 out          TCNT0, status
  512.  
  513.                 inc          PwmCnt
  514.                 tst          PwmCnt
  515.                 brne    pwm_no_reload
  516.                
  517.                 sbr          Flags, (1<<BLACK_OUT)
  518.                 lds          tempL, (DMX_FIELD+1)    ;refresh channels
  519.                 sts          (PWM_FIELD+8), tempL
  520.                
  521.                 ldi     tempL, 255;
  522.                 ;lds        tempL, (DMX_FIELD+1)
  523.                 sts          PWM_FIELD, tempL
  524.                
  525.                 ;ldi tempL,255;
  526.                 ;lds        tempL, (DMX_FIELD+1)
  527.                 sts          (PWM_FIELD+1), tempL
  528.                
  529.                 ;ds          tempL, (DMX_FIELD+1)
  530.                 sts          (PWM_FIELD+2), tempL
  531.                
  532.                 ;lds        tempL, (DMX_FIELD+1)
  533.                 sts          (PWM_FIELD+3), tempL
  534.                
  535.                 ;lds        tempL, (DMX_FIELD+1)
  536.                 sts          (PWM_FIELD+4), tempL
  537.                
  538.                 ;lds        tempL, (DMX_FIELD+1)
  539.                 sts          (PWM_FIELD+5), tempL
  540.                
  541.                 ;lds        tempL, (DMX_FIELD+1)
  542.                 sts          (PWM_FIELD+6), tempL
  543.                
  544.  
  545. ;       lds        tempL, (DMX_FIELD+9)
  546.                
  547.                 ; !!!!!!!!!! STROBO out
  548.                 ldi          tempL,255
  549.                 sts          (PWM_FIELD+7), tempL
  550.                
  551.                
  552.                 ldi          PwmCnt, 1                            ;reseed counter
  553.                 sbr          Flags, (1<<doIND)                    ;indicate in main
  554.           
  555.           pwm_no_reload:
  556.                 pop      tempL
  557.                 out     SREG, SREGbuf
  558.                 reti
  559.  
  560.  
  561.  
  562. ; ***************************Strobo function ****************************************
  563. strobe: 
  564.                 in      SREGbuf, SREG
  565.                 push    tempL
  566.                 push    tempH
  567.  
  568.                 sbrs    Flags, BLACK_OUT
  569.                 rjmp    str_blank
  570.                 cbr          Flags, (1<<BLACK_OUT)                                ;enable pwm
  571.                 ldi          tempL,  low(FLASH_DURATION)      ;load flash time
  572.                 ldi          tempH, high(FLASH_DURATION)
  573.                 rjmp    str_exit
  574.  
  575.         str_blank:
  576.                 sbr          Flags, (1<<BLACK_OUT)
  577.                 lds          tempL, StrobeFreqL
  578.                 lds          tempH, StrobeFreqH
  579.  
  580.         str_exit:
  581.                 out          OCR1AH, tempH
  582.                 out          OCR1AL, tempL
  583.                 pop          tempH
  584.                 pop          tempL
  585.                 out     SREG, SREGbuf
  586.                 reti   
  587.  
  588.  
  589. .include "lib_dmx_in.asm"
  590.  
  591. nix: rjmp nix
  592.  
  593. // Strobo frequency table (damped logarithmic)
  594. .org RATE
  595. .dw 65532, 60407, 56368, 53017, 50170, 47708, 45546, 43626, 41904, 40345, 38925, 37623, 36423, 35311, 34277, 33311
  596. .dw 32406, 31555, 30753, 29996, 29278, 28596, 27948, 27331, 26741, 26177, 25637, 25120, 24623, 24145, 23685, 23242
  597. .dw 22814, 22402, 22003, 21617, 21244, 20882, 20531, 20191, 19861, 19540, 19228, 18924, 18629, 18341, 18061, 17788
  598. .dw 17521, 17261, 17007, 16760, 16517, 16281, 16049, 15823, 15601, 15384, 15172, 14964, 14760, 14560, 14364, 14172
  599. .dw 13983, 13798, 13617, 13438, 13263, 13091, 12922, 12756, 12593, 12432, 12274, 12119, 11966, 11815, 11667, 11522
  600. .dw 11378, 11237, 11098, 10960, 10825, 10692, 10561, 10431, 10304, 10178, 10054, 99319811969195749458
  601. .dw 9343923091199008889987928686858184778375827381738074797678807784
  602. .dw 7690759675047412732272327144705669696884679967156631654964676387
  603. .dw 6307622761496071599459185843576856945620554854755404533352635193
  604. .dw 5125505649884921485547894723465845944530446644044341427942184157
  605. .dw 4097403739783919386038023744368736313574351834633408335332993245
  606. .dw 3191313830853033298129292878282727772726267726272578252924802432
  607. .dw 2384233722892242219621492103205720121967192218771833178917451701
  608. .dw 16581615157215301488144613501250110010501000950,   900,   850,   800,   750
  609. .dw 700,   650,   600,   550,   500,   450,   400,   350,   300,   250,   200,   150
  610.  
  611.  
  612. .org PAT0                                   ;on
  613. .dw 0b0111111111
  614. .dw 0b1111111111
  615.  
  616. .org PAT1                                   ;Lauflicht
  617. .dw 0b0000000001
  618. .dw 0b0000000010
  619. .dw 0b0000000100
  620. .dw 0b0000001000
  621. .dw 0b0000010000
  622. .dw 0b0000100000
  623. .dw 0b0001000000
  624. .dw 0b0010000000
  625. .dw 0b1100000000
  626.  
  627. .org PAT2                                   ;ping pong
  628. .dw 0b0000010000
  629. .dw 0b0000100000
  630. .dw 0b0000001000
  631. .dw 0b0001000000
  632. .dw 0b0000000100
  633. .dw 0b0010000000
  634. .dw 0b0000000010
  635. .dw 0b0100000000
  636. .dw 0b1000000001
  637.  
  638. .org PAT3                                   ;ping pong
  639. .dw 0b0000011000
  640. .dw 0b0000100100
  641. .dw 0b0001000010
  642. .dw 0b1010000001
  643.  
  644. .org PAT4                                   ;pfeil
  645. .dw 0b0000011000
  646. .dw 0b0000111100
  647. .dw 0b0001111110
  648. .dw 0b0011111111
  649. .dw 0b0011100111
  650. .dw 0b0011000011
  651. .dw 0b1010000001
  652.  
  653. .org PAT5                                   ;RGB
  654. .dw 0b0001001001
  655. .dw 0b0011011011
  656. .dw 0b0010010010
  657. .dw 0b0110110110
  658. .dw 0b0100100100
  659. .dw 0b1101101101
  660.  
  661. .org PAT6                                   ;RGB spread
  662. .dw 0b0100010001
  663. .dw 0b0101110011
  664. .dw 0b0001100010
  665. .dw 0b0011101110
  666. .dw 0b0010001100
  667. .dw 0b1110011101
  668.  
  669. .org PAT7
  670. .dw 0b0001001001                        ;RGB single change
  671. .dw 0b0001001011
  672. .dw 0b0001011011
  673. .dw 0b0011011011
  674. .dw 0b0011011010
  675. .dw 0b0011010010
  676. .dw 0b0010010010
  677. .dw 0b0010010110
  678. .dw 0b0010110110
  679. .dw 0b0110110110
  680. .dw 0b0110110100
  681. .dw 0b0110100100
  682. .dw 0b0100100100
  683. .dw 0b0100100101
  684. .dw 0b0100101101
  685. .dw 0b0101101101
  686. .dw 0b0101101001
  687. .dw 0b1101001001
  688.  
  689.  
  690. .org CHS_SPD
  691. .db 25, 10, 3, 2, 1, 2, 3, 5, 8, 12, 17, 22, 27, 35, 40, 48
A hozzászólás módosítva: Aug 15, 2016
(#) filter hozzászólása Aug 21, 2016 /
 
Sziasztok!

Ring buffert szeretnék használni UART-al, de fogadásnál Frame error-t dob. Mi lehet a hiba?

  1. /*************************************************************************
  2. Title:    Example program for the Interrupt controlled UART library
  3. Author:   Peter Fleury <pfleury@gmx.ch>   http://tinyurl.com/peterfleury
  4. File:     $Id: test_uart.c,v 1.7 2015/01/31 17:46:31 peter Exp $
  5. Software: AVR-GCC 4.x
  6. Hardware: AVR with built-in UART/USART
  7.  
  8. DESCRIPTION:
  9.           This example shows how to use the UART library uart.c
  10.  
  11. *************************************************************************/
  12. #include <stdlib.h>
  13. #include <avr/io.h>
  14. #include <avr/interrupt.h>
  15. #include <avr/pgmspace.h>
  16.  
  17. #include "uart.h"
  18.  
  19.  
  20. /* define CPU frequency in Hz in Makefile */
  21. #ifndef F_CPU
  22. #error "F_CPU undefined, please define CPU frequency in Hz in Makefile"
  23. #endif
  24.  
  25. /* Define UART buad rate here */
  26. #define UART_BAUD_RATE      9600     
  27.  
  28.  
  29. int main(void)
  30. {
  31.     unsigned int c;
  32.     char buffer[7];
  33.     int  num=134;
  34.  
  35.    
  36.     /*
  37.      *  Initialize UART library, pass baudrate and AVR cpu clock
  38.      *  with the macro
  39.      *  UART_BAUD_SELECT() (normal speed mode )
  40.      *  or
  41.      *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
  42.      */
  43.     uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
  44.    
  45.     /*
  46.      * now enable interrupt, since UART library is interrupt controlled
  47.      */
  48.     sei();
  49.    
  50.     /*
  51.      *  Transmit string to UART
  52.      *  The string is buffered by the uart library in a circular buffer
  53.      *  and one character at a time is transmitted to the UART using interrupts.
  54.      *  uart_puts() blocks if it can not write the whole string to the circular
  55.      *  buffer
  56.      */
  57.     uart_puts("String stored in SRAM\n");
  58.    
  59.     /*
  60.      * Transmit string  program memory to UART
  61.      */
  62.     uart_puts_P("String stored in FLASH\n");
  63.    
  64.        
  65.     /*
  66.      * Use standard avr-libc functions to convert numbers into string
  67.      * before transmitting via UART
  68.      */     
  69.     itoa( num, buffer, 10);   // convert interger into string (decimal format)         
  70.     uart_puts(buffer);        // and transmit string to UART
  71.  
  72.    
  73.     /*
  74.      * Transmit single character to UART
  75.      */
  76.     uart_putc('\r');
  77.    
  78.     for(;;)
  79.     {
  80.         /*
  81.          * Get received character  ringbuffer
  82.          * uart_getc() returns in the lower byte the received character and
  83.          * in the higher byte (bitmask) the last receive error
  84.          * UART_NO_DATA is returned when no data is available.
  85.          *
  86.          */
  87.         c = uart_getc();
  88.         if ( c & UART_NO_DATA )
  89.         {
  90.             /*
  91.              * no data available  UART
  92.              */
  93.         }
  94.         else
  95.         {
  96.             /*
  97.              * new data available  UART
  98.              * check for Frame or Overrun error
  99.              */
  100.             if ( c & UART_FRAME_ERROR )
  101.             {
  102.                 /* Framing Error detected, i.e no stop bit detected */
  103.                 uart_puts_P("UART Frame Error: ");
  104.             }
  105.             if ( c & UART_OVERRUN_ERROR )
  106.             {
  107.                 /*
  108.                  * Overrun, a character already present in the UART UDR register was
  109.                  * not read by the interrupt handler before the next character arrived,
  110.                  * one or more received characters have been dropped
  111.                  */
  112.                 uart_puts_P("UART Overrun Error: ");
  113.             }
  114.             if ( c & UART_BUFFER_OVERFLOW )
  115.             {
  116.                 /*
  117.                  * We are not reading the receive buffer fast enough,
  118.                  * one or more received character have been dropped
  119.                  */
  120.                 uart_puts_P("Buffer overflow error: ");
  121.             }
  122.             /*
  123.              * send received character back
  124.              */
  125.             uart_putc( (unsigned char)c );
  126.         }
  127.     }
  128.    
  129. }
(#) csabeszq hozzászólása Kedd, 12:15 /
 
Kertben üzemeltet valaki 7/24-ben AVR-t?

Rádiós jellel szeretnék 230V-ot kapcsolni (kerti lámpa). Az érdekelne, hogy mire kell figyelni -20 fokon.

Nem megoldható a lakásban való elhelyezés, mert egy földkábelnél több nem fér ki a gégecsövön.
A hozzászólás módosítva: Kedd, 12:16
(#) Kovidivi válasza csabeszq hozzászólására (») Kedd, 12:50 /
 
Nekem több dolog is megy. A lényeg, hogy azt a helyzetet is le kell kezelni, amikor lefagy (megáll) a program (watchdog), és újrainduláskor onnan folytassa a dolgát, ahol abbahagyta. Ez lehet áramkimaradás, villám miatti zavar, vagy csak egy motor elhúz az utcán, aminek a gyújtása bezavar. Így nem lesz gond.
A minusz 20 fok elvileg nem okozhat gondot, a páralecsapódásra kell gondolni (páraszívó gyöngy, ami a cipőkben szokott lenni? Vagy megfelelő felületi védelem.).
A hozzászólás módosítva: Kedd, 12:53
(#) Massawa válasza Kovidivi hozzászólására (») Kedd, 21:19 /
 
Ha állandoan áram alatt van az AVR akkor még a minusz 20 fok sem árt neki. Nekem egy falba helyezett jo záro dobozban (külsö házfal) van egy AVR vezérlés immár 5 éve és soha semilyen gond nem volt vele.
(#) tomat5 hozzászólása 13:26 /
 
Sziasztok!
ATmega2560 timer interrupt külső kvarcról nem működik, ha átállítom belső órajelre akkor viszont igen. A _delay_ms(1000) viszont megy külső órajelről is. Mi lehet ennek az oka?
Köszi a segítséget.
Következő: »»   746 / 746
Bejelentkezés

Belépés

Hirdetés
Frissek
2016. Aug, 31. Sze
16:13:38
Jelenleg 423 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu