Seltsames Verhalten eines PICs

Gast #2147747
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
Gast #2148228
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
#2148415
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 ...
Gast #2148742
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
Gast #2149523
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.
Gast #2149559
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
Angehängte Dateien:
Gast #2149588
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
#2149649
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
Gast #2149806
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
Gast #2149825
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
Gast #2149956
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren