Forum
nochmal Ratschlag: .. (Schaltungstechnik)
.include "m8515def.inc"
.def Temp = R16 ; Register Für Kleinere Arbeiten
.def Zeichen = R17 ; In Diesem Register Wird Das Zeichen An Die
.def Sum = R18
.def Alarm = R19
; Ausgabefunktion übergeben
.equ F_cpu = 4000000 ; Systemtakt In Hz
.equ Baud = 9600 ; Baudrate
; Berechnungen
.equ Ubrr_val =((f_cpu + Baud * 8) /(baud * 16) -1) ; Clever Runden
.equ Baud_real =(f_cpu /(16 *(ubrr_val + 1))) ; Reale Baudrate
.equ Baud_error =((baud_real * 1000) / Baud -1000) ; Fehler In Promille
.if((baud_error > 10) ||(baud_error < -10)) ; Max. + / -10 Promille Fehler
.error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
.endif
; Stackpointer initialisieren
ldi temp, HIGH(RAMEND)
Out Sph , Temp
ldi temp, LOW(RAMEND)
Out Spl , Temp
; Port a = Ausgang // Portnummer und Bit korrigieren
ldi temp, 0xFF
Out Ddra , Temp
ldi temp,0
Out Porta , Temp / / Kein Alarm
; Baudrate einstellen
; Baudrate einstellen
ldi temp, HIGH(UBRR_VAL)
Out Ubrrh , Temp
ldi temp, LOW(UBRR_VAL)
Out Ubrrl , Temp
; Frame-Format: 8 Bit
ldi temp, (1<
sbi UCSRB,TXEN ; TX aktivieren
sbi UCSRB, RXEN ; RX (Empfang) aktivieren
/ / Empfangen
Receive:
Receive_loop:
sbis UCSRA, RXC ; warten bis ein Byte angekommen ist
rjmp receive_loop
in temp, UDR ; empfangenes Byte nach temp kopieren
ret
/ / Hauptschleife
Start:
ldi sum,0xFF //Checksum Reset
ldi alarm,0 // nix alarm
rcall receive
cpi temp, 0x3a //start des blockes??
brne start
rcall receive
cpi temp, 0x10 // meine Adresse?
brne start
Sub Sum , Temp / / Checksum Aufaddieren
rcall receive
cpi temp, 0x01 // Kommando 01 wenn nicht nix mache
brne start
Sub Sum , Temp / / Checksum Aufaddieren
rcall receive
cpi temp, 0x08 // ALARM
brne weiter
ldi alarm,1 //Alarm Bit setzen, nicht ALARM ausloesen
Weiter:
Sub Sum , Temp / / Checksum Aufaddieren
rcall receive //checksumme empfangen
cp temp, sum //checksummen vergleichen
/ / Brne Checksumme Falsch
/ / Keinen Alarm Auslösen
/ / Checksumme Richtig Alarm Ausloesen Oder Sonstigen Befehl Verarbeiten
cpi alarm,1
rcall myALARM
rcall receive //CR
rcall receive // und LF empfangen
rcall SENDEN //Bestätigung senden
rjmp start //ende Hauptschleife
/ / Alarm
Myalarm:
/ / Setze Bit Für Relais Zu Ziehen
ldi temp,1
Out Porta , Temp ; Und An Port D Ausgeben.
ret
/ / / / Senden
Senden:
ldi sum,0xFF
Loop:
ldi zeichen, 0x3a
rcall serout ; Start Block
subi sum, 0x3a //Checksumme berechnen
ldi zeichen, 10
rcall serout ; Adresse Interface
subi sum, 0x10
ldi zeichen, 01 ; Kommando
subi sum, 01
rcall serout ; ...
ldi zeichen, 00 ; Daten still alive
rcall serout
/ / Subi Sum , 00
cp zeichen, sum ; checksumme senden
rcall serout
ldi zeichen, 10 ; CR
rcall serout
ldi zeichen, 13 ;LF
rcall serout
reti //zurueck zur Hauptschleeife
Serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
Out Udr , Zeichen
ret ; zurück zum Hauptprogramm
kann das bitte jemand für mich simulieren?
Wenn Fehler drin sind event. auch korrigieren?
DANKE
Gesamter Thread:
