Forum: Mikrocontroller und Digitale Elektronik PIC steuert LED sehr seltsam


von Onkel (Gast)


Lesenswert?

Also ich habe einen PIC 16F877 auf einem PICDEM 2 Plusboard und wollte 
mich damit ein wenig an die Programmierung solcher chips wagen.

nun wollte ich eine LED wie folgt ansteuern.:

  CLRF   PORTB
  BSF     STATUS,RP0
  CLRF    TRISB


hat geklappt, LED an RB 0 leuchtet.

so nun wollte ich aber das die LED an RB 1 leuchtet:


  CLRF   PORTB
  BSF     STATUS,RP0
  CLRF    TRISB
  RLF     PORTB,F


Jetzt geschieht etw. seltsames:

bei einmaligem drücken des resetknopfes bleibt die LED beim Start aus.
drücke ich den resetknopf 2 mal schnell hintereinnder geht die LED beim 
Start an.
setze ich nun:

  clrf   PORTB
  BSF     STATUS,RP0
  CLRF    TRISB
  RLF     PORTB,F
  RLF     PORTB,F

ist alles wieder wie vorher und die LED geht beim start immer an.




wie kommt das zustande?

und wie bekomme ich das licht auf RB1-3?

von Andreas R. (blackpuma)


Lesenswert?

Wieso machst du das über STATUS,RB0?

Mach doch BSF PORTB,0

Wenn du das über das Carry machst gibt es einen eigenen Befehl: "Rotate 
Left thru Carry" heißt der. Ich weiß jetzt den Befehl selbst nicht.

von Onkel (Gast)


Lesenswert?

hmmm wie gesagt bin anfäger habe deinen beitrag jetzt einfach mal so 
interpretiert, das ich statt status,PR0    PORTB,0-3
schreiben sollte und die entsprechende LED würde dann leuchten.

denke ich hab das flasch interpretiert, da es nicht funktioniert xD

von Jens P. (picler)


Lesenswert?

Ich kenne das PICDEM2 nicht, kann also nichts dazu sagen, ob der Port 
stimmt und wie die LEDs angeschlossen sind (vermutlich gegen GND). 
Ansonsten sind die Programmfragmente unvollständig. Ich habe die 
fehlenden Zeilen mal eingefügt. Ich gehe davon aus, das die 
Registerdefinition korrekt ist.

Onkel schrieb:
> Also ich habe einen PIC 16F877 auf einem PICDEM 2 Plusboard und wollte
> mich damit ein wenig an die Programmierung solcher chips wagen.
>
> nun wollte ich eine LED wie folgt ansteuern.:
>
>   CLRF   PORTB
>   BSF     STATUS,RP0
>   CLRF    TRISB
    BCF     STATUS,RP0     ;auf 1. Registerbank zurückschalten
>
Theoretisch müssten jetzt alle Leds leuchten oder aus sein, je nach 
Bezugspotential
>
> hat geklappt, LED an RB 0 leuchtet.
>
> so nun wollte ich aber das die LED an RB 1 leuchtet:
>
>   CLRF   PORTB
>   BSF     STATUS,RP0
>   CLRF    TRISB
    BCF     STATUS,RP0     ;auf 1. Registerbank zurückschalten
    BSF     PORTB,1        ;Bit1 auf PortB setzen =1

>   RLF     PORTB,F
den Sinn verstehe ich nicht, warum soll PortB rotiert werden?
Vorm Rotieren das C-Flag setzen / beachten
>
>
> Jetzt geschieht etw. seltsames:
>
> bei einmaligem drücken des resetknopfes bleibt die LED beim Start aus.
> drücke ich den resetknopf 2 mal schnell hintereinnder geht die LED beim
> Start an.
> setze ich nun:
>
>   clrf   PORTB
>   BSF     STATUS,RP0
>   CLRF    TRISB
    BCF     STATUS,RP0     ;auf 1. Registerbank zurückschalten
>   RLF     PORTB,F
>   RLF     PORTB,F
???
>
> ist alles wieder wie vorher und die LED geht beim start immer an.
>
> wie kommt das zustande?
>
> und wie bekomme ich das licht auf RB1-3?

Schaue dir mal die Seite sprut.de an. Da ist für Einsteiger viel 
nützliches dabei.

von Andreas R. (blackpuma)


Lesenswert?

Du musst schon für jedes LED eine Zeile schreiben.
1
BSF PORTB,0
2
BSF PORTB,1
3
BSF PORTB,2
4
BSF PORTB,3

Oder du machst es so:
1
MOVLW 00001111
2
MOVWF PORTB

LG
Andreas

von Onkel (Gast)


Lesenswert?

Jens du hast scheinbar nicht richtig gelesen warum ich rotieren lassen 
wollte hatte ich beschreiben.
das umschalten auf das erste register habe ich hier weggelassen, es 
stand aber im eigentlichen programm.


"Du musst schon für jedes LED eine Zeile schreiben."

auch das ist mir bewusst ich wollte die sache bloß abürzen ^^


naja also mit PORTB,2 leuchtet auf jeden fall keine LED.
ich werds mal mit movlw probieren.

ja es sind definitiv die richtigen ports, sie stehen sogar auf dem board 
drauf ^^

von Jens P. (picler)


Lesenswert?

Onkel schrieb:
> Jens du hast scheinbar nicht richtig gelesen warum ich rotieren lassen
> wollte hatte ich beschreiben.

Dann schaue Dir mal den RRF/RLF-Befehl genauer an. Der Inhalt des 
C-Flags wird nach Bit0/7 rotiert und der Inhalt von Bit7/0 nach C. 
Deshalb sollte man vor einer Rotation C entsprechend setzen oder 
rücksetzen. Um Bits oder IO-Pins zu setzen, gibt es bessere Wege, siehe 
die anderen Kommentare weiter oben.

von Onkel (Gast)


Lesenswert?

siehe
die anderen Kommentare weiter oben.



wie schon gesagt das funktioniet leider nicht

von Onkel (Gast)


Lesenswert?

ok die sache mit dem rotieren war nix ist soweit klar.

aber egal wie ich versuche eure tipps umzusetzen d.h.:

  clrf   PORTB
  clrf  TRISB
  BSF PORTB,1



  clrf   PORTB
  BSF PORTB,1
  clrf  TRISB



        clrf   PORTB
        clrf  TRISB
        MOVLW   00001111
        MOVWF   PORTB


        clrf    PORTB
        MOVLW   00001111
        MOVWF   PORTB
        clrf    TRISB


es bleibt dunkel.

was mache ich falsch?

andere programme können eigentlich nicht stören weil diese LED's als 
erstes ausgeführt werde

von Andreas R. (blackpuma)


Lesenswert?

Also CLRF TRISB gehört schonmal ganz an den Anfang weil du damit ja 
sagst das PORTB als Ausgang dient.

Dann CLRF PORTB damit alle LEDs aus sind.

Hast du vielleicht eine Schaltung? Mich würde interessieren wie die LEDs 
angeschlossen sind.

PORTB hat auch noch Pullup Widerstände wenn mich nicht alles täuscht. 
Vielleicht musst du die ein oder Ausschalten.

Hast du dein Config_Word richtig gestzt?

Aber bitte poste mal deine Schaltung.

Lg
Andreas

von Onkel (Gast)


Angehängte Dateien:

Lesenswert?

der dateianhang ist die schaltung.

Config_word??? ^^

von Severino R. (severino)


Lesenswert?

Versuch mal Folgendes:


banksel TRISB
clrf    TRISB
banksel PORTB
movlw   55h
movwf   PORTB
goto    $

Jetzt müssten jede zweite Led leuchten.

Wenn das auch nichts bringt, solltest Du Deinen Sourcecode auf's Minimum 
reduzieren, also alles was nichts mit der Led-Sache zu tun hat entfernen 
und dann aber das ganze MPLAB Projekt zippen und posten. Neue 
MPLAB-Versionen haben einen Menüpunkt zum Zippen eingebaut, für ältere 
Versionen musst Du halt von Hand zippen.
Der Grund: so sind auch die Configuration Bits und alles andere 
vorhanden und andere Forum-Teilnehmer können das direkt und identisch 
ausprobieren.

von Onkel (Gast)


Lesenswert?

SUPER!!

