PIC18F4550 - PIC macht "nix"

OP Persönliche Seite #1664845
Lesenswert?

Hallo zusammen,
ich habe Schwierigkeiten meinen PIC18F4550 in Betrieb zu nehmen!

Ich habe zunächst erstmal nur vor mit dem PIC ganz simpel zwei LEDs und 
einen Piezosummer zu schalten, alle jeweils mit Transistor verschaltet.
Wenn ich den PIC aus der Fassung nehme und an die jeweiligen Steuerpins 
5V anlege leuchten die LEDs und der Piezosummer summt, also stimmt 
schonmal der "Rest" der Schaltung.

Allerdings macht es der PIC nicht. Ich programmiere den PIC in C und 
habe als Taktquelle einen 20MHz Quarz mit 15pF Lastkondensatoren 
gewählt. Die 15pF habe ich aus dem Datenblatt so entnommen.

Ich habe mal ein Screenshot vom Signal am OSC2 Pin gemacht und 
angehängt.
Was ich komisch finde: Wenn ich am OSC1 Pin mit dem Scope messe und ich 
so vorgehe, dass ich den Tastkopf mit an den PIN hänge und DANN die 
Spannung einschalte, dann messe ich ein Signal 20Mhz und ca. 2,3V mit 1V 
Offset.

Wenn ich aber wiederum es umgekehrt mache also die Spannung einschalte 
und jetzt erst mit dem Tastkopf an den PIN gehe, messe ich das selbe 
Signal aber mit 2,8V Amplitude (immer noch 1V Offset!).

Am Ausgang (OSC2) ist bei beiden Varianten das Signal wie im Anhang!

Hier jetzt nochmal mein Code, ganz simpel möchte ich nur die drei 
Ausgänge auf High schalten:
1
#include <p18f4550.h>               // Für den PIC - wird autom. erkannt
2
#include "delays.h"                      // Für die Warteschleife 
3

4
#pragma config FOSC=HS            // Taktbereich auswählen
5
#pragma config PWRT=ON            // Power On Timer An
6
#pragma config WDT=OFF            // 
7
#pragma config BOR=OFF            // Brown Out Reset Aus
8
#pragma config LVP=OFF            // Low Voltage Programming Disable
9
#pragma config PBADEN=OFF          // 
10
#pragma config VREGEN=OFF          //
11
#pragma config MCLRE=ON            // Master Clear Reset An
12

13

14

15
void main(void)  
16
{
17
    LATA = 0x00;                    // PORTA löschen (kann beim Start undef. Zustand annehmen)
18
    LATB = 0x00;                    // PORTB löschen (kann beim Start undef. Zustand annehmen)
19
    LATC = 0x00;                    // PORTC löschen (kann beim Start undef. Zustand annehmen)
20
    LATD = 0x00;                    // PORTC löschen (kann beim Start undef. Zustand annehmen)
21
    LATE = 0x00;                     // 
22

23
    TRISA = 0x29;                   // 
24
    TRISB = 0xFC;                   // 
25
    TRISC = 0x02;                   //   
26
    TRISD = 0x00;                   // 
27
    TRISE = 0x00;                   // 
28

29
    ADCON1 = 0x0F;          // Alle Port Pins auf Digital gesetzt
30

31
//  GLCD_Init();
32
//  Setup_ADC();
33

34
  while(1);
35
  {
36
    LATAbits.LATA2 = 1;      //  
37
    LATEbits.LATE0 = 1;      //
38
    LATAbits.LATA4 = 1;      //  
39
  }
40
}

Dann habe ich nebenbei gleich nochmal eine Frage und zwar arbeite ich 
bei dieser Schaltung mit ICSP der Brenner erkennt den PIC und brennt ihn 
auch ohne Probleme. Jetzt meine Frage muss ich eigentlich dann RB7/6 als 
Eingänge konfigurieren oder spielt das keine Rolle?

Ich hoffe Ihr wisst was da schief läuft und ich bedanke mich jetzt schon
im voraus für jeden der helfen möchte!!

LG Nico
Gast #1664923
Lesenswert?

#pragma config MCLRE=ON            // Master Clear Reset An

1. Stell den mal OFF oder leg den MCLRE per Widerstand auf VDD.

