Ik heb de volgende code geschreven om een 4 kanaals dmx scanner uit te proberen. De pic die ik gebruik is een pic16f688. De kanaalwaardes heb ik een vaste waarde gegeven, omdat ik het alleen wil testen.
Onderaan de code staat nog een vraag.
Zou dit willen met de volgende code die ik heb geschreven:
void dmx(int Channel1, int Channel2, int Channel3, int Channel4, int Value1, int Value2, int Value3, int Value4);
void main(void)
{
int Channel1, Channel2, Channel3, Channel4, Value1, Value2, Value3, Value4;
ANSEL=0b00000000;
TXSTA=0b00100100;
RCSTA=0b10110000;
BRG16=0;
BRGH=1;
SPBRG=-0.5;
Value1 = 0b01010011;
Value2 = 0b11000111;
Value3 = 0b00011111;
Value4 = 0b11010000;
Channel1=1;
Channel2=2;
Channel3=3;
Channel4=4;
while(1)
{
dmx(Channel1, Channel2, Channel3, Channel4, Value1, Value2, Value3, Value4);
}
}
void dmx(int Channel1, int Channel2, int Channel3, int Channel4, int Value1, int Value2, int Value3, int Value4)
{
int nKanaal, nX;
nKanaal=5;
while(nKanaal>4)
{
nKanaal=1;
for(nX=0;nX<22;nX++)
{
TXREG=0b00000000; //break
}
for(nX=0;nX<2;nX++)
{
TXREG=0b11111111; //MAB
}
for(nX=0;nX<1;nX++)
{
TXREG=0b00000000; //startbit
}
for(nX=0;nX<8;nX++)
{
TXREG=0b00000000; //SC
}
for(nX=0;nX<2;nX++)
{
TXREG=0b11111111; //stopbit
}
}
while(nKanaal<5)
{
for(nX=0;nX<1;nX++)
{
TXREG=0b00000000; //startbit
}
if(nKanaal==Channel1)
{
for(nX=0;nX<8;nX++)
{
TXREG=Value1<<1;
}
}
if(nKanaal==Channel2)
{
for(nX=0;nX<8;nX++)
{
TXREG=Value2<<1;
}
}
if(nKanaal==Channel3)
{
for(nX=0;nX<8;nX++)
{
TXREG=Value3<<1;
}
}
if(nKanaal==Channel4)
{
for(nX=0;nX<8;nX++)
{
TXREG=Value4<<1;
}
}
for(nX=0;nX<2;nX++)
{
TXREG=0b11111111; //stopbit
}
nKanaal++;
}
}
Mijn volgende vraag is eigenlijk als je de TXREG een binaire waarde geeft zoals ik heb gedaan? bijvoorbeeld 0b01010101. Krijg je dit dan ook 01010101 op de oscilloscoop te zien of moet je zoals ik nu heb shiften?
Beste Huub, ik heb een opensource DMX zender en ontvanger geprogged. Welliswaar voor AVR, maar ook in C. Mss heb je daar wat aan ? De link staat in mijn sig. 
Je bent rare dingen aan het doen. (Of lullig gezegd, die code gaat nergens over) De UART van de pic voegt zelf al start en stopbits toe, je hoeft alleen maar een byte in het txreg register te stoppen. Om diezelfde reden kun je niet zonder meer een break versturen met je uart. Daarvoor moet je de uart uitzetten, pin laag maken om de break te genereren, even wachten, uart aanzetten (pin wordt hoog) ff wachten voor de MAB, en dan elke keer een byte in het tx register. Let erop dat dmx 2 stopbits gebruikt, daar kun je de 9-bits mode van de uart voor gebruiken.
Lees eerst aandachtig het hoofdstuk UART van de datasheet door. Je moet namelijk ook status-flags gaan pollen om elke keer als het tx=register leeg een nieuw byte te sturen.
Kan ik gewoon telkens de uart even uitzetten door er TXEN=0; neer te zetten? En zou je misschien een voorbeeld kunnen geven voor dat status flag pollen, want ik weet niet precies wat je hiermee bedoeld.
Ik heb de code wat aangepast. Zou die zo wel kunnen werken?
void dmx(int Channel1, int Channel2, int Channel3, int Channel4, int Value1, int Value2, int Value3, int Value4);
void main(void)
{
int Channel1, Channel2, Channel3, Channel4, Value1, Value2, Value3, Value4;
PORTC=0;
TRISC=0b00000000;
ANSEL=0b00000000;
TXSTA=0b01100111;
RCSTA=0b10110000;
BRG16=0;
SYNC=0;
BRGH=1;
SPBRG=-0.5;
Value1 = 0b01010011;
Value2 = 0b11000111;
Value3 = 0b00011111;
Value4 = 0b11010000;
Channel1=1;
Channel2=2;
Channel3=3;
Channel4=4;
while(1)
{
dmx(Channel1, Channel2, Channel3, Channel4, Value1, Value2, Value3, Value4);
}
}
void dmx(int Channel1, int Channel2, int Channel3, int Channel4, int Value1, int Value2, int Value3, int Value4)
{
int nKanaal, nX;
nKanaal=5;
while(nKanaal>4)
{
nKanaal=1;
SPEN=0;
for(nX=0;nX<28;nX++)
{
PORTC.4=0; //break
}
SPEN=1;
TXREG=0b; //MAB
if(TRMT!=1)
{
nop();
}
TXREG=0b00000000; //SC
if(TRMT!=1)
{
nop();
}
}
while(nKanaal<5)
{
if(nKanaal==Channel1)
{
TXREG=Value1;
if(TRMT!=1)
{
nop();
}
}
if(nKanaal==Channel2)
{
TXREG=Value2;
if(TRMT!=1)
{
nop();
}
}
if(nKanaal==Channel3)
{
TXREG=Value3;
if(TRMT!=1)
{
nop();
}
}
if(nKanaal==Channel4)
{
TXREG=Value4;
if(TRMT!=1)
{
nop();
}
}
nKanaal++;
}
}
[Bericht gewijzigd door Henry S. op (0%)]
Anoniem
Op 18 juni 2009 22:09:57 schreef GreenMagic:
Je bent rare dingen aan het doen. (Of lullig gezegd, die code gaat nergens over) De UART van de pic voegt zelf al start en stopbits toe, je hoeft alleen maar een byte in het txreg register te stoppen. Om diezelfde reden kun je niet zonder meer een break versturen met je uart. Daarvoor moet je de uart uitzetten, pin laag maken om de break te genereren, even wachten, uart aanzetten (pin wordt hoog) ff wachten voor de MAB, en dan elke keer een byte in het tx register. Let erop dat dmx 2 stopbits gebruikt, daar kun je de 9-bits mode van de uart voor gebruiken.
Lees eerst aandachtig het hoofdstuk UART van de datasheet door. Je moet namelijk ook status-flags gaan pollen om elke keer als het tx=register leeg een nieuw byte te sturen.
Zou ik nooit pollen, maar gewoon in een interrupt afhandelen. Simpeler dan dat kan echt niet.
Array klaar zetten, vervolgens TXIE op 1 zetten. Dit genereert meteen een interrupt (want de buffer TXREG was nou eenmaal leeg). In de interrupt maak je gelijk aan array. Vervolgens i++ en einde interrupt. Het enige wat je moet afvangen is wanneer de laatste byte is verstuurd. Daarna TXIE weer op 0 en klaar is keer
. Voordeel is het 'automatiseren' van het versturen, zonder dat je er op hoeft te wachten.
Voor de TS: Voordat je uberhaubt begint met DMX, probeer je uC eerst eens te laten communiceren met de COM-poort van een pc. Zo leer je begrijpen hoe de UART van een pic werkt en het is makkelijk te controleren. In bijv. hyperterminal(standaard in Windows) of Realterm (vind ik een beter alternatief) kun je characters in typen wat via de seriele poort naar de PIC wordt gestuurd. Andersom geeft het programma alles weer wat van de PIC naar de PC zend.
Maak bijvoorbeeld een testprogramma waar je een byte mee binnenhaalt, bij die waarde '1' op telt en vervolgens terug stuurt. Zo zul je zien dat een ingetypte 'a' een 'b' wordt, enz (zie ascii-tabel).