Assembler

Beiträge
69
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo leute,
ich bin einsteiger in sps- programmierung.
ich möchte ein assemblercode in AWL schreiben. die codenzeile am Anfang der Assemblercode sehen so aus:
FLAG_START BIT 7FH
FLAG_STOP BIT 7EH
......
wippe EQU 30H
HEIZstempel EQU 31H
.......
könnte jemand mir erklären ,was das heißt. und mir sagen wie ich das in AWL programmieren kann.
danke schön!!
 
Was Du da vor hast macht relativ wenig Sinn. Einzelne Zeilen von Assembler in AWL umzusetzen wird am Ende eher weniger ein lauffähiges Programm ergeben.
Der Befehl EQU, soweit es KEIL-Assembler ist, ist auch kein Assembler-Befehl, sondern eine Direktive und weist einem symbolischen Namen einen Wert zu, in deinem Fall erhält wippe den Wert 30Hex und HEIZstempel den Wert 31Hex. Dafür gibt es keinen AWL Befehl, hier müsstest Du entweder Globale Variablen als Konstanten anlegen oder ENUMs definieren.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Und BIT weist einem Symbol eine Adresse zu.
Nochmals mein gut gemeinter Rat: Vergiss Dein Vorhaben, das wird praktisch nicht klappen, besonders als SPS-Anfänger.
Wenn ich das richtig sehe versuchst Du gerade ein in Assembler geschriebenes Mikrocontroller Programm auf eine SPS zu übertragen und nimmst AWL, weil es Dir dem Assembler sehr ähnlich erscheint. Ein Mikrocontroller und eine SPS basieren aber meist auf völlig unterschiedlichen Konzepten (Stichwort: zyklische Programmausführung) und ein Programm lässt sich nur auf die SPS übertragen in dem man die Funktionsweise des Programms von Grund auf in der SPS neu programmiert.
 
Zuletzt bearbeitet:
... wie der Herr Tonn gesagt hat : impossible! ;)

also sowas zum Beispiel :

; **********************************************************************
; 8051 Monitor 25.07.90 (Wollvieh)
; 08.08.90 (Wollvieh)
; 18.10.90 (Wollvieh) intel-hex lader
;
;
; - fuer PEC-50S Platine
;
; Timer_0 Interrupt wird alle 10 ms ausgeloest
; Timer_1 im Auto_Reload Mode zum erzeugen der Baud-Rate
;
; **********************************************************************
;
; Speicheraufteilung (Decodierung Originalplatine modifiziert!)
;
; 0000-3FFF = BOOTROM (Program) ----> EPROM
;
; 0000-3FFF = RAM (Daten) ----> RAM
; 4000-7FFF = RAM (Program) ----> RAM
; 8000-xxxx = 8255
;
; ausfuehrbare Programme im RAM muessen ab adresse 4000h beginnen !
;

cr equ 0dh ; carriage return
lf equ 0ah ; linefeed
esc equ 1bh ; escape
eot equ 04h ; Limitter end of string

ramprg equ 4000h ; start of program (RAM)

piobase equ 8000h ; Basisadresse Pio 8255
porta equ 8000h ; port a register 8255
portb equ 8001h ; port b register 8255
portc equ 8002h ; port c register 8255
ctrl8255 equ 8003h ; controlregister 8255
cmdwort equ 080H ; alles auf ausgabe 8255
msb equ 0d8h ; 65535-10000 = 55535 (d8efh)
lsb equ 0efh ; 1 Mhz / 10000 = 100 Hz (0.01s)
cascade equ 5 ; Softwarezaehler 0.01s * 5 = 0.05s

; --------------- 8051 internes RAM ----------------------
stack equ 60h ; Initialwert fuer Stackpointer
ringwr equ 59h ; Ringpuffer Schreibzeiger
ringrd equ 58h ; Ringpuffer Lesezeiger
zaehler equ 57h ; Softwarezaehler
test equ 56H
count equ 55h ; zusatzregister fuer lokale schleifen
dummy equ 54h ; zusatzregister fuer schleifen

; ----------- Bitadressierbares Ram (128 Bit 's) ----------
SERFLAG EQU 127 ; bit 127
TOGGLE EQU 126 ; bit 126


; --------------- externes Ram ----------------------------
ringba equ 00h ; Basisadresse Ringpuffer
; von adresse 00h - 0ffh externes Ram
; belegt fuer Ringpuffer !

; ---------------- Startadresse nach Reset ----------------
ORG 0000H
LJMP INIT ; RESET
; ---------------- Interrupt-Sprungtabelle ----------------
ORG 3H
LJMP EXT0 ; EXTERNER INTERUPT 0
ORG 0BH
LJMP TIM0 ; TIMER INTERUPT 0
ORG 13H
LJMP EXT1 ; EXTERNER INTERUPT 1
ORG 1BH
LJMP TIM1 ; TIMER INTERUPT1
ORG 23H
LJMP COM ; SERIELLER INTERUPT
; ----------------------------------------------------------
EXT0: RETI
EXT1: RETI
TIM1: RETI
;---------------- Timer 0 Interrupt Routine ----------------
TIM0: PUSH PSW ; save reg's !
PUSH DPH ;
PUSH DPL ;
PUSH ACC ;
CPL P1.0 ; TEST
CLR EA ; disable all interrupts
CLR TR0 ; stop timer 0
MOV A , #(lsb-11) ; adjust previous instructions !
ADD A , TL0 ; adjust timer overrun !
MOV TL0 , A ; reload tl0 !
MOV A , #msb ;
ADDC A , TH0 ; adjust timer overrun !
MOV TH0 , A ; reload th0 !
SETB TR0 ; start timer 0 !
SETB EA ; enable all interrupt's !
DJNZ zaehler,weiter ; software zaehler pruefen
MOV zaehler,#cascade ; zaehler nachladen
INC TEST ;
JNB toggle , weiter ; flag aus monitorprogramm
MOV DPTR,#porta ; aktiviert porttest !
MOV A,TEST ;
MOVX @DPTR,A ; ausgabe port a
INC DPTR ;
MOVX @DPTR,A ; " port b
INC DPTR ;
MOVX @DPTR,A ; " port c
weiter: POP ACC ; restore reg's !
POP DPL ;
POP DPH ;
POP PSW ;
RETI
; ---------------- Serieller Interrupt Routine ----------------
COM: JNB ri,transmit ; wenn nicht ri,dann transmitter int. !
receive: PUSH acc
PUSH psw
PUSH dpl
PUSH dph
MOV a,sbuf ; zeichen nach akku
MOV dptr,#ringba ; basisadresse ringpuffer nach datapointer
MOV dpl,ringwr ; offset schreibzeiger nach dptr low
MOVX @dptr,a ; byte auf ringpuffer ablegen
INC ringwr ; schreibzeiger erhoehen
CLR ri ; receiver interrupt flag loeschen !
pop dph
pop dpl
pop psw
pop acc
reti
transmit: ; transmitter als fertig kennzeichnen !
CLR ti
SETB serflag ; flag transmitter ready !
reti

ORG 0100h
; ---------------- Einsprung nach Reset ----------------
INIT: SETB toggle ; toggle flag fuer porttest
MOV SP,#stack ; Stackpointer initialisieren !
MOV DPTR,#ctrl8255 ; Init. 8255 !
MOV a,#cmdwort ;
MOVX @DPTR,A ;
MOV zaehler , #cascade ; Softwarezaehler Presetwert
MOV TMOD , #00100001b ; Timer_0 Mode_1 = 16 Bit Timer
; Timer_1 Mode_2 = Auto-Reload
MOV TH0 , #msb ; Teilfaktor = 10000 (2710h)
MOV TL0 , #lsb ; Interrupt alle 10 ms
SETB TR0 ; Timer_0 Run Control Bit
SETB EA ; Enable Interrupt's
SETB ET0 ; Enable Timer_0 Interrupt
initser:
MOV SCON,#01010010b ; 8 bit uart + enable rec + set ti
MOV TH1,#-13 ; 1 000 000 /13 = 76923 /32 = 2403 Baud
SETB TR1 ; Timer_1 Run Control Bit
MOV ringwr,#0 ; Schreibzeiger Ringpuffer loeschen
MOV ringrd,#0 ; Lesezeiger Ringpuffer loeschen
SETB ES ; enable serial interrupt
LJMP main ; Monitorschleife

; ---------------- Intel-Hexcode empfangen ----------------
intel: CLR F0 ; meldung ausgeben !
MOV DPTR,#inttxt ;
LCALL out_string ;
nxtrecord:LCALL get_char ;
CJNE A , # ':',nxtrecord ; warten bis startzeichen !
LCALL sbyte ; recordlaenge !
MOV R0 , A ; retten akku
SUBB A , #0 ; recordlaenge = 0 ?
JZ readend ; dann ende !
MOV A , R0 ; restaurieren
MOV R2 , A ; checksum laenge !
MOV R3 , A ; counter (loop)
LCALL sbyte ; adresse high
MOV DPH , A ;
LCALL sbyte ; adresse low
 
Bezugnehmend auf den eröffnungsbeitrag:

Da Du offensichtlich schon über die Variablendeklaration bzw. Initialisierung stolperst würde ich dringend die Finger davon lassen.
Bei wenig komplexen Programmen ist es zwar durchaus möglich den Assemblercode als Basis zu benutzen, sinnvoller ist es aber m.E. die Funktion zu Grunde zu legen und das Programm neu aufzubauen.
 
Zuletzt bearbeitet:
Zurück
Oben