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?
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.
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
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.
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
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 ^^
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.
siehe die anderen Kommentare weiter oben. wie schon gesagt das funktioniet leider nicht
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
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
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.
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? =)
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.
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?
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
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?
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!).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.