PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC16F628 Programm läuft nicht



Tom Seiph
12.05.2006, 19:10
Hallo ich bin am Verzweifeln:

Ich habe folgende kleine Schaltung mit dem PIC16F628 aufgebaut:

3,3V SPG-Reg als Versorgung
An RB0-RB3 je ein 1k Widerstand und dann eine LED auf Masse
An RB4-RB7 je einen 4k7 Pullup und einen Schalter auf Masse

So alles was ich (momentan noch) will, ist über die Schalter die LEDS
an und aus zu schalten. Als Oszilator soll der Interne OSC des Pics
verwendet werden.

Hierzu habe ich ein kleines C-Programm (siehe ganz unten) für den
CC5X-Compiler geschrieben mit MPLAB und dem CC5X das HEX-File generiert und dieses dann mit dem PIC Brenner5 Rev 5a von Sprut auf den PIC gebrannt.
(Folgende Configuration: INTRC CLKOUT - Watchdog OFF - Power Up Timer ON - Brown Out Disabled - Master Clear Enabled - Low Voltage Program Disabled - Data EE Read Protect Disabled - Code Protect OFF)

Danach kommt der PIC auf die Schaltung aber irgendwie geht da nix an
und aus.

Ich kann mir nicht erklären warum nicht. Stimmen evtl. die
Einstellungen nicht oder ist ein fehler im Programm?

Es wäre nett wenn Ihr mir weiterhelfen könntet.

Vielen Dank

Tom


Hier noch schnell das Programm:

/* Funktionsprototypen */
void Startup(void);

/*--Globale Variablen---*/

/* Definitionen für die Belegung der IO-Ports */
#pragma bit S1 @ PORTB.7; /* Schalter 1 */
#pragma bit S2 @ PORTB.6; /* Schalter 2 */
#pragma bit S3 @ PORTB.5; /* Schalter 3 */
#pragma bit S4 @ PORTB.4; /* Schalter 4 */

#pragma bit L1 @ PORTB.3; /* LED 1 */
#pragma bit L2 @ PORTB.2; /* LED 2 */
#pragma bit L3 @ PORTB.1; /* LED 3 */
#pragma bit L4 @ PORTB.0; /* LED 4 */


/* Startup Code - Initialisierungen */
void Startup(void)

PORTB = 0b.0000.0000;
TRISB = 0b.1111.0000; /* Pin 4-7 als Eingang (1) Pins 0-3 als
Ausgang (0) */

return;

}

/*===== Hauptprogramm ===== */

void main(void)
{

Startup();

/* Endlosschleife - Main Loop */

for(;;)
{
/* Schalter-Port ist pulled-up -> Wenn der Schalter
betätigt ist, liegt der Port auf 0 = Low */

if (!S1)
L1 = 1;
else if (S1)
L1 = 0;
if (!S2)
L2 = 1;
else if (S2)
L2 = 0;
if (!S3)
L3 = 1;
else if (S3)
L3 = 0;
if (!S4)
L2 = 1;
else if (S4)
L2 = 0;

}
}

kalledom
12.05.2006, 21:29
Hallo Tom,
die Ausgänge des PIC sind Open-Collektor-Ausgänge, schalten also nur den GND durch. An einigen Pins können interne PullUp-Widerstände per Software enabled werden, die aber für den LED-Strom kaum brauchbar sind.
Entweder verlegst Du die LED's mit Vorwiderständen in Richtung Plus (LED-Polarität beachten !) oder Du verwendest externe PullUp-Widerstände und Treiber in Form von Transistoren oder Treiber-IC's wie z.B. ULN280x / UDN298x.
PS: mit einem ULN280x hättest Du natürlich das gleiche Problem, wie mit dem PIC-Ausgang :-)

PICture
13.05.2006, 06:31
Hallo Tom Seiph!

Wenn Du ein Reset-Taster angeschlossen hast, dann muss er durch pull-up ca. 10k an +Vcc angeschlossen sein. Wenn nicht, ändere Deine Konfiguration auf _MCLR_OFF.

MfG

Tom Seiph
13.05.2006, 13:54
Danke für Eure Antworten.

Also an der Hardware liegt es nicht, ich habe das Hex-File mit dem mikroC Compiler (hier wurden nur die Definitionen an den Compiler angepasst) erzeugt und dies hat einwandfrei funktioniert. Es muss also was am Code nicht stimmen.

Ich benötige auch den CCX5 Compiler, da es mit diesem möglich ist auch größerer Programme zu generieren. Der mikroC ist leider beschränkt und ich denke nicht, dass der Trick mit dem Zusammenfügen mehrerer Dateien wie beim CCX5 funktioniert.

Hat einer eine Idee was am Code nicht stimmen könnte?

Danke