Forum: Mikrocontroller und Digitale Elektronik IO Problem mit PIC


von chriis (Gast)


Lesenswert?

Hallo
Ich habe ein Problem mit meinem pic16f726. Mit diesem pic möchte ich ein 
RGB Led steuern, welches an PORTB 2-4 angeschlossen ist. Wenn ich mit 
RB2=1; ein Bit setze leuchtet das rote. Schalte ich zusätzlich 
RB3=1;(Grün) ein, erlischt das rote Led und das grüne leuchtet -> siehe 
Code.
Setze ich die Bits mit PORTB = 0b00011100; funktioniet es(LED leuchtet 
weiss)

WAS mache ich falsch??

Vielen  Dank!

Ich verwende MPLAB 8.86 und HI Tech C Compiler 9.82, das 
Programmiergerät ist PICKIT 2. VCAP ist an RA0 angeschlossen.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <htc.h>
4
5
#define L_RED    RB2
6
#define L_GREEN   RB3
7
#define L_BLUE    RB4
8
#define _XTAL_FREQ 16000000
9
10
11
void main (void)
12
{
13
  OSCCON = 0b00110000;
14
15
  ANSELB = 0xff;    //PORTB ADWandler aus 
16
  TRISB  = 0x00;     //PORTB ist Ausgang
17
  PORTB  = 0x00;     //PORTB reseten
18
19
  L_RED = 1;              //rotes LED leuchtet -> OK
20
  L_GREEN = 1;            //rotes LED löscht aus! Grünes leuchtet
21
  L_BLUE=1;               //grünes LED löscht aus! Blaues leuchtet
22
23
  PORTB  = 0x00;     //PORTB reseten
24
  PORTB  = 0b00011100;    //LED leuchtet weiss!
25
  
26
   while(1)
27
   {
28
   }
29
}

von Holger W. (holgerw)


Lesenswert?

Vorwiderstand in jedem einzelnen Strang ?
Setzt L_RED = 1; wirklich den Pin oder den ganzen Port ?

Holger

von chriis (Gast)


Lesenswert?

Ja jedes Led besitzt sein eigenen Vorwiderstand, pro Led fliesst ca 10mA 
direkt aus dem Pic.
L_RED =1; setzt nur das rote Led. Alle anderen Pins bleiben 
ausgeschaltet.

chriis

von Stefan (Gast)


Lesenswert?

Der setzt wahrscheinlich hier: #define L_GREEN   RB3
den Port RB3 auf 1 und die anderen auf Null.
Schau mal in der Beschreibung, ob du es anders machen mußt.
ZB. so: PORTB.1 = 1

von Holger W. (holgerw)


Lesenswert?

Die defines stimmen so, ich hab gerade in einem Projekt bei mir 
nachgesehen.
Was passiert denn bei

PORTB  = 0b00011000;
bzw. anderen Kombinationen mit 2.

Mach mal zwischen 2 Portzugriffe NOPs rein, nicht das du die Read/Modify 
Falle hast.

Holger

von chriis (Gast)


Lesenswert?

Holger W. schrieb:
> Was passiert denn bei
>
> PORTB  = 0b00011000;

Das RGB Led leuchtet Cyan -> blaues und grünes Led leuchten

Das NOP zwischen den Befehlen bringt nichts.

Mit anderen 2er Kombinationen funktioniert auch alles wunderbar. Soblad 
ich aber ein einzelnes Bit setzen möchte, wird der ganze Port geresetet 
und das gewünschte Bit gesetzt...


Was mir aufgefallen ist beim Debuggen ist, dass das PORTB register immer 
0x00; ist. Dabei ist es egal ob das Led leuchtet (Portb != 0) oder 
nicht.

von chriis (Gast)


Lesenswert?

Stefan schrieb:
> Der setzt wahrscheinlich hier: #define L_GREEN   RB3
> den Port RB3 auf 1 und die anderen auf Null.

Genau das passiert.


> Schau mal in der Beschreibung, ob du es anders machen mußt.
> ZB. so: PORTB.1 = 1

Das einzige was ich gefunden habe wäre PORTBbits.X = 1; -> bewirkt aber 
das gleiche wie RBx = 1;

Bei anderen PIC (die ich schon programmiert habe) funktioniert RBx so, 
dass nur dieses Bit gesetzt oder gelöscht wird

von Holger W. (holgerw)


Lesenswert?

Ich nutz den C18, nur ganz selten den HiTec.
Optimiert der evtl die leere While Schleife weg ?

Ansonsten weiss ich auch gerade nicht woran es liegen kann.
Ich lad es mal eben in einen 16F628.

Holger

von chriis (Gast)


Lesenswert?

Holger W. schrieb:
> Ich nutz den C18, nur ganz selten den HiTec.
> Optimiert der evtl die leere While Schleife weg ?

Nein tut er nicht. Hier ein Ausschnitt aus dem Assembler Code.
1
...
2
3
20:                  L_RED = 1;              //rotes LED leuchtet -> OK
4
  07F5    1506     BSF 0x6, 0x2
5
21:                  L_GREEN = 1;            //rotes LED löscht aus! Grünes leuchtet
6
  07F6    1586     BSF 0x6, 0x3
7
22:                  L_BLUE=1;               //grünes LED löscht aus! Blaues leuchtet
8
  07F7    1606     BSF 0x6, 0x4
9
23:                
10
24:                  PORTB  = 0x00;     //PORTB reseten
11
  07F8    0186     CLRF 0x6
12
25:                  PORTB  = 0b00011100;    //LED leuchtet weiss!
13
  07F9    301C     MOVLW 0x1c
14
  07FA    0086     MOVWF 0x6
15
  07FB    2FFC     GOTO 0x7fc
16
26:                
17
27:                  
18
28:                   while(1)//Endlosschlaufe
19
  07FC    2FFC     GOTO 0x7fc
20
29:                   {
21
30:                   }
22
31:                } 
23
  07FD    120A     BCF 0xa, 0x4
24
25
...

Hier ist interessant, dass er codetechnisch nur ein Bit setzt im PORTB 
Register. Funkt da evt ein anderes Modul dazwischen?
1
21:                L_GREEN = 1;  //rotes LED löscht aus! Grünes leuchtet
2
  07F6    1586     BSF 0x6, 0x3

von chriis (Gast)


Lesenswert?

chriis schrieb:
> Funkt da evt ein anderes Modul dazwischen?

Fehler gefunden

ANSELB = 0x00 und nicht 0xff. grrr saudummer Fehler
So war der AD wandler aktiviert!


VIELEN DANK an alle die mich Unterstützt haben!

chriis

von HolgerW (Gast)


Lesenswert?

ok, da hab ich auch nicht drauf geschaut ....

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.