PIC konfigurieren & programmieren

Hallo Leute,

Ich habe da ein kleineres Problem mit meinem PIC18F242.

Und zwar benutze ich die Demo vom MPLAB IDE V6.52 mit dem C18-Compiler. Als Brenner benutze ich den Olimex PG2C PIC-Programmer (http://www.olimex.com/dev/pic-pg2b.html)
Als Programmiersoftware benutze ich IC-Prog 1.05.

Nun habe ich folgenden Code erzeugt, nur um zu sehen, ob da überhaupt was passiert:

#include 

#pragma romdata CONFIG
\_CONFIG\_DECL (
\_OSCS\_ON\_1H & \_OSC\_ECIO\_1H, //externer Oszillator, RA6 ist IO
0b00000000,
0b00001110,
0b00000001,
0b10000000,
0b00001111,
0b11000000,
0b00001111,
0b11100000,
0b00001111,
0b01000000
);
#pragma romdata

void main (void){
 TRISB=0b00000000; //Port B ist Output
 TRISC=0b00000000;
 TRISA=0b00000000;
 PORTA = 0x7f; //Port A komplett auf 1 setzen
 PORTB = 0xff;
 PORTC = 0xff;
 PORTBbits.RB2 = 0;
 PORTBbits.RB4 = 0;
 while (1){ 
 PORTBbits.RB2 = 0;
 PORTBbits.RB4 = 0;
 PORTBbits.RB5 = 1;
 }
}

Und siehe da, nichts passiert. Meine Frage ist nun: Warum?

Die Betriebsspannung liegt bei 5.4V, es ist ein externer Oszillator mit 36 MHz angeschlossen. An allen Pins liegt eine Spannung von etwa 1 Volt an. Keins ist richtig an, keins ist richtig aus.

Bin für jede Hilfe Dankbar.

der Günther

Wollte nur sagen:

hier gekauft:
http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=3…

und da steht, dass er meinen PIC programmieren kann.

Danke nochmal

Richtige Bank ausgewählt?
Hallo Günther,

ich habe leider wenig Ahnung von C, programmiere die PIC´s in Assembler. Aber zumindest habe ich mir den Code mal angeschaut und frage Dich, ob Du daran gedacht hast, die richtige Speicherbank (Bank 0, Bank 1 usw.) auszuwählen, bevor Du die Tris-Register initialisierst?
Der Programmspeicher der PIC´s ist ja in bis zu 4 Bänken unterteilt, und die SFR´s sind auf diese verteilt.

Ich komme deshalb auf diese Idee, weil es so aussieht, dass alle Ports nach dem Einschalten der Betriebsspannung keinen definierten Zustand haben, bzw. noch als hochohmige Eingänge arbeiten. Die Spannung, die Du am OSZI messen kannst, ist irgend ein Zwischenwert, der sich aus dem Innenwiderstand des OSZI´s und den Ports des PIC´s ergibt.

Als zweites würde ich an Deiner Stelle mal das Programm mit dem integrierten Simulator testen. Schau (in einem Watch-Fenster) nach, ob die Ports ihre Zustände wechseln. Wenn „nein“, liegt es wohl doch an der vergessenen Umschaltung der Speicherbänke.

Gruß, Alexander

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Alexander,

und frage Dich, ob Du daran gedacht hast, die richtige
Speicherbank (Bank 0, Bank 1 usw.) auszuwählen, bevor Du die
Tris-Register initialisierst?
Der Programmspeicher der PIC´s ist ja in bis zu 4 Bänken
unterteilt, und die SFR´s sind auf diese verteilt.

Wie muss ich denn da hergehen? Bin etwas neu auf dem Gebiet.

Als zweites würde ich an Deiner Stelle mal das Programm mit
dem integrierten Simulator testen. Schau (in einem
Watch-Fenster) nach, ob die Ports ihre Zustände wechseln. Wenn
„nein“, liegt es wohl doch an der vergessenen Umschaltung der
Speicherbänke.

Hm. Ich hatte nach nem Simuator gesucht und keinen gefunden. Ich benutze wie gesagt den C18-Compiler. Habe auch nur diese Umgebung installiert.

Danke dir.

der Günther

Hallo Günther!

Deinen Compiler kenne ich leider nicht und kann Dir daher auch keine Tipps zu Deinem Quellcode geben. Allerdings habe ich auch schon einiges mit PICs gemacht und es gibt sehr viele Fallen, in die man fallen kann. Folgende Punkte solltest Du auch mal Prüfen:

  • MCLR richtig beschaltet (Wenn nicht --> Reset)
  • Alle fuses richtig gesetzt (Brownout…etc)
  • 36MHz ??
  • „PIN_XX = 1“ geht solch eine Zuweisung mit Deinem Compiler, oder gibt es eine Funktion wie z.B. Output_High(PIN_XX)
  • Alle Trisregister richtig gesetzt?
  • Ist Versorgungsspannung stabil (evtl. RC - Glied an MCLR und Stützkondensator zwischen Vss und Vdd)

Gruß, Tobi

Hallo Tobi,

Danke für deine Hilfe, hab dazu gleich ein paar Fragen:

  • MCLR richtig beschaltet (Wenn nicht --> Reset)

Was muss ich denn da schalten???

  • Alle fuses richtig gesetzt (Brownout…etc)

Habe Brownout disabled. Ich wusste nicht was das ist, daher dachte ich, es stört nicht.

  • 36MHz ??

Laut Spezifikation kann ich mit nem externen Clock auf 40MHz gehen. Mein Oszillator macht 36 MHz. Sollte doch gehen.

Ist der „OSZI 36,000000“ bei Reichelt.

  • „PIN_XX = 1“ geht solch eine Zuweisung mit Deinem Compiler,
    oder gibt es eine Funktion wie z.B. Output_High(PIN_XX)

Also in den wenigen Beispielapplikationen, die ich so fand wurde es so gemacht, wie ich es auch tat.

  • Alle Trisregister richtig gesetzt?

keine Ahnung. Ich habe meiner Meinung nach mit

TRISB=0b00000000;

das PORTB auf output gesetzt. Bräuchte ich da noch mehr?

  • Ist Versorgungsspannung stabil (evtl. RC - Glied an MCLR und
    Stützkondensator zwischen Vss und Vdd)

Ja, sie ist stabil. Wie kritisch ist das denn? Ich meine einen Stützkondensator zusätzlich einzulöten ist ja kein Thema.

Und welchen Compiler könnte ich denn noch benutzen? Mit welchem hast du denn Erfahrung? Welcher funktioniert auch für Anfänger gut? Welcher hat einen Simulator dabei?

Wie gesagt, ich mache das zum ersten Mal, möchte aber die Vorteile der Pics gern öfter benutzen.

Danke, der Günther.

Hallo Günther!

Der /MCLR (Master Clear) Pin dient zur Programmierung und ist gleichzeitig für Hardwarereset zuständig. Bei guter Versorgungsspannung reicht es, ihn direkt auf 5V zu legen. Besser ist aber dies über ein RC - Glied zu tun (Bsp. 4k7 und 100nF). Beschalten musst Du diesen Eingang auf jedenfall, da Dir Dein PIC sonst immer über reset läuft. Brownout disabled ist ok.
Bei Deiner Frequenz war ich nur kurz verwirrt, aber wenns so im Datenblatt steht ist das ja ok.

Ich verwende den C PIC Compiler von CCS. Der ist relativ einfach und bietet gute Funktionen, die einem das Programmieren erleichtern.

Gruß, Tobi

1 „Gefällt mir“

Grundlagenwissen über Pic´s nötig
Hallo Günther,

und frage Dich, ob Du daran gedacht hast, die richtige
Speicherbank (Bank 0, Bank 1 usw.) auszuwählen, bevor Du die
Tris-Register initialisierst?
Der Programmspeicher der PIC´s ist ja in bis zu 4 Bänken
unterteilt, und die SFR´s sind auf diese verteilt.

Wie muss ich denn da hergehen? Bin etwas neu auf dem Gebiet.

Zunächst solltest Du Dir das Datenblatt Deines PIC´s von der Microchip.Homepage runterladen (www.microchip.com). Dann schau nach, in welcher Speicherbank sich die TRIS-Register befinden. Dazu gibt es eine Übersicht im Datenblatt mit dem Namen „Register File Map“. Dort ist in einer Art Tabelle angegeben, in welcher Speicherbank sich das entsprechende Special-Function-Register (kurz: SFR) befindet, und welche hex-Adresse es hat.
Dort schaust Du wegen der Tris-Register nach.

Dann machst Du folgende Deklaration in Deinem Programm:
#Define TrisA equ 0x85
#Define TrisB equ 0x86
#Define TrisC equ 0x87

#Define Status equ 0x03

durch diese Deklarationen sagst Du dem Compiler, dass z.B. die Speicheradresse „0x85“, welche laut Register File Map die des TrisA-Registers ist, die Bezeichnung „TrisA“ im folgenden Programmtext bekommt.
So wird Dein Programm übersichtlicher, weil Du statt der Hex-Zahl 85 einfach die Bezeichnung „TrisA“ verwenden kannst.
Die hier angegebenen Hex-Zahlen sind nur als Beispiel gedacht. Welche Adresse Du tatsächlich angeben musst, steht in der Register File Map Deines PIC-Datenblattes.

Beim Einschalten der Versorgungsspannug wird der Inhalt aller Tris-Register auf „1“, also auf „Eingang“ gesetzt.
Um in das Tris-Register eine „0“ (Ausgang) reinzuschreiben, musst Du erst die entsprechende Speicherbank auswählen, in der sich das Tris-Register befindet.
Die richtige Speicherbank steht ebenfalls im Register File Map (ganz unten). Üblicherweise befinden sich die Tris-Register in Speichbank 1.

Grundsätzlich ist beim Einschalten der Betriebsspannung immer Bank 0 eingestellt. Um auf Speicherbank „1“ umzuschalten, musst Du entsprechende Bits im Status-Register setzen, bzw. löschen. Welche dies sind, entnimmst Du dem Datenblatt (dort, wo das Status-Register beschrieben wird).

Nachdem Bank 1 eingestellt wurde, kannst Du nun auf die SFR´s dieser Speicherbank zugreifen. Wenn die gewünschte Operation durchgeführt ist, schalte der Ordung halber wieder auf Bank 0 zurück. Damit ersparst Du Dir womöglich lange Fehlersuche.

Ich programmiere die PIC´s nicht in C, sondern in Assembler. Daher könnte es sein, dass Du diese Angaben hier nicht zu 100% übernehmen kannst. Probier´s aus.

Als zweites würde ich an Deiner Stelle mal das Programm mit
dem integrierten Simulator testen. Schau (in einem
Watch-Fenster) nach, ob die Ports ihre Zustände wechseln. Wenn
„nein“, liegt es wohl doch an der vergessenen Umschaltung der
Speicherbänke.

Hm. Ich hatte nach nem Simuator gesucht und keinen gefunden.
Ich benutze wie gesagt den C18-Compiler. Habe auch nur diese
Umgebung installiert.

Von der Microchip-Homepage kannst Du Dir eine integrierte Entwicklungsumgebung herunterladen, MPLAB genannt. Diese beinhaltet auch einen Simulator, d.h. das Programm wird, sofern es in Assembler geschrieben ist (mit Einschränkungen) so auf Deinem PC ausgeführt, als wenn es im PIC laufen würde. Du kannst Dir alle Port- und Registerzustände anzeigen lassen usw.
Doch leider kann ich Dir nicht sagen, ob sich dieser Simulator auch für C-Programme eignet, da ich mich damit noch nicht befasst habe.

Gruß, Alexander

Danke dir.

der Günther

Hallo Tobi,

Super, jetzt geht erstmal was, habe das entsprechende Beinchen auf Spannung gezogen und es geht. Allerdings sind die Ausgangsspannungen komisch.

Am Ausgang, den ich HI haben wollte liegen -5V, auf dem LOW 0V. Ich wollte aber eigentlich +5V am HI-Ausgang.

Danke Trotzdem, hast mir schwer geholfen.

der Günther

Hallo Günther,

Am Ausgang, den ich HI haben wollte liegen -5V, auf dem LOW
0V. Ich wollte aber eigentlich +5V am HI-Ausgang.

vielleicht solltest Du mal die Messspitzen richtig rum anschließen. Wo sollen denn dei -5V herkommen, wenn der PIC nur mit +5V und 0V verbunden ist? Schau doch mal ins Datenblatt, wie die Ports intern aussehen, dann wirst Du erkennen, daß da niemals -5V rauskommen können.
Gruß
Axel