DMX512 Transmitter med AVR...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
DeeJay_Bamse
Inlägg: 61
Blev medlem: 19 november 2007, 21:43:08
Ort: Skövde

Re: DMX512 Transmitter med AVR...

Inlägg av DeeJay_Bamse »

JockeE: Men ett "Standard-Break"... Är det alltid en viss tid eller är är det så länge "Standard-Break"et är satt?
Finns "Standard-Break" i AVR? Hittar inget om det...
Användarvisningsbild
JockeE
Inlägg: 330
Blev medlem: 4 augusti 2004, 08:46:50

Re: DMX512 Transmitter med AVR...

Inlägg av JockeE »

Jag vet inte hur andra mikrokontrollers hanterar break, men PIC:arna jag använder generar en breaksekvens med 12 nollbitar plus start- och stoppbit. Det går inte att påverka eller ändra på något sätt.

PIC-databladet kallar det för Break character sequence.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: DMX512 Transmitter med AVR...

Inlägg av Micke_s »

Annat sätt att skapa break på är väl att skicka tecknet som ger låg nivå ut med lägre hastighet.
Det är ju sändare du bygger så timingen styr du.

start är ju låg så du behöver bara skicka ut data så den blir låg minst 88us.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: DMX512 Transmitter med AVR...

Inlägg av vfr »

Helt rätt! Man får hålla lite koll bara när man skall byta baudrate. UART:ar kan vara lite kinkiga med byten av baudrate under sändning. Nu är det ju iofs fina pauser före och efter så det borde inte vara ett problem här. Möjligen då i slutet om man inte väntar in att UART:en hunnit sända klart innan man byter.
B1n4ry
EF Sponsor
Inlägg: 1327
Blev medlem: 30 november 2005, 20:02:50
Ort: Borås
Kontakt:

Re: DMX512 Transmitter med AVR...

Inlägg av B1n4ry »

Varför krångla till det med att byta baud? Det är ju bara att stänga av TX i 88us och sedan slå på den igen. Toggla EN bit. Vänta. Toggla samma bit igen...

Jag har nog lite C-kod, kan lägga upp den ikväll när jag kommer hem...

//B1N4RY
DeeJay_Bamse
Inlägg: 61
Blev medlem: 19 november 2007, 21:43:08
Ort: Skövde

Re: DMX512 Transmitter med AVR...

Inlägg av DeeJay_Bamse »

B1N4RY: Japp.. Det låter som en bra lösning... C Exempel är trevligt...
B1n4ry
EF Sponsor
Inlägg: 1327
Blev medlem: 30 november 2005, 20:02:50
Ort: Borås
Kontakt:

Re: DMX512 Transmitter med AVR...

Inlägg av B1n4ry »

Här kommer ett litet klipp från ett av mina projekt där jag sänder DMX

Kod: Markera allt

  	// Initiera UART
  	UCSR0A = UCSR0A | 0x02;             
  	UCSR0A = 0x00;             
	UCSR0C = 0x0E; 
	UBRR0H = 0x00;
	UBRR0L = 0x04;


	for(;;)
	{
 		/* Make Before Break */
		UCSR0B = UCSR0B & 0xF7; /* Disable TX */
		PORTD = PORTD | 0x02; /* Sätt PD1 = 1 */
		_delay_us(90);

		/* Break */
		PORTD = PORTD & 0xFD; /* Sätt PD1 = 0 */
		_delay_us(176);

		/* Make After Break */
		PORTD = PORTD | 0x02; /* Sätt PD1 = 1 */
		_delay_us(15); 

		UCSR0B = UCSR0B | 0x08; /* Enable TX */

		UDR0 = 0x00;	/* Skicka Startbyte */
		_delay_us(44); 
		
		for(n=1;n<=512;)  /* Skicka alla kanaler */
		{
		  	UDR0 = dmxdata[n];
		  	_delay_us(44);  
			++n;
		}
	}
Lite rörigt blev det när jag klistrade in men det är nog begripligt iaf.

Jag valde medvetet att använda delay mellan varje skickad byte eftersom
jag ville kunna provocera överföringen lite av testskäl i detta projektet.
Jag har gjort samma sak men väntat på "TX-ready" flaggan vad den nu heter men den koden hittar jag inte just nu... Eller så kan man ju köra med interrupt om man vill det, det har jag dock inte testat själv på AVR ännu...

//B1N4RY
B1n4ry
EF Sponsor
Inlägg: 1327
Blev medlem: 30 november 2005, 20:02:50
Ort: Borås
Kontakt:

Re: DMX512 Transmitter med AVR...

Inlägg av B1n4ry »

Hittade en skärmdump på hur det blev oxå:
Bild

// B1N4RY
DeeJay_Bamse
Inlägg: 61
Blev medlem: 19 november 2007, 21:43:08
Ort: Skövde

Re: DMX512 Transmitter med AVR...

Inlägg av DeeJay_Bamse »

B1N4RY: Tackar.... Ser ut ungefär som jag funderade på... Det enda var att du skickar Make Before Break.. Behöver man verkligen den? Enligt spec så räcker det med Breaket och MakeAfterBreak...
Men tack så mycket... Kommer att änväda detta i en interrupt med TX-Ready.. Tackar ännu en gång...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: DMX512 Transmitter med AVR...

Inlägg av sodjan »

> Det enda var att du skickar Make Before Break..

Syftar du på att signalen ligger hög innan break-perioden ?
Men det är den ju hela tiden i "idle", det inget som man "skickar"...
DeeJay_Bamse
Inlägg: 61
Blev medlem: 19 november 2007, 21:43:08
Ort: Skövde

Re: DMX512 Transmitter med AVR...

Inlägg av DeeJay_Bamse »

B1N4RY: Vad har du för att mäta signalen?? Program? Mätutrustning??
DeeJay_Bamse
Inlägg: 61
Blev medlem: 19 november 2007, 21:43:08
Ort: Skövde

Re: DMX512 Transmitter med AVR...

Inlägg av DeeJay_Bamse »

sodjan: Kollar du B1N4RYs kod så skickar han Mark Before Break innan Break......
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: DMX512 Transmitter med AVR...

Inlägg av sodjan »

OK, jag kollade bara bilden... :-) Sorry...
B1n4ry
EF Sponsor
Inlägg: 1327
Blev medlem: 30 november 2005, 20:02:50
Ort: Borås
Kontakt:

Re: DMX512 Transmitter med AVR...

Inlägg av B1n4ry »

Jag tog med MBB eftersom jag behövde få ngt att funka snabbt som attan och den fanns med i specifikationen. Det funkar säkert utan men det spelar ingen roll i min tillämpning.

Mätningarna gjorde jag med mitt RIGOL oscilloscop...
DS1102D: 2ch, 100Mhz + 16 bitars logikanalysator
ca 10.000:- för ett år sedan drygt har jag för mig...
Mycket trevligt instrument...

//B1N4RY
DeeJay_Bamse
Inlägg: 61
Blev medlem: 19 november 2007, 21:43:08
Ort: Skövde

Re: DMX512 Transmitter med AVR...

Inlägg av DeeJay_Bamse »

Hm... En liten tanke... Skulle det inte gå att köra:

Kod: Markera allt

      /* Break */
      UCSR0B = UCSR0B & 0xF7; /* Disable TX */
      PORTD = PORTD & 0xFD; /* Sätt PD1 = 0 */
      _delay_us(176);

      /* Mark After Break */
      UCSR0B = UCSR0B | 0x08; /* Enable TX */
      _delay_us(15); 

      UDR0 = 0x00;   /* Skicka Startbyte */
      /* Osv */
För det är la egentligen Lågsignal en viss tid och Högsignal (Idle) en viss tid som behövs... Alltså behöver man la inte sätta PD1 = 1 innan och efter = Idle....

sodjan: Lugnt... :)

B1N4RY: Lite över min kaliber kanske... :(
Skriv svar