-         

Ergebnis 1 bis 2 von 2

Thema: Problem mit PIC-Programm (PIC16F628A)

  1. #1

    Problem mit PIC-Programm (PIC16F628A)

    Anzeige

    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:
    Code:
    /*
     *  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

  2. #2
    *push*

    Weiß keiner was?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •