über seriell empfangene Zeichen im Speicher ablegen?
Hallo,
da es inzwischen mit dem Senden und Empfangen klappt, würde ich mein Programm gern ein bisschenaussbauen und die empfangenen Zeichen speichern.
Ich nehme an, dass sich hierfür der SRAM am besten eignet. Doch wie bekomme ich die Zeichen da rein? Vielleicht hat ja jemand ein paar Codeschnipsel für mich.
Später soll dan sowas rauskommen wie: "Sie haben folgenden Text eingegeben: Assembler macht Spass"
Grüße, JK
Liste der Anhänge anzeigen (Anzahl: 1)
das isser:
Code:
.NOLIST ; List-Output unterdrücken
; .INCLUDE <m8def.inc> ; das gibt es für jeden Controllertyp
.include "C:\PROGRA~1\VMLAB\include\m8def.inc
.def temp = R16 ; für Interrupt
.def ZEICHEN = R17
;------------------------------------------------------
; Peripherie initialisieren ;------------------------------------------------------
.equ F_CPU = 7372800 ; Systemtakt in Hz
.equ BAUD = 9600 ; Baudrate
.equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; Berechnen des Teilers für die Baudrate
.LIST ; List-Output wieder aufdrehen
.CSEG ; was nun folgt, gehört in den FLASH-Speicher
;------------------------------------------------------
; Start Adresse 0000 /Interruptvektoren
;------------------------------------------------------
.org 0x000 ; Interruptvektoren überspringen
rjmp Init
.org 0x00B ; UART Receive Complete Interrupt
rjmp serin
.org 0x00C ; USART Data Register Empty
rjmp serout
;------------------------------------------------------
; INITIALIZE
;------------------------------------------------------
INIT:
;Stack Pointer setzen
ldi temp,high(RAMEND)
out SPH,temp
ldi temp,low(RAMEND)
out SPL,temp
; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
out UBRRH, temp
ldi temp, LOW(UBRR_VAL)
out UBRRL, temp
; Frame-Format: 1 Stop-Bits, 8 Bit
ldi temp, (1<<URSEL)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0)
out UCSRC, temp
sbi UCSRB,RXEN ; Freigabe Empfangen
sbi UCSRB,RXCIE ; Interrupt für "Zeichen empfangen"
sbi UCSRB,TXEN ; Sender aktivieren
sei ; globale Interruptfreigabe
ldi XL, LOW(input*2) ; Adresse für Ablegen des ersten Zeichens in den
ldi XH, HIGH(input*2) ; X-Pointer laden
;------------------------------------------------------
; HAUPTSCHLEIFE
;------------------------------------------------------
Hauptschleife:
rjmp Hauptschleife
;------------------------------------------------------
; Subroutinen / ISRs
;------------------------------------------------------
;Auslesen der Zeichen und bereitstellen in ZEICHEN
;Erhöhen des Z-Pointers; bei leerem Zeichen --> Zurücksetzen des Z-Pointers
serout: ; (ISR)
lpm ; Erstes Byte des Strings nach R0 lesen
mov ZEICHEN,R0
adiw ZL, 1 ; Adresse des Z-Pointers um 1 erhöhen
tst R0 ; Inhalt von R0 auf Null testen
brbc 1,sprung_a ; nächten Befehl ausführen wenn kompletter String gesendet
cbi UCSRB,UDRIE ; Interrupt für "Puffer leer"
sprung_a:
out UDR, ZEICHEN ; Zeichen auf UART ausgeben
reti
serin: ; (ISR)
in temp, UDR ; Zeichen auslesen
st x+, temp ; im SRAM speichern
cpi temp,0x8D ; prüfen ob Enter gedrückt wurde
brne no_enter ; ISR beenden wenn nicht Enter gedrückt wurde
ldi ZEICHEN, '>' ; diese Zeichen als Antwort der ISR ausgeben
out UDR, ZEICHEN
sbi UCSRB,UDRIE ; Interrupt für "Puffer leer" freigeben
ldi ZL, LOW(Daten*2) ; Adresse des ersten Strings in den
ldi ZH, HIGH(Daten*2) ; Z-Pointer laden
no_enter:
reti ; Beim Verlassen wird sofort in die ISR für Senden gewechselt, UDRE=1
; und der Interrupt freigegeben ist
;------------------------------------------------------
; Datenbereich
;------------------------------------------------------
Daten:
.db "du hast folgendes Zeichen eingegeben: " ,10,13,0
.DSEG
input: .Byte 20 ; 20 Byte unter den Namen 'input' reservieren
soweit funktioniert das Programm ja, allerdings weiß ich nicht, ob die Zeichen korrekt im RAM abgelegt werden. Deshalb würde mich noch interessieren wie ich den Inhalt des RAM-Speichers interpretieren soll. Ich simuliere mit VMLab.