PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisproblem eines Programms



wurm
12.07.2007, 21:56
Hallo,

ich habe von einem Bekannten eine modulare Steuerung für einen Robotor bekommen. Diese Steuerung arbeitet mit mehreren PIC Microkontrollern (16f873a).
Diese sind über einen RS485-Bus miteinander verbunden.
Von einem dieser Kontroller wird ein PIC 18F45J10 angesteuert, der wiederum ein kleines TFT-Display ansteuert.
Der PIC18F45J10 übernimmt die gesamte Arbeit des Ansteuerns des Displays und er empfängt über den Bus bestimmte Kommandos, damit bestimmte Bilder auf dem Display dargestellt werden.

Ich habe auch den Quelltext der entsprechenden Programme der Microkontroller. Leider habe ich von C so gut wie keine Ahnung und verstehe einen Teil des Programms zum senden der Daten nicht.

Im Programmkopf sind folgende Variablen definiert:



#define ATTN 0x11
#define ADR 0x21
#define token 0x23

dann kommt der Aufruf, der die Daten über den BUS (die UART) versenden soll:


chksum = 0;
xputch(ATTN);
puthex(ADR);
puthex(token);
//================================================== =
battstat = 0; // Batterie-Status ausblenden
//================================================== =
puthex(battstat);
chksori = chksum;
puthex(chksori);

und dann gibt es da noch die entsprechenden Unterprogramme zum senden der Daten:


//================================================== ====================
// void xputch(char c)
// --------------------------------------------------------------------
// Eingang : char c --> Zeichen welches gesendet werden soll
// Bemerkung : es wird ein Zeichen an consol-output ausgegeben
//================================================== ====================
void xputch(byte c)
{ unsigned char tonne;
if(OERR){CREN=0;CREN=1;}
if(FERR) tonne = RCREG;
while(!TXIF) asm("NOP");
TXREG = c;
chksum += c;
}

//================================================== ====================
// void puthex(unsigned char n )
// --------------------------------------------------------------------
// Eingang : unsigned char n --> Zeichen welches gesendet werden soll
// Bemerkung : es wird ein Zeichen als HEX-Wert an consol-output ausgegeben
//================================================== ====================
void puthex(byte n )
{ if(( n / 16 )<10) xputch(( n / 16 )+'0');
else xputch(( n / 16 )+0x37);
if(( n % 16 )<10) xputch(( n % 16 )+'0');
else xputch(( n % 16 )+0x37);
}

Das xputch-Unterprogramm checkt, so wie ich das verstehe, nur ein paar
Register der UART und sendet dann das Zeichen c. Danach wird das
Zeichen wohl noch zur chksum dazu addiert.

Was die puthex-Routine genau macht, verstehe ich nicht ganz.
Da wird überprüft, ob das Ergebnis der Division von n/16 kleiner als 10 ist
und dann wenn dem so ist, dann wird n/16 + '0' ausgegeben.

Was bedeutet hier die + '0'? Ist das eine Stringverarbeitung und an den
ganzzahligen Ergebniswert wird eine 0 angehängt (z.B. 10 + '0' -> 100)??

Kann mir mal jemand die puthex-Routine ein wenig erklären?


Vielen Dank,
Thorsten

