DMX Senderoutine am PIC in C

OP #1948945
Lesenswert?
• ▲
▼
Hi

Programmiere derzeit eine Senderoutine am PIC in C.
Sie funktioniert auch wunderbar, aber ich bin noch nicht zu 100% 
zufrieden.

Hier mal der Code
1
#include <16F876a.h>
2

3
#device adc=8
4
#use delay(clock=20000000)
5
#fuses HS,NOWDT,NOPROTECT,NOLVP
6
#use rs232(baud=250000,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9,stream=DMXX)
7
#bit bit_nine = 0x98.0
8

9
#use rs232(baud=115200,parity=N,xmit=PIN_B0,rcv=PIN_B1,bits=9,stream=PC)
10

11
#define        sn75176 PIN_C3    //high: transmit low: receive
12
#define        DMXANZ 10
13

14
unsigned char  value[DMXANZ];
15
unsigned int   dmxnum;  
16
unsigned int   status;
17
int            WAIT = 10;
18

19

20
#int_TIMER2
21
void TIMER2_isr()    //10ms
22
{
23
  
24
   set_adc_channel( 0 );        
25
   delay_us(WAIT);     
26
   value[3] = read_ADC();       //Wert für Kanal 3 per Poti einlesen
27
   
28
   set_adc_channel( 1 );
29
   delay_us(WAIT);
30
   value[2] = read_ADC();       //Wert für Kanal 3 per Poti einlesen
31
   
32
   set_adc_channel( 2 );
33
   delay_us(WAIT);
34
   value[1] = read_ADC();       //Wert für Kanal 3 per Poti einlesen
35
   
36
}
37

38
void init_dmx(void)
39
{
40
   set_uart_speed(250000, DMXX);      //Baudrate für Break bzw. Reset
41
   output_high(sn75176);       //RS458-Wandler auf Sendemodus versetzen; high: transmit low: receive
42

43
   status=1;                  //mit Break bzw. Reset beginnen
44
}
45

46
void main()
47
{
48
   enable_interrupts(GLOBAL);
49
   
50
   enable_interrupts(INT_TIMER2);
51
   setup_timer_2(T2_DIV_BY_16,195,16);    //10ms
52
   
53
   setup_adc_ports(AN0_AN1_AN3);
54
   setup_adc(ADC_CLOCK_INTERNAL);
55

56

57
  init_dmx();  
58
   
59
   value[0] = 0;
60
  value[1] = 0;
61
  value[2] = 0;
62
  value[3] = 0;
63
  value[4] = 0;
64
  value[5] = 0;
65
  value[6] = 0;
66
  value[7] = 0;
67
  value[8] = 0;
68
  value[9] = 0;
69

70
   while(1)
71
   {
72
       switch(status)
73
     {
74
         case 1:                //RESET (0 senden)
75
               set_uart_speed(4800, DMXX);   
76
               
77
               putc(0,DMXX);
78
               status = 2;
79
        break;
80
         
81
        case 2:         //1.Byte senden --> 1.Byte immer 0!
82
               delay_us(30);
83
               set_uart_speed(250000, DMXX); 
84
               
85
               putc(0,DMXX);
86
               status = 3;
87
               
88
               dmxnum = 1;
89
         break;
90
         
91
         case 3:        //DMX-Daten senden                     
92
               delay_us(10);
93
               
94
               putc(value[dmxnum],DMXX);    // Sende den aktuellen DMX Wert
95
               dmxnum++;
96
               If (dmxnum == DMXANZ)
97
               {
98
                  status = 1;
99
               }
100
         break;
101
     }
102
   }
103
}

Wie ihr seht is die ganze Sendegeschichte in einer while(1)-Schleife, 
und das gefällt mir eigentlich garnicht, da ich nämlich so gut wie 
nichts anderes mehr machen kann.
Wenn ich beispielsweise etwas am Display ausgeben will, hängt sich alles 
auf.
Gibts ev. eine Alternative für die while(1)-Schleife, wie beim AVR 
sowas:
1
ISR (USART_TXC_vect)
2
{
3
..Senderoutine..
4
}
? Nur eben fürn PIC
Hab mich auch schon mit Timer & CO gespielt, jedoch jedes mal ohne 
Erfolg...

Bin kein Profi, deshalb Frag ich auch so blöd xDD

mfg Emanuel
OP #1952064
Lesenswert?
• ▲
▼
Master Snowman schrieb:
> ich sehe im datenblatt, dass der PIC das kann (siehe kapitel 10.2.1.).
> also den TXIF-interrupt gebrauchen, um neue daten ins TXREG-register zu
> schreiben. in der zwichenzeit kann dein programm im main sich rumtummeln
> so viel er will.

ok, was heißt das jetzt konkret? meinst du ev diesen interrupt?
1
#int_TBE
2
TBE_isr() 
3
{
4

5
}

wenn ja, hab ich schon ausprobiert; jedoch ohne Erfolg.

Emanuel
#1952527
Lesenswert?
• ▲
▼
ich kenne deinen compiler nicht, weiss also auch nicht, was "TBE_isr" 
ist resp. durch was er ausgellöst wird. du musst den interrupt 
verwenden, der ausgelöst wird, der im oben erwähnten kapitel behandelt 
wird. wie der bei deinem compiler heisst, musst du mit der hilfe deines 
compilers herausfinden. suche mal nach "serial" und "interrupt", da 
wirst du am schnellsten fündig.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.