Forum: Mikrocontroller und Digitale Elektronik Merkwürdiges PIC12f615 problem


von Markus (Gast)


Lesenswert?

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

von Thomas M. (thomas1123) Benutzerseite


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

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

von Thomas M. (thomas1123) Benutzerseite


Lesenswert?

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;
}

von Markus (Gast)


Lesenswert?

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

von Thomas M. (thomas1123) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.