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