das isser:
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.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







Zitieren

Lesezeichen