jetz hat's geklappt. Danke an alle die sich hier bemüht haben!
so und wer erklärt mir nun warum das jetzt klappt? =)

von Severino R. (severino)


Lesenswert?

Onkel schrieb:
> SUPER!!
>
> jetz hat's geklappt. Danke an alle die sich hier bemüht haben!
> so und wer erklärt mir nun warum das jetzt klappt? =)

Interessanter ist doch, warum es nicht geklappt hatte.

Jetzt musst Du uns aber aufklären, wie Du es nun gemacht hast, resp. 
welche Vorschläge Du befolgt hast.

von Onkel (Gast)


Lesenswert?

Jetzt musst Du uns aber aufklären, wie Du es nun gemacht hast, resp.
welche Vorschläge Du befolgt hast.

deinen Severino ^^

wollte sagen das dein vorschlag jetz den ausschlag gegeben hat.

naja für mich interessant ist dieses banksel damit kann ich nämlich nix 
anfangen ehrlich gesagt ^^

und die werte die bei movlw eingegeben werden. was sind das für werte?

von Severino R. (severino)


Lesenswert?

Onkel schrieb:

> naja für mich interessant ist dieses banksel damit kann ich nämlich nix
> anfangen ehrlich gesagt ^^
banksel setzt die Bankselect-Bits so, dass die richtige Bank für die 
entsprechende Speicherstelle (also TRISB bzw. PORTB) angesprochen wird.
Hättest in diesem Fall auch schreiben können:

bsf     STATUS,RP0       ; <--- beachte: b s f
clrf    TRISB
bcf     STATUS,RP0       ; <--- beachte: b c f
movlw   55h
movwf   PORTB
goto    $

Aber dann muss man genau wissen, wann bsf und wann bcf.
Und diese Informationen entnimmt man dem sog. Datenblatt (Achtung: ist 
ein richtiges Buch!!!)

> und die werte die bei movlw eingegeben werden. was sind das für werte?
Das sind magische Werte, die man nur in einer Vollmondnacht ausrechnen 
kann.
Nein, 55h ist 55 hexadezimal ist 01010101 binär und sorgt dafür, dass 
die Bits von PortB eben abwechslungsweise den Wert 0 bzw. 1 annehmen.


Ich kann Dir nur die Lektüre des Datenblatts nahelegen, und zur 
Einführung in die PICs auch:
http://www.sprut.de
http://www.fernando-heitor.de

von Onkel (Gast)


Lesenswert?

ok danke datenblatt liegt neben mir, aber chinesisch kann ich leider 
noch nicht ;) keine ahnung wo mein chef den her hat  ^^

sprut hatte ich auch zu rate gezogen, war aber der meinung ich bräuchte 
jetz dann doch mal menschlichen rat xD

fernandor-heitor kenne ich noch nicht, danke für die hilfe und die guten 
tipp's

ps:

jetz kann es sein das ich mich furchtbar irre aber war hexadezimal nicht 
auh für die farbcodierung verantwortlich und ist der da nicht 6-stellig?

von Severino R. (severino)


Lesenswert?

Onkel schrieb:
> ok danke datenblatt liegt neben mir, aber chinesisch kann ich leider
> noch nicht ;) keine ahnung wo mein chef den her hat  ^^

Kannst bei http://www.microchip.com auch eins auf Englisch downloaden.

> sprut hatte ich auch zu rate gezogen, war aber der meinung ich bräuchte
> jetz dann doch mal menschlichen rat xD

Schon ok, mir ging's nur darum, Dich mit Zusatzinformationen zu 
versorgen.
Oft heisst es nämlich zum Datenblatt: "Ich kann kein Englisch".

> ps:
>
> jetz kann es sein das ich mich furchtbar irre aber war hexadezimal nicht
> auh für die farbcodierung verantwortlich und ist der da nicht 6-stellig?

Schon möglich, Du kannst auch Dein Banksaldo (auch 6-stellig?) in 
hexadezimal ausdrücken, oder Dein Gewicht (lieber nicht 6-stellig!).

von Onkel (Gast)


Lesenswert?

xDDD ok damit bringen wir das jetzt zum abschluss xDDD

danke nochmal euch allen und bis zum nächsten problem =)

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.