Moin, vorweg: Ich bin fortgeschrittener Student, habe gute C-Kenntnisse und Arduinoerfahrung hoch und runter. Nun möchte ich in dem Rahmen eines Moduls weg von dem Arduinospielkram mal "richtige" Mikrocontroller ausprobieren. Ich nutze MPlab X IDE als Programmierumgebung. Der Witz des Moduls ist, dass man keinerlei fremde Bibliotheken nutzt, sondern von Grund auf alles selbst programmiert, solang man kein Assembler nutzt, sondern in C bleibt. Ich habe bereits Timer, Interrupts, IOs und PWM-Signale genutzt und mir eigene kleine Bibiotheken geschrieben. Eine Basis ist also da :) Mein Problem bei der Programmierung mit dem PIC ist eigentlich nur der Mangel an Beispielen und Erklärungen. Ich habe ein Beispielcode gefunden, wie man den PIC30F (nicht ganz meine Version) als Master für I²C nutzt: http://taur-tech.com/wp/2016/07/18/a-working-example-of-i2c-communication-using-a-microchip-dspic30f-as-master/ Ansonsten sah das relativ mau aus. Ich werde mich wohl mit dem Link und diesem "Handbuch" hier http://ww1.microchip.com/downloads/en/DeviceDoc/70000195f.pdf da entlang hangeln müssen. So viel zum Thema, nun zu den Fragen: Habt ihr andere Links zu dem Thema I²C für den PIC33? Wie macht man das, wenn man keine Anleitung findet? Und wie finde ich heraus wie mein Datenwort, dass dann hoffentlich geschickt wird, codiert sein muss, damit ein LCD Display wie bspw. dieses hier https://www.amazon.de/AZDelivery-HD44780-Display-Schnittstelle-Anzeigen/dp/B01N3B8JMN/ref=sr_1_20_sspa?ie=UTF8&qid=1511897562&sr=8-20-spons&keywords=tft+display+arduino&psc=1 damit etwas anfangen kann? Arduino Bibs aufdröseln und daraus schlau werden? Wo bezieht man dafür die Info? Beste Grüße Flap
Gast
#5229783
Findet man eigentlich alles in den Datenblättern, vom Mikrocontroller und vom Display.
Gast
#5229788
Nord L. schrieb: > vorweg: Ich bin fortgeschrittener Student, habe gute C-Kenntnisse und > Arduinoerfahrung hoch und runter. Aber weiss immer noch nicht dass "LCD Display" "Liquid Crystal Display Display" bedeuted. Und der Rest steht doch tatsächlich alles in den Datenblättern.
Gast
#5229883
Ich bin bekennender I2C-Hasse. Drum habe ich das nur für PIC32 selber geschrieben, denn für PIC24 gibts das fertig. Die Unterschiede zu deinem PIC dürften sich in Grenzen halten. Siehe Anhang. Warnung: Mein Code das sehr simpel und blockierend. Es gibt z.B. keine Timeouts, was fatal sein kann, wenn sich der Slave nicht zu einem ACK herablässt. Aber, das kannst du ja leicht verbessern. Ich bin so vorgegangen: Zunächst zerpflückt man die I2C Kommunikation in wiederverwendbare Einzelschritte, welche die I2C-Schnittstelle des PIC kann. Das wird sein: - startcondition setzen - daten senden - daten lesen - stopconditon setzen Zu jedem habe ich mir eine kleine Funktion geschrieben. Eine Kommunikation klöppelt man sich aus diesen Einzelschritten zusammen. Das kann dann Beispielsweise so aussehen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
Wie du das nicht blockierend mit Interrupts machen kannst, musst du dir selber überlgen :-)
Gast
#5230738
Kenne mich mit PIC nicht aus, aber gibt es da nicht etwas Hardware-mäßiges, was man über Register steuern kann? Stelle mir sowas wie TWI bei den Atmel-MC´s vor. Gibt es sowas bei PIC nicht? Wenn nicht, dann wäre das ja mal ein Vorschlag für Mikrochip!
Gast
#5230955
Frager schrieb: > Kenne mich mit PIC nicht aus, aber gibt es da nicht etwas > Hardware-mäßiges, was man über Register steuern kann? Stelle mir sowas > wie TWI bei den Atmel-MC´s vor. Gibt es sowas bei PIC nicht? > Wenn nicht, dann wäre das ja mal ein Vorschlag für Mikrochip! Klar gibts das. Bei den PICs heißt das, tada, I2C. Mein Code verwendet genau das. Ist ein sehr gängiges Feature. Was dem TE nicht klar ist, ist dass das bei den PICs über fast alle PICs sehr ähnlich funktioniert. D.h. es ist nicht nötig, ein spezifisches Beispiel für PIC33F herauszusuchen. Oft sind nur minimale Anpassungen nötig. Das gilt von 8-32Bit.
Hurra schrieb: > Was dem TE nicht klar ist, ist dass das bei den PICs über fast alle PICs > sehr ähnlich funktioniert. D.h. es ist nicht nötig, ein spezifisches > Beispiel für PIC33F herauszusuchen. Oft sind nur minimale Anpassungen > nötig. > Das gilt von 8-32Bit. Danke! Das war wichtige Info für mich :> Hier der Code. Header:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
Die .c source file
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
Und schließlicht die main file
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
Egal ob ich den
1 | |
Befehl ausführe oder den Code in der while-Schleife, er kommt da nicht heraus. Ich gehe da im Debugmode mit einem ICD 3 durch. Ich schreibe gleichzeitig in das TRN Register, weil es im Handbuch hieß, es müsste etwas auf den Bus geschrieben werden, damit die Startcondition ausgeführt werden könnte. Ich habe ein Oszi direkt am clk-Pin hängen, es kommt auch kein Signal. Hat wer Ideen woran es liegen könnte?
Hast du Leds die du ansteuern kannst? Dann kannst du in den Unterprogramm suchen wo er festhängt bzw. die Leds in den Unterprogramm in Abschnitten testen. Warum hast du keine Klammern in den While schleifen?
Gast
#5236685
Das hier ist dir bekannt? http://ww1.microchip.com/downloads/en/DeviceDoc/70000195f.pdf das I2C Modul ist ident für alle PIC24 und DSPIC33. Das Hauptdatenblatt ist ja immer etwas einfach gehalten. Das oben verlinkte ist sehr viel detaillierter. Ich sehe jedoch, du hast .SCLREL gesetzt. Das Bit hat nur Auswirkungen im Slave-Mode. Ich würde es mal wegtun. Außerdem sollte man das Modul erst dann einschalten, wenn die Baudrate gesetzt wird. Ob das wirklich nötig ist, weiß ich aber nicht. Bei mir war für I2C Starcondition immer nur folgendes nötig: - I2C2BRG : Baudrate setzen - I2CEN = 1 (Modul einschalten) - ACKDT = 0 (eventuell vorhandene alte Acks löschen) - SEN = 1, und dann warten. Dann musst du am Oszilloskop sehen, wie zuerst SDA, dann SCL auf LOW gehen. PS: I2C ist halt Mist und zickig. Das ist nun mal so. Da hilft nur Durchbeißen. Es lohnt sich aber, das I2C-Modul der PICs ist recht gut.
Gast
#5236721
Rainer S. schrieb: > Hast du Leds die du ansteuern kannst? > Dann kannst du in den Unterprogramm suchen wo er festhängt bzw. die Leds > in den Unterprogramm in Abschnitten testen. Was sind Leds? Ich bin mit dem ICD3 Debugger Schritt für Schritt durchgegangen, er hängt in der genannten Funktion. > Warum hast du keine Klammern in den While schleifen? Ddie main-whileSchleife hat Klammern. Die Schleife zum Warten auf dsa Setzen des .SEN bits braucht keine, soll ja nur warten. Dachdecker schrieb: > Das hier ist dir bekannt? > http://ww1.microchip.com/downloads/en/DeviceDoc/70000195f.pdf Jo, danke. > Ich sehe jedoch, du hast .SCLREL gesetzt. Das Bit hat nur Auswirkungen > im Slave-Mode. Ich würde es mal wegtun. Geht klar. > Außerdem sollte man das Modul erst dann einschalten, wenn die Baudrate > gesetzt wird. Ob das wirklich nötig ist, weiß ich aber nicht. > > Bei mir war für I2C Starcondition immer nur folgendes nötig: > - I2C2BRG : Baudrate setzen > - I2CEN = 1 (Modul einschalten) > - ACKDT = 0 (eventuell vorhandene alte Acks löschen) > - SEN = 1, und dann warten. > > Dann musst du am Oszilloskop sehen, wie zuerst SDA, dann SCL auf LOW > gehen. Komme erst wieder Montag dazu weiter zu arbeiten, dann werden die sehr konstruktiven Vorschläge umgesetzt! Vielen Dank soweit. Nordlicht
Moin moin, das mit dem I2C hat gut geklappt (deshalb musste ich mich auch nicht eher melden grins), nun hapert es noch am Display. Das Display muss im 4bit Mode angesprochen werden, weil bereits 4 Bit des I2C Datenworts für Steuerbit verbraucht werden. Die Initialisierung funktioniert soweit, dass ich das Display anschalten kann und den Cursor zum blinken bringen kann. In einer früheren Version konnte ich auch schon Buchstaben anzeigen, allerdings bin ich dahintergekommen, dass wohl die 4bit Initialisierung nicht geklappt hat, denn es konnte nur die unterste Reihe der Matrix des Manuals, LINK: https://www.sparkfun.com/datasheets/LCD/HD44780.pdf (Seite 17) angezeigt werden, auch wenn ich in die unteren 4 Bit des "data"bytes in der main() Funktion nicht mit 1111 beschrieben habe. Nach meiner Arbeit an der 4Bit Initialiserung können jedoch keinerlei Buchstaben mehr angezeigt werden. Nun bin ich mir auch unsicher, ob ich das Ganze verschlimmbessert habe, oder nicht. Ein Indiz, dass die 4Bit Initialisiserung geklappt hat, ist das am Ende des Init-Blocks mit diesen Zeilen Code das Display noch gesteuert werden kann:
1 | |
2 | |
3 | |
4 | |
5 | |
Das dürfte ja eigentlich nur dann funktionieren, wenn die 4Bit Init erfolgreich war. Was dagegen spricht, ist das es keinerlei Unterschied macht, ob dieser Block auskommentiert ist oder nicht:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
Ich habe ein wenig in einer Arduinobib gespickt, die ich für das Display getestet habe. Dort wurde der 4 Bit Mode 3 mal geschrieben, entgegen des Handbuches, wo er nur 2 mal geschrieben wurde. Falls ihr der Meinung seid, dass die Init komplett Grütze ist, kann ich gern die alte Version, in der im 8Bitmode die unterste Reihe der Matrix angezigt werden konnte, noch zur Verfügung stellen, die ist gesichtert. Meine Frage an euch: Ist die Init Mist oder die main Schleife? Und was ist Mist? Der Controller ist auf 80MHz getaktet. Die Wartezeiten in der Init zwischen den Befehlen habe ich mit einem Oszi geprüft, vor der jeweiligen WhileSchleife ein Pin auf 1 gesetzt, danach wieder runter gezogen. Die Zeiten passen und sind ca 20% über der Mindestzeit. Auf dem Bus liegt an was geschrieben wird, das habe ich mit einem Logikanalyzer geprüft. Hier der Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | |
183 | |
184 | |
185 | |
186 | |
187 | |
188 | |
189 | |
190 | |
191 | |
192 | |
193 | |
194 | |
195 | |
196 | |
197 | |
198 | |
199 | |
200 | |
201 | |
202 | |
203 | |
204 | |
205 | |
206 | |
207 | |
208 | |
209 | |
210 | |
211 | |
212 | |
213 | |
214 | |
215 | |
216 | |
217 | |
218 | |
219 | |
220 | |
221 | |
222 | |
223 | |
224 | |
225 | |
226 | |
227 | |
228 | |
229 | |
230 | |
231 | |
232 | |
233 | |
234 | |
235 | |
236 | |
237 | |
238 | |
239 | |
240 | |
241 | |
242 | |
243 | |
244 | |
245 | |
246 | |
247 | |
248 | |
249 | |
250 | |
251 | |
252 | |
253 | |
254 | |
255 | |
256 | |
257 | |
258 | |
259 | |
260 | |
261 | |
262 | |
263 | |
264 | |
265 | |
266 | |
267 | |
268 | |
269 | |
270 | |
271 | |
272 | |
273 | |
274 | |
275 | |
276 | |
277 | |
278 | |
279 | |
280 | |
281 | |
282 | |
283 | |
284 | |
285 | |
286 | |
287 | |
288 | |
289 | |
290 | |
291 | |
292 | |
293 | |
294 | |
295 | |
296 | |
297 | |
298 | |
299 | |
300 | |
301 | |
302 | |
303 | |
304 | |
305 | |
306 | |
307 | |
308 | |
309 | |
310 | |
311 | |
312 | |
313 | |
314 | |
315 | |
316 | |
317 | |
318 | |
319 | |
320 | |
321 | |
322 | |
323 | |
324 | |
325 | |
326 | |
327 | |
328 | |
329 | |
330 | |
331 | |
332 | |
333 | |
334 | |
335 | |
336 | |
337 | |
338 | |
339 | |
340 | |
341 | |
342 | |
343 | |
344 | |
345 | |
346 | |
347 | |
348 | |
349 | |
350 | |
351 | |
352 | |
353 | |
354 | |
355 | |
356 | |
357 | |
358 | |
359 | |
360 | |
361 | |
362 | |
363 | |
364 | |
365 | |
366 | |
367 | |
368 | |
369 | |
370 | |
371 | |
372 | |
373 | |
374 | |
375 | |
376 | |
377 | |
378 | |
379 | |
380 | |
381 | |
382 | |
383 | |
384 | |
385 | |
386 | |
387 | |
388 | |
389 | |
390 | |
391 | |
392 | |
393 | |
394 | |
395 | |
396 | |
397 | |
398 | |
399 | |
400 | |
401 | |
402 | |
403 | |
404 | |
405 | |
406 | |
407 | |
408 | |
409 | |
410 | |
411 | |
412 | |
413 | |
414 | |
415 | |
416 | |
417 | |
418 | |
419 | |
420 | |
421 | |
422 | |
423 | |
424 | |
425 | |
426 | |
427 | |
428 | |
429 | |
430 | |
431 | |
432 | |
433 | |
434 | |
435 | |
436 | |
437 | |
438 | |
439 | |
440 | |
441 | |
442 | |
443 | |
444 | |
445 | |
446 | |
447 | |
448 | |
449 | |
450 | |
451 | |
452 | |
453 | |
454 | |
455 | |
456 | |
457 | |
458 | |
459 | |
460 | |
461 | |
462 | |
463 | |
464 | |
465 | |
466 | |
467 | |
468 | |
469 | |
470 | |
471 | |
472 | |
473 | |
474 | |
475 | |
476 | |
477 | |
478 | |
479 | |
480 | |
481 | |
482 | |
483 | |
484 | |
485 | |
486 | |
487 | |
488 | |
489 | |
490 | |
491 | |
492 | |
493 | |
494 | |
495 | |
496 | |
497 | |
498 | |
499 | |
500 | |
501 | |
502 | |
503 | |
504 | |
505 | |
506 | |
507 | |
508 | |
509 | |
510 | |
511 | |
512 | |
513 | |
514 | |
515 | |
516 | |
517 | |
518 | |
519 | |
520 | |
521 | |
522 | |
523 | |
524 | |
525 | |
526 | |
527 | |
528 | |
529 | |
530 | |
531 | |
532 | |
533 | |
534 | |
535 | |
536 | |
537 | |
538 | |
539 | |
540 | |
541 | |
542 | |
543 | |
544 | |
545 | |
546 | |
547 | |
548 | |
549 | |
550 | |
551 | |
552 | |
553 | |
554 | |
555 | |
556 | |
557 | |
558 | |
559 | |
560 | |
561 | |
562 | |
563 | |
564 | |
565 | |
566 | |
567 | |
568 | |
569 | |
570 | |
571 | |
572 | |
573 | |
574 | |
575 | |
576 | |
577 | |
578 | |
579 | |
580 | |
581 | |
582 | |
583 | |
584 | |
585 | |
586 | |
587 | |
588 | |
589 | |
590 | |
591 | |
592 | |
593 | |
594 | |
595 | |
Falls ihr euch die Zeit für das Problem nehmt, vielen vielen Dank. Beste Grüße das Nordlicht
Gast
#5249566
Ich kann dir nur vorschlagen, das Problem sauber zu gliedern, und in einen kürzeren Beitrag zu fassen. Niemand hat Lust, sich in seiner Freizeit durch eine km-lange Textwurst zu wühlen. Mal ganz davon abgesehen, dass man da drin nichts findet. In der einen Minute habe ich die Stelle nicht gefunden, wo das Display initialisiert wird.
Gast
#6084520
Dumpf Backe schrieb: > Nord L. schrieb: >> vorweg: Ich bin fortgeschrittener Student, habe gute C-Kenntnisse und >> Arduinoerfahrung hoch und runter. > > Aber weiss immer noch nicht dass "LCD Display" > > "Liquid Crystal Display Display" > > bedeuted. > > Und der Rest steht doch tatsächlich alles in den Datenblättern. na da war wohl wieder einer besonders schlagfertig schon klar, warum er Dumpf Backe heist
Gast
#6084603
Gott schrieb: > na da war wohl wieder einer besonders schlagfertig Und Gott ist so schlagfertig dass er nur zwei Jahre gebraucht hat um diesen Sachverhalt herauszufinden.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.