2. Mach die Kondensatoren mal grösser, ich habe gute Erfahrungen mit 27 
oder 33 pF gemacht.

3. An OSC1 zu messen, verfälscht die ganze Charakteristik des 
Oszillators. Man darf PICs nur an OSC2 messen.

4. Beim Brennen sind die Zustände von RB6/RB7 egal.
OP Persönliche Seite #1664938
Lesenswert?

Also ich hätte den Schaltplan gerne als Grafik angehängt der ist aber so 
groß, dass wenn ich einen Screenshot mache man die Werte etc. nicht mehr 
lesen kann daher die Target Datei im Anhang wer Target nicht hat ich 
beantworte auch alle Anfragen.

Zu 1. Habe den MCLRE Pin über 20K und 1N4148 auf Vdd.
Zu 2. Wie gesagt habe schon auf 4Mhz gewechselt und damit 30pF, hilft 
nicht.
Zu 3. Gut zu wissen!
Zu 4. Danke!
Zu 5. Kann ich dann die Verbindungen bei behalten oder muss ich den 
Quarz auslöten?
Angehängte Dateien:
Gast #1664978
Lesenswert?

> Zu 5. Kann ich dann die Verbindungen bei behalten oder muss ich den
> Quarz auslöten?
Kann angeschlossen bleiben.

Oha, das ist mal ein wilder Schaltplan. Da würde mich dann doch dazu 
auch ein Foto des Aufbaus interessieren...
Gast #1665115
Lesenswert?

Poste mal ein Oszill.-Photo vom Anschluss OSC2.

Noch ne Idee_1: schliess mal einen Widerstand 330 Ohm zwischen Quarz und 
OSC2 an (so wie bei den Resonatoren im Datenblatt) oder einen Widerstand 
1 MOhm parallel zum Quarz.

Noch ne Idee_2: Bau Dir aus einem Gatter (Inverter), Quarz und den 
Kondensatoren einen externen Oszillator (oder nimm einen fertigen, falls 
vorhanden) und schliess den an OSC1 an. Wenns dann geht, ist es das 
Platinenlayout.
Gast #1665130
Lesenswert?

Das sollte aber ein Rechteck sein ...

Brauchst Du denn unbedingt - z.B. wegen zeitkritischer Dinge - einen 
Quarz für den Oszillator, bei mir reichen in 90% der Schaltungen die 1% 
Genauigkeit des internen Oszillators. Wie ich sehe, hast du ja auch den 
timer1 schon für einen Quarz vorgesehen (mache ich auch gerne), da 
kannst Du ja auch genaue Zeiten abgreifen. Oder nimm einen Resonator 
(0.5% Genauigkeit), 20 MHz sind aber schwierig zu beschaffen (z.B. bei 
http://www.futurlec.com/ICCrystalsResonators.shtml, Lieferzeit meist 
etwa 2 Wochen).
Gast #1665131
Lesenswert?

Meine Güte, jetzt teste das Ganze doch einfach mal mit dem internen 
Oszillator.
Ich glaube nicht, dass es an der externen Taktversorgung liegt. Das Ding 
schwingt doch ganz passabel.
Vielleicht baut der Compiler auch einfach nur Mist oder es liegt 
anderweitig ein Problem in der Software vor. DAS solltest Du zuerst 
ausschließen und dafür gibt es keinen einfacheren Weg als über den 
IntOsc.
OP Persönliche Seite #1665137
Lesenswert?

Hi, nein für den PIC als Takt ist es unkritisch, da ich ja wie du ja 
schon erkannt hast den Timer1 vorbereitet habe. Kannst du mir sagen wie 
man den internen Oszillator verwendet?

Ich habe im Datenblatt erstmal nur das OSCCON Register gefunden und 
würde daraus erstmal schließen, dass ich SCS1 und IRCF0-2 auf 1 setzten 
muss, ist das richtig? Was muss noch gemacht werden..?

Danke soweit schon mal ... =)
Gast #1665158
Lesenswert?

> Kannst du mir sagen wie man den internen Oszillator verwendet?
> Ich habe im Datenblatt erstmal nur das OSCCON Register gefunden und
> würde daraus erstmal schließen, dass ich SCS1 und IRCF0-2 auf 1 setzten
> muss, ist das richtig? Was muss noch gemacht werden..?

An dieser Stelle ist die Hilfedatei "hlpPIC18ConfigSet.chm" aus dem 
C18-Doc-Verzeichnis sehr zu empfehlen.

Ich würde erstmal folgendes vorschlagen:

Config Bits:
FOSC = INTOSC_HS

...und dann noch im OSCCON-Register die Frequenz konfigurieren
(wenn Du dies nicht tust - auch nicht schlimm - dann läuft der PIC 
standardmäßig mit 1 MHz).

gruß
daniel
Gast #1665170
Lesenswert?

Kenne mich mit C nicht so aus, aber eine fehlende Compare-Zuweisung ist 
ein Fehler, den ich immermal gerne vergesse.
CMCON=0x07

Ausserdem gefällt mir deine MCLR-Beschaltung nicht, setze den Pin 
einfach mal an Gnd, zum Testen.

USB hast du nicht in der Configuration eingeschaltet?
OP Persönliche Seite #1665173
Lesenswert?

Also habe mal die Config wie folgt geändert:
1
#pragma config FOSC=INTOSC_HS    // Taktbereich auswählen
2
#pragma config PWRT=ON      // Power On Timer An
3
#pragma config WDT=OFF      // 
4
#pragma config BOR=OFF      // Brown Out Reset Aus
5
#pragma config LVP=OFF      // Low Voltage Programming Disable
6
#pragma config PBADEN=OFF    // 
7
#pragma config VREGEN=OFF    //
8
#pragma config MCLRE=ON      // Master Clear Reset An

Und dann noch die Frequenz auf 8Mhz eingestellt:
1
OSCCONbits.IRCF0=1;
2
OSCCONbits.IRCF1=1;
3
OSCCONbits.IRCF2=1;

@Helmut, die Beschaltung für den MCLRE Pin habe ich mir so von Sprut ab 
geguckt: http://www.sprut.de/electronic/pic/icsp/icsp.gif

USB ist nicht eingeschaltet.. Ich werde die Comparatoren mal einstellen 
bzw. aus stellen.. mal schaun.
Gast #1665180
Lesenswert?

MCRLE gehört NICHT an GND, da dann Dauer-Reset


für die CONFOG:

   FOSC = INTOSC_HS     ; die PLL geht nur beim Quarz,
                        ; nicht beim int. Oszillator

und weiter in Assembler:

   movlw b'01110010'    ; int. Oszill. 8 MHz
   movwf OSCCON

bzw. in C:

   OSCCONbits.SCS1=1;
   OSCCONbits.SCS0=0;
OP Persönliche Seite #1665182
Lesenswert?

Also ich habe den internen Oszillator eingeschaltet, so lange das 
richtig war:
1
#pragma config FOSC=INTOSC_HS    // Taktbereich auswählen
2

3
OSCCONbits.IRCF0=1;
4
OSCCONbits.IRCF1=1;
5
OSCCONbits.IRCF2=1;

..dann noch die Komparator Eingänge deaktiviert:
1
CMCON=0x07;

und dann nochmal den internen Oszillator ausgeschaltet und die 
Abschaltung der Komparator Eingänge behalten. Nichts passiert. Habe 
jetzt noch mit rein geschrieben, dass er den kompletten PORTD auf High 
setzten soll:
1
LATD=0xFF;

..und hier passiert auch nichts.


@Helmut, das wäre super! Vielleicht ist ja auch der PIC kaputt wobei
ich das noch nie erlebt habe zumal lässt er sich auch problemlos 
brennen..
Gast #1665193
Lesenswert?

>... und schalte den verdammten MCLRE ab, der stört nur
>#pragma config MCLRE=OFF

Das lässt er besser mal schön so wie es ist.
Ich würde mir mal ein Multimeter schnappen
und den Pegel am Reset Pin messen. Wenn da keine
5V sind dann läuft auch nix.
OP Persönliche Seite #1665208
Lesenswert?

