Forum: Mikrocontroller und Digitale Elektronik Gibt es beim 8051 einen analogen Befehl zum BREQ?


von Maxim (Gast)


Lesenswert?

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?

von Manfred (Gast)


Lesenswert?

Versuch es halt so:

Label_0: JB badr, Label_1
         NOP;             dein Befehl, der übersprungen werden soll
Label_1: NOP;             hier geht es weiter

von Maxim (Gast)


Lesenswert?

Dann habe ich nen Haufen Labels.

von Dirk H. (arm-dran)


Lesenswert?

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

von Joerg W. (joergwolfram)


Lesenswert?

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

von Maxim (Gast)


Lesenswert?

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

von Dirk H. (arm-dran)


Lesenswert?

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

von Dirk H. (arm-dran)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Dirk H. (arm-dran)


Lesenswert?

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.

von Dirk H. (arm-dran)


Lesenswert?

sorry , er liesst ne 0 zurück, sonst bleibt alles

von Maxim (Gast)


Lesenswert?

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.

von Ralph (Gast)


Lesenswert?

Programmier in C und lass den Compiler die Assemblierung machen.
Der Compiler kann das garantiert besser als 99 % der selbsternannten 
Assembler Gurus.

von Maxim (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von ..AUK.. (Gast)


Lesenswert?

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


von Dirk H. (arm-dran)


Lesenswert?

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?

von Gast (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.