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
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.
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
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 ...
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
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?
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.
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
> 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)
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
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
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.
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
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
@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
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.
@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
Low-Voltage Programming (LVP) in den Config-Bits disabled? Sonst schaltet der PIC immer in den Progamming-Mode, wenn man an PB5 rumspielt...
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.
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.