Mein erstes PIC Programm auf der selbstgestrickten dsPIC Platine:
Kann mir jemand sagen, wieso das printf im folgenden (Test)Beispiel nur
den string 123456 ausgibt und die 7 verschluckt?
Gemäss Librarryreferenz muss man eine Hilfsfunktion write bereitstellen,
die vom printf (und anderen Funktionen aus stdio) aufgerufen wird.
Die Funktion wird für jedes Zeichen in printf aufgerufen mit length = 1.
Aber eben nicht für das letzte!
Bin ich nun blind, oder ist das ein Bug/Feature...?
1 | #include <p30f4013.h>
|
2 | #include <stdio.h>
|
3 |
|
4 | void initUART2(int baudrate, int fcy);
|
5 | int write(int handle, void *buffer, unsigned int len);
|
6 |
|
7 | int main(void)
|
8 | {
|
9 | int i=0;
|
10 |
|
11 | char buffer[] = "1234567";
|
12 |
|
13 | i=9600;
|
14 |
|
15 | initUART2(i, 10); // CPUclk = 10MHz
|
16 | printf("%s", buffer);
|
17 | return 0;
|
18 | }
|
19 |
|
20 | void initUART2(int baudrate, int fcy)
|
21 | {
|
22 | volatile UxMODEBITS *umode = &U2MODEbits;
|
23 | volatile UxSTABITS *ustatus = &U2STAbits;
|
24 | volatile unsigned int *brg = &U2BRG;
|
25 |
|
26 | *brg = (unsigned int) (fcy*1.e6/(16.*baudrate)-1.);
|
27 |
|
28 | umode->UARTEN = 1;
|
29 | umode->LPBACK = 0;
|
30 | umode->ALTIO = 0;
|
31 | umode->ABAUD = 0;
|
32 | umode->PDSEL = 0;
|
33 | umode->STSEL =0;
|
34 |
|
35 | ustatus->UTXISEL = 1;
|
36 | ustatus->UTXBRK = 0;
|
37 | ustatus->UTXEN = 1;
|
38 | return;
|
39 | }
|
40 |
|
41 |
|
42 | int write(int handle, void *buffer, unsigned int len)
|
43 | {
|
44 | int i;
|
45 | volatile unsigned int c;
|
46 |
|
47 | volatile UxSTABITS *ustatus = &U2STAbits;
|
48 | volatile unsigned int *txreg = &U2TXREG;
|
49 |
|
50 | for (i = 0; i<len; i++)
|
51 | {
|
52 | while ((ustatus->TRMT) == 0);
|
53 | c = ((unsigned int *)buffer)[i];
|
54 | *txreg = c;
|
55 | }
|
56 | return(len);
|
57 | }
|