60 Commits

Author SHA1 Message Date
da3c2a5ffb image 2024-03-08 08:23:51 +01:00
a5438cef14 accept multiple address/data octets 2024-03-08 08:16:56 +01:00
d295a36598 receivedata added 2024-03-07 21:50:09 +01:00
3eaf90dbd6 works again 2024-03-07 15:43:27 +01:00
25ad1ad7df try math 2024-03-06 13:17:08 +01:00
6536dc5534 try math 2024-03-06 13:16:18 +01:00
730ac0df30 try math 2024-03-06 13:15:56 +01:00
152c9f60d4 try math 2024-03-06 13:14:43 +01:00
2f07e37b5d try math 2024-03-06 13:12:59 +01:00
d61986630c try math 2024-03-06 13:12:13 +01:00
2e19371fac try math 2024-03-06 13:08:18 +01:00
53e33bf4ff try math 2024-03-06 13:08:04 +01:00
01c645d8df try math 2024-03-06 13:07:38 +01:00
75acdd3171 try math 2024-03-06 13:04:32 +01:00
e6db62c9a5 try math 2024-03-06 13:04:14 +01:00
2ccef81175 try math 2024-03-06 13:03:49 +01:00
ad37bb2280 fix for new image 2024-03-06 12:57:37 +01:00
fd6eb582eb new image 2024-03-06 12:55:36 +01:00
8292d59cf0 doc on reset circuit 2024-03-06 10:44:31 +01:00
1e77cdaddf Merge branch 'main' of gitea.hottis.de:wn/rgb-driver-01 2024-03-06 10:39:23 +01:00
d0219a3c77 violet 2024-03-06 10:39:10 +01:00
2bef7bf2c2 Merge branch 'main' of gitea.hottis.de:wn/rgb-driver-01 2024-03-06 10:37:12 +01:00
9f50f6010b reset circuit 2024-03-06 10:36:43 +01:00
c35ec0991c dimm factor introduced 2024-03-05 17:01:53 +01:00
584e834b0d comment 2024-03-05 16:21:56 +01:00
fbe779d3b8 code beautified 2024-03-05 16:18:19 +01:00
49d78662e2 rolling led 2024-03-05 16:14:13 +01:00
c502303a36 use of subroutines work 2024-03-05 15:27:34 +01:00
2d532a6403 this is working 2024-03-05 15:06:42 +01:00
86fb74bd49 adjust color offsets 2024-02-29 18:13:58 +01:00
42c06f0da4 drop unnecessary .extern statements 2024-02-28 12:10:22 +01:00
b4ebe4978b readme 2024-02-27 20:53:13 +01:00
a5536e63b7 six leds 2024-02-27 20:49:06 +01:00
4f70ea392b readme 2024-02-27 20:39:27 +01:00
9c493d515e image 2024-02-27 20:35:48 +01:00
201a371a57 names refactor 2024-02-27 19:11:36 +01:00
40c49b6809 names refactor 2024-02-27 19:09:50 +01:00
c9b8fbba52 readme 2024-02-27 19:03:57 +01:00
d8755709cd readme 2024-02-27 19:02:02 +01:00
785810924e timing images 2024-02-27 19:00:19 +01:00
a0794dd9c1 refactor names, 6 2024-02-27 18:59:57 +01:00
4104cbf3d6 refactor names, 5 2024-02-27 18:30:08 +01:00
c829a76273 refactor names, 4 2024-02-27 17:48:22 +01:00
e1b7c328f8 refactor names, 3 2024-02-27 17:45:40 +01:00
2435cee771 refactor names, 2 2024-02-27 17:34:11 +01:00
75598f973a refactor names, 1 2024-02-27 17:32:16 +01:00
155b7153e9 refactor 2024-02-27 16:58:43 +01:00
5c2a6c42d2 hold data in ram 2024-02-27 15:33:45 +01:00
b390b8ec8f hold data in ram 2024-02-27 15:32:35 +01:00
cbf8a3cf86 color wheel from https://learn.sparkfun.com/tutorials/lilypad-protosnap-plus-activity-guide/3-custom-color-mixing 2024-02-27 15:11:27 +01:00
f0e8bf7616 color definitions 2024-02-27 15:10:38 +01:00
8f143104f6 works with leds attached 2024-02-27 14:23:32 +01:00
80801e185b readme 2024-02-27 12:09:39 +01:00
68490a4f83 schematics 2024-02-27 12:08:47 +01:00
5d7c75b358 fix 2024-02-27 11:58:02 +01:00
4e6fd76b08 Merge branch 'main' of gitea.hottis.de:wn/msp430-experiment-02 2024-02-27 11:56:31 +01:00
cea174197f add images 2024-02-27 11:56:06 +01:00
df9faabc7f readme 2024-02-27 11:54:19 +01:00
5128d36a75 readme fixed 2024-02-27 11:42:54 +01:00
b3ee547b64 remove dead code 2024-02-27 11:38:44 +01:00
17 changed files with 442 additions and 86 deletions

