Skip to content
Snippets Groups Projects
Commit 19c0be34 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

add preliminary arduino nano dmx driver

note that it disables stdout / kout support, as the ATMega328 only has one
UART.
parent b78f5950
No related branches found
No related tags found
No related merge requests found
/*
* Copyright 2022 Daniel Friesel
*
* SPDX-License-Identifier: BSD-2-Clause
*/
class DMX {
private:
DMX(const DMX &copy);
public:
unsigned char frames[16];
DMX() {}
void setup();
void write();
};
extern DMX dmx;
......@@ -35,6 +35,15 @@ config arch_arduino_nano_driver_timer
bool "Timer with Interrupts"
select meta_driver_timer
config arch_arduino_nano_driver_dmx
bool "DMX"
select meta_driver_dmx
config arch_arduino_nano_driver_dmx_pin
string "DMX Pin"
default "pb5"
depends on arch_arduino_nano_driver_dmx
choice arch_arduino_nano_cpu
bool "CPU Type"
......
......@@ -88,6 +88,10 @@ ifdef CONFIG_arch_arduino_nano_driver_adc
CXX_TARGETS += src/arch/arduino-nano/driver/adc.cc
endif
ifdef CONFIG_arch_arduino_nano_driver_dmx
CXX_TARGETS += src/arch/arduino-nano/driver/dmx.cc
endif
ifdef CONFIG_arch_arduino_nano_driver_spi
CXX_TARGETS += src/arch/arduino-nano/driver/spi.cc
endif
......
/*
* Copyright 2022 Daniel Friesel
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <avr/io.h>
#include "arch.h"
#include "driver/dmx.h"
#include "driver/gpio.h"
#define BAUD 250000UL
#include <util/setbaud.h>
void DMX::setup()
{
UBRR0H = UBRRH_VALUE;
UBRR0L = UBRRL_VALUE;
#if USE_2X
UCSR0A |= _BV(U2X0);
#else
UCSR0A &= ~_BV(U2X0);
#endif
UCSR0B |= _BV(TXEN0);
UCSR0C = _BV(USBS0) | _BV(UCSZ01) | _BV(UCSZ00); // 8 bits
}
void DMX::write()
{
// Disable UART for reset and mark signals
UCSR0B &= ~_BV(TXEN0);
gpio.output(GPIO::pd1, 0);
arch.delay_us(88); // break
gpio.output(GPIO::pd1, 1);
arch.delay_us(8);
UCSR0B |= _BV(TXEN0); // causes line to go high
for (uint8_t i = 0; i < 16; i++) {
while (!(UCSR0A & _BV(UDRE0)));
UDR0 = frames[i];
}
for (uint8_t i = 0; i < 241; i++) {
while (!(UCSR0A & _BV(UDRE0)));
UDR0 = 0;
}
for (uint8_t i = 0; i < 255; i++) {
while (!(UCSR0A & _BV(UDRE0)));
UDR0 = 0;
}
}
DMX dmx;
......@@ -6,6 +6,8 @@ config meta_driver_adc
bool
config meta_driver_counter
bool
config meta_driver_dmx
bool
config meta_driver_hardware_i2c
bool
config meta_driver_i2c
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment