IO Problem mit PIC

Gast #2808306
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
}
Gast #2808409
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.
Gast #2808415
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
Gast #2808443
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

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