Ich kann den PIC auslesen habe dann das Hex File hilft das? Also kann 
man daraus erlesen wo das Programm steht?
1
:020000040000FA
2
:100000006FEF00F012000000060EF66E000EF76EA5
3
:10001000000EF86E00010900F550656F0900F550FB
4
:10002000666F03E1656701D03DD00900F550606F50
5
:100030000900F550616F0900F550626F0900090071
6
:10004000F550E96E0900F550EA6E09000900090053
7
:10005000F550636F0900F550646F09000900F6CF91
8
:1000600067F0F7CF68F0F8CF69F060C0F6FF61C0C5
9
:10007000F7FF62C0F8FF0001635302E1645307E039
10
:100080000900F550EE6E6307F8E26407F9D767C020
11
:10009000F6FF68C0F7FF69C0F8FF00016507000EB2
12
:1000A000665BBFD71200896A8A6A8B6A8C6A8D6A1E
13
:1000B000290E926EFC0E936E020E946E956A966AED
14
:1000C0000F0EC16ED388D38AD38CD382D390070E00
15
:1000D000B46EFFD789848D8089888C68120013EEF6
16
:1000E00000F023EE00F0F86A019C04EC00F084ECD0
17
:1000F00000F053EC00F0FBD7120000EE00F00F0E02
18
:0A010000EE6AEA62FDD71200120059
19
:020000040030CA
20
:0E0000003F0B181E000181000FC00FE00F40E3
21
:00000001FF

Das erscheint mir auch irgendwie ein bisschen wenig oder?
Ich benutze übrigens noch den Brenner8 von Sprut.
Gast #1665213
Lesenswert?

Häng mal das List-File (also die vom Compiler erzeugte 
Assembler-Listing-Datei) von Deinem Programm hier an. Und das C-File 
gleich mit.

> Du musst noch die SCS-Bits im OSCCON setzen (siehe oben)
Nicht nötig, die SCS-Bits stehen standardmäßig auf der primären 
Taktquelle (und diese ist ja nun bereits über FOSC auf den internen OSC 
festgelegt).

> LatD=0xFF ? nicht PortD=0xFF
Port beschreiben: LatD
Port lesen: PortD

> Das erscheint mir auch irgendwie ein bisschen wenig oder?
Wieso? Was tut Dein Programm denn schon großartiges? :-D
OP Persönliche Seite #1665218
Lesenswert?

Da hast du auch wieder recht =) Ja LATD ist mir schon klar hab mich nur 
vertippt ist aber richtig im Programm. Okay dann hier mal die beiden 
Dateien!
Ich weiß nicht genau welche Datei du damit meinst aber habe mal alles 
aus dem Ordner angehängt!
Angehängte Dateien:
Gast #1665219
Lesenswert?

Hallo!

Hab jetzt nicht alles genau gelesen, aber hab gesehen, dass Du die 
20MHz, die dein Quarz liefert nicht teilst, da der PIC nur 4 MHz 
verträgt.

Ich würd folgende Einstellungen machen: (Der PIC läuft dann intern mit 
48 Mhz-- generiert durch PLL (96Mhz) / 2 = maximale Arbeitsfrequenz des 
18F4550)

FOSC = HSPLL_HS
PLLDIV = 5      //Divide by 5 (20 MHz oscillator input)
CPUDIV = OSC1_PLL2     //[OSC1/OSC2 Src: /1][96 MHz PLL Src: /2]

PLLDIV (Prescaler) musst Du auf jeden Fall machen, da der Input wie 
gesagt nur 4 MHz verträgt.

Versuch mal diese Einstellungen und berichte dann.

MfG Darkleon
Gast #1665231
Lesenswert?

Hallo!

Hast Du auch folgendes aus Deinem Code genommen?
1
OSCCONbits.IRCF0=1;
2
  OSCCONbits.IRCF1=1;
3
  OSCCONbits.IRCF2=1;
4
    OSCCONbits.SCS1=1;
5
    OSCCONbits.SCS0=0;

Das gehört dann klarerweise nicht mehr dazu, da Du wieder mit Deinem 
externen Quarz arbeitest ;)

Meld Dich dann wieder.

Mfg Darkleon
Gast #1665248
Lesenswert?

Stimmt;)

In Deinem riesigen Schaltplanbild (arbeite mit einem 10" Netbook) sehe 
ich, dass der 20 MHz Quarz mit nur einem Kondensator nach GND verbunden 
ist. Es gehört aber an jedes Beinchen ein eigener Kondensator und die 
zusammen dann auf GND (Oder hab ich das nur nicht gesehen). Auch konnte 
ich die 100nF Kondensatoren zwischen VDD und GND am PIC nicht finden. 
(mit 10" und Mouspad ist das große Bild schnell unübersichtlich ;)). Die 
100nF kommen auf beide Seiten (Der Controller hat ja links und rechts 
VDD und GND, und diese müssen auch beschalten sein).

Hab ich das nur nicht in Deinem Schaltplan gesehen, oder hast Du es 
anders??

MFG Darkleon
Gast #1665254
Lesenswert?

Wenn das Assemblerlisting nicht erzeugt wird, dann tu bitte Folgendes 
(und zwar für den C-Code, den Du vorhin bereits angehängt hast!):

1.) Compilieren
2.) View->Disassembly Listing (daraufhin erscheint dieses in einem 
Fenster)
3.) Dort Rechtsklick und "Output to file..." wählen.
4.) Den Ranz hier mit Anhängen.

@alle anderen:
Vielleicht erstmal nicht weiter Verwirrung mit unterschiedlichsten 
Oszillatoreinstellungen stiften. Der interne OSC ist in diesem Fall 
definitiv die einfachste/sicherste Methode und wenn sich hier schon 
nichts rührt, dann liegt es wohl eher am Code des Testprogramms (oder 
doch an der Hardware...)
Gast #1665269
Lesenswert?

Hallo Zwirbeljupp!

Also ich schließe mal die Software aus, denn er hat den richtigen PIC 
gewählt.
Dann definiert er z.B.: den kompletten Port D mit 0. Danach setzt er den 
kompletten Port auf Ausgang und in seiner Schleife schaltet er den 
kompletten PortD auf High. Auch wenn einige Pins am PortD mit 
irgendeiner Hardware standardmäßig arbeiten sollte zumindest eine (oder 
mehrere LEDs leuchten).

Voausgesetzt ist natürlich, dass der Teiler (bei 4MHZ nicht notwendig) 
richtig eingestellt ist, die richtige Option für den Takt ausgewählt ist 
(HS,HS_PLL,...),der Quarz und die Versorgnungspins korrekt mit 
Kondensatoren beschaltet sind und die richtige Spannung an den richtigen 
Pins anliegt ;).

Ist eines nicht korrekt läufts nicht, und da die Software schon mit fast 
allen möglichen Taktmöglichkeiten probiert wurde (und diese durchaus 
korrekt waren) schließe ich die Software aus.

MfG Darkleon
Gast #1665286
Lesenswert?

Hallo!

Ja Deine Anschlüsse sind falsch. Richtigerweise (auch zu sehen im 
Datenblatt) im Anhang. Der 100nF Kondensator zwischen VDD und GND soll 
so knapp wie möglich an den PIC. So wie im Anhang dann auch auf der 
rechten Seite des 18F4550,denn dort hat er auch Pins für VDD und VSS. 
Diese müssen auch mit der Versorgungsspannung verbunden werden.

Also korrigiere das mal und versuche es mit dem externen Quarz, 
(Anschluss auch im Anhang).

Dann sollte es hardwaremäßig keine Probleme mehr geben.

Gib dann Bescheid.

MfG Darkleon
Angehängte Dateien:
Gast #1665294
Lesenswert?

Oh Gott, wie bin ich denn heute drauf.....

Sorry,vergiss meinen letzten Post. Hast es ja eh korrekt. Sah nur die 
zweiten Kondensatoren bei den Quarzen nicht....

Sorry..muss mal eine Rauchen gehen ;)

Mfg Darkleon
#1665305
Lesenswert?

