root / TL16C754_training.X / main.c @ master
Historique | Voir | Annoter | Télécharger (18,304 ko)
1 |
/*
|
---|---|
2 |
* File: newmain.c
|
3 |
* Author: eniro
|
4 |
*
|
5 |
* Created on May 27, 2024, 3:32 PM
|
6 |
*/
|
7 |
|
8 |
|
9 |
#define F_CPU 24000000UL |
10 |
|
11 |
#include <xc.h> |
12 |
#include <math.h> |
13 |
#include <stdlib.h> |
14 |
#include <util/delay.h> |
15 |
#include <avr/interrupt.h> |
16 |
#include <avr/eeprom.h> |
17 |
#include "macros_def.h" |
18 |
#include "TL16C_addr.h" |
19 |
#include "TL16C_CFG.h" |
20 |
|
21 |
|
22 |
//OSC. setup
|
23 |
#define FREQSEL 0x7 //16MHz |
24 |
#define _FREQSEL_REG_WR ((FREQSEL) << 2) |
25 |
|
26 |
|
27 |
|
28 |
//////////////////////////////////////
|
29 |
//prototypes functions
|
30 |
|
31 |
void initUartA(uint8_t busSpeed, uint8_t dataBits, uint8_t parity, uint8_t stopBit);
|
32 |
void initUartB(uint8_t busSpeed, uint8_t dataBits, uint8_t parity, uint8_t stopBit);
|
33 |
void initUartC(uint8_t busSpeed, uint8_t dataBits, uint8_t parity, uint8_t stopBit);
|
34 |
void initUartD(uint8_t busSpeed, uint8_t dataBits, uint8_t parity, uint8_t stopBit);
|
35 |
|
36 |
void writePortA(uint8_t reg, uint8_t addr);
|
37 |
void writePortB(uint8_t reg, uint8_t addr);
|
38 |
void writePortC(uint8_t reg, uint8_t addr);
|
39 |
void writePortD(uint8_t reg, uint8_t addr);
|
40 |
uint8_t readPortA(uint8_t addr); |
41 |
uint8_t readPortB(uint8_t addr); |
42 |
uint8_t readPortC(uint8_t addr); |
43 |
uint8_t readPortD(uint8_t addr); |
44 |
|
45 |
void initExtClock(uint8_t prescaler, uint16_t cnt); //set an external clock on PA0 |
46 |
void setWait(uint16_t cnt); //fast delay |
47 |
|
48 |
|
49 |
uint8_t DLL_DEBUG, DLH_DEBUG, LCR_DEBUG; |
50 |
|
51 |
//////////////////////////////////////
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
int main(void) { |
57 |
|
58 |
uint8_t ctrlReg; |
59 |
uint8_t bufferA[64], bufferB[64], bufferC[64], bufferD[64]; |
60 |
uint8_t counterA = 0, counterB = 0, counterC = 0, counterD = 0; |
61 |
|
62 |
setWait(5000);
|
63 |
|
64 |
|
65 |
for(int i = 0; i < 64; i++) |
66 |
{ |
67 |
bufferA[i] = 0;
|
68 |
} |
69 |
for(int i = 0; i < 64; i++) |
70 |
{ |
71 |
bufferB[i] = 0;
|
72 |
} |
73 |
for(int i = 0; i < 64; i++) |
74 |
{ |
75 |
bufferC[i] = 0;
|
76 |
} |
77 |
for(int i = 0; i < 64; i++) |
78 |
{ |
79 |
bufferD[i] = 0;
|
80 |
} |
81 |
|
82 |
_PROTECTED_WRITE(CLKCTRL.OSCHFCTRLA, _FREQSEL_REG_WR); //switch to 24 MHz
|
83 |
|
84 |
//initExtClock(DIV1, 0x0000); //Set clock out with prescaler
|
85 |
|
86 |
//Enable pins (Port direction)
|
87 |
ADDR_ENABLE; //Address pins
|
88 |
ENABLE_WR_RD_PINS; //Read and Write pins
|
89 |
ENABLE_CS_PINS; //Chip select pins
|
90 |
ENABLE_RESET_PIN; //Reset pin
|
91 |
|
92 |
//////////////////////////////////////////////////////////////
|
93 |
//Remember to put high level on cs pins to disable devices...
|
94 |
SETCSA; |
95 |
SETCSB; |
96 |
SETCSC; |
97 |
SETCSD; |
98 |
//Also don't forget IOR and IOW
|
99 |
SETWR; |
100 |
SETRD; |
101 |
//////////////////////////////////////////////////////////////
|
102 |
|
103 |
|
104 |
/*ENABLE_POW_SUPPLY_PIN;
|
105 |
POWER_OFF;
|
106 |
_delay_ms(500);
|
107 |
POWER_ON;
|
108 |
_delay_ms(500);*/
|
109 |
|
110 |
|
111 |
|
112 |
|
113 |
////////////////////////////////////////
|
114 |
//init TL16C IC
|
115 |
SETRST; |
116 |
//_delay_ms(10);
|
117 |
setWait(100);
|
118 |
CLRRST; |
119 |
////////////////////////////////////////
|
120 |
|
121 |
asm("nop"); //wait a little bit for reset sequence back on boot |
122 |
|
123 |
|
124 |
//uint16_t wordTemp;
|
125 |
/*uint8_t regVal; //temp value for reading register and change it's value without clearing it
|
126 |
regVal = readPortA(LCR_REG);
|
127 |
writePortA(0x9D, LCR_REG); //set LCR[7] = 1 -> enable divisor latch mode
|
128 |
//Set bus speed (according of 8MHz OSC. -> DL = Fosc/(16*Fbauds*DIV));
|
129 |
//DIV = 1 or 4 (see TL16C datasheet p.14), we use here DIV = 1
|
130 |
//wordTemp = busSpeed >> 8;
|
131 |
writePortA(0, DLH_REG); //Always 0x00 in our cfg...
|
132 |
LCR_DEBUG = readPortA(DLH_REG);
|
133 |
writePortA(104, DLL_REG); //Set speed...
|
134 |
LCR_DEBUG = readPortA(DLL_REG);
|
135 |
_delay_ms(1);
|
136 |
writePortA(3, LCR_REG);
|
137 |
LCR_DEBUG = readPortA(LCR_REG);
|
138 |
_delay_ms(1);
|
139 |
writePortA(0x01, FCR_REG); //enable FIFO
|
140 |
_delay_ms(250); //wait a bit
|
141 |
*/
|
142 |
|
143 |
initUartA(BAUDS_19200, DATA_8BITS, NO_PARITY, ONE_STOPBIT); |
144 |
initUartB(BAUDS_19200, DATA_8BITS, NO_PARITY, ONE_STOPBIT); |
145 |
initUartC(BAUDS_19200, DATA_8BITS, NO_PARITY, ONE_STOPBIT); |
146 |
initUartD(BAUDS_19200, DATA_8BITS, NO_PARITY, ONE_STOPBIT); |
147 |
//ctrlReg = readPortA(LSR_REG);
|
148 |
//ctrlReg = readPortA(RHR_REG);
|
149 |
/*ctrlReg = readPortB(LSR_REG);
|
150 |
ctrlReg = readPortB(RHR_REG);
|
151 |
ctrlReg = readPortC(LSR_REG);
|
152 |
ctrlReg = readPortC(RHR_REG);
|
153 |
ctrlReg = readPortD(LSR_REG);
|
154 |
ctrlReg = readPortD(RHR_REG);*/
|
155 |
//_delay_ms(1000);
|
156 |
setWait(500);
|
157 |
ctrlReg = 0;
|
158 |
|
159 |
while(1) |
160 |
{ |
161 |
//Tx send
|
162 |
/*writePortA(0x42, THR_REG);
|
163 |
writePortA(0x55, THR_REG);
|
164 |
writePortA(0x43, THR_REG);
|
165 |
writePortA(0x60, THR_REG);
|
166 |
writePortA(0x97, THR_REG);
|
167 |
writePortA(0x54, THR_REG);
|
168 |
writePortA(0x26, THR_REG);
|
169 |
writePortA(0x08, THR_REG);*/
|
170 |
|
171 |
|
172 |
////////////////////////////////////////////////////////
|
173 |
//Read UART A
|
174 |
|
175 |
ctrlReg = readPortA(LSR_REG); |
176 |
|
177 |
if((ctrlReg & 0x01) == 0x01) //Check if one byte available |
178 |
{ |
179 |
bufferA[counterA] = readPortA(RHR_REG); |
180 |
counterA++; |
181 |
if(counterA >= 64) |
182 |
counterA = 0;
|
183 |
|
184 |
if(bufferA[counterA] == 0xF8) |
185 |
asm("nop"); |
186 |
|
187 |
ctrlReg = 0;
|
188 |
} |
189 |
|
190 |
|
191 |
////////////////////////////////////////////////////////
|
192 |
//Read UART B
|
193 |
|
194 |
ctrlReg = readPortB(LSR_REG); |
195 |
|
196 |
if((ctrlReg & 0x01) == 0x01) //Check if one byte available |
197 |
{ |
198 |
bufferB[counterB] = readPortB(RHR_REG); |
199 |
counterB++; |
200 |
if(counterB >= 64) |
201 |
counterB = 0;
|
202 |
|
203 |
if(bufferB[counterB] == 0xF8) |
204 |
asm("nop"); |
205 |
|
206 |
ctrlReg = 0;
|
207 |
} |
208 |
|
209 |
|
210 |
////////////////////////////////////////////////////////
|
211 |
//Read UART C
|
212 |
|
213 |
ctrlReg = readPortC(LSR_REG); |
214 |
|
215 |
if((ctrlReg & 0x01) == 0x01) //Check if one byte available |
216 |
{ |
217 |
bufferC[counterC] = readPortC(RHR_REG); |
218 |
counterC++; |
219 |
if(counterC >= 64) |
220 |
counterC = 0;
|
221 |
|
222 |
if(bufferC[counterC] == 0xF8) |
223 |
asm("nop"); |
224 |
|
225 |
ctrlReg = 0;
|
226 |
} |
227 |
|
228 |
////////////////////////////////////////////////////////
|
229 |
//Read UART D
|
230 |
|
231 |
ctrlReg = readPortD(LSR_REG); |
232 |
|
233 |
if((ctrlReg & 0x01) == 0x01) //Check if one byte available |
234 |
{ |
235 |
bufferD[counterD] = readPortD(RHR_REG); |
236 |
counterD++; |
237 |
if(counterD >= 64) |
238 |
counterD = 0;
|
239 |
|
240 |
if(bufferD[counterD] == 0xF8) |
241 |
asm("nop"); |
242 |
|
243 |
ctrlReg = 0;
|
244 |
} |
245 |
|
246 |
|
247 |
|
248 |
if(LCR_DEBUG == 0x00) |
249 |
asm("nop"); |
250 |
|
251 |
if(DLL_DEBUG == 0x00) |
252 |
asm("nop"); |
253 |
|
254 |
if(DLH_DEBUG == 0x00) |
255 |
asm("nop"); |
256 |
|
257 |
|
258 |
setWait(10);
|
259 |
//_delay_ms(1);
|
260 |
} |
261 |
|
262 |
|
263 |
return 0; |
264 |
} |
265 |
|
266 |
|
267 |
|
268 |
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
269 |
//functions
|
270 |
|
271 |
|
272 |
//////////////////////////////////////
|
273 |
//High level functions
|
274 |
|
275 |
void initUartA(uint8_t busSpeed, uint8_t dataBits, uint8_t parity, uint8_t stopBit)
|
276 |
{ |
277 |
|
278 |
uint8_t regVal; //temp value for reading register and change it's value without clearing it
|
279 |
//void (*callFuncWR)();
|
280 |
//uint8_t (*callFuncRD)();
|
281 |
//uint16_t addrWriteFunc[] = {&writePortA, &writePortB, &writePortC, &writePortD};
|
282 |
//uint16_t addrReadFunc[] = {&readPortA, &readPortB, &readPortC, &readPortD};
|
283 |
uint8_t wordValues[] = {DATA_5BITS, DATA_6BITS, DATA_7BITS, DATA_8BITS}; |
284 |
uint8_t baudsValues[] = {DL_9600_BAUDS, DL_19200_BAUDS, DL_38400_BAUDS}; |
285 |
uint8_t parityValues[] = {PARITY_NONE, PARITY_ODD, PARITY_EVEN}; |
286 |
uint8_t stopBitValues[] = {STOPBIT_ONE, STOPBIT_TWO}; |
287 |
|
288 |
//callFuncWR = uart_type > 3 ? writePortD : addrWriteFunc[uart_type];
|
289 |
//callFuncRD = uart_type > 3 ? writePortD : addrReadFunc[uart_type];
|
290 |
|
291 |
|
292 |
//Read register first...
|
293 |
regVal = readPortA(LCR_REG); |
294 |
//_delay_ms(1);
|
295 |
setWait(20);
|
296 |
regVal |= DLAB_ERF_EN_BIT; //set LCR[7] = 1 -> enable divisor latch mode
|
297 |
writePortA(regVal, LCR_REG); //switch Mode
|
298 |
//_delay_ms(1);
|
299 |
setWait(20);
|
300 |
//Set bus speed (according of 8MHz OSC. -> DL = Fosc/(16*Fbauds*DIV));
|
301 |
//DIV = 1 or 4 (see TL16C datasheet p.14), we use here DIV = 1
|
302 |
writePortA(0x00, DLH_REG); //Always 0x00 in our cfg... MAX 12MHz |
303 |
//_delay_ms(1);
|
304 |
setWait(20);
|
305 |
writePortA(busSpeed > 2 ? DL_38400_BAUDS : baudsValues[busSpeed], DLL_REG);
|
306 |
//_delay_ms(1);
|
307 |
setWait(20);
|
308 |
|
309 |
regVal = readPortA(LCR_REG); |
310 |
regVal &= ~(DLAB_ERF_EN_BIT); //set LCR[7] = 0 -> disable divisor latch mode
|
311 |
|
312 |
regVal |= dataBits > 3 ? DATA_8BITS : wordValues[dataBits]; //set 8bits mode |
313 |
regVal |= (stopBit > 1 ? STOPBIT_TWO : stopBitValues[stopBit]) << 2; //set stop bits |
314 |
regVal |= (parity > 2 ? PARITY_EVEN : parityValues[parity]) << 3; //set stop bits |
315 |
writePortA(regVal, LCR_REG); |
316 |
//_delay_ms(1);
|
317 |
setWait(20);
|
318 |
writePortA(0x01, FCR_REG); //enable FIFO |
319 |
//_delay_ms(250); //wait a bit
|
320 |
setWait(20);
|
321 |
} |
322 |
|
323 |
|
324 |
void initUartB(uint8_t busSpeed, uint8_t dataBits, uint8_t parity, uint8_t stopBit)
|
325 |
{ |
326 |
|
327 |
uint8_t regVal; //temp value for reading register and change it's value without clearing it
|
328 |
//void (*callFuncWR)();
|
329 |
//uint8_t (*callFuncRD)();
|
330 |
//uint16_t addrWriteFunc[] = {&writePortA, &writePortB, &writePortC, &writePortD};
|
331 |
//uint16_t addrReadFunc[] = {&readPortA, &readPortB, &readPortC, &readPortD};
|
332 |
uint8_t wordValues[] = {DATA_5BITS, DATA_6BITS, DATA_7BITS, DATA_8BITS}; |
333 |
uint8_t baudsValues[] = {DL_9600_BAUDS, DL_19200_BAUDS, DL_38400_BAUDS}; |
334 |
uint8_t parityValues[] = {PARITY_NONE, PARITY_ODD, PARITY_EVEN}; |
335 |
uint8_t stopBitValues[] = {STOPBIT_ONE, STOPBIT_TWO}; |
336 |
|
337 |
//callFuncWR = uart_type > 3 ? writePortD : addrWriteFunc[uart_type];
|
338 |
//callFuncRD = uart_type > 3 ? writePortD : addrReadFunc[uart_type];
|
339 |
|
340 |
|
341 |
//Read register first...
|
342 |
regVal = readPortB(LCR_REG); |
343 |
setWait(20);
|
344 |
regVal |= DLAB_ERF_EN_BIT; //set LCR[7] = 1 -> enable divisor latch mode
|
345 |
writePortB(regVal, LCR_REG); //switch Mode
|
346 |
setWait(20);
|
347 |
//Set bus speed (according of 8MHz OSC. -> DL = Fosc/(16*Fbauds*DIV));
|
348 |
//DIV = 1 or 4 (see TL16C datasheet p.14), we use here DIV = 1
|
349 |
writePortB(0x00, DLH_REG); //Always 0x00 in our cfg... MAX 12MHz |
350 |
setWait(20);
|
351 |
writePortB(busSpeed > 2 ? DL_38400_BAUDS : baudsValues[busSpeed], DLL_REG);
|
352 |
setWait(20);
|
353 |
|
354 |
regVal = readPortB(LCR_REG); |
355 |
regVal &= ~(DLAB_ERF_EN_BIT); //set LCR[7] = 0 -> disable divisor latch mode
|
356 |
|
357 |
regVal |= dataBits > 3 ? DATA_8BITS : wordValues[dataBits]; //set 8bits mode |
358 |
regVal |= (stopBit > 1 ? STOPBIT_TWO : stopBitValues[stopBit]) << 2; //set stop bits |
359 |
regVal |= (parity > 2 ? PARITY_EVEN : parityValues[parity]) << 3; //set stop bits |
360 |
writePortB(regVal, LCR_REG); |
361 |
setWait(20);
|
362 |
writePortB(0x01, FCR_REG); //enable FIFO |
363 |
setWait(20);
|
364 |
} |
365 |
|
366 |
|
367 |
void initUartC(uint8_t busSpeed, uint8_t dataBits, uint8_t parity, uint8_t stopBit)
|
368 |
{ |
369 |
|
370 |
uint8_t regVal; //temp value for reading register and change it's value without clearing it
|
371 |
//void (*callFuncWR)();
|
372 |
//uint8_t (*callFuncRD)();
|
373 |
//uint16_t addrWriteFunc[] = {&writePortA, &writePortB, &writePortC, &writePortD};
|
374 |
//uint16_t addrReadFunc[] = {&readPortA, &readPortB, &readPortC, &readPortD};
|
375 |
uint8_t wordValues[] = {DATA_5BITS, DATA_6BITS, DATA_7BITS, DATA_8BITS}; |
376 |
uint8_t baudsValues[] = {DL_9600_BAUDS, DL_19200_BAUDS, DL_38400_BAUDS}; |
377 |
uint8_t parityValues[] = {PARITY_NONE, PARITY_ODD, PARITY_EVEN}; |
378 |
uint8_t stopBitValues[] = {STOPBIT_ONE, STOPBIT_TWO}; |
379 |
|
380 |
//callFuncWR = uart_type > 3 ? writePortD : addrWriteFunc[uart_type];
|
381 |
//callFuncRD = uart_type > 3 ? writePortD : addrReadFunc[uart_type];
|
382 |
|
383 |
|
384 |
//Read register first...
|
385 |
regVal = readPortC(LCR_REG); |
386 |
setWait(20);
|
387 |
regVal |= DLAB_ERF_EN_BIT; //set LCR[7] = 1 -> enable divisor latch mode
|
388 |
writePortC(regVal, LCR_REG); //switch Mode
|
389 |
setWait(20);
|
390 |
//Set bus speed (according of 8MHz OSC. -> DL = Fosc/(16*Fbauds*DIV));
|
391 |
//DIV = 1 or 4 (see TL16C datasheet p.14), we use here DIV = 1
|
392 |
writePortC(0x00, DLH_REG); //Always 0x00 in our cfg... MAX 12MHz |
393 |
setWait(20);
|
394 |
writePortC(busSpeed > 2 ? DL_38400_BAUDS : baudsValues[busSpeed], DLL_REG);
|
395 |
setWait(20);
|
396 |
|
397 |
regVal = readPortC(LCR_REG); |
398 |
regVal &= ~(DLAB_ERF_EN_BIT); //set LCR[7] = 0 -> disable divisor latch mode
|
399 |
|
400 |
regVal |= dataBits > 3 ? DATA_8BITS : wordValues[dataBits]; //set 8bits mode |
401 |
regVal |= (stopBit > 1 ? STOPBIT_TWO : stopBitValues[stopBit]) << 2; //set stop bits |
402 |
regVal |= (parity > 2 ? PARITY_EVEN : parityValues[parity]) << 3; //set stop bits |
403 |
writePortC(regVal, LCR_REG); |
404 |
setWait(20);
|
405 |
writePortC(0x01, FCR_REG); //enable FIFO |
406 |
setWait(20);
|
407 |
} |
408 |
|
409 |
|
410 |
|
411 |
void initUartD(uint8_t busSpeed, uint8_t dataBits, uint8_t parity, uint8_t stopBit)
|
412 |
{ |
413 |
|
414 |
uint8_t regVal; //temp value for reading register and change it's value without clearing it
|
415 |
//void (*callFuncWR)();
|
416 |
//uint8_t (*callFuncRD)();
|
417 |
//uint16_t addrWriteFunc[] = {&writePortA, &writePortB, &writePortC, &writePortD};
|
418 |
//uint16_t addrReadFunc[] = {&readPortA, &readPortB, &readPortC, &readPortD};
|
419 |
uint8_t wordValues[] = {DATA_5BITS, DATA_6BITS, DATA_7BITS, DATA_8BITS}; |
420 |
uint8_t baudsValues[] = {DL_9600_BAUDS, DL_19200_BAUDS, DL_38400_BAUDS}; |
421 |
uint8_t parityValues[] = {PARITY_NONE, PARITY_ODD, PARITY_EVEN}; |
422 |
uint8_t stopBitValues[] = {STOPBIT_ONE, STOPBIT_TWO}; |
423 |
|
424 |
//callFuncWR = uart_type > 3 ? writePortD : addrWriteFunc[uart_type];
|
425 |
//callFuncRD = uart_type > 3 ? writePortD : addrReadFunc[uart_type];
|
426 |
|
427 |
|
428 |
//Read register first...
|
429 |
regVal = readPortD(LCR_REG); |
430 |
setWait(20);
|
431 |
regVal |= DLAB_ERF_EN_BIT; //set LCR[7] = 1 -> enable divisor latch mode
|
432 |
writePortD(regVal, LCR_REG); //switch Mode
|
433 |
setWait(20);
|
434 |
//Set bus speed (according of 8MHz OSC. -> DL = Fosc/(16*Fbauds*DIV));
|
435 |
//DIV = 1 or 4 (see TL16C datasheet p.14), we use here DIV = 1
|
436 |
writePortD(0x00, DLH_REG); //Always 0x00 in our cfg... MAX 12MHz |
437 |
setWait(20);
|
438 |
writePortD(busSpeed > 2 ? DL_38400_BAUDS : baudsValues[busSpeed], DLL_REG);
|
439 |
setWait(20);
|
440 |
|
441 |
regVal = readPortD(LCR_REG); |
442 |
regVal &= ~(DLAB_ERF_EN_BIT); //set LCR[7] = 0 -> disable divisor latch mode
|
443 |
|
444 |
regVal |= dataBits > 3 ? DATA_8BITS : wordValues[dataBits]; //set 8bits mode |
445 |
regVal |= (stopBit > 1 ? STOPBIT_TWO : stopBitValues[stopBit]) << 2; //set stop bits |
446 |
regVal |= (parity > 2 ? PARITY_EVEN : parityValues[parity]) << 3; //set stop bits |
447 |
writePortD(regVal, LCR_REG); |
448 |
setWait(20);
|
449 |
writePortD(0x01, FCR_REG); //enable FIFO |
450 |
setWait(20);
|
451 |
} |
452 |
|
453 |
|
454 |
|
455 |
|
456 |
|
457 |
|
458 |
|
459 |
//set an external clock on PA0
|
460 |
void initExtClock(uint8_t prescaler, uint16_t cnt)
|
461 |
{ |
462 |
TCA0.SINGLE.CMP0 = cnt; //set number of count that define period
|
463 |
TCA0.SINGLE.CTRLA = 0x01 | ((prescaler & 0x7) << 1) ; //enable with DIVn prescaler |
464 |
TCA0.SINGLE.CTRLB = 0x11; //Freq mode and enable CMP0 bit for waveform output |
465 |
PORTA.DIR |= 0x01; // PA0 OUTPUT |
466 |
} |
467 |
|
468 |
|
469 |
|
470 |
///////////////////////////////////////////////////////
|
471 |
//write functions
|
472 |
|
473 |
|
474 |
|
475 |
void writePortA(uint8_t reg, uint8_t addr)
|
476 |
{ |
477 |
DATADIR(0xFF); //set I/O on write mode |
478 |
ADDRWRITE(addr); //search uartn register
|
479 |
DATAWRITE(reg); //write data
|
480 |
CLRCSA; //enable uartA call
|
481 |
setWait(3);
|
482 |
CLRWR; //enable write mode
|
483 |
setWait(3);
|
484 |
SETWR; //disable write mode
|
485 |
setWait(3);
|
486 |
SETCSA; //disable uartA call
|
487 |
DATADIR(0x00); //set input mode (to reduce power consumption) |
488 |
} |
489 |
|
490 |
void writePortB(uint8_t reg, uint8_t addr)
|
491 |
{ |
492 |
DATADIR(0xFF); //set I/O on write mode |
493 |
ADDRWRITE(addr); //search uartn register
|
494 |
DATAWRITE(reg); //write data
|
495 |
CLRCSB; //enable uartA call
|
496 |
setWait(3);
|
497 |
CLRWR; //enable write mode
|
498 |
setWait(3);
|
499 |
SETWR; //disable write mode
|
500 |
setWait(3);
|
501 |
SETCSB; //disable uartA call
|
502 |
DATADIR(0x00); //set input mode (to reduce power consumption) |
503 |
} |
504 |
|
505 |
void writePortC(uint8_t reg, uint8_t addr)
|
506 |
{ |
507 |
DATADIR(0xFF); //set I/O on write mode |
508 |
ADDRWRITE(addr); //search uartn register
|
509 |
DATAWRITE(reg); //write data
|
510 |
CLRCSC; //enable uartA call
|
511 |
setWait(3);
|
512 |
CLRWR; //enable write mode
|
513 |
setWait(3);
|
514 |
SETWR; //disable write mode
|
515 |
setWait(3);
|
516 |
SETCSC; //disable uartA call
|
517 |
DATADIR(0x00); //set input mode (to reduce power consumption) |
518 |
} |
519 |
|
520 |
void writePortD(uint8_t reg, uint8_t addr)
|
521 |
{ |
522 |
DATADIR(0xFF); //set I/O on write mode |
523 |
ADDRWRITE(addr); //search uartn register
|
524 |
DATAWRITE(reg); //write data
|
525 |
CLRCSD; //enable uartA call
|
526 |
setWait(3);
|
527 |
CLRWR; //enable write mode
|
528 |
setWait(3);
|
529 |
SETWR; //disable write mode
|
530 |
setWait(3);
|
531 |
SETCSD; //disable uartA call
|
532 |
DATADIR(0x00); //set input mode (to reduce power consumption) |
533 |
} |
534 |
|
535 |
|
536 |
///////////////////////////////////////////////////////
|
537 |
//read functions
|
538 |
|
539 |
|
540 |
uint8_t readPortA(uint8_t addr) |
541 |
{ |
542 |
uint8_t result; |
543 |
DATADIR(0x00); //set I/O on read mode |
544 |
ADDRWRITE(addr); //search uartn register
|
545 |
CLRCSA; //enable uartA call
|
546 |
setWait(3);
|
547 |
CLRRD; //enable read mode
|
548 |
setWait(3);
|
549 |
result = PORTD.IN; //set I/O on read mode
|
550 |
setWait(3);
|
551 |
SETRD; //disable read mode
|
552 |
setWait(3);
|
553 |
SETCSA; //hang up uartA call
|
554 |
return result;
|
555 |
} |
556 |
|
557 |
uint8_t readPortB(uint8_t addr) |
558 |
{ |
559 |
uint8_t result; |
560 |
DATADIR(0x00); //set I/O on read mode |
561 |
ADDRWRITE(addr); //search uartn register
|
562 |
CLRCSB; //enable uartB call
|
563 |
setWait(3);
|
564 |
CLRRD; //enable read mode
|
565 |
setWait(3);
|
566 |
result = PORTD.IN; //set I/O on read mode
|
567 |
setWait(3);
|
568 |
SETRD; //disable read mode
|
569 |
setWait(3);
|
570 |
SETCSB; //hang up uartB call
|
571 |
return result;
|
572 |
} |
573 |
|
574 |
uint8_t readPortC(uint8_t addr) |
575 |
{ |
576 |
uint8_t result; |
577 |
DATADIR(0x00); //set I/O on read mode |
578 |
ADDRWRITE(addr); //search uartn register
|
579 |
CLRCSC; //enable uartC call
|
580 |
setWait(3);
|
581 |
CLRRD; //enable read mode
|
582 |
setWait(3);
|
583 |
result = PORTD.IN; //set I/O on read mode
|
584 |
setWait(3);
|
585 |
SETRD; //disable read mode
|
586 |
setWait(3);
|
587 |
SETCSC; //hang up uartC call
|
588 |
return result;
|
589 |
} |
590 |
|
591 |
uint8_t readPortD(uint8_t addr) |
592 |
{ |
593 |
uint8_t result; |
594 |
DATADIR(0x00); //set I/O on read mode |
595 |
ADDRWRITE(addr); //search uartn register
|
596 |
CLRCSD; //enable uartD call
|
597 |
setWait(3);
|
598 |
CLRRD; //enable read mode
|
599 |
setWait(3);
|
600 |
result = PORTD.IN; //set I/O on read mode
|
601 |
setWait(3);
|
602 |
SETRD; //disable read mode
|
603 |
setWait(3);
|
604 |
SETCSD; //hang up uartD call
|
605 |
return result;
|
606 |
} |
607 |
|
608 |
|
609 |
|
610 |
|
611 |
|
612 |
|
613 |
|
614 |
void setWait(uint16_t cnt)
|
615 |
{ |
616 |
uint16_t k = 0;
|
617 |
while(k < cnt)
|
618 |
{ |
619 |
asm("nop"); |
620 |
k++; |
621 |
} |
622 |
} |