PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit PIC-Programm (PIC16F628A)



NovitA
17.07.2007, 21:24
Huhu!

Da ich neu bin erst mal ein großes hallo an alle hier :-)
Und direkt mein Problem:

Ich hab mich in letzter Zeit recht viel mit Microcontroller-Programmierung beschäftigt. Nun habe ich hier einige PIC16F628A und einen amateurhaft-selber-geätzten PIC-Programmer. Nachdem meine ersten Programme (LED blinken lassen, ...) funktioniert haben, wagte ich mich auch an kompliziertere Dinge (aktuell: Steuerung für einen Platinen-Belichter, wenn der klappt ein DMX-Sender).
Leider habe ich zum einen das Problem, dass der Programmer nur bei ~ 1/10 aller programmiervorgänge überhaupt etwas tut und dass das Programm scheinbar kein Stück funktioniert.

Hier zunächst mal der Code an sich:

/*
* Belichtungstimer v1.0
* Autor: Josef Burg
*
* Portbelegung:
* -----------------------------------------------
* PortA.0: Taster zum erhöhen von time
* PortA.1: Taster zum erniedrigen von time
* PortA.2: Anode 1. Siebensegmentanzeige
* PortA.3: Anode 2. Siebensegmentanzeige
* PortA.4: Anode 3. Siebensegmentanzeige
* PortA.5: Start/Stop-Taster
* PortA.6: Anschluss grüne "Im Betrieb"-LED
* PortA.7: Relais zum schalten der UV-Röhren
* PortB.0: Kathode A-Segment
* PortB.1: Kathode B-Segment
* PortB.2: Kathode C-Segment
* PortB.3: Kathode D-Segment
* PortB.4: Kathode E-Segment
* PortB.5: Kathode F-Segment
* PortB.6: Kathode G-Segment
* PortB.7: -
*/

#include <16F628A.h>
#include "delay20.c"
#define Null 0b.0100.0001;
#define Eins 0b.0111.1001;
#define Zwei 0b.0010.0100;
#define Drei 0b.0011.0000;
#define Vier 0b.0001.1001;
#define Funf 0b.0001.0010;
#define Sechs 0b.0000.0010;
#define Sieben 0b.0111.1000;
#define Acht 0b.0000.0000;
#define Neun 0b.0001.0000;
// Wenn PortB eines dieser Bytes zugewiesen wird, sollte die angegebene Zahl erscheinen
#pragma config = 0b.1111.1111.0011
// Bit 1,0 : 11-RC, 10-HS, 01-XT, 00-LP
// Bit 2 : 1 - Watchdog Ein, 0 - Watchdog Aus
// Bit 3 : 0- Power up Timer Ein, 1- Power up Timer Aus
// Bit's 13...4 : 0-Leseschutz Ein, 1-Leseschutz Aus

// --> Hier also: Oszilator RC (Intern), Watchdog aus, PuT ein und Leseschutz aus

void Delay1s( uns16 time) {
do {
Delay1ms(1000);
} while ( -- time != 0);
}

void output(int time) {

}

void main(void)
{
TRISA = 0b.0010.0011; // Am Port A sind Pins 5, 1 und 0 (Pins 17, 18 und 16) als Eingänge definiert - der Rest als Ausgänge
TRISB = 0b.0000.0000; // Alle Pins an Port B als Ausgänge für die Anzeige
int time; // Variable für die Wartezeit
time = 0; // Initialisieren
bit up @ PORTA.0; // Über up wird der Taster zum erhöhen der Zeit angesprochen
bit down @ PORTA.1; // Über down der Taster zum erniedrigen
bit start @ PORTA.5; // Und über start - wie könnte es anders sein - der zum starten
bit LED @ PORTA.6; // Variable zum ansprechen der BetriebsLED
bit UV @ PORTA.7; // Variable zum Ansprechen der UV-Röhren
bit S1 @ PORTA.2;
bit S2 @ PORTA.3;
bit S3 @ PORTA.4;
char Disp @ PORTB; // Display an PortB

while(1) { // Endlosschleife

if (up) { // Wenn die Erhöhen-Taste gedrückt wird
time++; // Erhöhe den Stand
output(time); // Gib den neuen Stand des Timers aus
Delay1ms(100); // 0,1s zum entprellen warten
if(up) { // Solange man die Taste gedrückt hält, wird zunächst 0,5s gewartet, dann jede 0,1s um 1 erhöht
Delay1ms(500);
while(up) {
time++;
output(time);
Delay1ms(100);
} // Ende while
} // Ende if
} // Ende if

if (down) { // Für die Erniedrigen-Taste das gleiche in grün
time--;
output(time);
Delay1ms(100);
if(down) {
Delay1ms(500);
while(down) {
time--;
output(time);
Delay1ms(100);
} // Ende while
} // Ende if
} // Ende if

if (start) { // Wenn start gedrückt wird
LED = 1; // LED einschalten
if (time > 5) { // Röhren nur einschalten wenn länger als 5sec ein um beschädigung der Röhren zu vermeiden
UV = 1;
while (time) {
Delay1s(1); // 1sek warten
time--; // timer erniedrigen
if (start) { // Wenn ncohmal start gedrückt wird, wird der Vorgang abgebrochen
time = 0;
}
output(time); // und ausgeben
}
UV = 0; // UV-Röhren ausschalten
}
LED = 0; // LED wieder ausschalten
}
} // Ende while
} // Ende main

Am Anfang des Codes steht die Belegung, zur Verdeutlichung ist im Anhang nochmal ein Schaltplan (Das ganze ist auf 2 Platinen verteilt, welche über ein Flachbandkabel miteinander verbunden sind).

Natürlich wäre es toll wenn jetzt einer sagen könnte/würde "In Zeile xy ist der Fehler, es muss blablub heißen", aber natürlich bin ich überJEGLICHEN Tipp wie ich den Fehler finden kann dankbar (Da ich nciht den leisesten schimmer habe wie man an ein solches Problem rangeht).

Vielen dank für alle Tipps die ich (hoffentlich) bekommen werden
NovitA

PS: Ich bitte es zu entschuldigen wenn obiger Code kompletter Mist ist ;)

NovitA
19.07.2007, 12:25
*push*

Weiß keiner was?