n'abend,
nach ca. 12 stunden (gefühlt 120 stunden) fließt mir langsam das hirn zu
den ohren raus...
mein uart macht FAST was er soll, aber seit stunden immer nur FAST!!!
aahhh
wie folgt:
ich schicke mit dem befehl
U1TXREG = data & 0xFF; (aus der microchip uart lib) folgendes:
0x18 0x18 0x18
und lese das ergebnis mit hTerm:
0xcf 0xcf 0xcf 0xFF
das ganze binär:
gesendet:
00011000 00011000 00011000
empfangen:
11001111 11001111 11001111 11111111
es werden immer genau so viele bytes empfangen wie gesendet (und
zusätzlich 0xff am ende, warum auch immer)
die empfangen bytes scheinen invertiert zu sein (halb so wild), um 1
nach links verschoben, und die rechte stelle mit ner 1 aufgefüllt.
will ich jetzt zumindest mal die invertierung ausgleichen mit
U1TXREG = 0xff - (data & 0xFF);
dann liest hTerm:
00110001 00110001 00110001 11111111
d.h. meine datenbytes richtig rum, aber immer noch verschoben, und die 1
hinten dran (und das 0xff byte am ende)
und jetzt kommt der knüller:
meine sendeeinstellung ist:
8bit, parity even, 1 stopbit
wenn ich am empfänger (hTerm) die gleichen einstellungen vornehme, dann
sind die ganzen empfangenen bytes rot (fehler)
stelle ich jetzt aber den empfänger so ein:
8bit, parity ODD, 1 stopbit
dann zeigt er KEINE fehler an. (die empfangen bytes sehen genauso dumm
aus)
(bei anderen gesendeten bytes wie z.b. 1c bekomm ich in jedem fall
fehler)
hier ein bisschen code
1 | #define FCY 14745600ul //7,3728 * 10^6 * 8 (pll8)
|
2 | #define BAUD 38400ul
|
3 | #define UBRG_VAL ((FCY+BAUD*8)/(BAUD*16)-1)
|
4 | #define BAUD_REAL (FCY/(16*(UBRG_VAL+1)))
|
5 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
|
6 |
|
7 | /*dank der frequenz ergibt das immer subergerade UBRG_VAL werte*/
|
8 |
|
9 | _FOSC(CSW_FSCM_OFF & XT_PLL8); /* external 7,3728MHz, PLL8 */
|
10 | _FWDT(WDT_OFF); /* Watch dog Timer OFF */
|
11 | _FBORPOR(PBOR_OFF & MCLR_EN); /* Brown Out OFF, MCLR Enabled */
|
12 | _FGS(CODE_PROT_OFF); /* Code Protect OFF */
|
13 |
|
14 |
|
15 | int main(void){
|
16 |
|
17 | U1MODE = 0x8082; /* operation settings */
|
18 | U1STA = 0x510; /* TX & RX interrupt modes */
|
19 | U1BRG = UBRG_VAL; /* baud rate */
|
20 |
|
21 |
|
22 | for(i=0;i<3;i++){
|
23 | while(U1STAbits.TRMT!=1);
|
24 | WriteUART1(0x18);
|
25 | }
|
26 |
|
27 | while(U1STAbits.TRMT!=1);
|
28 | U1MODEbits.UARTEN = 0;
|
29 |
|
30 | }
|
31 |
|
32 | void WriteUART1(unsigned int data){
|
33 |
|
34 | U1TXREG = 0xff - (data & 0xFF);
|
35 | /*zahl & 0xff ist doch immer die zahl selbst?*/
|
36 |
|
37 | }
|
weiß irgendjemand rat?
danke!
nochwas:
ich kann sogar mit gewalt meine zahl richtig hinschieben:
U1TXREG = (0xff - (data & 0xFF)) >> 1;
dann sind die bits an der richtigen position, aber die 1 rechts geht
nicht weg...
(also bei z.B. 00011100 kommt 00011101 an ...)