Forum: Mikrocontroller und Digitale Elektronik PIC - CCS C Problem


von gast (Gast)


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

von gast (Gast)


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
}

von Schoasch (Gast)


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

von holger (Gast)


Lesenswert?

TMR0IF in INTCON wird am Ende des Interrupts nicht
zurückgesetzt. Macht CCS das automatisch ?

von gast (Gast)


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

von gast (Gast)


Lesenswert?

keiner, der mir helfen kann?

von gast (Gast)


Lesenswert?

Kann mir noch immer keiner helfen? verzweifelt

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Ich bin mir nicht sicher aber ist das & hier richtig?
1
get_tris_a() & 0xF0

von gast (Gast)


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

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Hab grad noch mal nachgeschaut, stimmt, wenn sie 0 sind sinds AUsgänge, 
das wusste ich halt nich mehr genau.

von gast (Gast)


Lesenswert?

keiner eine lösung? gibts ja nicht! :(

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.