Moin zusammen . Ich bin grade dabei mich in die Pic Programmierung einzuarbeiten, also noch ein absoluter Anfänger in solchen Dingen. Die 3-4 Jahre Info in der Schule haben da nicht viel gebracht... Ein kleines Programm zu schreiben hab ich jedoch nach einiger Zeit endlich hinbekommen. Aufgrund meiner Zweifel an der richtigen Programmierung hab ich das Programm dann mit dem "Real Pic Simulator" simuliert. Und nach einigen Versuchen ging es sogar Also dachte ich mir, versuch ich es mal richtig. Programm auf den Pic "gebrannt" (mit Mplab IDE) und dann Strom anschlossen, Quarz (20MHZ)auch , Oszilloskop an den festgelegten Ausgangspin und nix -.- Garkeine Reaktion. Ich habe den Pic 16F871 verwendet. (http://circuits.datasheetdir.com/19/PIC16F871-pinout.jpg) An die beiden Linken Vss u Vdd Anschlüsse(Pin 11 und 12) Strom(5V) angelegt. (kurze Frage , warum gibt es eigentlich 2x Vss und 2x Vdd (Pin11,12 und 31,32) An die Pins 13 und 14 den Quarz und zwar direkt. Kann man den direkt anschließen? Hab glaubich irgendwo gelesen gehabt das das nicht gehen soll... Mein Lehrer war jedoch der Meinung das sie es früher immer so gemacht hatten und es auch so ging... Muss vllt festgelegt werden das ein externer Quarz verwendet wird? oder so? Den Pin 33 also RB0 hab ich als Ausgang festgelegt. Jedoch kam da nix an/raus.. Nun meine Frage, wo ist der/die Fehler? Da die Simulation erfolgreich war, muss eigentlich der Fehler in der Schaltung liegen... Ich würde mich über eine Lösung freuen Mfg Andi
Andi schrieb: > (kurze Frage , warum gibt es eigentlich 2x Vss und 2x Vdd (Pin11,12 und > 31,32) Es kann Chip-Layout abhängig sein. Einfach immer alles an Versorgung anschließen. Es gibt auch bei manchen PICs AGND und AVdd, dies ist die Versorgungsspannung vom Analog-Digital-Wandler im PIC. Andi schrieb: > An die Pins 13 und 14 den Quarz und zwar direkt. > Kann man den direkt anschließen? > Hab glaubich irgendwo gelesen gehabt das das nicht gehen soll... > Mein Lehrer war jedoch der Meinung das sie es früher immer so gemacht > hatten und es auch so ging... Dein Quarz hat 2 Anschlüsse. Diese kommen an die beiden PINs vom PIC, da ist es auch egal welcher Pin an welchen Anschluss vom Quarz. Zusätzlich pro Quarz-Anschluss ein Kondensator mit ~12-22pF gegen Masse. Sollte im Datenblatt (was du hoffentlich gelesen oder mindestens überflogen hast) aber auch abgebildet sein. Andi schrieb: > Muss vllt festgelegt werden das ein externer Quarz verwendet wird? oder > so? Ja, in dem/den Config-Word(s) wird u.A. festgelegt, ob interner Oscillator, externes RC-Glied, externer Quarz/Oszillator usw. Andi schrieb: > Nun meine Frage, wo ist der/die Fehler? Ohne Schaltplan, am besten zusätzlich noch ein Foto vom Aufbau, und ohne Programmcode wird man es nicht sagen können ;)
Ja, wir brauchen auf jeden Fall mehr Infos. Also ein Schaltplan muss her, und auch bitte der Programmcode. Gruß Jens
Danke erstma für die schnellen Antworten ;) Den Aufbau hab ich unten rangehangen. Ich hoffe man kann es erkennen, ist da alles andere als hübsch oder ordentlich. Denke der Fehler liegt in der Festlegung vom Quarz im Quelltext. Zu dem Quelltext. is bissel lang^^
1 | |
2 | ;********************************************************************** |
3 | ; This file is a basic code template for assembly code generation * |
4 | ; on the PIC16F871. This file contains the basic code * |
5 | ; building blocks to build upon. * |
6 | ; * |
7 | ; Refer to the MPASM User's Guide for additional information on * |
8 | ; features of the assembler (Document DS33014). * |
9 | ; * |
10 | ; Refer to the respective PIC data sheet for additional * |
11 | ; information on the instruction set. * |
12 | ; * |
13 | ;********************************************************************** |
14 | ; * |
15 | ; Filename: xxx.asm * |
16 | ; Date: * |
17 | ; File Version: * |
18 | ; * |
19 | ; Author: * |
20 | ; Company: * |
21 | ; * |
22 | ; * |
23 | ;********************************************************************** |
24 | ; * |
25 | ; Files Required: P16F871.INC * |
26 | ; * |
27 | ;********************************************************************** |
28 | ; * |
29 | ; Notes: * |
30 | ; * |
31 | ;********************************************************************** |
32 | |
33 | |
34 | list p=16f871 ; list directive to define processor |
35 | #include <p16f871.inc> ; processor specific variable definitions |
36 | |
37 | __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _CPD_OFF |
38 | |
39 | ; '__CONFIG' directive is used to embed configuration data within .asm file. |
40 | ; The lables following the directive are located in the respective .inc file. |
41 | ; See respective data sheet for additional information on configuration word. |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | ;***** VARIABLE DEFINITIONS |
49 | w_temp EQU 0x7E ; variable used for context saving |
50 | status_temp EQU 0x7F ; variable used for context saving |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | ;********************************************************************** |
59 | ORG 0x000 ; processor reset vector |
60 | |
61 | |
62 | |
63 | cblock
|
64 | CounterA
|
65 | CounterB
|
66 | CounterC
|
67 | CounterD
|
68 | CounterE
|
69 | CounterF
|
70 | CounterG
|
71 | CounterH
|
72 | CounterM
|
73 | CounterN
|
74 | CounterO
|
75 | CounterP
|
76 | CounterI
|
77 | CounterJ
|
78 | CounterQ
|
79 | CounterL
|
80 | |
81 | |
82 | endc
|
83 | |
84 | ; remaining code goes here |
85 | Init
|
86 | |
87 | bsf STATUS, RP0 ; auf Bank 1 umschalten |
88 | movlw B'00000000' ; PortB alle output |
89 | movwf TRISB |
90 | bcf STATUS, RP0 ; auf Bank 0 zurückschalten |
91 | clrf PORTB ; alle ausschalten |
92 | goto mainloop |
93 | |
94 | |
95 | mainloop
|
96 | |
97 | bcf PORTB,0 ;port0 aus ;0 |
98 | call delay100ms ;0 |
99 | bsf PORTB,0 ;ein ;0 |
100 | call delay900ms ;0 |
101 | |
102 | |
103 | bcf PORTB,0 ;port0 aus |
104 | call delay100ms |
105 | bsf PORTB,0 ;ein |
106 | call delay900ms |
107 | |
108 | bcf PORTB,0 ;port0 aus |
109 | call delay100ms |
110 | bsf PORTB,0 ;ein |
111 | call delay900ms |
112 | |
113 | bcf PORTB,0 ;port0 aus |
114 | call delay100ms |
115 | bsf PORTB,0 ;ein |
116 | call delay900ms |
117 | bcf PORTB,0 ;port0 aus |
118 | call delay100ms |
119 | bsf PORTB,0 ;ein |
120 | call delay900ms |
121 | bcf PORTB,0 ;port0 aus |
122 | call delay100ms |
123 | bsf PORTB,0 ;ein |
124 | call delay900ms |
125 | bcf PORTB,0 ;port0 aus |
126 | call delay100ms |
127 | bsf PORTB,0 ;ein |
128 | call delay900ms |
129 | bcf PORTB,0 ;port0 aus |
130 | call delay100ms |
131 | bsf PORTB,0 ;ein |
132 | call delay900ms |
133 | bcf PORTB,0 ;port0 aus |
134 | call delay100ms |
135 | bsf PORTB,0 ;ein |
136 | call delay900ms |
137 | bcf PORTB,0 ;port0 aus |
138 | call delay100ms |
139 | bsf PORTB,0 ;ein |
140 | call delay900ms |
141 | bcf PORTB,0 ;port0 aus |
142 | call delay100ms |
143 | bsf PORTB,0 ;ein |
144 | call delay900ms |
145 | bcf PORTB,0 ;port0 aus |
146 | call delay100ms |
147 | bsf PORTB,0 ;ein |
148 | call delay900ms |
149 | bcf PORTB,0 ;port0 aus |
150 | call delay100ms |
151 | bsf PORTB,0 ;ein |
152 | call delay900ms |
153 | bcf PORTB,0 ;port0 aus |
154 | call delay100ms |
155 | bsf PORTB,0 ;ein |
156 | call delay900ms |
157 | bcf PORTB,0 ;port0 aus |
158 | call delay100ms |
159 | bsf PORTB,0 ;ein |
160 | call delay900ms |
161 | |
162 | |
163 | |
164 | bcf PORTB,0 ;aus ;1 |
165 | call delay200ms ;1 |
166 | bsf PORTB,0 ;ein ;1 |
167 | Call delay800ms ;1 |
168 | |
169 | |
170 | bcf PORTB,0 ;port0 aus ;0 |
171 | call delay100ms ;0 |
172 | bsf PORTB,0 ;ein ;0 |
173 | call delay900ms ;0 |
174 | |
175 | bcf PORTB,0 ;port0 aus |
176 | call delay100ms |
177 | bsf PORTB,0 ;ein |
178 | call delay900ms |
179 | |
180 | bcf PORTB,0 ;aus ;1 |
181 | call delay200ms ;1 |
182 | bsf PORTB,0 ;ein ;1 |
183 | Call delay800ms ;1 |
184 | |
185 | bcf PORTB,0 ;port0 aus ;0 |
186 | call delay100ms ;0 |
187 | bsf PORTB,0 ;ein ;0 |
188 | call delay900ms ;0 |
189 | |
190 | bcf PORTB,0 ;aus ;1 |
191 | call delay200ms ;1 |
192 | bsf PORTB,0 ;ein ;1 |
193 | Call delay800ms ;1 |
194 | |
195 | bcf PORTB,0 ;aus ;1 |
196 | call delay200ms ;1 |
197 | bsf PORTB,0 ;ein ;1 |
198 | Call delay800ms ;1 |
199 | |
200 | bcf PORTB,0 ;port0 aus ;0 |
201 | call delay100ms ;0 |
202 | bsf PORTB,0 ;ein ;0 |
203 | call delay900ms ;0 |
204 | |
205 | bcf PORTB,0 ;aus ;1 |
206 | call delay200ms ;1 |
207 | bsf PORTB,0 ;ein ;1 |
208 | Call delay800ms ;1 |
209 | |
210 | |
211 | bcf PORTB,0 ;port0 aus ;0 |
212 | call delay100ms ;0 |
213 | bsf PORTB,0 ;ein ;0 |
214 | call delay900ms ;0 |
215 | |
216 | bcf PORTB,0 ;aus ;1 |
217 | call delay200ms ;1 |
218 | bsf PORTB,0 ;ein ;1 |
219 | Call delay800ms ;1 |
220 | |
221 | bcf PORTB,0 ;port0 aus ;0 |
222 | call delay100ms ;0 |
223 | bsf PORTB,0 ;ein ;0 |
224 | call delay900ms ;0 |
225 | |
226 | bcf PORTB,0 ;port0 aus ;0 |
227 | call delay100ms ;0 |
228 | bsf PORTB,0 ;ein ;0 |
229 | call delay900ms ;0 |
230 | |
231 | bcf PORTB,0 ;aus ;1 |
232 | call delay200ms ;1 |
233 | bsf PORTB,0 ;ein ;1 |
234 | Call delay800ms ;1 |
235 | |
236 | bcf PORTB,0 ;aus ;1 |
237 | call delay200ms ;1 |
238 | bsf PORTB,0 ;ein ;1 |
239 | Call delay800ms ;1 |
240 | |
241 | bcf PORTB,0 ;port0 aus ;0 |
242 | call delay100ms ;0 |
243 | bsf PORTB,0 ;ein ;0 |
244 | call delay900ms ;0 |
245 | |
246 | bcf PORTB,0 ;port0 aus ;0 |
247 | call delay100ms ;0 |
248 | bsf PORTB,0 ;ein ;0 |
249 | call delay900ms ;0 |
250 | |
251 | bcf PORTB,0 ;port0 aus ;0 |
252 | call delay100ms ;0 |
253 | bsf PORTB,0 ;ein ;0 |
254 | call delay900ms ;0 |
255 | |
256 | bcf PORTB,0 ;aus ;1 |
257 | call delay200ms ;1 |
258 | bsf PORTB,0 ;ein ;1 |
259 | Call delay800ms ;1 |
260 | |
261 | bcf PORTB,0 ;port0 aus ;0 |
262 | call delay100ms ;0 |
263 | bsf PORTB,0 ;ein ;0 |
264 | call delay900ms ;0 |
265 | |
266 | bcf PORTB,0 ;port0 aus ;0 |
267 | call delay100ms ;0 |
268 | bsf PORTB,0 ;ein ;0 |
269 | call delay900ms ;0 |
270 | |
271 | bcf PORTB,0 ;aus ;1 |
272 | call delay200ms ;1 |
273 | bsf PORTB,0 ;ein ;1 |
274 | Call delay800ms ;1 |
275 | |
276 | bcf PORTB,0 ;port0 aus ;0 |
277 | call delay100ms ;0 |
278 | bsf PORTB,0 ;ein ;0 |
279 | call delay900ms ;0 |
280 | |
281 | bcf PORTB,0 ;aus ;1 |
282 | call delay200ms ;1 |
283 | bsf PORTB,0 ;ein ;1 |
284 | Call delay800ms ;1 |
285 | |
286 | bcf PORTB,0 ;port0 aus ;0 |
287 | call delay100ms ;0 |
288 | bsf PORTB,0 ;ein ;0 |
289 | call delay900ms ;0 |
290 | |
291 | bcf PORTB,0 ;aus ;1 |
292 | call delay200ms ;1 |
293 | bsf PORTB,0 ;ein ;1 |
294 | Call delay800ms ;1 |
295 | |
296 | bcf PORTB,0 ;port0 aus ;0 |
297 | call delay100ms ;0 |
298 | bsf PORTB,0 ;ein ;0 |
299 | call delay900ms ;0 |
300 | |
301 | bcf PORTB,0 ;aus ;1 |
302 | call delay200ms ;1 |
303 | bsf PORTB,0 ;ein ;1 |
304 | Call delay800ms ;1 |
305 | |
306 | bcf PORTB,0 ;aus ;1 |
307 | call delay200ms ;1 |
308 | bsf PORTB,0 ;ein ;1 |
309 | Call delay800ms ;1 |
310 | |
311 | bcf PORTB,0 ;port0 aus ;0 |
312 | call delay100ms ;0 |
313 | bsf PORTB,0 ;ein ;0 |
314 | call delay900ms ;0 |
315 | |
316 | bcf PORTB,0 ;port0 aus ;0 |
317 | call delay100ms ;0 |
318 | bsf PORTB,0 ;ein ;0 |
319 | call delay900ms ;0 |
320 | |
321 | |
322 | bcf PORTB,0 ;aus ;1 |
323 | call delay200ms ;1 |
324 | bsf PORTB,0 ;ein ;1 |
325 | Call delay800ms ;1 |
326 | |
327 | bcf PORTB,0 ;port0 aus ;0 |
328 | call delay100ms ;0 |
329 | bsf PORTB,0 ;ein ;0 |
330 | call delay900ms ;0 |
331 | |
332 | bcf PORTB,0 ;port0 aus ;0 |
333 | call delay100ms ;0 |
334 | bsf PORTB,0 ;ein ;0 |
335 | call delay900ms ;0 |
336 | |
337 | bcf PORTB,0 ;port0 aus ;0 |
338 | call delay100ms ;0 |
339 | bsf PORTB,0 ;ein ;0 |
340 | call delay900ms ;0 |
341 | |
342 | bcf PORTB,0 ;port0 aus ;0 |
343 | call delay100ms ;0 |
344 | bsf PORTB,0 ;ein ;0 |
345 | call delay900ms ;0 |
346 | |
347 | bcf PORTB,0 ;aus ;1 |
348 | call delay200ms ;1 |
349 | bsf PORTB,0 ;ein ;1 |
350 | Call delay800ms ;1 |
351 | |
352 | bcf PORTB,0 ;port0 aus ;0 |
353 | call delay100ms ;0 |
354 | bsf PORTB,0 ;ein ;0 |
355 | call delay900ms ;0 |
356 | |
357 | bcf PORTB,0 ;port0 aus ;0 |
358 | call delay100ms ;0 |
359 | bsf PORTB,0 ;ein ;0 |
360 | call delay900ms ;0 |
361 | |
362 | |
363 | bcf PORTB,0 ;aus ;1 |
364 | call delay200ms ;1 |
365 | bsf PORTB,0 ;ein ;1 |
366 | Call delay800ms ;1 |
367 | |
368 | bcf PORTB,0 ;port0 aus ;0 |
369 | call delay100ms ;0 |
370 | bsf PORTB,0 ;ein ;0 |
371 | call delay900ms ;0 |
372 | |
373 | bcf PORTB,0 ;port0 aus ;0 |
374 | call delay100ms ;0 |
375 | bsf PORTB,0 ;ein ;0 |
376 | call delay900ms ;0 |
377 | |
378 | bcf PORTB,0 ;port0 aus ;0 |
379 | call delay100ms ;0 |
380 | bsf PORTB,0 ;ein ;0 |
381 | call delay900ms ;0 |
382 | |
383 | bcf PORTB,0 ;port0 aus ;0 |
384 | call delay100ms ;0 |
385 | bsf PORTB,0 ;ein ;0 |
386 | call delay900ms ;0 |
387 | |
388 | bcf PORTB,0 |
389 | call delay200ms |
390 | call delay800ms |
391 | |
392 | |
393 | |
394 | goto mainloop |
395 | |
396 | |
397 | |
398 | |
399 | |
400 | delay100ms
|
401 | ;PIC Time Delay = 0,10000100 s with Osc = 20000000000 Hz |
402 | ;499994 cycles |
403 | movlw 0x03 |
404 | movwf CounterI |
405 | movlw 0x18 |
406 | movwf CounterJ |
407 | movlw 0x02 |
408 | movwf CounterQ |
409 | Delay_2
|
410 | decfsz CounterI, f |
411 | goto $+2 |
412 | decfsz CounterJ, f |
413 | goto $+2 |
414 | decfsz CounterQ, f |
415 | goto Delay_2 |
416 | |
417 | ;2 cycles |
418 | goto $+1 |
419 | retlw 0 |
420 | |
421 | |
422 | delay900ms
|
423 | ;PIC Time Delay = 0,90000000 s with Osc = 20000000000 Hz |
424 | movlw 0x27 |
425 | movwf CounterM |
426 | movlw 0xD0 |
427 | movwf CounterN |
428 | movlw 0x0A |
429 | movwf CounterO |
430 | Delay_q
|
431 | decfsz CounterM, f |
432 | goto $+2 |
433 | decfsz CounterN, f |
434 | goto $+2 |
435 | decfsz CounterO, f |
436 | goto Delay_q |
437 | |
438 | ;6 cycles |
439 | goto $+1 |
440 | goto $+1 |
441 | goto $+1 |
442 | retlw 0 |
443 | |
444 | |
445 | |
446 | |
447 | |
448 | |
449 | |
450 | delay200ms
|
451 | ;PIC Time Delay = 0,20000000 s with Osc = 20000000000 Hz |
452 | ;999990 cycles |
453 | movlw 0x07 |
454 | movwf CounterE |
455 | movlw 0x2F |
456 | movwf CounterF |
457 | movlw 0x03 |
458 | movwf CounterG |
459 | Delay_0
|
460 | decfsz CounterE, f |
461 | goto $+2 |
462 | decfsz CounterF, f |
463 | goto $+2 |
464 | decfsz CounterG, f |
465 | goto Delay_0 |
466 | |
467 | ;6 cycles |
468 | goto $+1 |
469 | goto $+1 |
470 | goto $+1 |
471 | retlw 0 |
472 | |
473 | |
474 | delay800ms
|
475 | |
476 | ;PIC Time Delay = 0,80000000 s with Osc = 20000000000 Hz |
477 | ;3999994 cycles |
478 | movlw 0x23 |
479 | movwf CounterA |
480 | movlw 0xB9 |
481 | movwf CounterB |
482 | movlw 0x09 |
483 | movwf CounterC |
484 | Delay_1
|
485 | decfsz CounterA, f |
486 | goto $+2 |
487 | decfsz CounterB, f |
488 | goto $+2 |
489 | decfsz CounterC, f |
490 | goto Delay_1 |
491 | |
492 | ;2 cycles |
493 | goto $+1 |
494 | return
|
495 | END
|
496 | |
497 | END ; directive 'end of program' |
Aaalso ;) Zum Schaltplan: Die 2 von mir erwähnten Kondensatoren vom Quarz zur Masse fehlen. Siehe Datenblatt, Seite 89 (PDF 91): http://ww1.microchip.com/downloads/en/DeviceDoc/30569b.pdf Dazu hast du, wie ich schon meinte, auf der rechten Seite die Versorgung nicht angeschlossen. Ehrlich gesagt, bin ich mir nicht sicher, ob man diese zwingend anschließen muss, da ich es noch nie probiert habe. Also erstmal anschließen. Zuletzt: Pin1 ist ein Reset-Eingang. Dieser startet den PIC neu. Da dieser im moment in der Luft hängt, wird bestimmt der PIC die ganze zeit neu starten. Dort gehört ein Pull-Up-Widerstand zu 5V dran, z.B. 10k Ohm. Zum Programm: Auf der Seite im Datenblatt siehst du auch, dass du _RC_OSC bei einem RC-Glied benutzen musst. Da du aber einen Quarz benutzt, musst du XT oder HS verwenden, XT bis 4MHz, HS ab 4MHz. Die warteschleifen hab ich so nicht geprüft, jedoch kann man auch Code sparen (gerade bei so "langen" Warteschleifen), wenn du eine 100ms-Wartefunktion machst und bei 200ms, 800ms und 900ms diese 100ms-Funktion entsprechend oft aufrufst.
Hi, JA- Du hast einen Fehler bei der Quarzfestlegung. Im Quelltext steht _RC_OSC das steht für eine externe Kombination von Kondensator und Widerstand. ICh habe die 871er bezeichnungen nicht ganz im Kopf, manchmal weichen die (leider) etwas ab, aber für einen Quarz müsste da wahrscheinlich stehen: _XT_OSC , evtl. wenn der Quarz eine HOHE Frequenz hat, z.B. 20MHz (Manchmal, je nach Quarz auch bei 16) auch HS_OSC! Zudem sind bei dir am Quarz keine Kondensatoren Angebracht! Du brauchst noch von jedem Anschluss des Quarzes einen Keramikkondensator mit einem Wert zwischen 15 bis 22pf nach Masse. Gruß Carsten
Was mir doch noch aufgefallen ist: Die Warteschleife sieht mir irgendwie generiert aus, was ja auch nicht schlimm ist, nur: Andi schrieb: > ;PIC Time Delay = 0,80000000 s with Osc = 20000000000 Hz 20000000000 Hz?? -> 20.000.000.000 Hz -> 20GHz. Ich wünschte manchmal mein PC wär so schnell ;) Ich mein nur, evtl hat der Generator auch "falsch" gerechnet, wenn er von 20GHz statt 20 MHz ausgegangen ist. Sollte trotzdem einen Takt ausgeben, den du mit dem Oszi messen kannst.
Danke schonmal , Sind die Kondensatoren zwingend notwendig oder eher empfehlenswert? ;) Werd die vermutlich eh einbauen, aber halt intressehalber . Das mit der Versorgung war wenn nicht der einzige Fehler, beim rumprobieren hab ich auch beide verbunden. Zu dem Reset-Eingang, man bin ich doof . Hatte ich auch schon häufig vorher gelesen gehabt.. aber daran hab ich natürlich dann nicht gedacht :) Zu dem Programm, reicht es dann wenn ich bei der Festlegung , also bei der config das "& _HS_OS" einfüge? Zu der Sparsamkeit, da geht wirklich deutlich mehr ;) Hätte einfach 2 Unterprogramme machen können und die immer aufrufen können , aber das kommt später wenn der Rest erstmal stimmt .
Michael Skropski schrieb: > Was mir doch noch aufgefallen ist: > > Die Warteschleife sieht mir irgendwie generiert aus, was ja auch nicht > schlimm ist, nur: > > Andi schrieb: >> ;PIC Time Delay = 0,80000000 s with Osc = 20000000000 Hz > > 20000000000 Hz?? -> 20.000.000.000 Hz -> 20GHz. Ich wünschte manchmal > mein PC wär so schnell ;) > > Ich mein nur, evtl hat der Generator auch "falsch" gerechnet, wenn er > von 20GHz statt 20 MHz ausgegangen ist. Sollte trotzdem einen Takt > ausgeben, den du mit dem Oszi messen kannst. Jo, gut gesehn ;) Das ist natürlich Schwachsinn , da kommt 20000000Hz hin .
Andi schrieb: > Sind die Kondensatoren zwingend notwendig oder eher empfehlenswert? ;) > Werd die vermutlich eh einbauen, aber halt intressehalber . Die sind notwendig;) Nach meinem Wissensstand bringen die den Quarz zum schwingen. Andi schrieb: > reicht es dann wenn ich bei der Festlegung , also bei der config das "& > _HS_OS" einfüge? Kommt drauf an, wie der Assembler das umsetzt. Nur sehe ich keinen Sinn darin den RC_OSC drin zu behalten, da du ihn schlicht nicht angeschlossen hast. Andi schrieb: > Zu der Sparsamkeit, da geht wirklich deutlich mehr ;) > Hätte einfach 2 Unterprogramme machen können und die immer aufrufen > können , aber das kommt später wenn der Rest erstmal stimmt . War auch nur als Tipp gemeint. Was ich mir auch angewöhnt habe: Ich hab ganz am Anfang immer die Initialisierung. Dort stehen ALLE TRIS und PORT-Register, aber auch OSCCON, ADCON usw. Die passen zwar nicht immer, aber dann vergesse ich nicht mal ein Register hinzuschreiben oder nachzugucken, ob es das Register gibt und wenn nicht, ob es vergleichbare gibt. Da AD-Wandlereingänge eine höhere Priorität haben, als Digitale Eingänge (also vom vordefiniertem zustand der Register als ADC-Input eingestellt sind), stell ich sie so gleich immer aus (es sei denn ich brauch sie. Alles was ich nicht brauche, kommentiere ich aus. Ich weiß nicht, ob du extra nachgeguckt hast, welche Einstellung im OSCCON-Register ist, aber dort wird u.A. der Taktteiler eingestellt. Und nur wenn du den weißt, kannst du auch eine Warteschleife programmieren ;) Andi schrieb: > Jo, gut gesehn ;) > Das ist natürlich Schwachsinn , da kommt 20000000Hz hin . Hast du die denn (evtl falsch) generieren lassen oder selbst programmiert?
Michael Skropski schrieb: > Ich weiß nicht, ob du extra nachgeguckt hast, welche Einstellung im > OSCCON-Register ist, aber dort wird u.A. der Taktteiler eingestellt. Und > nur wenn du den weißt, kannst du auch eine Warteschleife programmieren > ;) Ich hab ins DB geguckt. Der hat noch kein OSCCON-Register ;) Der ist schon n Stück älter der PIC. Edit: Den PIC den ich u.A. für mein nächstes Projekt nehme ist der PIC16F1825, der Anfang/Mitte letzen Jahres rausgekommen ist. Die neueren haben im Datenblatt mehr Blockschaltbilder, wie z.B. vom Clock Source auf Seite 58: http://ww1.microchip.com/downloads/en/DeviceDoc/41440B.pdf Kann man gut sehen, wie was womit einstellbar ist.
Danke, ihr habt mir sehr geholfen. Demnach müssen nur noch die Kondensatoren ergänzt werden. Der Reset Pin auf High gelegt werden, sowie die Quarzfestlegung . @Michael Skropski Mich wundert nur warum es denn auch schon bei Leuten ohne geklappt hat.. aber hautpsache es geht mit :) Zu der Sache mit den Delays, zuerst hatte ich die falsch generieren lassen , sie dann berichtigt , aber das Kommentar nicht ersetzt ;) Daher mit Recht verwirrend. Jo der Pic ist schon paar Jahre alt, da ich aber ja absoluter Beginner bin, hab ich genommen was ich kriegen konnte, vorallem da ich die 16F871 direkt hatte ohne Umkosten :)
Andi schrieb: > @Michael Skropski > Mich wundert nur warum es denn auch schon bei Leuten ohne geklappt hat.. > aber hautpsache es geht mit :) Meinst du ohne Kondensatoren am Quarz? Wenn ja, es kann evtl auch mal funktionieren. Ebenso ist es bei den Kondensatoren zwischen Vdd und GND am PIC (den du übringens auch nicht drin hast) oder den Kondensatoren vor und hinter einem Spannungsregler a la 7805. Es funktioniert evtl ohne und bei vielen Aufgaben ist es meist auch nich sooooo wichtig, trotzdem sollte man sich sowas angewöhnen, denn sonst funktioniert es evtl mal nicht ganz oder der PIC verhällt sich eigenartig, man ist verwirrt, weil es ja sonst immer funktioniert hat, nur um dann nach langem Messen mit dem Oszi (was man evtl nicht mal zuhause hat) rauszukriegen, dass die Versorgungsspannung unsauber ist. Ich benutze ausschließlich neue(re) PICs. Sie sind meist schneller zu takten, stromsparender, mehr Speicher, besser Configurierbar und das bei ansich immer billigerem Preis. Wenn bei mir etwas eher unkritisch zeittechnisch gesehen ist, bin ich froh, dass ich für provisorische Aufbauten keinen Pullup-Widerstand an MCLR brauche (da deaktiviert/als IO konfiguriert) und auch keinen Quarz + 2 Kondensatoren (da interner Taktgeber). Ich spare Platz auf der Platine, Bauteile, Arbeitszeit, nervem beim routen der Signale für eine Platine usw. Zugegeben haben mache ältere PICs auch die Möglichkeit mit internen Taktgeber und deaktivierung vom MCLR, doch da bleiben noch die anderen oben genannten Bauteile. Um einfach mal 3 von mir für sehr angenehm empfundene PICs zu erwähnen: PIC12F1840, PIC16F1939, PIC18F26K22 Als Beispiel dein PIC16F871 vs. PIC16F1939 (beide 40pinner und DIP): PIC16F871: Programmspeicher: 3,5kByte RAM: 128 Byte EEPROM-Speicher: 64 Byte IOs: 33 Max. CPU-Speed: 20MHz Interner Oscillator: - AD-Channels: 8 á 10bit Communitation: 1xUART Timer: 2x8bit, 1x16bit Stromaufnahme RC,4MHz,3V Vdd: 2mA max Reicheltpreis: 3,40€ PIC16F1939: Programmspeicher: 28kByte RAM: 1024 Byte EEPROM-Speicher: 256 Byte IOs: 35, 1 Input only Max. CPU-Speed: 32MHz Interner Oscillator: 32kHz, 32MHz AD-Channels: 14 á 10bit Communitation: 1xUART, 1xSPI/I²C Timer: 4x8bit, 1x16bit Stromaufnahme RC,4MHz,3V Vdd: 0,49mA max Reicheltpreis: 2,15€
Deine Argumente sprechen echt schon ziemlich für einen neuen PIC ;) Meine Pics wurden -soweit ich weiß- auch zu einer Zeit gekauft wo sie relativ neu waren, und die mit integriertem Quarz deutlich teurer waren. Außerdem hab ich gehört das die Genauigkeit bei integrierten Quarzen sind soo super ist, stimmt das? Aber bei meinem ersten Versuch habe ich erstmal das genommen was da war, man will ja am Anfang noch nich soviel Geld dafür ausgeben ( bzw so wie ich garkein Geld :D) Welchen Sinn hat der Kondensator zwischen GND und VDD? Könnte es mir nur vorstellen zwecks Spannungsspitzen beim einschalten.. Werde am Mittwoch mal berichten was dabei rauskam ;) Vorher habe ich leider nur die Möglichkeit die programmtechnischen Fehler anzupassen..
>Meine Pics wurden -soweit ich weiß- auch zu einer Zeit gekauft wo sie >relativ neu waren, und die mit integriertem Quarz deutlich teurer waren. Klar, grad wenn man welche hat und keine großen Ansprüche hat oder Grundlagen lernen will. Nur wenn ich mir PICs kaufe, dann sind die nach dem F vierstellig. Außer es ist alles schon fertig, also Schaltplan, Layout und Programm, aus dem Internet. >Außerdem hab ich gehört das die Genauigkeit bei integrierten Quarzen >sind soo super ist, stimmt das? "sind" = "nicht"? Also es geht. Es heißt, dass die internen Taktgeber bei den PICs genauer sind als bei AVRs, aber das hab ich nur mal gelesen. Wenn du eine Relaiskarte machst, ein paar Tasten auswerten willst, nen LED-Cube machen willst, reicht der massig aus. Ob du zum entprellen der Taster 20ms oder 20,05ms wartest, ist ja total unrelevant. Es gibt allerdings Sachen, wo er als zu ungenau gilt. z.B.: für das USB-Modul, für das UART-Modul (zumindest bei hohen Baudraten) und natürlich bei einer Uhr. Doch zumindest nach meiner Erfahrung ist das meiste nicht soo sehr Zeitkritisch und der interne langt. Also Tasterauswertung, I2C, SPI, LCD-Ansteuerung, Leds oder Relais ansteuern.. Alles machbar. > Welchen Sinn hat der Kondensator zwischen GND und VDD? Durch die internen Schaltvorgänge kommen Störsignale aus dem IC in/auf die Versorgungsleitung und kann andere Teile stören. Deswegen sollen diese auch so dicht wie möglich an das IC und auch deswegen sollte mal die Versorgungsspannung für Digital-ICs getrennt von der der Analog-ICs routen. Wenn es denn so wichtig und genau ist/seib soll.
Servus, alsoo Prinzipiell geht es erstmal, danke :) Denke das Hauptproblem war echt der Resetpin.. Der Quarz ist inzwischen auch richtig angeschlossen. Und ja, mit "sind" war "nicht" gemeint ;) Wie groß sollte der Kondensator etwa sein zwischen GND und VDD? Und wie sollte man ihn schalten? Einfach direkt vor Vdd? Hab es erstmal ohne versucht, es geht, aber ich bekomm irgendwie kein sauberes Signal raus.. Liegt zum einen auch an der Schaltung, da die irgendwie nur aus Wachelkontakten bestand, war auch erstmal nur zusammengesteckt.. Werde es bald mal auf ne Platine löten, dann sollten die erstmal weg sein. Hoff ich jedenfalls. Genauigkeit spielt schon eine wichtige Rolle.. Was kann man dafür noch machen um ein möglichst stabile und genaue Schaltung zu erhalten? ( im Bezug auf den Pic) Bzw, fallen dir noch irgendwelche typischen Fehler ein die für ein unsauberes Signal sorgen? Wenn ich direkt am Pic abgreife müsste auf dem Oszilloskop ja eine Rechteckspannung angezeigt werden. Bei einer groben Anzeige sieht es auch danach aus Je feiner man es sich jedoch anzeigen lässt , desto weniger hat es mit Rechteckspannung zu tun ... extreme Ungenauigkeiten die ich mir nicht erklären kann . Vielleicht könnt ihr / du mir helfen :)
Andi schrieb: > Wie groß sollte der Kondensator etwa sein zwischen GND und VDD? So ein grober Standardwert sind 100nF Kondensatoren, also nich nur bei PICs sondern allgemein ICs (auch 7400-Reihe etc). Und diesen so dicht wie es geht an das IC dran. Manchmal sieht man auch einen Sockel, wo schon gleich ein Kondensator eingelötet ist, doch dazu braucht man natürlich ein IC, der die Versorgungsspannungspins an der Stelle hat. Andi schrieb: > Hab es erstmal ohne versucht, es geht, aber ich bekomm irgendwie kein > sauberes Signal raus.. Wie ich meinte, meist funktioniert es auch ohne. Aber man sollte ihn trotzdem hinmachen. Wegen der Sicherheit. Andi schrieb: > Liegt zum einen auch an der Schaltung, da die irgendwie nur aus > Wachelkontakten bestand, war auch erstmal nur zusammengesteckt.. Wenn der Aufbau sche**e ist, dann kann das schon passieren. Genauso, wenn irgendwas anderes am PIN hängt oder ein Messkopf nicht richtig calibriert ist oder das Oszi falsch eingestellt ist. Hast du denn mit dem Oszi die Möglichkeit nen Screenshot zu machen oder es abzufotografieren? Und hast du am Programm was geändert? Wenn ja lad es nochmal hoch hier Andi schrieb: > Werde es bald mal auf ne Platine löten, dann sollten die erstmal weg > sein. > Hoff ich jedenfalls. > > Genauigkeit spielt schon eine wichtige Rolle.. Mach das, ist besser so. Genauigkeit ist relativ. Bei der Messung zwischen Hamburg und Berlin kommts nicht auf n paar Meter an, jedoch schon, wenn du ein Regal baust ;) Ich mein nur, dass man für manches es genauer braucht und für manches nicht und man deshalb die Genauigkeit festlegen muss und dementsprechend Datenblätter lesen und dementsprechend genaue Bauteile kaufen muss. Andi schrieb: > Je feiner man es sich jedoch anzeigen lässt , desto weniger hat es mit > Rechteckspannung zu tun ... extreme Ungenauigkeiten die ich mir nicht > erklären kann . Wie extrem ist extrem? Schwingt das Signal nach dem Schalten oder passt die Spannung oder Frequenz nicht? Also am besten Screenshot/Foto, da sieht man es am besten.
Den Kondensator werde ich morgen dann mal zwichen schalten, dann kommt auch gleich ein Foto vom Oszi und vom Aufbau. Ich versuch mal die Ungenauigkeit zu beschreiben ;) So sieht es etwas bei einer groben Einstellung aus, wie es auch sein muss. http://www.hobby-bastelecke.de/bilder/grundlagen/rechteckspannung.gif Bei einer feinen Zeiteinstellung kommt das etwas sowas -nicht ganz so extrem - zustande http://www.physikblog.eu/wp-content/uploads/2008/08/dsc01430.jpg Morgen kommen dann alle Bilder. Evtl auch Vid Am Quelltext wurde nur der Teil "_RC_OSC" durch "_HS_OSC" geändert
Joa die Ungenauigkeit ist erstma weg, ohne Grund ;) Denk mal das Video kann ich mir jetzt sparen .. Wenn sich was neues ergibt melde ich mich wieder. Aber jetzt schonmal vielen Dank für eure ganze Hilfe!
Michael Skropski schrieb: > Ich spare Platz auf der Platine, Bauteile, Arbeitszeit, > nervem beim routen der Signale für eine Platine usw. Zugegeben haben > mache ältere PICs auch die Möglichkeit mit internen Taktgeber und > deaktivierung vom MCLR, doch da bleiben noch die anderen oben genannten > Bauteile. Vorsicht! Wenn bei älteren PICs der interne Takt aktiviert wird, sowie der MCLR als IO genutzt wird, lassen sie sich gerne mal nicht mehr neu programmieren. Ist mir schon oft bei einem PIC16F716 mit dem Original-PICkit3 von MicroChip passiert. Meine Meinung dazu: Bau den Quarz mit den beiden Kondensatoren dran und verzichte auf einen IO, und das spart dann wirklich Nerven :-) Gruß Jens
Ein Grund mehr, keine älteren PICs mehr zu benutzen ;) Joa, diese IOs benutze ich auch erst zum Schluss, wenn keine anderen PINs mehr frei sind. Doch wenn alle belegt sind, bis auf die beiden vom Oscillator und ich brauche noch einen oder auch 2 Pins, dann werde ich trotzdem den PIC benutzen und keinen Größeren nehmen. Also statt einem 28pinner einen 40 Pinner oder statt einem 44TQFP nen 64TQFP. Probleme hatte ich bisher auch nie. Hast du zu dem PIC schonmal die Errata gelesen, ob das darin erwähnt ist?
ww1.microchip.com/downloads/en/DeviceDoc/80184F.pdf Das ist die errata von deinem PIC und unter Punkt 1müsste dein Fehler stehen.
Tja, ich habe das damals im Microchip-Forum gefunden, und konnte die Aussage eben aus persönlicher Erfahrung bestätigen. Gruß Jens
Nabend zusammen, ich muss mich leider nochmal mit dem selben Problem wie in dem ersten Post melden.. Konkret: es hat alles funktioniert bis letzte Woche Donnerstag. Dann haben wir es irgendwie geschafft - wir wissen bis heute nicht wie, vermutlich irgendwie zuviel Spannung angelegt - einen Kurzschluss zu produzieren , der Pic ist wohl abgeraucht... Naja nicht schön, aber eig nicht so tragisch, neuen Pic genommen (selber Typ) , Programm rauf, eingebaut , und es passiert nix. Es kommt einfach nichts raus... Die Fehler die beim ersten Mal dafür verantwortlich waren können es nicht sein. Vielleicht hat sich mit dem Pic der Quarz verabschiedet? Was ich mir eigentlich nicht vorstellen kann.. Ich hoffe ihr habt irgendwelche Ideen wo der Fehler liegt. Paar Bilder vom Aufbau häng ich noch ran. Noch paar Daten zu den Bauelementen: Die Kondensatoren am Quarz haben beide 15pF. Der Wiederstand dabei ist 270 ohm. Der Quarz hat 20Mhz. Es liegen 5V an. Ausgang vom Pic ist RB0.
Achso, und das Programm ist dasselbe wie oben geschrieben, nur mit "_RC_OSC" statt "_HS_OSC". Mit hoffnungsvollen Grüßen ;) Andi
Also 2 Sachen. 1. So wie ich das Sehe geht +5V von links zum MCLR, von da aus zum Vdd PIN 11 und von da aus zu Vdd PIN 32. Deine Brücke von Vss zu Vss, also PIN 12 zu 31 ist zwar da, jedoch sehe ich auf den (recht großen ;) ) Bildern nicht, dass da auch noch n anderes Kabel ankommt. Deine Masse kommt von rechts und geht an die Kondensatoren, jedoch nicht zum PIC. 2. Der Quarz ist zu weit weg. Am besten den Quarz direkt in die nächsten Löcher und die Kondensatoren direkt dahinter. Sonstige Anmerkungen: Den Widerstand beim Quarz dürftest du eigentlich nicht brauchen. Im Datenblatt steht: "A series resistor (Rs) may be required for AT strip cut crystals.", also wird VIELLEICHT benötigt bei AT Strip Cut Crystals. Die Quarze, die ich wenn benutzt habe, waren die Standard-Teile von Reichelt und ich hab nie einen Widerstand gebraucht. Und.. Was sind das für Kondensatoren?^^ Die hab ich ja noch nie gesehn ;) Andi schrieb: > und das Programm ist dasselbe wie oben geschrieben, nur mit "_RC_OSC" > statt "_HS_OSC". Ich hoffe, du hast hier nen Dreher drin ;) Es muss _HS_OSC sein, statt (wie oben im Code) _RC_OSC.
Oh... Das mit der Masse stimmt... keine Ahnung wie ich die übersehn konnte, klar, danke ;) Zu 2. Spielt die Entfernung echt eine so extreme Rolle ? Hätt ich nicht gedacht. Klar je näher desto weniger Wiederstände durch Kabel, und minimal kürzere Zeit beim Stromfluss , aber das es so wichtig ist, ist gut zu wissen. Zu dem Wiederstand, naja ich hatte in nem Buch über Pics die Schaltung zum Aufbau bei nem 20Mhz Quarz gefunden, da dachte ich , kann nicht schaden ;) Vorallem da es ja nur 270 ohm sind . Jaa die Kondensatoren sind mit Sicherheit bestimmt doppelt so alt wie ich und kommen entweder DDR oder noch früher bzw weiter östlicher her :D Hatte auch einen 270ohm Wiederstand in der Größe einer AAA Batterie mit einem "Russenstern " drauf gefunden gehabt . Alles halbe Antiquitäten ;) Jup da hab ich mich bei dem Beitrag verschrieben, natürlich andersrum.
Andi schrieb: > Spielt die Entfernung echt eine so extreme Rolle ? Je länger die Leitung, desto höher ist die Kapazität zwischen den beiden Leitungen und könnte stören. Genauso wie die 100nF an den Versorgungspins. Es KANN funktionieren, aber evtl tuts das irgendwann mal nicht, wenn irgendwas stört. Und dann ist die Suche lang und der Ärger groß, denn die Schaltung hat ja schon funktioniert.. ;) Funktionierts denn jetzt?^^
Der Bericht kommt leider erst morgen ;) Hab die Schaltung nicht Zuhause, von Stromversorgung und Oszi mal zu schweigen ..
So ich meld mich mal wieder. Also es geht jetzt erstma wieder alles , danke :) Nur glaub ich, dass das Programm nicht so geht wie es gehen soll. Im Simulationsprogramm wird mir eine regelmäßige Rechteckspannung angezeigt, und genau da ist das Problem. Theoretisch sollte eine unregelmäßige Absenkung von 100ms low und 900ms high, bzw von 200ms low und 800ms high vorkommen. Und von dieser Unregelmäßigkeit kann ich beim simulierten Programm nichts erkennen.. Ich vermute, dass das Programm bei den Schleifen , bzw eher beim Aufrufen dieser liegt. Ich hoffe ihr konnt mir nochmal helfen ;) P.s generiert wurde die Schleifen mit : http://techref.massmind.org/cgi-bin/delay.exe
hallo andi, hab gerade mal deinen "leidensweg" durchgelesen ;-) hmmm...trau es mich kaum zu fragen, aber kennst du als PIC-anwender die page von sprut?? hatte vor etlichen jahren auch mit pic-controllern angefangen, dabei war sprut ein guter lehrer, dort gibts wirklich gute tips für den einstig in die manchmal nicht ganz so triviale pic-welt ;-) hier der link ---> www.sprut.de
Hallo Andi, ich kann "pom pete" nur zustimmen. Auch ich habe mit Hilfe der Seite von "sprut" [http://www.sprut.de/index.htm] den Umgang mit den PICs gelernt (und lerne auch noch heute). Lese Dir mal PORTB_TEST.asm (am besten lesbar wenn in MPLAB geladen) durch, vielleicht gibt es Dir einige Anregungen. Es ist auch vorteilhaft, wenn man sich von Anfang an einen guten Programmierstil zulegt. Das bedeutet: - Übersichtlich gegliederter Programmaufbau - Erläuterung hinter jeder Zeile Programmcoce. Nur so kannst Du oder auch ein anderer der Dir helfen soll, den Code wieder rasch verstehen. Ich habe Dir mal ein Beispiel angehängt, wie ich - so auf die Schnelle - Dein Programm erstellt haben würde. Einige Anmerkungen habe ich beigefügt. Fehlerfreiheit ist nicht garantiert, jedenfalls läuft es im Debugger "MPLAB-SIM" durch. Dieser Simulator, integriert in MPLAB, erlaubt Dir mit Hilfe des "Watch-Fensters" die Überwachung des Programmablaufs. Auch das "Stop-Fenster" ist zur Zeitmessung hilfreich. Der "Stimulus" erlaubt Dir z.B. Impulsfolgen (z.B. Tastendruck) usw an einen oder mehrere Eingänge des µC zu legen. Viel Spass mit den PICs Ottmar
Ja, die Seite kannte ich schon ;) @Ottmar , vielen Dank ;) Musste das Programm zwar etwas abwandeln aber dafür hat es heute komplett mit allem funktioniert :) Vielen vielen Dank !! Eure Hilfe war echt super ! Mit freundlichen Grüßen Andi
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.