IO Problem mit PIC

Gast #2808306
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
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
Gast
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
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
Gast
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.