Forum: Mikrocontroller und Digitale Elektronik Beispiel Prog in C PIC 18F4550


von Patrick E. (f4550tim)


Lesenswert?

Hallo, ich habe hier einen 8-Bit binärzähler. Ich möchte, sobald der 
Port auf 255 steht. Also alle Pins von D auf high stehen, die Funktion 
zum blinken aufrufen. Doch leider wenn ich das ausgeklammerte (die If 
abfrage) einklammere (also nicht auskommentiere), dann dauert es eine 
kurze zeit. Ich bekomme die erste LED an PORT D also PIN 1 auf high, und 
dann geht garnichts mehr. Wo liegt mein Denkfehler?

Wenn er auf 255 hochgezählt hat, wird er automatisch mit dem nächsten 
zähler auf 0 gesetzt. Das klappt auch soweit wennn ich die Ifabfrage 
drausen lasse.

lg Tim

PS: Hier mein Code
1
#include <p18f4550.h>    // Pic .h eigebunden
2
#include <delays.h>    // delays.h eingebunden
3
4
#pragma config FOSC = HS  //Oscilator Art zwischen 4MHz - 20MHz
5
#pragma config PWRT = ON  // AN
6
#pragma config BOR = OFF
7
#pragma config WDT = OFF  // Watch Dog AUS
8
#pragma config LVP = OFF
9
#pragma config PBADEN = OFF
10
#pragma config VREGEN = OFF
11
#pragma config MCLRE = ON  // Master Reset AN
12
13
#pragma code     //Code soll in den Programmspeicher geschrieben werden
14
15
16
17
18
unsigned char a=0;   // Variable a wird deklariert und auf 0 gestezt
19
20
21
22
23
  void set (void)  // Das ist die Funktion, die die neuen Bits an PORT D setzt
24
  {
25
    LATD=a;  //Variable a wir auf den Port geschrieben
26
  }
27
28
  void blink (void)
29
  {
30
      a=0;
31
      Delay10KTCYx(50);
32
      a=255;
33
      Delay10KTCYx(50);
34
      a=0;
35
      Delay10KTCYx(50);
36
      a=255;
37
      Delay10KTCYx(50);
38
      a=0;
39
      Delay10KTCYx(50);
40
      a=255;
41
      Delay10KTCYx(50);
42
      a=0;
43
      Delay10KTCYx(100);
44
  }
45
46
  void main(void)   // Haupt Routine
47
  {
48
      TRISD = 0;      // Port D ist nun ein Ausgang
49
      TRISA = 0xFF;    // Port A ist ein Eigang
50
      ADCON1 = 0x0F;    // Alle Port Pins auf digital gesetzt
51
      CMCON = 0x07;     // Komparatoreinänge deaktivieren
52
    LATD = 0x00;  // Der PORT D ist von Anfang an auf 0 gesetzt
53
54
55
    while (1)
56
    {  
57
58
/*-----------------------------------------------------------------------------------------------
59
      if (a=0xFF)  //Wenn der zähler bei 255 angekommen ist, dann wird blink aufgerufen.
60
      {
61
      blink();
62
      }
63
-----------------------------------------------------------------------------------------------*/
64
65
      a++;    // a wird hochgezählt
66
      set();    // Die Funktion Set wird aufgerufen
67
      Delay10KTCYx(100);  // ein wenig Pause
68
69
70
      
71
    }
72
  }

von Martin S. (drunkenmunky)


Lesenswert?

Tim E. schrieb:
> if (a=0xFF)  //Wenn der zähler bei 255 angekommen ist, dann wird blink 
aufgerufen.

= ist eine Zuweisung
== ist ein Vergleich

Um solche Fehler zu vermeiden, schreibe die Variable die du verlgeichen 
willst (also a) auf die rechte  Seite. So etwa:
if ( 0xFF == a )

Wenn du jetzt nur ein = machst, gibt der Compiler ne Fehlermeldung aus, 
dass das so keinen Sinn macht

von Patrick E. (f4550tim)


Lesenswert?

Danke dir. Nun ist alle sin bester Ordnung. Ich habe auch noch oben bei 
der funktion blink nach jedem setzten des wertes einmal die Funktion set 
aufgerufen, damit man das blinken auch sieht.

DANKE für deien tollen TIPP mit dem a nach rechts.

lg Tim

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.