mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC steuert LED sehr seltsam


Autor: Onkel (Gast)
Datum:

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

Autor: Andreas Riegebauer (blackpuma)
Datum:

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

Autor: Onkel (Gast)
Datum:

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

Autor: Jens PICler (picler)
Datum:

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

Autor: Andreas Riegebauer (blackpuma)
Datum:

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

Oder du machst es so:
MOVLW 00001111
MOVWF PORTB

LG
Andreas

Autor: Onkel (Gast)
Datum:

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

Autor: Jens PICler (picler)
Datum:

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

Autor: Onkel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siehe
die anderen Kommentare weiter oben.



wie schon gesagt das funktioniet leider nicht

Autor: Onkel (Gast)
Datum:

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

Autor: Andreas Riegebauer (blackpuma)
Datum:

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

Autor: Onkel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
der dateianhang ist die schaltung.

Config_word??? ^^

Autor: Severino R. (severino)
Datum:

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

Autor: Onkel (Gast)
Datum:

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

Autor: Severino R. (severino)
Datum:

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

Autor: Onkel (Gast)
Datum:

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

Autor: Severino R. (severino)
Datum:

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

Autor: Onkel (Gast)
Datum:

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

Autor: Severino R. (severino)
Datum:

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

Autor: Onkel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
xDDD ok damit bringen wir das jetzt zum abschluss xDDD

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

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.