Solltest deinen 2200µF Elko mal überdenken, der Ladestrom könnte die BAT 
gefährden. 2200 am Eingang Spannungsregler -->7805  --->Diode--->100µF 
sollte auch gehen.
Ist eigentlich Schade, dass du den USB-Kram nicht benutzt und die GLCD 
Pins so benutzt. Wäre `ne schöne Sache für Später.
Aber, deine Sache ;-)
Gast #1665315
Lesenswert?

Hast Du das auch auf einem Steckbrett?

Ich glaube nämlich immer noch, dass nur ein 100nF für beide VDDs zu 
wenig ist, denn ich auf beiden Seiten jeweils einen 100nF und in 
diversen Schaltplänen im Netz hab ich auch immer zwei gesehen. Bei mir 
läufts (zwar nicht Dein Code, da ich momentan keine Möglichkeit habe den 
zu testen) und ich glaube deshalb,dass nur ein 100nF zu wenig ist..Kann 
mich aber natürlich auch täuschen.

MfG Darkleon
Gast #1665335
Lesenswert?

Hi holger.

Klar hab ich die gesehen.
Ich hab aber geschrieben, ob er das AUCH auf einem Steckbrett hat.

Also zwischen
> Hast das auch auf einem Steckbrett?
und
> Hast das auf einem Steckbrett?

ist ein Unterschied, oder??

P.S.: Nich böse nehmen ;)
Gast #1665359
Lesenswert?

>Hi holger.
>
>P.S.: Nich böse nehmen ;)

Tu ich doch nicht;)

>Wieso? Es liegen doch überall die entsprechenden Signale an? Und der PIC
>und der Quarz hat Verbindung zur Masse.

Ja, wenn dein OSCI dranhängt schwingt der Quarz auch. Das sieht
eigentlich alles gut aus. Dein Programm läuft aber nicht.
Läuft es mit OSCI dran? Hast du das Programm von Helmut versucht?

Das stinkt doch geradezu nach Hardwarefehler!
#1665385
Lesenswert?

Wird Nicolas doch hoffentlich "spannungsmässig" an den Prozessorpin`s im 
Betrieb durch gemessen haben, soviel Zeit wie schon in der Fehlersuche 
steckt.

Aber, wer kennt es nicht, die einfachsten Fehler sieht man nicht.  --->
ein neuer Tag, eine andere Sichtweise.... ;-) und da haben wir den 
Fehler....
#1665394
Lesenswert?

Recht hast du, mal was anderes sehen.
Das Programm macht als Enlosprogramm für PortA.0 bis PortD.7 für 1 Sek 
High an den entsprechenden Pin und schaltet ihn dann wieder aud Gnd.
Solltest deine Peripheriechips für den Test besser rausnehmen.

So:
while true


PortA.0=1
delay_ms(1000)
PortA.0=0

PortA.1=1
delay_ms(1000)
PortA.1=0

PortA.2=1
delay_ms(1000)
PortA.2=0

.....bis....

PortD.7=1
delay_ms(1000)
PortD.7=0

wend

'   Main program
end.
Gast #1665554
Lesenswert?

Bin ja kein Bayern Fan, aber England, nee, dann lieber Bayern.


Ist kein C-Programm, MikroeBasic, für C reicht mein Brain nicht.

Man kann aber auch mit Basic brauchbare Programme basteln.

Aber jetzt keine Diskussion ob C oder was weiß ich, jeder nach seinen

Fähigkeiten und Geschmack. Was hinten raus kommt zählt.

Siehe mein GLCD-Touchscreen-Modul für CAN- oder USB-Kontroller.
Gast #1665601
Lesenswert?

Die Zeit mit einer Sekunde kommt hin?

Ausserdem, das ist doch erfreulich.

Freu dich darüber, seih stolz auf diesen Teil.

Mit dem C-Programm kann dir sicherlich auch jemand helfen.

Mach erst einmal ein ganz einfaches Main-Programm, PortB.1 blinken 
lassen

zB, damit testest du deine Configuration, wenn Das läuft mach weiter.

Viel Erfolg
Gast #1665846
Lesenswert?

So, bin gerade erst dazu gekommen, mir das Assemblerlisting zur Brust zu 
nehmen. Und - entgegen aller Zweifler - es liegt natürlich doch an einem 
verkorksten Programm!

Man schaue sich einmal folgenden Ausschnitt aus dem zuvor von Nicolas 
geposteten Code genau an:
1
  while(1);
2
  {
3
    LATAbits.LATA2 = 1;      //  
4
    LATEbits.LATE0 = 1;      //
5
    LATAbits.LATA4 = 1;      //  
6
  }

Man sieht es leider erst auf dem zweiten Blick, aber dann ist es 
ziemlich klar, warum weder Pin A2, E0 noch A4 gesetzt werden ;-)
Die Lösung des Rätsels gibts nach der Kaffeepause...

Gruß
Daniel

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