- Warteschleife wird nicht aufgerufen
- Du löscht Carry und schiebst dieses in den Port? Da sollte also
nach 8 Durchläufen alles auf 0 stehen...
- sofern Port B auch analoge Ports hat (das weiß ich nicht aus dem Kopf)
musst du die Ports erst noch auf digital initialisieren
- schau bei sprut nach
Auweia, ich hoffe du stellst dein Auto nicht irgendwann mal vor die
Werkstatt mit einem Zettel auf dem steht: "Bitte reparieren". Wie wäre
es denn mit ner Fehlerbeschreibung du Witzbold???
Ingo
Entschuldige Ingo, bin nicht so vertraut mit Foren aber du hast schon
recht.
Habe jetzt das Programm bischen umgeändert. Resultat: eine LED blinkt
und das wars.
Hi,
wie bereits geschrieben:
Loop:
bcf STATUS,C
rrf PORTB,F
goto Loop
DIese Schleife läuft unendlich, das ist schon mal der richtige Start. Du
setzt nun vorher das Bit ganz rechts, und schiebst es im ersten
Durchlauf nach rechts raus. Also erstmal rlf nutzen, oder vorhher das
Bit ganz links setzen.
Dann musst du noch dafür sorgen das es wenn es ganz links angekommen ist
wieder rechts gesetzt wird, damit das LL im "Kreis" läuft.
Damit man das ganze dann noch sieht sollte man ein großes Wait einbauen.
Zählen bis 1Mio sollte erstmal ausreichén damit du überhaupt was
siehtst, ansonsten leuchten alle 8 LED recht dunkel und du siehst das LL
nicht...
DS
...das Wait zählt bis 255*255 schon mal ganz gut, wird wohl erstmal
ausreichen :-) jenachdem was für einen Systemtakt du dort hast. PIC
teilt inter erstmal durch 4, zumindest die 16er machen das...
Danke schon mal für eure Antworten!
habe jetzt das Programm bischen umgeändert aber funktionieren tut es
nicht.
Es leuchtet kurz die rechte LED auf und das wars... :(
So wirst du das Carry-Flag nie zürück auf Bit#0 bekommen weil ganz
sicher in deiner "Warte"-Routine das C irgendwann verändert wird.
Definiere für das Lauflicht eine Variable z.B. <lauflicht>
movlw b'00000001'
movwf lauflicht
Lauf
BANKSEL lauflicht
rlf lauflicht,F ;aktuelles Muster verschieben
btfsc STATUS,C ;wenn "0" ins CARRY rutsch nix machen
bsf lauflicht,0 ;ansonst Übertrag der "1" aus Bit #7 in Bit #0
movf lauflicht,W
BANKSEL PORTB
movwf PORTB
call Warte
goto Lauf
ungetest so aus dem Stegreif... ausserdem hat MPLAB auch 'n Simulator
der bei solchen trivialen Dingen ganz sicher funkteoniert....
immer besser.
schau dir den Befehl:
btfsc
http://www.sprut.de/electronic/pic/assemble/befehle.html#btfsc
mal an.
der überspringt den Folgebefehl wenn das getestete bit = 0 ist.
Was steht in deinem Programm wenn man den Befehl nach dem btfsc
überspringt? :-)
http://www.sprut.de/electronic/pic/assemble/befehle.html#rlf
Wenn dir das Bit nach links "raus" läuft, dann ist es weg. Ein weg ist:
routieren.
ausgeben.
warten.
prüfen ob bit ganz links gesetzt
Ja: lade 0000 00001
nein: gehe nach oben.
DS
Viel Dank für eure Antworten!!
Habe jetzt das hier rausbekommen aber klappt immer noch nicht...
Zuerst leuchtet die linke LED und dann alles auf ein mal...
Bin ich irgendwie zu doof dafür?!
Start:
org 0x0010
;Init
movlw B'00000000'
BANKSEL TRISB
movwf TRISB
Bereite:
BANKSEL PORTB
movlw B'00000001'
movwf PORTB
bcf STATUS,C
Lauf:
rlf PORTB,f
movwf PORTB
call Warte
btfsc STATUS,Z
goto Bereite
goto Lauf
Wozu testest du das ZERO-Flag????
Völlig sinnlos nach der Warteschleife (wäre auch nach dem "rlf" sinnlos,
weil die Rotate-Befehle keinen Einfluß auf das ZERO-Flag haben).
Vielleicht solltest du dir mal das Datenblatt und darin die
Befehlsübersicht vornehmen....
hi,
guter Ansatz. Nur wie schon beschrieben, Zeroflag wird nicht beeinfluss
:-) ansosten schon ein guter Ansatz. Ist ganz normal, aus Fehlern lernt
man, zumal es nicht ersichtlich ist, wenn man Anfänger ist :-)
btfsc hast du also verstanden :-) klasse.
Versuche es mal nach meiner letzten beschreibung. Teste das 7te Bit im
Port nach der ausgabe und nach dem wait.
Am besten ist es wenn du dir mal einen PAP machst.
http://de.wikipedia.org/wiki/Programmablaufplan
übrigens: soetwas geht auch
btfsc Register,Bit
call Funktion
goto Label_x
dabei musst nur bedenken dass am ende immer zum Label_x gegangen wird,
egal wie das Bit steht, denn call kommt aners als ein goto an die stelle
zurück :-)
Zur Lösung brauchst du das Carryflag nicht.
DS
Hallo Alexander,
beigefügt ist Dei Lauflicht, welches zumindest im Watchfenster von MPLAB
SIM durchläuft.
Das Lauflicht wird mit Hilfe des Carrybits von STATUS "am Leben"
gehalten. Lies Dir den Code durch, lese dazu die verwendeten Befehle im
Datenblatt nach, bis Du die Funktion der Befehle zueinander verstanden
hast.
Du kannst ja noch "Warten" durch das Einfügen einer weiteren äußeren
Schleife welche auf 6 Zählt (4MHz-Quarz) auf ca. 1 s erweitern.
mfG Ottmar
Ottmar vielen Danke für das Programm!
Dennis, habe jetzt bei btfsc PORTB,7 geschrieben aber irgendwie will es
immerno noch nicht...habe noch bischen rumetestet aber klappte einfach
nichts....ich weiss nicht mehr weiter.
Hallo Alexander,
nein, Du sollst nicht abschreiben, aber lesen und verstehen! Noch besser
in MPLAB, mit dem Simulator und dem Watch-Fenster den Code Befehl um
Befehl durchgehen und dabei die Inhalte der einzelnen Register (einfach
in das Watchfenster ziehen) beachten.
Wenn Du ein Programm schreiben willst, solltest Du (falls noch nicht
geschehen), die umfangreichen, auch mächtigen Hilfsmittel der MPLAB-IDE
nutzen (lernen).
mfG Ottmar
entweder so:
rlf PORTB,w
movwf PORTB
oder so:
rlf PORTB,f
wobei erstes dazu gebraucht wird wenn das verschobene Ergebnis im
Arbeitsregister weiterverarbeitet werden soll,wie bei einer
Multiplikation oder wenn es in einer anderen Ram Zelle abgelegt werden
soll.
Das Banksel musst du übrigens auch nicht ständig machen. Ich kenne
jedoch diese Schreibweise:
BANKSEL PORTB
nicht, bzw weiß nicht was dahinter steckt. Eigentlich geht es um die
RP/RS Bits im Status reg, die passen müssen.
Habe ich gerade mal nachgesehen:
http://www.sprut.de/electronic/pic/grund/adress.htm#banksel
das ist ja furchtbar. Der Controller ist dann nur noch mit dem Setzen
der Banksel Bis zu machen....
Tip: Schreibe das komplette Programm auf Bank0 und nur wenn du mehr
brauchst oder mal etwas aus einer anderen Bank, schalte kurz darauf um
und schnell wieder zurück. Dann muss man sich um die Bank auch nicht
wirklich gedanken machen...
Tip2: Steige auf Atmel um :-) ist die bessere Wahl meiner Meinung nach.
Es gibt dazu aber wirklich viele Diskussionen - muss man letztendlich
selber wissen.
DS.
D.S. schrieb:> das ist ja furchtbar. Der Controller ist dann nur noch mit dem Setzen> der Banksel Bis zu machen....
Na ja, so tragisch ist dies bei den PICs auch wieder nicht:
1. Mann (Frau..) weiß, dass die Datenrichtungsregister (TRISA, TRISB
usw) in Bank 1 sind.
2. In jedem Datenblatt ist eine Übersicht enthalten aus der ersichtlich
ist in welcher Bank das jeweilige Register sich befindet.
3. 90% oder mehr des Codes lwerden mit den Registern in Bank 0
abgewickelt.
4. Diskussionen "Atmel besser als PIC" oder umgekehrt, sind überflüssig
und können zigfach mit der Suchfunktion im Forum nachgelesen werden.
Zum Lernverfahren hier im Thread:
Das "Hinwerfen" einzelner Codezeilen bringt kaum einen Lerneffekt.
Besser ist es einen funktionierenden Code, übersichtlich und
zusammenhängend dargestellt, durchzuarbeiten und zu verstehen.
Unabdinglich ist es dazu, im Datenblatt die Funktionsmöglichkeiten der
einzelen Register, sowie der Assemblerbefehle nachzulesen.
Dazu ist es nicht schlecht sich über die Hilfen welche die
Entwicklungsumgebung (MPLAB-IDE) bietet zu nutzen.
Im MPLAB-Simulator (Einzelschritt, Animation Breakpoints usw) +
Watchfenster (Registerinihalte) ist z.B. die Funktin von RRF bzw RLF,
die Auswirkung hierbei auf STATUS,C (Carrybit) und der Zustand der
PORTB-Ausgängen RB7-RB0 problemlos und einleuchtend zu erkennen.
Schon mit den vorgenannten Hilfsmitteln sind je nach Komplexität des
Codes fast alle Fehler zu erkennen.
Weitere Hilfsmittel der MPLAB-IDE:
_Stimulus (Eingänge High- Low setzen, Pin- Register Aktionen usw)
-File-Register-Fenster (Adressen, Inhalte)
-Programm-Memory-Fenster
-*.LST-Files (Programmaufbau, Adressen usw)
@Alexander
...also ran an den Speck, das zielgerichtete, systematische Lernen der
Programmierung von Microcontroller macht doch Spass und ist wirklich
kein Hexenwerk :-) !
mfg Ottmar
>>Na ja, so tragisch ist dies bei den PICs auch wieder nicht.
Naja, wenn ich vor jedem Ram Zugriff ein Banksel mache, dann ist das je
nach Programm ganz schön tragisch, weil immer 2 Befehlszyklen verloren
gehen, man verschenkt zeit, schau dir das bei sprut mal an. Zudem teilt
der Pic ja vorher den Systemtakt eh noch durch 4...Aber das können wir
dann ja mal an anderer Stelle weiterführen...
>>Das "Hinwerfen" einzelner Codezeilen bringt kaum einen Lerneffekt.
das sind keine Codezeilen sondern einzelne Assemblerbehle die wir hier
durchgehen und Alex macht das schon recht gut. Man sieht eben nicht auf
den ersten Blick das ein rlf keinen Einfluss auf das Zerobit hat.
Alex hat sich bis jetzt ganz gut verbessert und er steht kurz vor seiner
Lösung :-) Es ist auch ein gutes Ziel für das erste Programm.
Eine Erklärung wie er sein Programm simulieren kann wäre doch auch eine
gute Unterstützung.
DS.
Dennis S. schrieb:> Eine Erklärung wie er sein Programm simulieren kann wäre doch auch eine> gute Unterstützung.
@Alexander
Ich nehme diese Anregung von Dennis an, solltest Du konkrete Fragen zur
Simulation in MPLAB haben, frage einfach!
Dennis S. schrieb:> wenn ich vor jedem Ram Zugriff ein Banksel mache, dann ist das je> nach Programm ganz schön tragisch, weil immer 2 Befehlszyklen verloren> gehen, man verschenkt zeit
Das ist doch einseitig betrachtet und übertrieben! Reden wir doch hier
besser über das Programm von Alexander! Pro und Contra Atmega/PIC Ist
ätzend und m.E. Ansichts- und Gewöhnungssache! Mehr Kommentar zu diesem
Themaa gibt es von meiner Seite hier nicht mehr.
mfG Ottmar