View File

@ -10,7 +10,7 @@ ASFLAGS=$(COMMON) -D__ASSEMBLER__
LDFLAGS=-L $(TOOLCHAIN_PREFIX)/include -Wl,-Map,firmware.map -nostdlib -nostartfiles -T $(MCU).ld LDFLAGS=-L $(TOOLCHAIN_PREFIX)/include -Wl,-Map,firmware.map -nostdlib -nostartfiles -T $(MCU).ld
$(ARTIFACT).elf: main.o $(ARTIFACT).elf: colors.o main.o
$(CC) -o $@ $(LDFLAGS) $^ $(CC) -o $@ $(LDFLAGS) $^
$(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt $(OBJDUMP) -D $(ARTIFACT).elf > $(ARTIFACT).txt

38
colors.S Normal file
View File

@ -0,0 +1,38 @@
#include "colors.h"
#define DIMM_FACTOR 3
.section ".rodata","a"
;; color definitions according to
;; https://learn.sparkfun.com/tutorials/lilypad-protosnap-plus-activity-guide/3-custom-color-mixing
colors:
.global colors
;; red, green, blue, padding
off:
.byte 0x00, 0x00, 0x00, 0
blue:
.byte 0x00>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0
green:
.byte 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0
orange:
.byte 0xff>>DIMM_FACTOR, 0x80>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0
rose:
.byte 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0x80>>DIMM_FACTOR, 0
magenta:
.byte 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0
violet:
.byte 0x80>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0
azure:
.byte 0x00>>DIMM_FACTOR, 0x80>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0
cyan:
.byte 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0
springgreen:
.byte 0x00>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0x80>>DIMM_FACTOR, 0
chartreuse:
.byte 0x80>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0
yellow:
.byte 0xff>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0
white:
.byte 0xff>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0xff>>DIMM_FACTOR, 0
red:
.byte 0xff>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0x00>>DIMM_FACTOR, 0

22
colors.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef _COLORS_H_
#define _COLORS_H_
#define _off 0x00
#define _blue 0x01
#define _green 0x02
#define _orange 0x03
#define _rose 0x04
#define _magenta 0x05
#define _violet 0x06
#define _azure 0x07
#define _cyan 0x08
#define _springgreen 0x09
#define _chartreuse 0x0a
#define _yellow 0x0b
#define _white 0x0c
#define _red 0x0d
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

BIN
docs/comm_game_ctrl_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
docs/five_leds.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
docs/pulse_complete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
docs/pulse_long.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
docs/pulse_short.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
docs/reset-circuit.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 726 KiB

BIN
docs/reset-signal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

BIN
docs/schematics.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 899 KiB

BIN
docs/six_leds.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

374
main.S
View File

@ -1,39 +1,72 @@
.file "main.S"
#include <msp430g2553.h> #include <msp430g2553.h>
#include "colors.h"
#define PC r0 #define PC r0
#define SP r1 #define SP r1
#define SR r2 #define SR r2
.section ".rodata","a" ;; ----------------------------------------------------
;; --- r4, r5 and r6 must not be used for any other ---
;; --- purpose ---
;; required for communication between drawscreen and isr
#define SIGNAL_REGISTER r4
#define SIGNAL_OCTET_DONE 0x01
#define SIGNAL_ISR_ENABLE 0x02
#define SIGNAL_ALL_DATA_DONE 0x04
#define SIGNAL_INIT_VALUE SIGNAL_OCTET_DONE
;; required for handover of data between drawscreen and isr
#define DATA_REGISTER r5
;; required for sequencing of isr
#define BIT_COUNTER_REGISTER r6
#define BIT_COUNTER_INIT_VALUE 0x01
;; ----------------------------------------------------
;; 2.48us
#define TIMER_COMPLETE 45
;; 1.18us
#define TIMER_LONG 22
;; 550ns
#define TIMER_SHORT 10
.macro set_data_bit
bis #BIT0, &P1OUT
.endm
.macro clear_data_bit
bic #BIT0, &P1OUT
.endm
.macro set_output_enable
bis #BIT1, &P1OUT
.endm
.macro clear_output_enable
bic #BIT1, &P1OUT
.endm
.macro set_debug
bis #BIT2, &P1OUT
.endm
.macro clear_debug
bic #BIT2, &P1OUT
.endm
.macro set_signal_waiting_for_data
bis #BIT3, &P1OUT
.endm
.macro clear_signal_waiting_for_data
bic #BIT3, &P1OUT
.endm
.section ".data"
screendata: screendata:
.byte 0x01 .rept 60 ;; number of leds in hardward
.byte 0x03 .byte 0
.byte 0x07 .endr
.byte 0x0f
screendataend: screendataend:
.byte 0xff .byte 0xff
red: data_forward_pointer:
colors1: .word 0
.byte 0b01001111
colors2:
.byte 0b01000111
colors3:
.byte 0b01000011
.byte 0
blue:
.byte 0b11001111
.byte 0b11000111
.byte 0b11000011
.byte 0
green:
.byte 0b10001111
.byte 0b10000111
.byte 0b10000011
.byte 0
;; .text is the name of the section, it is a hint for the linker to ;; .text is the name of the section, it is a hint for the linker to
;; allocate the section ;; allocate the section
@ -41,6 +74,7 @@ green:
;; @progbits is a hint for the linker to allocate this section into ;; @progbits is a hint for the linker to allocate this section into
;; program memory (flash) ;; program memory (flash)
.section ".text","ax",@progbits .section ".text","ax",@progbits
;; ----------------------------------------------------
_start: _start:
;; disable watchdog ;; disable watchdog
mov.w #WDTPW|WDTHOLD,&WDTCTL mov.w #WDTPW|WDTHOLD,&WDTCTL
@ -54,13 +88,21 @@ _start:
;; initialize stack pointer with value from linker ;; initialize stack pointer with value from linker
mov.w #__stack, SP mov.w #__stack, SP
mov.w #0xaaaa, r7
mov.w #0x5555, r8
init: init:
;; configuration of GPIO Ports ;; configuration of GPIO Ports
mov.b #BIT0|BIT1|BIT2,&P1DIR ;; BIT0: data bit
;; BIT1: output enable
;; BIT2: debug
;; BIT3: Signal waiting for data
mov.b #BIT0|BIT1|BIT2|BIT3, &P1DIR
mov.b #0,&P1OUT mov.b #0,&P1OUT
;; BIT5: spi, UCB0CLK
;; BIT6: spi, UCB0SOMI
;; BIT7: spi, UCB0SIMO
mov.b #BIT5|BIT6|BIT7, &P1SEL
mov.b #BIT5|BIT6|BIT7, &P1SEL2
;; BIT4: long pulse
;; BIT1: short pulse
mov.b #BIT1|BIT4,&P2DIR mov.b #BIT1|BIT4,&P2DIR
mov.b #BIT1|BIT4,&P2SEL mov.b #BIT1|BIT4,&P2SEL
@ -69,24 +111,22 @@ init:
;; cycle time is 56.25ns ;; cycle time is 56.25ns
mov.w #ID_0|MC_0|TACLR|TASSEL_2,&TA1CTL mov.w #ID_0|MC_0|TACLR|TASSEL_2,&TA1CTL
;; 2.0us ;; 2.0us
mov.w #45,&TA1CCR0 mov.w #TIMER_COMPLETE,&TA1CCR0
;; a bit less ;; a bit less
mov.w #10,&TA1CCR1 mov.w #TIMER_SHORT,&TA1CCR1
mov.w #22,&TA1CCR2 mov.w #TIMER_LONG,&TA1CCR2
;; configure output mode for TA0.1 ;; configure output mode for TA0.1
mov.w #CCIE,&TA1CCTL0 mov.w #CCIE,&TA1CCTL0
mov.w #OUTMOD_7,&TA1CCTL1 mov.w #OUTMOD_7,&TA1CCTL1
mov.w #OUTMOD_7,&TA1CCTL2 mov.w #OUTMOD_7,&TA1CCTL2
;; initialize bit-counter for isr ;; spi configuration
mov.b #0x01,r6 ;; USCI B to slave mode
;; initialize isr-sync register, signal BYTE_DONE for the first start mov.b #UCSYNC, &UCB0CTL0
mov.b #0x01,r4 mov.b #0x00, &UCB0CTL1
;; screen data start/next into r7 ;; make sure the isr will not immediately start
mov.w #screendata, r7 mov.b #SIGNAL_INIT_VALUE, SIGNAL_REGISTER
;; screen data end into r8
mov.w #screendataend, r8
;; start timer in up mode ;; start timer in up mode
bis.w #MC0,&TA1CTL bis.w #MC0,&TA1CTL
@ -94,90 +134,251 @@ init:
eint eint
;; ----------------------------------------------------
;; r4: synchronization between mainloop and isr
;; r5: data byte to be handled by isr
mainloop: mainloop:
call #forwardscreen_init
call #resetscreen
mainloop_draw:
call #drawscreen
;; signal waiting for data
set_signal_waiting_for_data
;call #forwardscreen
;call #wait
call #receivedata
;; data has been received, clear signal
clear_signal_waiting_for_data
jmp mainloop_draw
;; ----------------------------------------------------
wait:
push r11
push r12
mov.w #0x0040, r11
wait_continue_1:
mov.w #0xffff, r12
wait_continue_2:
dec.w r12
jnz wait_continue_2
dec.w r11
jnz wait_continue_1
pop r12
pop r11
ret
;; ----------------------------------------------------
forwardscreen_init:
mov.w #screendata, &data_forward_pointer
ret
;; ----------------------------------------------------
forwardscreen:
push r8
push r10
mov.w #screendataend, r8
mov.w data_forward_pointer, r10
mov.b #_off, @r10
inc.w r10
mov.b #_blue, @r10
cmp.w r10, r8
jnz forwardscreen_done
mov.w #screendata, r10
forwardscreen_done:
mov.w r10, data_forward_pointer
pop r10
pop r8
ret
;; ----------------------------------------------------
resetscreen:
push r7
push r8
;; reset screen data
mov.w #screendata, r7
mov.w #screendataend, r8
resetscreen_continue:
mov.b #_off, @r7
inc.w r7
cmp.w r7, r8
jnz resetscreen_continue
pop r8
pop r7
ret
;; ----------------------------------------------------
receivedata:
push r9
push r10
;; wait for first octet
receivedata_wait_for_control_octet:
bit #UCB0RXIFG, &UC0IFG
jz receivedata_wait_for_control_octet
;; get control or address octet from buffer register
mov.b UCB0RXBUF, r9
;; check whether value == 0xff (wait for the whole
;; set of data to fill the screendata)
cmp.b #0xff, r9
;; receive all data
jz receivedata_wait_for_all_data
;; check whether value == 0xfe (no more data)
cmp.b #0xfe, r9
;; no more data
jz receivedata_end
;; it is an address octet
receivedata_wait_for_octet:
bit #UCB0RXIFG, &UC0IFG
jz receivedata_wait_for_octet
;; get data octet from buffer register
mov.b UCB0RXBUF, r10
;; move it to the destination
mov.b r10, screendata(r9)
;; next address/control octet
jmp receivedata_wait_for_control_octet
receivedata_wait_for_all_data:
;; this is a bit dangerous, if the application controller
;; sends too few data, we are in a dead lock
receivedata_end:
pop r10
pop r9
ret
;; ----------------------------------------------------
drawscreen:
push r7
push r8
push r9
#define DATA_NEXT_ADDRESS_REGISTER r7
#define DATA_END_ADDRESS_REGISTER r8
#define NEXT_DATA_REGISTER r9
;; initialize bit-counter for isr
mov.b #BIT_COUNTER_INIT_VALUE, BIT_COUNTER_REGISTER
;; initialize isr-sync register, signal BYTE_DONE for the first start
mov.b #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
;; screen data start/next into r7
mov.w #screendata, DATA_NEXT_ADDRESS_REGISTER
;; screen data end into r8
mov.w #screendataend, DATA_END_ADDRESS_REGISTER
drawscreen_continue:
;; prepare next byte to handle by isr ;; prepare next byte to handle by isr
cmp.w r7,r8 cmp.w DATA_NEXT_ADDRESS_REGISTER, DATA_END_ADDRESS_REGISTER
jz mainloop_data_done jz drawscreen_data_done
;; load next data byte ;; load next data byte
mov.b @r7,r9 mov.b @DATA_NEXT_ADDRESS_REGISTER, NEXT_DATA_REGISTER
inc.w r7 inc.w DATA_NEXT_ADDRESS_REGISTER
mainloop_wait_for_isr: ;; multiple color code by four to get color data
;; check bit0 in sync register rla.b NEXT_DATA_REGISTER
bit #0x01,r4 rla.b NEXT_DATA_REGISTER
jz mainloop_wait_for_isr
;; load data
mov.b r9,r5
;; clear BYTE_DONE
bic #0x01, r4
;; enable isr ;; enable isr
bis #0x02, r4 bis #SIGNAL_ISR_ENABLE, SIGNAL_REGISTER
drawscreen_wait_for_isr_0:
;; check bit0 in sync register
bit #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
jz drawscreen_wait_for_isr_0
;; load data
mov.b colors(NEXT_DATA_REGISTER), DATA_REGISTER
;; clear BYTE_DONE
bic #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
drawscreen_wait_for_isr_1:
;; check bit0 in sync register
bit #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
jz drawscreen_wait_for_isr_1
;; load data
mov.b colors+1(NEXT_DATA_REGISTER), DATA_REGISTER
;; clear BYTE_DONE
bic #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
drawscreen_wait_for_isr_2:
;; check bit0 in sync register
bit #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
jz drawscreen_wait_for_isr_2
;; load data
mov.b colors+2(NEXT_DATA_REGISTER), DATA_REGISTER
;; clear BYTE_DONE
bic #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
;; continue ;; continue
jmp mainloop jmp drawscreen_continue
mainloop_data_done: drawscreen_data_done:
;; signal all data processed, isr finish ;; signal all data processed, isr finish
bis #0x04, r4 bis #SIGNAL_ALL_DATA_DONE, SIGNAL_REGISTER
bis #BIT2, &P1OUT
;; continue pop r9
jmp mainloop pop r8
pop r7
ret
;; ----------------------------------------------------
; --- timer isr --- ; --- timer isr ---
;; r6: exclusively used by isr as bit-counter ;; r6: exclusively used by isr as bit-counter
timer1_a0_isr: timer1_a0_isr:
;; check isr enable bit ;; check isr enable bit
bit #0x02,r4 bit #SIGNAL_ISR_ENABLE, SIGNAL_REGISTER
jz timer1_a0_isr_exit jz timer1_a0_isr_exit
;; shift msb of data register r5 into carry flag and set or reset P1.0 accordingly ;; shift msb of data register r5 into carry flag and set or reset P1.0 accordingly
rla.b r5 rla.b DATA_REGISTER
jnc timer1_a0_isr_false_bit jnc timer1_a0_isr_false_bit
bis #BIT0,&P1OUT set_data_bit
jmp timer1_a0_isr_end jmp timer1_a0_isr_end
timer1_a0_isr_false_bit: timer1_a0_isr_false_bit:
bic #BIT0,&P1OUT clear_data_bit
timer1_a0_isr_end: timer1_a0_isr_end:
;; enable output ;; enable output
bis #BIT1, &P1OUT set_output_enable
;; roll bit-counter ;; roll bit-counter
rla.b r6 rla.b BIT_COUNTER_REGISTER
jnc timer1_a0_isr_exit jnc timer1_a0_isr_exit
;; reset bit-counter ;; reset bit-counter
mov.b #0x01,r6 mov.b #BIT_COUNTER_INIT_VALUE, BIT_COUNTER_REGISTER
;; signal byte done ;; signal byte done
bis #0x01,r4 bis #SIGNAL_OCTET_DONE, SIGNAL_REGISTER
bit #0x04, r4 ;; check whether all data are processed
bit #SIGNAL_ALL_DATA_DONE, SIGNAL_REGISTER
jz timer1_a0_isr_exit jz timer1_a0_isr_exit
;; disable isr ;; disable isr
bic #0x02, r4 bic #SIGNAL_ISR_ENABLE, SIGNAL_REGISTER
;; disable output ;; disable output
bic #BIT1, &P1OUT clear_output_enable
timer1_a0_isr_exit: timer1_a0_isr_exit:
reti reti
;; ----------------------------------------------------
;timer0_a1_isr:
; reti
; --- interrupt vectors ---
; .section "__interrupt_vector_9","ax",@progbits
; .word timer0_a1_isr
.section "__interrupt_vector_14","ax",@progbits .section "__interrupt_vector_14","ax",@progbits
.word timer1_a0_isr .word timer1_a0_isr
@ -186,3 +387,6 @@ timer1_a0_isr_exit:
.word _start .word _start
.end .end

View File

@ -1,5 +1,97 @@
## Debugging
```
mspdebug rf2500 gdb mspdebug rf2500 gdb
msp430-gdb -x firmware.gdb msp430-gdb -x firmware.gdb
```
Attention: the gdb in the TI toolchain package is broken, use the one from Debian Attention: the gdb in the TI toolchain package is broken, use the one from Debian
## Signals Working Cycler
These signals are related to code under tag `cycler_works_include_output_stage`.
First octets:
![](./docs/cycler_working_first_octets.png)
Last octets:
![](./docs/cycler_working_last_octets.png)
Schematics and legend for signals:
![](./docs/schematics.jpeg)
## Timing
Complete cycle: 2.48us
![](./docs/pulse_complete.png)
Short pulse: 550ns
![](./docs/pulse_short.png)
Long pulse: 1.18us
![](./docs/pulse_long.png)
## Load Time
During of loading data into five LEDs: 297us
![](./docs/five_leds.png)
During of loading data into six LEDs: 297us
![](./docs/six_leds.png)
| # of LEDs | Load Time measured | calculated |
| --------- | ------------------ | ---------- |
| 5 | 297us | |
| 6 | 354us | 356.4us |
| 10 | | 594us |
| 100 | | 5.9ms |
| 200 | | 11.8ms |
## Reset Circuitry
It appears that the output voltage of the power supply raises that slow, that the MCU
will not handle the reset correctly.
The following circuitry should generate a valid reset signal far enough from the raise
of the supply voltage:
![](./docs/reset-circuit.jpeg)
The circuit generates the following signals:
![](./docs/reset-signal.png)
#### Reference voltage (green):
```math
U_ref = 3.3V \frac{22k\Omega}{22k\Omega + 10k\Omega} = 2.2V
```
#### Trigger voltage (purple):
```math
U_trigg = 3.3V \frac{330k\Omega}{330k\Omega + 82k\Omega} = 2.64V
```
#### RC constant:
```math
\tau = 82k\Omega \cdot 100nF = 8.2ms
```