1 | #define DDR_in set_tris_b(0xFFFF)
|
2 | #define DDR_out set_tris_b(0xF000)
|
3 | #define DATA_in input_b()
|
4 | #define DATA_out(value) output_b(value)
|
5 |
|
6 | // ASCII control commands
|
7 | #define SOH 0x01
|
8 | #define ENQ 0x05 // Enq
|
9 | #define ACK 0x06 // ACK
|
10 | #define NACK 0x15 // NACK
|
11 | #define BEL 0x07 // "Warnglocke"
|
12 | #define EOT 0x04
|
13 | #define temp 0xAA // Überhizung
|
14 |
|
15 | // RS232 steps
|
16 | #define waitENQ 0
|
17 | #define waitSOH 1
|
18 | #define waitCMD 2
|
19 | #define waitNUM 3
|
20 | #define waitPAR 4
|
21 | #define waitRED 0
|
22 | #define waitGREEN 1
|
23 | #define waitBLUE 2
|
24 | #define waitAX1 3
|
25 | #define waitAX2 4
|
26 | #define waitAX3 5
|
27 | #define waitACK 5
|
28 | #define waitEOT 6
|
29 |
|
30 | // Programm-defines
|
31 | #define STREAM 0x11
|
32 | #define STOP 0x22
|
33 | #define Stream_buf_max 1000 // Maximale Buffer-Grösse
|
34 |
|
35 | unsigned int8 command = STOP;
|
36 | unsigned int16 x_achse_buf[Stream_buf_max]; // X-Achsen Werte
|
37 | unsigned int16 y_achse_buf[Stream_buf_max]; // Y-Achsen Werte
|
38 | unsigned int8 red_buf[Stream_buf_max]; // RGB Werte
|
39 | unsigned int8 green_buf[Stream_buf_max];
|
40 | unsigned int8 blue_buf[Stream_buf_max];
|
41 |
|
42 | //*****************************************************************************
|
43 | // Definitionen
|
44 | #define TXE PIN_F6 // Transmitt-enabmle pin
|
45 | #define WR PIN_F4 // Write pin (high peak)
|
46 | #define RX PIN_D11 // Receive data Pin
|
47 | #define RD PIN_F3 // Read pin (during read low)
|
48 | #define PWREN PIN_F5 // configurations-status
|
49 |
|
50 | #define rxBuf_max 50 // buffer size
|
51 | static int8 index_rxBuf_R = 0; // Index of last write RX-Buffer
|
52 | static int8 index_rxBuf_W = 0; // Index of last read RX-Buffer
|
53 | static unsigned int8 rxBuf[rxBuf_max + 1]; // RX-Buffer
|
54 | #define txBuf_max 50 // buffer size
|
55 | static int8 index_txBuf_R = 0; // Index to write TX-Buffer
|
56 | static int8 index_txBuf_W = 0; // Index to read TX-Buffer
|
57 | static unsigned int8 txBuf[txBuf_max + 1]; // TX-Buffer
|
58 | //*****************************************************************************
|
59 | // Functions
|
60 | //=========== INIT ====================================
|
61 | void ft245_init(void){
|
62 | int8 i = 0;
|
63 | unsigned int8 blink_cnt = 0;
|
64 |
|
65 | output_high(RD); // set control-pins
|
66 | output_low(WR);
|
67 |
|
68 | for(i=0;i<=txBuf_max;i++){ // clear buffers
|
69 | txBuf[i] = 0;
|
70 | }
|
71 | i = 0;
|
72 | for(i=0;i<=rxBuf_max;i++){
|
73 | rxBuf[i] = 0;
|
74 | }
|
75 |
|
76 | while(input_state(PWREN) == 1){ // wait until the USB FTDI-configuration
|
77 | if(blink_cnt >= 250){ // Blaue LED mit 4Hz blinken
|
78 | output_toggle(LED_blue);
|
79 | blink_cnt = 0;
|
80 | }
|
81 | blink_cnt ++;
|
82 | delay_ms(1);
|
83 | }
|
84 | }
|
85 | //=========== TX ====================================
|
86 | // if no new data, return / need to calls in the main
|
87 | void usart_tx(void){ // send-function
|
88 | if(input_state(TXE) == 0){ // if sending possible
|
89 |
|
90 | if(index_txBuf_R == index_txBuf_W){ // no new data => return
|
91 | return;
|
92 | }
|
93 | if(index_txBuf_R == txBuf_max){ // ringbuffer
|
94 | index_txBuf_R = 0;
|
95 | }
|
96 | else{
|
97 | index_txBuf_R ++;
|
98 | }
|
99 |
|
100 | DATA_out(txBuf[index_txBuf_R]); // write datas to the ftdi
|
101 | output_high(WR); // new data available
|
102 | output_low(WR);
|
103 | }
|
104 | }
|
105 | void txBuf_write(int8 parameter){ // TX buffer handling
|
106 | if(index_txBuf_W == txBuf_max){ // ringbuffer
|
107 | index_txBuf_W = 0;
|
108 | }
|
109 | else{
|
110 | index_txBuf_W ++;
|
111 | }
|
112 | txBuf[index_txBuf_W] = parameter;
|
113 | }
|
114 | //=========== RX ====================================
|
115 | // need to calls in the main
|
116 | void usart_rx(void){ // read function (polling)
|
117 | if(input_state(RX) == 0){ // if new data in the FTDI buffer
|
118 | if(index_rxBuf_W == rxBuf_max){ // ringbuffer
|
119 | index_rxBuf_W = 0;
|
120 | }
|
121 | else{
|
122 | index_rxBuf_W ++;
|
123 | }
|
124 |
|
125 | // take datas and set it dynamic in the buffer
|
126 | DDR_in;
|
127 | output_low(RD); // read data
|
128 | rxBuf[index_rxBuf_W] = DATA_in; // store data
|
129 | output_high(RD); // read finished
|
130 | DDR_out;
|
131 | }
|
132 | }
|
133 |
|
134 | void RS232(void){
|
135 | static unsigned int8 RS232_state = 0; // Protokollstatus
|
136 | static unsigned int16 index_par = 0; // Array-Variable für Parameters
|
137 | static unsigned int16 NUM = 0; // Anzahl zu übertragenden Werte
|
138 | static unsigned int1 num_teil = 0; // 16Bit Anzahl zusammensetzen
|
139 | static unsigned int16 k = 0; // Speichervariable für Steuerung
|
140 | static unsigned int8 PAR_state = 0;
|
141 | static unsigned int8 temp_cmd = 0;
|
142 | unsigned int16 a,i;
|
143 | usart_tx(); // Wenn Daten im TX-Buffer, senden
|
144 | usart_rx(); // Wenn Daten im FTDI-Buffer, entgegennehmen
|
145 |
|
146 | if(index_rxBuf_W == index_rxBuf_R){ // Buffer Error abgleichen
|
147 | return; // Wenn keine neuen Daten => aus Funktion heraus springen
|
148 | }
|
149 | if(index_rxBuf_R == rxBuf_max){ // Erhöhen
|
150 | index_rxBuf_R = 0;
|
151 | }
|
152 | else{
|
153 | index_rxBuf_R ++;
|
154 | }
|
155 |
|
156 | switch (RS232_state){
|
157 | case waitENQ:
|
158 | switch (rxBuf[index_rxBuf_R]){
|
159 | case '?': // Suche der LCU
|
160 | printf(txBuf_Write,"USB LCU");
|
161 | output_high(LED_green);
|
162 | break;
|
163 |
|
164 | case ENQ:
|
165 | RS232_state = waitSOH; // In nächsten State wechselnd
|
166 | txBuf_Write(ACK);
|
167 | break;
|
168 |
|
169 | default:
|
170 | txBuf_Write(rxBuf[index_rxBuf_R]); // Unbekanter Befehl zurückgeben
|
171 | break;
|
172 | }
|
173 | break;
|
174 |
|
175 | case waitSOH: // Header der Übertragung
|
176 | switch (rxBuf[index_rxBuf_R]){
|
177 | case SOH:
|
178 | RS232_state = waitCMD;
|
179 | break;
|
180 |
|
181 | default:
|
182 | RS232_state = waitENQ;
|
183 | txBuf_Write(NACK);
|
184 | break;
|
185 | }
|
186 | break;
|
187 |
|
188 | case waitCMD: // Kommando
|
189 | switch (rxBuf[index_rxBuf_R]){
|
190 | case STREAM: // Werte streamen
|
191 | RS232_state = waitNUM;
|
192 | temp_cmd = rxBuf[index_rxBuf_R];
|
193 | break;
|
194 |
|
195 | case STOP: // Projektor aus
|
196 | command = rxBuf[index_rxBuf_R];
|
197 | txBuf_Write(ACK);
|
198 | RS232_state = waitACK;
|
199 | break;
|
200 |
|
201 | case 0x01: // Show 1
|
202 | command = rxBuf[index_rxBuf_R];
|
203 | txBuf_Write(ACK);
|
204 | RS232_state = waitACK;
|
205 | break;
|
206 | case 0x02:
|
207 | for(i=0;i<1000;i++){
|
208 | printf(txBuf_Write,"%d\n",x_achse_buf[i]);
|
209 | printf(txBuf_Write,"%d\n",y_achse_buf[i]);
|
210 | printf(txBuf_Write,"%d\n",red_buf[i]);
|
211 | printf(txBuf_Write,"%d\n",green_buf[i]);
|
212 | printf(txBuf_Write,"%d\n\n",blue_buf[i]);
|
213 | for(a=0;a<10;a++) usart_tx();
|
214 | }
|
215 | txBuf_Write(ACK);
|
216 | RS232_state = waitACK;
|
217 | break;
|
218 | default:
|
219 | RS232_state = waitENQ;
|
220 | txBuf_Write(NACK);
|
221 | command = 0;
|
222 | break;
|
223 | }
|
224 | break;
|
225 |
|
226 | case waitNUM: // Anzahl zu empfangender Werte in 16 Bit
|
227 | switch (num_teil){ // 2 8Bit Werte zu 16 Bit Wert zusammensetzen
|
228 | case 0:
|
229 | NUM = (rxBuf[index_rxBuf_R] << 8);
|
230 | num_teil = 1;
|
231 | break;
|
232 |
|
233 | case 1:
|
234 | NUM |= rxBuf[index_rxBuf_R];
|
235 | RS232_state = waitPAR;
|
236 | num_teil = 0;
|
237 | printf(txBuf_Write,"%d\n",rxBuf[index_rxBuf_R]);
|
238 | printf(txBuf_Write,"%d\n",NUM);
|
239 | break;
|
240 | }
|
241 | break;
|
242 |
|
243 | case waitPAR:
|
244 | index_par ++;
|
245 | switch(PAR_state){ // Werte in Ausgabe-Arrays speichern
|
246 | case waitRED:
|
247 | red_buf[k] = rxBuf[index_rxBuf_R];
|
248 | PAR_state = waitGREEN;
|
249 | output_high(LED_red);
|
250 | break;
|
251 |
|
252 | case waitGREEN:
|
253 | green_buf[k] = rxBuf[index_rxBuf_R];
|
254 | PAR_state = waitBLUE;
|
255 | break;
|
256 |
|
257 | case waitBLUE:
|
258 | blue_buf[k] = rxBuf[index_rxBuf_R];
|
259 | PAR_state = waitAX1;
|
260 | break;
|
261 |
|
262 | case waitAX1:
|
263 | x_achse_buf[k] = (rxBuf[index_rxBuf_R] << 4);
|
264 | PAR_state = waitAX2;
|
265 | break;
|
266 |
|
267 | case waitAX2:
|
268 | x_achse_buf[k] |= (rxBuf[index_rxBuf_R] >> 4);
|
269 | y_achse_buf[k] = ((rxBuf[index_rxBuf_R] & 0x0F) << 8);
|
270 | PAR_state = waitAX3;
|
271 | break;
|
272 |
|
273 | case waitAX3:
|
274 | y_achse_buf[k] |= rxBuf[index_rxBuf_R];
|
275 | if(k == (Stream_buf_max - 1)) // Ringbuffer Steuerung
|
276 | k = 0;
|
277 | else
|
278 | k ++;
|
279 | PAR_state = waitRED;
|
280 | if(index_par == NUM){
|
281 | RS232_state = waitACK;
|
282 | txBuf_Write(ACK);
|
283 | index_par = 0;
|
284 | output_low(LED_red);
|
285 | }
|
286 | break;
|
287 | }
|
288 | break;
|
289 |
|
290 | case waitACK:
|
291 | if(rxBuf[index_rxBuf_R] == ACK){ // ACK empfangen,
|
292 | RS232_state = waitEOT;
|
293 | }
|
294 | break;
|
295 |
|
296 | case waitEOT: // Übertragung beendet
|
297 | if(rxBuf[index_rxBuf_R] == EOT){
|
298 | RS232_state = waitENQ;
|
299 | if(temp_cmd == STREAM){
|
300 | // command = temp_cmd;
|
301 | temp_cmd = 0;
|
302 | }
|
303 | }
|
304 | break;
|
305 |
|
306 | default: // Default
|
307 | RS232_state = waitENQ;
|
308 | txBuf_Write(NACK);
|
309 | break;
|
310 | }
|
311 | }
|