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
voidinit_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
voidmain()
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
case1://RESET (0 senden)
75
set_uart_speed(4800,DMXX);
76
77
putc(0,DMXX);
78
status=2;
79
break;
80
81
case2://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
case3://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
ich weiss jetzt nicht, ob dein PIC einen interrupt auslösen kann, wenn
er mit senden fertig ist. falls die schnittstelle so konfiguriert werden
kann, könntest du in der interrupt-routine jeweils das nächste zu
übertragende byte ins senderegister schreiben usw.
@heinzhorst: klar, es gäbe noch die möglichkeit den
interrupt-on-pin-change, dann muss er einfach immer im richtigen moment
für ein byte auf die taste drücken - hahaha :-) lies mal den ganzen
satz, den du zitierst, da ist nämlich noch ein "wenn".
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.
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
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.