NumberFive
13.07.2007, 05:17
0 => 48(0)48(0)
1 => 48(0)49(1)
2 => 48(0)50(2)
3 => 48(0)51(3)
4 => 48(0)52(4)
5 => 48(0)53(5)
6 => 48(0)54(6)
7 => 48(0)55(7)
8 => 48(0)56(8)
9 => 48(0)57(9)
10 => 48(0)65(A)
11 => 48(0)66(B)
12 => 48(0)67(C)
13 => 48(0)68(D)
14 => 48(0)69(E)
15 => 48(0)70(F)
16 => 49(1)48(0)
17 => 49(1)49(1)
18 => 49(1)50(2)
19 => 49(1)51(3)
20 => 49(1)52(4)
21 => 49(1)53(5)
22 => 49(1)54(6)
23 => 49(1)55(7)
24 => 49(1)56(8)
25 => 49(1)57(9)
26 => 49(1)65(A)
27 => 49(1)66(B)
28 => 49(1)67(C)
29 => 49(1)68(D)
30 => 49(1)69(E)
31 => 49(1)70(F)
32 => 50(2)48(0)
33 => 50(2)49(1)
34 => 50(2)50(2)
35 => 50(2)51(3)
36 => 50(2)52(4)
37 => 50(2)53(5)
38 => 50(2)54(6)
39 => 50(2)55(7)
40 => 50(2)56(8)
41 => 50(2)57(9)
42 => 50(2)65(A)
43 => 50(2)66(B)
44 => 50(2)67(C)
45 => 50(2)68(D)
46 => 50(2)69(E)
47 => 50(2)70(F)
48 => 51(3)48(0)
49 => 51(3)49(1)
50 => 51(3)50(2)
51 => 51(3)51(3)
52 => 51(3)52(4)
53 => 51(3)53(5)
54 => 51(3)54(6)
55 => 51(3)55(7)
56 => 51(3)56(8)
57 => 51(3)57(9)
58 => 51(3)65(A)
59 => 51(3)66(B)
60 => 51(3)67(C)
61 => 51(3)68(D)
62 => 51(3)69(E)
63 => 51(3)70(F)
64 => 52(4)48(0)
65 => 52(4)49(1)
66 => 52(4)50(2)
67 => 52(4)51(3)
68 => 52(4)52(4)
69 => 52(4)53(5)
70 => 52(4)54(6)
71 => 52(4)55(7)
72 => 52(4)56(8)
73 => 52(4)57(9)
74 => 52(4)65(A)
75 => 52(4)66(B)
76 => 52(4)67(C)
77 => 52(4)68(D)
78 => 52(4)69(E)
79 => 52(4)70(F)
80 => 53(5)48(0)
81 => 53(5)49(1)
82 => 53(5)50(2)
83 => 53(5)51(3)
84 => 53(5)52(4)
85 => 53(5)53(5)
86 => 53(5)54(6)
87 => 53(5)55(7)
88 => 53(5)56(8)
89 => 53(5)57(9)
90 => 53(5)65(A)
91 => 53(5)66(B)
92 => 53(5)67(C)
93 => 53(5)68(D)
94 => 53(5)69(E)
95 => 53(5)70(F)
96 => 54(6)48(0)
97 => 54(6)49(1)
98 => 54(6)50(2)
99 => 54(6)51(3)
100 => 54(6)52(4)
101 => 54(6)53(5)
102 => 54(6)54(6)
103 => 54(6)55(7)
104 => 54(6)56(8)
105 => 54(6)57(9)
106 => 54(6)65(A)
107 => 54(6)66(B)
108 => 54(6)67(C)
109 => 54(6)68(D)
110 => 54(6)69(E)
111 => 54(6)70(F)
112 => 55(7)48(0)
113 => 55(7)49(1)
114 => 55(7)50(2)
115 => 55(7)51(3)
116 => 55(7)52(4)
117 => 55(7)53(5)
118 => 55(7)54(6)
119 => 55(7)55(7)
120 => 55(7)56(8)
121 => 55(7)57(9)
122 => 55(7)65(A)
123 => 55(7)66(B)
124 => 55(7)67(C)
125 => 55(7)68(D)
126 => 55(7)69(E)
127 => 55(7)70(F)
128 => 56(8)48(0)
129 => 56(8)49(1)
130 => 56(8)50(2)
131 => 56(8)51(3)
132 => 56(8)52(4)
133 => 56(8)53(5)
134 => 56(8)54(6)
135 => 56(8)55(7)
136 => 56(8)56(8)
137 => 56(8)57(9)
138 => 56(8)65(A)
139 => 56(8)66(B)
140 => 56(8)67(C)
141 => 56(8)68(D)
142 => 56(8)69(E)
143 => 56(8)70(F)
144 => 57(9)48(0)
145 => 57(9)49(1)
146 => 57(9)50(2)
147 => 57(9)51(3)
148 => 57(9)52(4)
149 => 57(9)53(5)
150 => 57(9)54(6)
151 => 57(9)55(7)
152 => 57(9)56(8)
153 => 57(9)57(9)
154 => 57(9)65(A)
155 => 57(9)66(B)
156 => 57(9)67(C)
157 => 57(9)68(D)
158 => 57(9)69(E)
159 => 57(9)70(F)
160 => 65(A)48(0)
161 => 65(A)49(1)
162 => 65(A)50(2)
163 => 65(A)51(3)
164 => 65(A)52(4)
165 => 65(A)53(5)
166 => 65(A)54(6)
167 => 65(A)55(7)
168 => 65(A)56(8)
169 => 65(A)57(9)
170 => 65(A)65(A)
171 => 65(A)66(B)
172 => 65(A)67(C)
173 => 65(A)68(D)
174 => 65(A)69(E)
175 => 65(A)70(F)
176 => 66(B)48(0)
177 => 66(B)49(1)
178 => 66(B)50(2)
179 => 66(B)51(3)
180 => 66(B)52(4)
181 => 66(B)53(5)
182 => 66(B)54(6)
183 => 66(B)55(7)
184 => 66(B)56(8)
185 => 66(B)57(9)
186 => 66(B)65(A)
187 => 66(B)66(B)
188 => 66(B)67(C)
189 => 66(B)68(D)
190 => 66(B)69(E)
191 => 66(B)70(F)
192 => 67(C)48(0)
193 => 67(C)49(1)
194 => 67(C)50(2)
195 => 67(C)51(3)
196 => 67(C)52(4)
197 => 67(C)53(5)
198 => 67(C)54(6)
199 => 67(C)55(7)
200 => 67(C)56(8)
201 => 67(C)57(9)
202 => 67(C)65(A)
203 => 67(C)66(B)
204 => 67(C)67(C)
205 => 67(C)68(D)
206 => 67(C)69(E)
207 => 67(C)70(F)
208 => 68(D)48(0)
209 => 68(D)49(1)
210 => 68(D)50(2)
211 => 68(D)51(3)
212 => 68(D)52(4)
213 => 68(D)53(5)
214 => 68(D)54(6)
215 => 68(D)55(7)
216 => 68(D)56(8)
217 => 68(D)57(9)
218 => 68(D)65(A)
219 => 68(D)66(B)
220 => 68(D)67(C)
221 => 68(D)68(D)
222 => 68(D)69(E)
223 => 68(D)70(F)
224 => 69(E)48(0)
225 => 69(E)49(1)
226 => 69(E)50(2)
227 => 69(E)51(3)
228 => 69(E)52(4)
229 => 69(E)53(5)
230 => 69(E)54(6)
231 => 69(E)55(7)
232 => 69(E)56(8)
233 => 69(E)57(9)
234 => 69(E)65(A)
235 => 69(E)66(B)
236 => 69(E)67(C)
237 => 69(E)68(D)
238 => 69(E)69(E)
239 => 69(E)70(F)
240 => 70(F)48(0)
241 => 70(F)49(1)
242 => 70(F)50(2)
243 => 70(F)51(3)
244 => 70(F)52(4)
245 => 70(F)53(5)
246 => 70(F)54(6)
247 => 70(F)55(7)
248 => 70(F)56(8)
249 => 70(F)57(9)
250 => 70(F)65(A)
251 => 70(F)66(B)
252 => 70(F)67(C)
253 => 70(F)68(D)
254 => 70(F)69(E)
255 => 70(F)70(F)


jetzt klar was die Funktion macht ?

wurm
13.07.2007, 08:32
ja, ich denke, dass ich das jetzt verstanden habe. ich muss mich auf jeden fall mal näher mit c befassen.

vielen dank für die schnelle antwort.

mfg,
thorsten