Bei denm ATMega konnte ich mit BREQ etwas prüfen und dann eine Zeile überspringen oder auch nicht. Das vermisse ich beim 8051. Der hat zwar natürlich auch Sprungbefehle, aber nur wenige. Der Befehl JB badr, rel Prüft, ob an der Adresse "badr" das Bit gesetzt ist und springt dann zur Adresse "rel". Kann man da vielleicht schreiben JB badr, PC + 1 ? Wie muss ich das genau schreiben?
Versuch es halt so: Label_0: JB badr, Label_1 NOP; dein Befehl, der übersprungen werden soll Label_1: NOP; hier geht es weiter
Hallo Maxim, was soll das bringen? Das was Du meinst sind die sogennanten SKIP Befehle, die nicht jede MCU hat. Der Vorteil ist, Sie benötigen keinen weiteren Operanten und Übersrinen den folgenden Befehl. Dieser Befehl ist aber nur Sinnvoll, wenn es reicht mit dem folgendem Befehl eine Aktion zu starten. Mit den bedingten Sprüngen, wie beim 8051 ist man im Sprungziel flexibel // Kann man da vielleicht schreiben // JB badr, PC + 1 ? Der Sinn inst mir nicht klar, (PC+1)??? die relative Sprungweite sird ohnehin vom Assembler berechnet. Außerdem wäre es dann eher JB badr, das Überspringen des nächsten Befehls wäre dann automatisch Sowas gibts beim 8051 nicht. Es gibt aber z. B. JBC jump if bit an clear, damit erparst du Dir den Sinn des Skip Befehls
Beim (alten) 51-er Assembler von Wickenhäuser ging es mit jb bit,!+1 oder so. Allerdings ist es viel besser mit Labels zu arbeiten, denn wenn zum Beipiel der nächste Befehl nach einer Änderung eine andere Anzahl von Bytes hat, gibts Fehlinterpretationen. Jörg
Hm, da bin ich wohl noch etwas im Assembler von ATmegas hängen geblieben. Also lass ich das 'mal sein und gewöhne mich an die neuen Befehle oder besser gesagt entwöhne mich von alten Konstrukten. Jetzt habe ich aber ein anderes Problem, will nur keinen extra Thread dafür aufmachen. LED_0_ON: MOV A, P2 ORL A, #00001111b MOV P2, A RETI Mit LED_0_ON sollen vier LEDs am Port P2 eingeschaltet werden. Der Zustand der anderen vier soll aber unangetastet bleiben. Mir fällt gerade ein, dass man das auch mit SETB lösen könnte. Aber so müsste es doch auch gehen, oder? RIDE stürzt beim kompilieren ab, daher weiß ich nicht, ob der Fehler wirklich in diesem Unterprogramm liegt. Für alle Fälle poste ich noch das ganze Programm: ; Erster Versuch mit dem Drehimpulsgeber include REG8252.INC SIG_A EQU P3.3 SIG_B EQU P3.2 LOOP: ACALL CHECK_SIG_A SJMP LOOP CHECK_SIG_A: JB SIG_A, LED_0_ON JNB SIG_A, LED_0_OFF RETI LED_0_ON: MOV A, P2 ORL A, #00001111b MOV P2, A RETI LED_0_OFF: MOV A, P2 ANL A, #11110000b MOV P2, A RETI END
Joerg Wolfram wrote: > Beim (alten) 51-er Assembler von Wickenhäuser ging es mit > > jb bit,!+1 > > oder so. Allerdings ist es viel besser mit Labels zu arbeiten, denn wenn > zum Beipiel der nächste Befehl nach einer Änderung eine andere Anzahl > von Bytes hat, gibts Fehlinterpretationen. > > Jörg Erstens das und zweitens, was ist wenn dieses Ziellabel von mehreren Programmteilen angesprungen wird. Es dokumentiert ja auch das Programm. Ich kann mich noch an der Maschinenspracheeditor des C16 erinnern, da war es ähnlich
Maxim wrote: > include REG8252.INC > > SIG_A EQU P3.3 > SIG_B EQU P3.2 > > LOOP: ACALL CHECK_SIG_A > SJMP LOOP > > CHECK_SIG_A: JB SIG_A, LED_0_ON Hier springst du wenn SIG_A gesetzt nach LED_0 ON > JNB SIG_A, LED_0_OFF Hier kontrollierst Du SIG_A nochmal, warum, wenn es oben nicht gesetzt war ist hier klar, das es nicht gesetzt ist. > RETI Das Reti ist Únsinning, weil die Routine nie zurückkehrt Außerdem springst du beides mal mmit bedingten Sprüngen eine Unterprogrammroutine an. Programm muß abstürzen. RETI ist nur zur Rückkehr aus Interuptrourinen gedacht. > > LED_0_ON: MOV A, P2 > ORL A, #00001111b > MOV P2, A > RETI > > LED_0_OFF: MOV A, P2 > ANL A, #11110000b > MOV P2, A > RETI > > END Beschreibe kurz, was bedingt durch beide Signal A und B mit den Ausgängen gemacht werden soll ich schreibe dir dann das richtige Prog
Maxim wrote: > LED_0_ON: MOV A, P2 > ORL A, #00001111b > MOV P2, A Beim 8051 schreibt man dafür:
1 | ORL P2, #00001111b |
Bzw. man muß es sogar so schreiben und nicht anders ! Wenn die anderen Pins Eingänge sind, die extern auf 0 gezogen werden, sind sie nach Deiner Variante plötzlich low aktive Ausgänge. Daher darf man nur die Read-Modify-Write Instruktionen nehmen. Peter
Man kann aber nicht ne Portleitung einlesen verknüpfen und wieder rausschreiben. Hängen an den unbenutzten Leitungen zum Beispiel Tasten, so werden die Ports auf 1 gesetzt, allso Pullups. Ist eine Taste gedrückt, so liesst er ne 1 zurück und schreibt sie wieder raus. Absofort würde die Taste immer als gedrückt erscheinen.
sorry , er liesst ne 0 zurück, sonst bleibt alles
Gibt es bei dem 8051 keine DDRs? Wie unterscheidet er zwischen einem Input und einem Output? ps: Wie das fertige Programm genau laufen soll, weiß ich auch nocht nicht. Ich will zunächst mal ganz Simple Ein-/Ausgabe-Programme schreiben, damit ich eine Grundlage für mein kleines Programm habe. Das soll dann die Daten von einem Drehimpulsgeber auswerten.
Programmier in C und lass den Compiler die Assemblierung machen. Der Compiler kann das garantiert besser als 99 % der selbsternannten Assembler Gurus.
Danke für dein Tipp, aber ich MUSS in Assembler programmieren, gehört zum Abitur am IT-TG. Ich will auch kein Assembler-Guru werden, sondern "nur" lauffähige Programme erstellen.
Maxim wrote: > Gibt es bei dem 8051 keine DDRs? Wie unterscheidet er zwischen einem > Input und einem Output? Gibbet nich. Der 8051 hat open-drain Ausgänge mit Pull-up. Deshalb ist auch der Pegel nach dem Reset high. Schau Dir mal die Beschreibung im Datenblatt an. Peter
Hi @Peter Gibbet nicht? Hatte ich nicht grade einen neueren von Atmel mit Push-Pull-Ausgängen erwischt, es das also nu doch gibt? Die wollen wohl ihre AVR-Gemeinde dezimieren... ;) Aber Recht hat der Peter dennoch. Der Standard-8051er arbeitet, wie er schon beschreiben hat. Ausnahmen sind hier echt selten. Gruß, Arne
Solche PortPins neent man auch QUASI Bidirektional. Lasten werden hier generell ( bis auf diese Ausnahmecontroller) gegen 0 geschaltet. Für ne anzusteuernde LED heisst das im Klartext: LED mit Vorwiderstand gegen VDD. Strombelastbarkeit des PortPins vorher checken. Der Vorteil dieser PortBeschaltung ist, daß man bidirektionale Pheriperie wie I2C leicht umsetzten kann, ohne über DDRs erst Umzuschalten. Nachteil die Pullup Seite bringt keine Treiberleistung. Die Bemerkung oben // Programmier in C und lass den Compiler die Assemblierung machen. // Der Compiler kann das garantiert besser als 99 % der selbsternannten // Assembler Gurus. war wieder total unpassend. Er wollte ne Antwort auf seine Frage. Wenn zu Dir jemand sagt, ich möchte Autofahren lernen, sagst dann - besorg dir nen Chauffeur?
@Maxim In- und Output werden nur durch die entsprechenden Befehle unterschieden. z.B. MOV A, P2 bedeutet: lies Port 2 ein und speichere in Akku MOV P2, A bedeutet: schreibe Inhalt Akku in Port 2 Latchs Entscheidend ist also die Zieladresse nach dem MOV-Befehl! Für den Programmierer vereinfacht dies die Sache einwenig, da er sich keine großen Gedanken über die Deklaration der Ports machen muss. Hängen Sensoren und Aktoren an einem Port, so muss man halt die nicht benötigten / gewollten PINs beim Einlesen oder Ausgabe maskieren.
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.