www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC - CCS C Problem


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <16F84.h>

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

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

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


mfg. Gast

Autor: gast (Gast)
Datum:

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


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

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

*/


#define    Ledport             PORTA    // RGB Led Port

#define    R_PIN               0      // R Ausgang
#define    G_PIN               1      // G
#define    B_PIN               2      // B
#define    INVERT              0      // Ausgang Low aktiv ?

#define    Time                1      // Statusbit für Farbwechsel

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

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


//-------------------------------------------------------------------------------
//Hauptprogramm
//-------------------------------------------------------------------------------
int main(void)
{
  unsigned char H,S,V;

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

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

  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

  // Interrupts aktivieren
  enable_interrupts (INT_TIMER0);
  enable_interrupts (GLOBAL);

  for(;;)
  {
    if (Flags&Time)
    {
      Flags&=~Time;
      H++;
      hsv_to_rgb(H,S,V);
    }
  }
  return (0);
}

//-------------------------------------------------------------------------------
//HSV nach RGB konvertieren
//-------------------------------------------------------------------------------
void hsv_to_rgb (unsigned char h, unsigned char s, unsigned char v)
{
  unsigned char r,g,b, i, f;
  unsigned int p, q, t;

  if( s == 0 ) 
  {
     r = g = b = v;
  }
  else
  {
    i=h/43;
    f=h%43;
    p = (v * (255 - s))/256;
    q = (v * ((10710 - (s * f))/42))/256;
    t = (v * ((10710 - (s * (42 - f)))/42))/256;

    switch( i )
    {
      case 0:
        r = v; g = t; b = p; break;
      case 1:
        r = q; g = v; b = p; break;
      case 2:
        r = p; g = v; b = t; break;
      case 3:
        r = p; g = q; b = v; break;
      case 4:
        r = t; g = p; b = v; break;
      case 5:
        r = v; g = p; b = q; break;
    }
  }

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

//-------------------------------------------------------------------------------
//Timer  0 Interrupt, 39us
//-------------------------------------------------------------------------------
#int_timer0
void timer0interrupt()
{
  static unsigned char PWM_cnt;

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

#if (INVERT==1)
  if (PWM_cnt <Red)
    Ledport &=~(1 << R_PIN);
  else
    Ledport |= (1 << R_PIN);

  if (PWM_cnt <Green)
    Ledport &=~(1 << G_PIN);
  else
    Ledport |= (1 << G_PIN);

  if (PWM_cnt <Blue)
    Ledport &=~(1 << B_PIN);
  else
    Ledport |= (1 << B_PIN);
#else
  if (PWM_cnt <Red)
    Ledport |= (1 << R_PIN);
  else
    Ledport &=~(1 << R_PIN);

  if (PWM_cnt <Green)
    Ledport |= (1 << G_PIN);
  else
    Ledport &=~(1 << G_PIN);

  if (PWM_cnt <Blue)
    Ledport |= (1 << B_PIN);
  else
    Ledport &=~(1 << B_PIN);
#endif
  PWM_cnt++;
  if (PWM_cnt==0)
    Flags|=Time;
}


Autor: Schoasch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner, der mir helfen kann?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir noch immer keiner helfen? verzweifelt

Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:

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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Icke Muster (Firma: my-solution) (hendi)
Datum:

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

Autor: gast (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.