PIC - CCS C Problem

Gast #618239
Lesenswert?

Habe da ein Problem mit der Ansteuerung meiner LEDS, es ist P0 P1 und P3 
ständig high und P2 auf low, es tut sich sonst nichts.

Habe ich ein Problem mit dem Timer oder mit dem FastIO?

folgendes ist noch inkludiert:
1
#include <16F84.h>
2

3
#FUSES NOWDT                   // No Watch Dog Timer
4
#FUSES HS                      // Quarz, high speed
5
#FUSES NOPUT                   // No Power Up Timer
6
#FUSES NOPROTECT               // Code not protected from reading
7

8
#use delay(clock=20000000)     // Frequenz des Quarz = 20MHz
9
#use fast_io(a)                // schnelles schalten der I/Os
10
                               // erfordert set_tris_a();
11
#use fast_io(b)
12

13
#BYTE PORTA = 5                // Adresse des PORTA, für fast_io
14
#BYTE PORTB = 6                // Adresse des PORTB für fast_io

mfg. Gast
Gast #618242
Lesenswert?

warum auch immer, aber meine source wurde nicht angehängt.. hier ist 
sie:
1
#include "C:\Dokumente und Einstellungen\WoifaL\Eigene Dateien\testilein\Balkonbeleuchtung 0.1\test.h"
2

3

4
/*
5
H:          der Farbton als Farbwinkel H auf dem Farbkreis (z. B. 0° = Rot, 120° = Grün, 240° = Blau)
6
S:          die Sättigung S in Prozent (z. B. 0% = keine Farbe, 50% = ungesättigte Farbe, 100% = gesättigte, reine Farbe) 
7
V:          der Grauwert V als Prozentwert angegeben (z. B. 0% = keine Helligkeit, 100% = volle Helligkeit)
8

9
Skalierung der HSV Werte:
10
H:      0-255, 0=rot, 42=gelb, 85=grün, 128=türkis, 171=blau, 214=violett
11
S:      0-255, 0=weißtöne, 255=volle Farben
12
V:      0-255, 0=aus, 255=maximale Helligkeit
13

14
*/
15

16

17
#define    Ledport             PORTA    // RGB Led Port
18

19
#define    R_PIN               0      // R Ausgang
20
#define    G_PIN               1      // G
21
#define    B_PIN               2      // B
22
#define    INVERT              0      // Ausgang Low aktiv ?
23

24
#define    Time                1      // Statusbit für Farbwechsel
25

26
// Prototypen
27
void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v);
28

29
// Globale Variabeln (Timer ISR)
30
volatile unsigned char Red, Green, Blue;    // PWM Register
31
volatile unsigned char Flags;
32

33

34
//-------------------------------------------------------------------------------
35
//Hauptprogramm
36
//-------------------------------------------------------------------------------
37
int main(void)
38
{
39
  unsigned char H,S,V;
40

41
  set_tris_a (get_tris_a() & 0xF0); // PIN0 - PIN4 = Ausgang
42
  // wird verwendet für fast_io (a);
43
  set_tris_b (get_tris_b() | 0xF0); // PIN4 - PIN7 = Eingang
44
  // wird verwendet für fast_io (b);
45

46
  H=0;
47
  S=255;
48
  V=255;              // HSV Startwerte: rot, volle Helligkeit
49
  hsv_to_rgb(H,S,V);        // HSV to RGB
50

51
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
52

53
  // Interrupts aktivieren
54
  enable_interrupts (INT_TIMER0);
55
  enable_interrupts (GLOBAL);
56

57
  for(;;)
58
  {
59
    if (Flags&Time)
60
    {
61
      Flags&=~Time;
62
      H++;
63
      hsv_to_rgb(H,S,V);
64
    }
65
  }
66
  return (0);
67
}
68

