Forum: Mikrocontroller und Digitale Elektronik Seltsames Verhalten eines PICs


von Peter (Gast)


Lesenswert?

Hallo,

ich habe hier einen PIC18F1320. Der zeigt ein seltsames Verhalten an 
PORT RB5. Bei jedem Schreibzugriff auf PORTB oder LATB Geht der Port 
kurz auf 0. Der PIC läuft mit 8 MHz. Der Ausgang ist für ca. 100 ns auf 
LOW. Ich habe es mit BCF, BSF und MOV Befehlen probiert, jedes mal das 
gleiche Ergebnis. Kennt jemand dieses Verhalten? Wie kann man es 
umgehen? Ich habe dazu nichts im Datenblatt gefunden.

Danke

Peter

von Lehrmann M. (ubimbo)


Lesenswert?

Seltsames Verhalten gibt es nicht. Das einzige was es gibt sind 
Programm- oder Denkfehler. Ohne vernünftigen Schaltplan / Kenntnis über 
Beschaltung und den entsprechenden Sourcecode kamm man allerdings nur 
raten.

Peter schrieb:
> Bei jedem Schreibzugriff auf PORTB

Da hat man nichts zu schreiben. PORTx lesen - LATx schreiben.

von Peter (Gast)


Lesenswert?

Hallo Michael

Das mit dem LATx und PORTx war mir klar. Warum brauchst du den 
Sourecode? Ich habe direkt im Disassembler geschaut welche Befehler der 
Compiler generiert hat und habe verschiedene Varianten Ausprobiert. 
Siehe auch 1. Post. Dabei war TRISB die ganze Zeit auf 0. Das wird 
einmal beim Start gesetzt.

Am Ausgang ist direkt ein Logiglevelmosfet der 15V 5mA schaltet. Das 
verhalten ist aber auch bei offen Eingang so.

Mfg

Peter

von Lehrmann M. (ubimbo)


Lesenswert?

Peter schrieb:
> Am Ausgang ist direkt ein Logiglevelmosfet der 15V 5mA schaltet. Das
> verhalten ist aber auch bei offen Eingang so.

Gut, dann wissen wir, dass das Problem definitiv im Bereich der Software 
zu suchen ist. Ansonsten gibt es ja keine Störmöglichkeit ?!
100nF Abblockkondensatoren sind installiert.

Peter schrieb:
> Warum brauchst du den
> Sourecode?

Weil da der Fehler versteckt ist =) Wenn ich den Programmablauf kenne, 
dann kann ich dir sagen woran es liegt.

Peter schrieb:
> Ich habe direkt im Disassembler geschaut welche Befehler der
> Compiler generiert hat und habe verschiedene Varianten Ausprobiert.

Ein Disassemble ist nie ein-eindeutig (!)


EDIT

So jetzt fällt mir noch was ein. Hast du eine Endlosschleife ? 
Ansonsten löst der PIC ständig einen Reset aus, das könnte die 
Zeitspanne durchaus erklären. Du weißt ja hoffentlich, dass das Programm 
nie enden darf ...

von Peter (Gast)


Lesenswert?

Lehrmann Michael schrieb:
> So jetzt fällt mir noch was ein. Hast du eine Endlosschleife ?
>
> Ansonsten löst der PIC ständig einen Reset aus, das könnte die
>
> Zeitspanne durchaus erklären. Du weißt ja hoffentlich, dass das Programm
>
> nie enden darf ...

Ja eine Endlosschleife ist vorhanden. Ich denke es liegt nicht an der 
Software. Das ist nicht mein erstes PIC Programm und ich hatte seither 
noch nie solche Probleme. Die 100ns sind ja unter der Zykluszeit des MC. 
8MHz => 500ns Befehlsausführungszeit. Ich kann mit dem Debuger (ICD3) im 
Einzelschrittmodus über die Ensprechenden Schreibbefehle gehen und sehe 
Parallel die 0 auf dem Oszi

Mfg

Peter

von Lehrmann M. (ubimbo)


Lesenswert?

Mamma mia =)

könntest du bitte einfach dein Programm so wie die Config-Bits hier her 
posten und wenn du eine Beschaltung hast die hier auch genau angeben.

So geheimnisvoll kann der Code und die Schaltung ja doch nicht sein 
oder?

von ??? (Gast)


Lesenswert?

8MHz => 500ns ?
8MHz => 125ns

von Peter (Gast)


Lesenswert?

8MHz Oszilatortakt

PIC Tcy = Tosc * 4

Peter

von usuru (Gast)


Lesenswert?

Mach doch mal ein ganz einfaches Programm *** Port ein / Port aus *** 
und Poste den Code sowie den generierten Assembler-Code. Und probier 
mal, ob das auch mit einem Assembler-Programm passiert.

So wie Du es schreibst, müsste das ja eine Macke des µC sein, das wäre 
schon längst aufgefallen, das Teil gibt es immerhin seit 2003.

von ??? (Gast)


Lesenswert?

>PIC Tcy = Tosc * 4

Aha, ja dann

Gruß

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

Testcode C:
1
#include "p18f1320.h"
2
3
void main()
4
{
5
6
  // Oscillator
7
  OSCCON  = 0b01110010;      // IntOSC mit 8MHz
8
9
  TRISBbits.TRISB5 = 0;
10
  
11
  while(1)
12
  {
13
    LATBbits.LATB5 = 1;  
14
    Nop();
15
    Nop();
16
    Nop();
17
    Nop();
18
    Nop();
19
  }
20
}
Testcode Disassembler:
1
---  C:\Users\Michael\Desktop\Test2\test.c  ------------------------------------------------------
2
1:                 #include "p18f1320.h"
3
2:                 
4
3:                 void main()
5
4:                 {
6
5:                 
7
6:                   // Oscillator
8
7:                   OSCCON  = 0b01110010;      // IntOSC mit 8MHz
9
  00E2    0E72     MOVLW 0x72
10
  00E4    6ED3     MOVWF 0xfd3, ACCESS
11
8:                 
12
9:                   TRISBbits.TRISB5 = 0;
13
  00E6    9A93     BCF 0xf93, 0x5, ACCESS
14
10:                  
15
11:                  while(1)
16
  00F4    D7F9     BRA 0xe8
17
12:                  {
18
13:                    LATBbits.LATB5 = 1;  
19
  00E8    8A8A     BSF 0xf8a, 0x5, ACCESS
20
14:                    Nop();
21
  00EA    0000     NOP
22
15:                    Nop();
23
  00EC    0000     NOP
24
16:                    Nop();
25
  00EE    0000     NOP
26
17:                    Nop();
27
  00F0    0000     NOP
28
18:                    Nop();
29
  00F2    0000     NOP
30
19:                  }
31
20:                }
32
  00F6    0012     RETURN 0

Mfg Peter

von usuru (Gast)


Lesenswert?

> 18:                    Nop();
>   00F2    0000     NOP
> 19:                  }
> 20:                }
>   00F6    0012     RETURN 0

Im Assembler-Listing fehlt etwas: der Code an Adresse 00F4 (also in der 
Zeile 19)

von usuru (Gast)


Lesenswert?

und: Dein Signal am Oszi hat 9 MHz, Fosc ist 8 MHz, Fcy ist also 2 MHz.

Du misst also gar nicht das, was Dein Programm erzeugt, denn das braucht 
8 Takte (1x BRA =2, 1x BSF =1, 5x NOP =5) das wären 2 MHz / 8 = 250 kHz

von Carsten S. (dg3ycs)


Lesenswert?

usuru schrieb:
> und: Dein Signal am Oszi hat 9 MHz, Fosc ist 8 MHz, Fcy ist also 2 MHz.
>
> Du misst also gar nicht das, was Dein Programm erzeugt, denn das braucht
> 8 Takte (1x BRA =2, 1x BSF =1, 5x NOP =5) das wären 2 MHz / 8 = 250 kHz

Nee, ich interpretiere das Diagramm anders, bin aber auch kein 
versierter Agilent Nutzer...
Für mich sieht es so aus als das die 110ns der Versatz des Markers zum 
Triggerpunkt in der Mitte des Schirms sind. Also die Zeit bis zur Mitte 
der Unscheinbaren Linie leicht Links der Schirmmitte.
Die 110ns scheinen damit die länge des Low-Pulses zu sein.

Tatsächlich scheint die Ablenkung aus 1µS/Div eingestellt zu sein was 
tatsächlich einer Periodenzeit von 250Khz entspricht, die ja schon 
korrekt oben vorgerechnet wurde.

Zum Fehler:
Ohne mich jetzt tief ins Datenblatt einzugraben und die SW zu 
analysieren:
Der Pin PB5 ist ja auch als gesonderter Interrupt Pin ausgewiesen... 
(KBI 1)
Wie sieht es mit den Interrupteinstellungen aus? Könnte es sein das beim 
Schreibzugriff ein Interrupt ausgelöst wird? Mal als Tip ins Blaue.

Ach ja: Zudem ist es ja einer der ICSP Pins. Beim debuggen ist die 
Funktion an diesen Pins ggf. von der Normalen abweichend da ja auch 
Kommunikation darüber lauft.

Gruß
Carsten

von usuru (Gast)


Lesenswert?

Du hast recht, die Zeiteinteilung ist 1 µs je Teil, ich habe die 9 MHz 
falsch interpretiert. Trotzdem fehlt der Code an der Adresse 00F4. Sehr 
seltsam. Werde das heute abend mal nachbauen.

von (prx) A. K. (prx)


Lesenswert?

usuru schrieb:

> Im Assembler-Listing fehlt etwas: der Code an Adresse 00F4 (also in der
> Zeile 19)

Steht da, der Code ist nur recht kreativ sortiert, nämlich nicht 
aufsteigend nach Adressen, sondern entsprechend der Quellcodestatements:

11:                  while(1)
  00F4    D7F9     BRA 0xe8

von Peter (Gast)


Lesenswert?

Hallo

@Carsten Sch. danke für die konstruktiven Beiträge.

Interrupt ist nicht konfiguriert und dürfte nicht Auslösen. Würde auch 
zusäztlich Zeit brauchen.

Debugging habe ich schon ausgeschaltet.

Ich denke mittlerweile das ich den Pin sehr seltsam geschossen habe da 
die Ausgangsspannung auch nur noch auf 3.3V kommt. Oberer Transistor der 
Ausgangsstufe defekt.

Mfg

Peter

von Rudi (Gast)


Lesenswert?

@Peter

>Am Ausgang ist direkt ein Logiglevelmosfet der 15V 5mA schaltet

könnte das das Problem sein? Benutzt du keinen Gatevorwiderstand? 
Logiklevel bedeutet ja nur, dass der MOSFET auf diese Spannungspegel 
reagiert - entbindet dich aber nicht vom Auf- resp. Entladen der 
Gatesourcekapazität. Diese stellt im ungeladenen Zustand für die 
Einschaltflanke natürlich einen Kurzschluß - halt ein Kondesator - dar.

Sonnigen Gruß aus dem Norden

Rudi

von (prx) A. K. (prx)


Lesenswert?

Rudi schrieb:

> Gatesourcekapazität. Diese stellt im ungeladenen Zustand für die
> Einschaltflanke natürlich einen Kurzschluß - halt ein Kondesator - dar.

Ist aber allenfalls relevant, wenn er für seine 5mA einen FET der 
Zig-Ampere-Klasse verwendet.

von Rudi (Gast)


Lesenswert?

@A.K.

>Ist aber allenfalls relevant, wenn er für seine 5mA einen FET der
>Zig-Ampere-Klasse verwendet.

Na, da bin ich mir aber nun gar nicht sicher. Der gemessene Zeitbereich, 
für die der Port nach Masse gezogen wird, spricht eigentlich eine 
deutliche Sprache, ebenso wie das Ansteigen der Flanke danach :-)

Du musst bedenken, dass der Port ja auch die Energie liefern können 
muß...und da zählt auch durchaus ein C von einigen 100 pF - so 
jedenfalls meine Erfahrung.

Falls dem nicht so sein sollte - umso besser :-)

Immen noch nen sonnigen Gruß

Rudi

von (prx) A. K. (prx)


Lesenswert?

Ein BS170 hat keine 30pF. Das entspricht ungefähr einer quer über die 
Platine verlegten Leiterbahn.

von Vielleicht (Gast)


Lesenswert?

Low-Voltage Programming (LVP) in den Config-Bits disabled? Sonst 
schaltet der PIC immer in den Progamming-Mode, wenn man an PB5 
rumspielt...

von Rudi (Gast)


Lesenswert?

Habe ich da irgendetwas übesehen? BS170? Wo steht das?

Rudi

von (prx) A. K. (prx)


Lesenswert?

Rudi schrieb:

> Habe ich da irgendetwas übesehen? BS170? Wo steht das?

War ein Beispiel für einen für 5mA passenden FET. Man kann natürlich 
auch einen 50A-Klops verwenden, dann ist es mehr.

von Thomas (Gast)


Lesenswert?

Erst mal einen anderen Port probieren.

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.