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, r16So 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, r16nä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, r16ansonsten habe ich das schon richtig gemacht
in r16, UDR out PORTB, r16 retifehlt noch Und da ist mein max232 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
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
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 donewahrscheinlich stimmt das STOP Bit nicht, mit stty noch einstellen und die Parität