69
//-------------------------------------------------------------------------------
70
//HSV nach RGB konvertieren
71
//-------------------------------------------------------------------------------
72
void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v)
73
{
74
  unsigned char r,g,b, i, f;
75
  unsigned int p, q, t;
76

77
  if( s == 0 ) 
78
  {
79
     r = g = b = v;
80
  }
81
  else
82
  {
83
    i=h/43;
84
    f=h%43;
85
    p = (v * (255 - s))/256;
86
    q = (v * ((10710 - (s * f))/42))/256;
87
    t = (v * ((10710 - (s * (42 - f)))/42))/256;
88

89
    switch( i )
90
    {
91
      case 0:
92
        r = v; g = t; b = p; break;
93
      case 1:
94
        r = q; g = v; b = p; break;
95
      case 2:
96
        r = p; g = v; b = t; break;
97
      case 3:
98
        r = p; g = q; b = v; break;
99
      case 4:
100
        r = t; g = p; b = v; break;
101
      case 5:
102
        r = v; g = p; b = q; break;
103
    }
104
  }
105

106
  disable_interrupts (GLOBAL);   // Kein Interrupt beim übernehmen der neuen Werte!
107
  Red=r, Green=g, Blue=b;
108
  enable_interrupts (GLOBAL);
109
}
110

111
//-------------------------------------------------------------------------------
112
//Timer  0 Interrupt, 39us
113
//-------------------------------------------------------------------------------
114
#int_timer0
115
void timer0interrupt()
116
{
117
  static unsigned char PWM_cnt;
118

119
  set_timer0 (61); // 39us
120
  // entspricht bei der PWM ca. 100Hz
121

122
#if (INVERT==1)
123
  if (PWM_cnt <Red)
124
    Ledport &=~(1 << R_PIN);
125
  else
126
    Ledport |= (1 << R_PIN);
127

128
  if (PWM_cnt <Green)
129
    Ledport &=~(1 << G_PIN);
130
  else
131
    Ledport |= (1 << G_PIN);
132

133
  if (PWM_cnt <Blue)
134
    Ledport &=~(1 << B_PIN);
135
  else
136
    Ledport |= (1 << B_PIN);
137
#else
138
  if (PWM_cnt <Red)
139
    Ledport |= (1 << R_PIN);
140
  else
141
    Ledport &=~(1 << R_PIN);
142

143
  if (PWM_cnt <Green)
144
    Ledport |= (1 << G_PIN);
145
  else
146
    Ledport &=~(1 << G_PIN);
147

148
  if (PWM_cnt <Blue)
149
    Ledport |= (1 << B_PIN);
150
  else
151
    Ledport &=~(1 << B_PIN);
152
#endif
153
  PWM_cnt++;
154
  if (PWM_cnt==0)
155
    Flags|=Time;
156
}
Gast #618326
Lesenswert?

Hi

Wieso mischst du denn CCS-Sonderfunktionen und normale zuweisungen 
durcheinander? Verwende doch gleich direkte Zuweisung.

Also zb. das Tris-Register und die ganzen Port-Bits zuweisen
#byte TRISA = 0x85

#bit LED_R = PORTA.0

Und da könnte es eventuell zu einem read-modify-write Problem kommen:
Ledport |= (1 << B_PIN);

Setz die bits einfach einzeln, wie ob definiert.

Ansonst fällt mir momentan nichts auf.

mfg SChoasch
Gast #618353
Lesenswert?

Habe es jetzt mit der Direkten Zuweisung versucht, jetzt leuchtet LED 0 
und LED 1.
Jedoch ändert sich die Helligkeit nicht und ich befürchte er steht 
einfach irgenwo.

Das Timer Interupt Flag wird vom CCS gelöscht.

mfg. Gast
Gast #646309
Lesenswert?

Wieso sollte es denn falsch sein? Meiner Meinung nach wird das Register 
ausgelesen mit 0xF0 verundet, also die letzten 4 Bit gelöscht (= 
Ausgang) und wieder geschrieben? Oder sehe ich das falsch?

mfg. gast

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren