mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Merkwürdiges PIC12f615 problem


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Müller (thomas1123) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Müller (thomas1123) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Müller (thomas1123) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
guter chef :-)
und den picc-compiler hat er dir auch noch spendiert.
da musst du dankbar seindenn der is teuer.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.