I'm using an ATMEGA328, with an external 20MHz crystal and fuses set by avrdude as -U lfuse:w:0x46:m -U hfuse:w:0xdf:m
. I want to send DMX with it. Using the code from Radig Ulricht:
/*------------------------------------------------------------------------------
Copyright: Radig Ulrich mailto: mail@ulrichradig.de
Author: Radig Ulrich
Remarks:
known Problems: none
Version: 17.12.2011
Description: DMX_TX
Dieses Programm ist freie Software. Sie können es unter den Bedingungen der
GNU General Public License, wie von der Free Software Foundation veröffentlicht,
weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder
(nach Ihrer Option) jeder späteren Version.
Die Veröffentlichung dieses Programms erfolgt in der Hoffnung,
daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE,
sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT
FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
Programm erhalten haben.
Falls nicht, schreiben Sie an die Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
------------------------------------------------------------------------------*/
#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdio.h>
#define F_CPU 20000000
#include <util/delay.h>
#define DMX_BAUD 250000
#define DMX_BAUD_BREAK 80000
volatile unsigned char dmx_buffer[512];
//############################################################################
//DMX Senderoutine
ISR (USART_TX_vect)
//############################################################################
{
static unsigned int dmx_channel_tx_count = 0;
static unsigned char dmx_tx_state = 0;
switch (dmx_tx_state)
{
case (0):
UBRR0 = (F_CPU / (DMX_BAUD_BREAK * 16L) - 1);
UDR0 = 0; //RESET Frame
dmx_tx_state = 1;
break;
case (1):
UBRR0 = (F_CPU / (DMX_BAUD * 16L) - 1);
UDR0 = 0; //Start Byte
dmx_tx_state = 2;
break;
case (2):
_delay_us(10);
//Ausgabe des Zeichens
UDR0 = dmx_buffer[dmx_channel_tx_count];
dmx_channel_tx_count++;
if(dmx_channel_tx_count == 512)
{
dmx_channel_tx_count = 0;
dmx_tx_state = 0;
}
break;
}
}
//############################################################################
//Hauptprogramm
int main (void)
//############################################################################
{
//Init usart DMX-BUS
UBRR0 = (F_CPU / (DMX_BAUD * 16L) - 1);
DDRD |= (1<<PIND1); //Output TXD Pin ATmega88
UCSR0B|=(1<<TXEN0)|(1<<TXCIE0); // TXEN0 Transmitter enable / TXCIE0 TX complete interrupt enable
UCSR0C|=(1<<USBS0); //USBS0 2 Stop bits
sei();//Globale Interrupts Enable
UDR0 = 0;//Start DMX
//Endlosschleife
while(1)
{
dmx_buffer[0]=255;
dmx_buffer[1]=255;
dmx_buffer[2]=255;
dmx_buffer[3]=255;
dmx_buffer[4]=0;
dmx_buffer[99]=128;
dmx_buffer[511]=128;
}
}
This code produces me a constant and periodic square wave on the TX pin, not the expected dmx packet with the break times and all... What could be wrong?
EDIT: Scope images