Das Interrupt benutzen um RS-232 zu nutzen möglichst aus dem Kopf

Image Screenshot_20241103_203139

Image Screenshot_20241103_203212

So weit, weiss ich es

;; so ungef"ahr stelle ich mir das vor
;; jetzt muss ich noch in das UART Baud Rate Register - UBBRH, UBBRL, den Wert schreiben
;; auf https://www.mikrocontroller.net/articles/AVR-Tutorial:_UART
;; ist ein Link f"ur Rechner f"ur die baudrate - ich habe 4 MHz, CPU Takt Frequenz und m"ochte eine Baudrate von 9600 Hz
;; http://www.gjlay.de/helferlein/avr-uart-rechner.html
;; dann muss ich in UCSRA, UCSRB, UCRSC, die entsprechenden Bits setzen
;; ich muss meinen MAX232 anschliessen, den ich gel"otet habe
;; ich muss die Daten wahrscheinlich mit OUT UDR in das UART Daten Register schreiben, wenn ich senden will. Es gibt noch UDER - aber ich vermute ich brauche es nicht unbedingt, wenn ich Interrupts verwende, das kann aber falsch sein
;; ich muss 9600 UBRR 23 0x017 0.0% UBBR 47 0x02F 0.0%
;; schreiben
;; also ldi r16, HIGH (0x017)out UBRRH, r16...

.include "m8def.inc"

.org 0x000
rjmp RESTART
.org
rjmp RS232RCV

RESTART:

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, 0xff
out DDRB, r16

sei

end: rjmp end

RS232RCV:
in r16, UDR
out PORTB, r16
So weit weiss ich es weiter
.include "m8def.inc"

.equ BAUDRATE = 0x017

.org 0x000
rjmp RESTART
.org
rjmp RS232RCV

RESTART:

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, HIGH (BAUDRATE)
out UBRRH, r16
ldi r16, LOW (BAUDRATE)
out UBRRL, r16

ldi r16, 0xff
out DDRB, r16

sei

end: rjmp end

RS232RCV:
in r16, UDR
out PORTB, r16
nächster schritt
;; gut den Namen dieser Addresse in der "Interrupt Vektor Tabelle" kann man sich merken, muss man:
;; jetzt muss ich nur noch die bits setzen

    ldi     temp, (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
    out     UCSRC, temp

    sbi     UCSRB, RXCIE                ; Interrupt bei Empfang
    sbi     UCSRB, RXEN                 ; RX (Empfang) aktivieren

:: Ansonsten ist alles einfacher als bei denen im Beispiel, weil die eine LED ein und ausschalten, das mache ich nicht, sondern gebe den Wert des empfangenen Zeichens auf den LED's aus

.include "m8def.inc"

.equ BAUDRATE = 0x017

.org 0x000
rjmp RESTART
.org URXCaddr
rjmp RS232RCV

RESTART:

ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

ldi r16, HIGH (BAUDRATE)
out UBRRH, r16
ldi r16, LOW (BAUDRATE)
out UBRRL, r16

ldi r16, 0xff
out DDRB, r16

sei

end: rjmp end

RS232RCV:
in r16, UDR
out PORTB, r16
ansonsten habe ich das schon richtig gemacht
in r16, UDR
out PORTB, r16

reti
fehlt noch Und da ist mein max232 Image IMG_4501 Entschuldigung - der Atmega8, ist wie der Intel 8039, und der 8086 und Intel Core i5 und der STM32 ARM Cortex M7 ein Computer

jetzt stelle ich fest, an meinem max232, ist schon ein Atmega8, das ist dumm. Und ich erinnere mich, was ich vergessen hatte - mit dem STK500, muss ich meinen MAX232 nicht erst verwenden, das STK500 hat, ja ein RS232 Spare Buchse - und - der MAX232 ist integriert auf dem STK500, ich muss nur DB... entsprechend verbinden,

Hier sieht man sowohl Portd als auch rxd und Txd

Image IMG_4502

Image IMG_4503

Image IMG_4504

Image IMG_4505

Es tut! Es tut! Es tut!

Das ist ein A ein kleines A Abgesehen davon , dass an portb durch das stk500 die oberen 2 Bit nicht dargestellt werden. Ich vermute aber, dass es bei einem kleinen A gar nicht relevant

Image IMG_4509

root@work:/home/david/20241103# stty -F /dev/ttyS3 9600
root@work:/home/david/20241103# echo "a" > /dev/ttyS3
root@work:/home/david/20241103#
# Baudrate Einstellen - auf 9600, wichtig, die RS232 Schnittstelle an meinem PC ist /dev/ttyS3 und nicht /dev/ttyS0
Dann abschicken. Ich zeige einen Film

Und ein skript

#!/bin/bash

stty -F /dev/ttyS3 9600

a=(a b c d e)
for s in "${a[@]}"
do
    echo "$s" > /dev/ttyS3
    sleep 1
done

stty -F /dev/ttyS3 9600

b=(h a l l o)
for s in "${b[@]}"
do
    echo "$s" > /dev/ttyS3
    sleep 1
done
wahrscheinlich stimmt das STOP Bit nicht, mit stty noch einstellen und die Parität