Hallo, ich habe ein sehr merkwürdiges Problem mit einem PIC 12F615 einige der GPIO schalten sich ab wenn ich einen anderen PIN auf 1 lege. Ich dachte erst ich habe ein Hardwareproblem, aber der Simulator verhält sich ähnlich, wenn auch nicht gleich. Ich habe dazu ein minimal Testprogramm geschrieben um den Fehler auf den Grund zu gehen. #include <htc.h> __CONFIG(0x3f4c); void main(void) { TRISIO = 0x04; while (1) { CLRWDT(); GP5 = !GP5; GP0 = !GP0; GP3 = !GP3; } } wenn ich mit dem Debugger in die while-Schleife komme hat das GPIO Register den Wert 0x00 am Ende der while-Schleife würde ich jetzt den Wert 0x31 erwarten. Es steht dann aber 0x20 im GPIO nach dem zweiten durchlauf wieder 0x00 und so weiter Also im Einzelschritt: nach GP5 = !GP5; --> GPIO = 0x20 nach GP0 = !GP0; --> GPIO = 0x21 nach GP3 = !GP3; --> GPIO = 0x20 zweiter Durchlauf nach GP5 = !GP5; --> GPIO = 0x00 nach GP0 = !GP0; --> GPIO = 0x01 nach GP3 = !GP3; --> GPIO = 0x00 der erzeugte Assembler-Code sieht für mich als C-Programmierer auch erstmal gut aus: 1: #include <htc.h> 2: __CONFIG(0x3f4c); 3: 4: void main(void) { 5: 6: TRISIO = 0x14; 001 3014 MOVLW 0x14 002 1683 BSF 0x3, 0x5 003 0085 MOVWF 0x5 7: while (1) { 00C 2804 GOTO 0x4 8: CLRWDT(); 9: 004 0064 CLRWDT 10: GP5 = !GP5; 005 1283 BCF 0x3, 0x5 006 3020 MOVLW 0x20 007 0685 XORWF 0x5, F 11: GP0 = !GP0; 008 3001 MOVLW 0x1 009 0685 XORWF 0x5, F 12: GP3 = !GP3; 00A 3008 MOVLW 0x8 hat jemand eine Idee hierzu? habe ich was übersehen? Gruß und Danke schon mal Markus
ich glaube das problem liegt daran das wenn du bei nem pic in an einem port nur ein bit ändern willst liest er erst den port ein, manipuliert das eine bit dann und schreibt dann den ganzen port. wenn du jetzt die zustände an verschiedenen pins sehr schnell änderst kann es sein das der pin den du einen takt zuvor auf 1 gesetzt hast NOCH nicht physikalisch einen highpegel hat und somit beim ändern eines anderen pins noch als 0 gelesen wird. ich hoffe ich konnte helfen lösung : bei solchen problemen am besten den ganzen port schreiben.
hmmm, im ursprünglichen Programm lagen die einzelnen Port-Pin-Zugriffe aber weiter auseinander. Mir ist dann am Scope aufgefallen das das unerwartete Abschalten eines PIN mit dem Ansteuern eines anderen PIN zusammen lag und habe dann auf dieses Test-Programm gekürzt um andere Beeinflussungen auszuschließen. Kann der Simulator im MPLAB diese "pysikalische" Timing berücksichtigen? Gruß Markus
ich kann es nicht mit sicherheit sagen aber ich denke eher nicht versuch mal das: while(1) { GPx = 1; GPy = 1; GPz = 1; GPx = 0; GPy = 0; GPz = 0; }
arrrgh, ja ich habe was übersehen! GP0, GP1 und GP3 sind Standardmäßig auf Analogeingang gestellt und liefern daher eine 0 beim lesen zurück, und der read-modify-write Zugriff setzt die zuvor auf 1 gesetzen Ports wieder auf 0. Da diese aber trotzdem als Ausgang funktionierten (ich konnte ja das Schalten mit dem Skope sehen) bin auch nicht darauf gekommen das die erstmal auf ADC stehen. ich wollte ja nen AVR, aber mein Chef.... Gruß Markus
guter chef :-) und den picc-compiler hat er dir auch noch spendiert. da musst du dankbar seindenn der is teuer.
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.