Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if defined(__AVR__)
- void dmxSendByte(volatile uint8_t value)
- {
- uint8_t bitCount, delCount;
- __asm__ volatile (
- "clin" <<==== DISABLE INTERRUPTS
- "ld __tmp_reg__,%a[dmxPort]n"
- "and __tmp_reg__,%[outMask]n"
- "st %a[dmxPort],__tmp_reg__n"
- "ldi %[bitCount],11n" // 11 bit intervals per transmitted byte
- "rjmp bitLoop%=n" // Delay 2 clock cycles.
- "bitLoop%=:n"
- "ldi %[delCount],%[delCountVal]n"
- "delLoop%=:n"
- "nopn"
- "dec %[delCount]n"
- "brne delLoop%=n"
- "ld __tmp_reg__,%a[dmxPort]n"
- "and __tmp_reg__,%[outMask]n"
- "secn"
- "ror %[value]n"
- "brcc sendzero%=n"
- "or __tmp_reg__,%[outBit]n"
- "sendzero%=:n"
- "st %a[dmxPort],__tmp_reg__n"
- "dec %[bitCount]n"
- "brne bitLoop%=n"
- "sein" <<==== ENABLE INTERRUPTS
- :
- [bitCount] "=&d" (bitCount),
- [delCount] "=&d" (delCount)
- :
- [dmxPort] "e" (dmxPort),
- [outMask] "r" (~dmxBit),
- [outBit] "r" (dmxBit),
- [delCountVal] "M" (F_CPU/1000000-3),
- [value] "r" (value)
- );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement