-
-
Um die Kleine Assemblerfront zu stärken. Hi Hi
Wenn du dirs etwas leichter machen willst, es ist sogar relatv gut dokumentiert. du musst die Variable Zeiger noch definieren Irgeneine Ram adresse die 0 als high byte hat (bei mir ist es ox70 gewesen). ind der steht dann der Wert an welcher Stelle des Strings er gerade ist, die länge ist glaub ich auf 15 begrenzt, dass nicht fer ganze Ram volgemüllt wird, wenn kein neues Startzeichen kommt. Musst du halt deinen Bedingungen anpassen ebenso wie das was er machen soll wenn er ein Abschlusszeichen empfängt.
ich schreibs als Text da ich das mit dem Programmkästchen nicht kann.
;Interuproutine für Serielle Schnittstelle
;-----------------------------------------------------------------
; Interruptroutine: wird ausgeführt sobald ein Byte über das UART empfangen wurde
;----------------------- ------------------------------
int_rxc:
push Temp ; temp auf dem Stack sichern
push temp1
push temp2
clr ZH
ldi ZL, Zeiger ;zum Laden Des Zeigers
ld temp2,Z
;-----------------------------------------------------------------
;Anfangszeichen Empfangen Pointer wird auf erste Stelle gesetzt
;-----------------------------------------------------------------
in Temp, UDR
cpi Temp, '['
brne Zahl
ldi temp2, 0x01 ;Wenn ein Klammer auf erkannt wird, wird der Zeiger auf 1 gesetz
;um die Klammer in 0x71 zu schreiben
Zahl:
cpi Temp, ']' ;die Position(im Programm) Zahl und Zahl1 bedeuten dass
brne Zahl1 ; kein Steuerzeichen empfangen wurde
;-----------------------------------------------------------------
;Abschlusszeichen Empfangen Wert wird errechnet
;-----------------------------------------------------------------
clr ZH
ldi ZL,String1 ;Anfangswert des Zu Berechnenden Registers
rcall Dezimalstring5 ;die Umrechnung wird 2x mit den jeweiligen Adressen aufgerufen
sbrs Temp,0 ;Da Dezimalstring wenn die Umrechnung gültig ist eine 1
rjmp ERROR_Konvert ;in Temp zurückgibt wird diese Überprüft
ldi ZL,Wert1H ;wenn die eins nicht kommt wirde Error ausggeben
st Z+,Erg1
st Z,Erg0
ldi ZL,String2 ;Anfangswert des Zu Berechnenden Registers
rcall Dezimalstring5
sbrs Temp, 0 ;Da Dezimalstring wenn die Umrechnung gültig ist eine 1
rjmp ERROR_Konvert ;in Temp zurückgibt wird diese Überprüft
ldi ZL,Wert2H ;wenn die eins nicht kommt wirde Error ausggeben
st Z+,Erg1
st Z,Erg0
; rcall Senden ;kann Zur Kontrolle aktiviert werden
rcall Dig_out ;gibt den Empfangenen String mit errechneten werten zurück
rjmp int_rxc_end ;wenn die Rechnung erfolgt ist, wird die Berechnung beendet
;-----------------------------------------------------------------
; Zahl Empfangen
;-----------------------------------------------------------------
Zahl1: add ZL,temp2 ;Wenn kein Steuerzeichen erkannt Wurde, wird der Zeiger
st Z,Temp ;zum Zpointer addiert und der empfangene
;Wert dort abgelegt
inc temp2 ;dann Wird der Zeiger incrementier und wieder gesichert
cpi temp2,0x0F ;Es wird Überprüft ob der Zeiger größer als 15 ist,
brlo Zeiger_OK ;falls dies der Fall ist wird er wieder decrementiert
dec temp2 ;um zu verhindern dass er den ganzen RAM beschreibt, ab dann
;wird nur noch die Speicherzelle String1+Zeiger Beschrieben
Zeiger_OK: ;bis wieder ein "[" ankommt
ldi ZL,Zeiger ;
st Z,temp2
int_rxc_end:
pop temp2
pop temp1
pop temp
reti
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen