2024-11-24

Das ist mir jetzt aber egal, ich will das RS-232 haben und das externe Interrupt. Das ist nicht schwer, sie müssen sei - aktivieren und MCUCR und GICR - und IS.. und INT0 und INT1, das geht. Gut und jetzt TWI

jetzt kommen die übungen - das erste ist 1.) Port Ausgeben 2.) LED Blinken lassen 3.) Externe Interrupts - beide aus dem Kopf 4.) LCD - aus dem Kopf 5.) RS232 - so weit aus dem Kopf Vorher die Commands beim LCD


1.) Cursor Home
2.) On/Off Controll
3.) Entry Mode
4.) Cursor/Scrollen
5.)
6.) Konfiguration
7.) Display RAM/Address Set
8.) Charakter RAM Address Set

0b0000 0001     Cursor Home
0b0000 001x     On/Off COntroll
0b0000 01is     Entry Mode
0b0000 1dcb     Cursor/Scrollen
0b0001 srxx

0b01aa aaaa     Display RAM Address Set
0b1aaa aaaa     Character RAM Address Set

Da sind fehler drin

Clear Display
Cursor Home
Entry Mode
On/Off COntroll
Cursor/Scrollen

Standard Übung Port B


.include "m8def.inc"

ldi r16, 0xff
out DDRB, r16

ldi r16, 0b01010101
out PORTB, r16

end: rjmp end

Standard Übung, Blinken


.include "m8def.inc"

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

ldi r16, 0xff
out DDRB, r16

ldi r16, 0x00
loop1:
com r16
out PORTB, r16
com r16
rcall sleep
inc r16
rjmp loop1

sleep:
push r16
push r17
ldi r17, 0xff
sleep_loop1:
ldi r16, 0xff
sleep_loop2:
dec r16
brne sleep_loop2
dec r17
brne sleep_loop1
pop r17
pop r16
ret

Neue externes Interrupt, das ist ohne Rising Edge


;; siehe da es funktioniert

.include "m8def.inc"

.org 0x000
rjmp RESET
.org INT0addr
rjmp ExternInterrupt0
.org INT1addr
rjmp ExternInterrupt1

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

ldi r16, 0xff
out DDRB, r16
ldi r16, 0x00
out DDRD, r16

;; MCUCR
;; GICR
;; GICR - Global Interrupt Control Register - da muessen INT0 und INT1 gesetzt werden
;; MCUCR - muessen - Interrupt Sense Irgendwas, und 00 und 01 IS...00 01 10 11 und es ist egal was
;; weil, ob wir - raising edge, falling edge, low level, letzten endes, wenn die Anwendung
;; nur Tastendruck ist kann man das verzeihen
;; das heisst, Interrupt Sense Controll

ldi r16, (1 << INT0) | (1 << INT1)
out GICR, r16
ldi r16, (1 << ISC01) | (1 << ISC11)
out MCUCR, r16

sei

end: rjmp end

ExternInterrupt0:
ldi r16, 0x00
out PORTB, r16
reti

ExternInterrupt1:
ldi r16, 0xff
out PORTB, r16
reti

und hier noch mal, ohne Rising Edge:


.include "m8def.inc"

.org 0x000
rjmp RESET
.org INT0addr
rjmp ExternInterrupt0
.org INT1addr
rjmp ExternInterrupt1

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

ldi r16, 0xff
out DDRB, r16
ldi r16, 0x00
out DDRD, r16

;; MCUCR
;; GICR
;; GICR - Global Interrupt Control Register - da muessen INT0 und INT1 gesetzt werden
;; MCUCR - muessen - Interrupt Sense Irgendwas, und 00 und 01 IS...00 01 10 11 und es ist egal was
;; weil, ob wir - raising edge, falling edge, low level, letzten endes, wenn die Anwendung
;; nur Tastendruck ist kann man das verzeihen
;; das heisst, Interrupt Sense Controll

ldi r16, (1 << INT0) | (1 << INT1)
out GICR, r16
ldi r16, (1 << ISC01) | (0 << ISC00) | (1 << ISC11) | (0 << ISC10)
out MCUCR, r16

sei

end: rjmp end

ExternInterrupt0:
ldi r16, 0x00
out PORTB, r16
reti

ExternInterrupt1:
ldi r16, 0xff
out PORTB, r16
reti

Und ein Film ohne Rising Edge:

;; jetzt könnte man das umdrehen, indem man die falling edge nimmt, nämlich von der Taste runter geht.?? Verstehen??

;; tatsächlich das mit der falling und rising edge funktioniert - der witz ist, die Pins genauso wie die LED's sind beim STK500 invertiert. Deswegen das com - bei der Ausgabe, die LED's vom AVR invertiert - Atmega8, aber STK500 und deswegen rising edge rein machen und es geht beim loslassen aus, weil das invertiert ist.


.include "m8def.inc"

.org 0x000
rjmp RESET
.org INT0addr
rjmp ExternInterrupt0
.org INT1addr
rjmp ExternInterrupt1

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

ldi r16, 0xff
out DDRB, r16
ldi r16, 0x00
out DDRD, r16

;; MCUCR
;; GICR
;; GICR - Global Interrupt Control Register - da muessen INT0 und INT1 gesetzt werden
;; MCUCR - muessen - Interrupt Sense Irgendwas, und 00 und 01 IS...00 01 10 11 und es ist egal was
;; weil, ob wir - raising edge, falling edge, low level, letzten endes, wenn die Anwendung
;; nur Tastendruck ist kann man das verzeihen
;; das heisst, Interrupt Sense Controll

ldi r16, (1 << INT0) | (1 << INT1)
out GICR, r16
ldi r16, (1 << ISC01) | (1 << ISC11) | (1 << ISC10) | (1 << ISC00)
out MCUCR, r16

sei

end: rjmp end

ExternInterrupt0:
ldi r16, 0x00
out PORTB, r16
reti

ExternInterrupt1:
ldi r16, 0xff
out PORTB, r16
reti

;; so, das ist der Standard - ohne Rising Edge - die taster sind invertiert

jetzt probiere ich RS232, das ist nicht ganz so einfach, weil die bits sind kompliziert, die muss ich jetzt noch nachlesen Und - ich kann mal hinschreiben und theoretisch weiss, ...

Da sind noch Sachen falsch


.include "m8def.inc"

.org 0x000
rjmp RESET

;; was ich nicht weiss, ist, welche Interrupts sind das
;; fuer RS232 -- man kann Pollin nehmen
;; oder Interrupt

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

;; jetzt muss ich IN und OUT bei PORTD konfigurieren
;; ich weiss nicht welche Pins
;; aber das geht generell mit 0b00001000 irgendso etwas
;; Weil man hat zwei Bit, das geht ja nicht ueber eine Leitung
;; sondern man hat RxD und TxD
;; und das geht nicht ueber eine Leitung
;; deswegen ist der eine = 0, Eingang
;; der andere gleich 1

;; gut, das ist das

ldi r16, 0b...
out DDRD, r16

;; jetzt muss ich Baudrate einstellen und das geht so,
;; das steht in der Tabelle

;; hier steht 9600 Baud Rate
;; das ist 23 oder 47, bei 3.6864 MHz
;; und mein Controller ist 3.6864 MHz
;; und: das haengt von U2X ab
;; weil, wenn die doppelte Geschwindigkeit, dann muss
;; U2X geloescht oder gesetzt sein
;; so - OK - und ich wuerde einfache geschwindigkeit
;; also, muss es - der U2X = 0, normal Mode
;; also = 23 OK

;; also

.equ BAUDRATE = 23
ldi r16, HIGH (BAUDRATE)
out UBRRH, r16
ldi r16, LOW (BAUDRATE)
out UBRRL, r16

;; jetzt senden und empfangen einstellen
;; TXEN - Transmit Enable
;; RXEN - Recieve Enable

;ldi r16, (1 << TXEN) | (1 << RXEN)
;out UCSRA, r16

;; ich vermute UCSRA

;; OK, die sind aktiviert
;; jetzt muss ich einstellen - Frame Format
;; Parity - no, odd, even
;; 5, 6, 7, 8 ... Datenbits
;; stop Bit

;; das geht mit
;; UCSZ2:0 UART Character Size, und das sind 1..8 Bit, dann wuerde ich sagen
;; (1 << UCSZ2) | (1 << UCSZ1) | (1 << UCSZ0), Datenbits
;; Stop Bit: USBS - machen wir rein, das kann ich am PC einstellen
;; Gerade Paritaet - dass heisst: UPM1:0, UART Parity Mode - das heisst,
;; was nehmen wir? Gerade - even, das ist wahrscheinlich - da die reihenfolge
;; no, even, odd geht - wuerde ich sagen
;; no - das einfachste, ich lasse es 0 0
;; even - 0 1
;; odd - 1 0
;; wuerde ich sagen.

;;ldi r16, (1 << UCSZ2) | (1 << UCSZ1) | (1 << UCSZ0)
;; welches A, B, C?
;; das ist falsch, weil
;; USCSZ2 UCSRB
;; halt, nachher habe ich 9 Bit - Data Size, das geht nicht
;; UCSZ1 und UCSZ0 in UCSRC
;;  dann

ldi r16, (1 << UCSZ1) | (1 << UCSZ0)
out UCSRC, r16

;; jetzt habe ich bei mikrocontroller.net gespickelt, das stimmt so weit - richtig gemacht
;; jetzt kommt - eines URSEL
;; was URSEL ist weiss ich nicht
;; o Bit 7 - URSEL: Register Select
;; This bit selects between accessing the UCSRC or the UBRRH Register. It is read as
;; one when reading UCSRC. The URSEL must be one when writing the UCSRC.
;; ich muss UBRRH und nicht UCSRC benutzen, deswegen setzen

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

;; so jetzt einfachstes
;; senden, ohne empfang, ohne Interrupt, dann kommt
;;

ldi r16, (1 << TXEN)
out UCSRB, r16

;; gut das ist aktiviert

;; und jetzt muss ich senden, da muss ich nichts machen, ausser, dass ich
;; beim Senden aufpassen muss, ob das Bit UDRE gesetzt ist
;; nicht immer weiter senden, sondern gucken ist UDRE gesetzt


;; den Befehl kenne ich nicht - sbis - das sind glaube ich bedingte teilweise

rs232out:
sbis UCSRA, UDRE
rjmp rs232out

;; OK, jetzt probieren

Jetzt habe ich das so richtig gemacht, hier die richtige Version


.include "m8def.inc"

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

ldi r16, 0b00000010
out DDRD, r16

.equ BAUDRATE = 23
ldi r16, HIGH (BAUDRATE)
out UBRRH, r16
ldi r16, LOW (BAUDRATE)
out UBRRL, r16

;ldi r16, (0 << UCSZ2)
;out UCSRB, r16
ldi r16, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) | (1 << USBS) | (1 << UPM0) | (1 << UPM1)
;ldi r16, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0)
out UCSRC, r16

;;ldi r16, (1 << TXEN)
;;out UCSRB, r16
;sbi UCSRB, TXEN
; Enable Receiver and Transmitter
ldi r16, (1<<RXEN)|(1<<TXEN)
out UCSRB,r16


again:
ldi r16, 'H'
rcall rs232out
ldi r16, 'a'
rcall rs232out
ldi r16, 'l'
rcall rs232out
ldi r16, 'l'
rcall rs232out
ldi r16, 'o'
rcall rs232out
ldi r16, 10
rcall rs232out
ldi r16, 13
rcall rs232out
rcall sync
cli UCSRA, UDRE
rjmp again


rs232out:
sbis UCSRA, UDRE
rjmp rs232out
out UDR, r16
ret


sync:
    ldi     r16, 0
sync_1:
    ldi     r16, 0
sync_loop:
    dec     r16
    brne    sync_loop
    dec     r16
    brne    sync_1
    ret

Jetzt die Baudrate laut Plan 23, aber: Tatsächlich


;; ich habe seltsamer weise, nebenbei eine Bestaetigung geschaffen, fuer das, was ich eingegeben habe
david@work:~/m820241124$ F_CPU=3686400
david@work:~/m820241124$ BAUD=9600
david@work:~/m820241124$ echo $(((($F_CPU+$BAUD*8)/($BAUD*16)-1)))
23
david@work:~/m820241124$

Jetzt die Ausgabe

## es geht, mit einer ausnahme, es zeigt leider nur mist an - aber es geht

root@work:/home/david# cat /dev/ttyS3

�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�
8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8�
�8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8�
�8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<�
�8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8
�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8
�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8
��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8�
�8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<�
�8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8�
�8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8�
�8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8�
�8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<��8��8�8��8�8<�
�8��8�8��8�8<��8��8�8��8�8^C
root@work:/home/david#


root@work:/home/david# stty -F /dev/ttyS3 9600 cs8 -cstopb -parenb

ich habe alles ausprobiert, der Mist bleibt.

ich habe es ja schon mal hingekriegt, damals mit dem eigenen MAX232 - ich benutze jetzt das RS232 Spare vom STK500. Damit muss es gehen, man muss beim Atmega8, einfach - PD0 mit RxD von Spare 232 verbinden und PD1 mit TxD. Das ist einfacher gemacht, als gesagt. Der Benutzt einen MAX202 scheinbar

Das geht. Ich habe ja auch mal mit dem eigenen MAX232, raus genommen den Atmega8, dann ging es. Der Unterschied ist jetzt, ich weiss, was ich an Quelltext tue.


# also ich habe jetzt gemacht
root@work:/home/david/m820241124# stty -F /dev/ttyS3 9600 cs8 cstopb parodd
# cstopb steht f"ur 2 Stop bits - und - es ist immer ein Startbit - LOW so weit ich weiss und ein Stop Bit - HIGH, aber ich habe die M"oglichkeit zwei Stop Bit ein zu stellen. Dann kann ich Paritit"at keine, even, odd. Und ich habe jetzt odd. Und beim AVR habe ich

; ldi r16, (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) | (1 << USBS) | (1 << UPM0) | (1 << UPM1)
out UCSRC, r16
und baudrate 9600 bei 3.686... MHz. Tut leider immer noch nicht. Ausser schlechter Ausgabe

Es hatte auch schon getan und die Leistung damals, wo ich angeblich nicht wusste, was ich tue. Ich wusste schon nur, was ich mit dem Bits nicht so genau umzugehen war, dass ich den Max 232 neu eingebaut hatte? und ich denke das war für mich damals die entscheidende Erfahrung und die war auch wichtig. Sagt sich so einfach Max 232. Aber ich wusste nicht was es ist. Jetzt weiß ich ja inzwischen ist nichts besonderes in diesem Sinne vielleicht schon im eigentlichen Sinne das Problem scheint jetzt zu sein. Damals hat es mit dem Max 232 funktioniert auch nicht sofort. Aber dann ging's auf einmal wo ich den Reset Knopf gedrückt hab so steht's auch auf der Homepage. Ich vermute jetzt, dass das Problem einfach einfach an dem stk 500 liegt und so an beiden. Ich hab zwei weil da ist ja dieses spare drauf und es kommt schon was an aber das passt soweit nicht. Damals war es mit dem raus gebauten atmega8

ich probiere jetzt was anderes, zeichen empfangen und auf dem LCD ausgeben. Oder nein, ich gebe eine Zählschleife aus - ich mache es anders - ein Zeichen alleine ist problematisch, aber ich gebe eine Zählschleife aus, das ist optimal, ich glaube in die Richtung geht es.

Das scheint zu gehen, ich mache jetzt die Zählschleife mit einem Bash Programm, dann sehe ich, ob es geht.


root@work:/home/david/m820241124# stty -F /dev/ttyS3 ospeed 9600 cs8 cstopb -evenp parodd raw crtscts root@work:/home/david/m820241124# /bin/bash m820241124008uart.sh

Man kann ganz klar erkennen, je nachdem was ich da für Parameter einstelle, desto anders die Ausgabe, also die Existiert, auch beim Senden, aber - es kommen seltsame Zeichen raus. Auch jetzt. Es zählt nicht gescheiht und - ich muss die richtigen Parameter finden, aber die habe ich eigentlich, also ich weiss es nicht. Aber ich weiss es liegt daran, es sendet und empfängt, nur nicht richtig.

was ich machen kann und jetzt muss ich gehen, ich kann den MAX232 als seperate schaltung bauen, rüber legen und dann damit verbinden, vielleicht geht es damit besser.

Mach jetzt hier weiter ich mach jetzt hier weiter ich poste das erst mal auf meiner Homepage und dann kümmere ich mich um die RS 232 als kann sein, dass ich den Max 232 außerhalb nehmen muss und dass es dann funktioniert. Ich will mir aber die Parameter noch mal genauer anschauen. Ich will, dass es funktioniert in beide Richtungen vielleicht ohne Unterbrechung Ziel ist jetzt. Ich werde jetzt erst mal dann auch noch Filme zeigen, was ich schon übertragen konnte, was ich übertragen hat und wenn ich hier Übertragung unterbreche, dass dann auch die Sache aufhört, aber ich will zeigen, dass die Zeichen falsch sind aber dass sie trotzdem übertragen werden das kommt auch auf die Homepage. Mein Ziel ist trotzdem, dass die Sache funktioniert. Egal wie wenn sich nichts anders regeln lässt dann halt so oder so jedenfalls ich will ja jeden Tag meine Übungen machen und ich mach ja jetzt nicht irgendwas verstehen Sie ich mach jetzt nicht etwas aufs gerade was dann gerade wohl was dann so geplant ist das ist gerade wohl ist, sondern ich möchte jetzt schrittweise weiterkommen. Sie wissen auch irgendwann stehen die Pixel Displays an und darauf liege ich aber jetzt nicht in erster Linie wert. Ich mach auch weiter meine Übungen mit TTL Gattern jedenfalls ich hab ja die Standardübung für den AVR und der Rest bleibt auch jetzt bleiben bleiben auch die vhdl Übung deshalb d.h. Latch und so weiter und es entwickelt sich dann zum MIPS 32 okay aber bei dem AVR mache ich natürlich auch weiter und da bin ich bisher soweit, dass ich die Unterbrechung kann was die externen betrifft aber da war ich noch nicht 100-prozentig aber das werde ich jetzt 100-prozentig wissen das kommt zu der Übung. Ich war dabei, dass ich den Port nach außen schreibe. Das ist kein Problem. Ich bin da soweit, dass ich den Stack kann. In dem Atemzug habe ich eine einzige Übung, die so ist es ja die Standardübung halt, dass die LEDs hoch gezählt werden und blinken und das mache ich ja mit einer Unterprogramm und das ist bisher der Standard jetzt neu dazukommen. Die Externunterbrechung also die sollen jetzt 100 Prozent dazu und dann soll eben dazu das LCD soll zu den 100-prozentigen Übungen und jetzt eben die RS 232 das soll auch zu den 100-prozentigen Übungen, die jeden Tag stattfinden jeden Tag neu schreiben aber auch auswendig lernen. Das ist klar und ich will aber dass es vorher halt 100 Prozent funktioniert weil ich will nicht was üben. Das geht zur Not auch damit es einfach weiß weil es ja so richtig ist, aber ich will was was 100 Prozent funktioniert, damit es in der Übung dann auch klar ist gut wenn ich damit fertig bin, dann werde ich fast den AVR betrifft nächste Schritte angehen. Dann werde ich den i2c beziehungsweise TWI machen. Da fehlt der Timer da fehlt noch der Timer i2c also TWI mache ich. Wenn ich soweit bin, dann möcht ich neben dem Timer dann auch noch gehört noch dazu der AD Wandler das kommt dann auch noch jetzt erst mal das auf die Homepage dann vielleicht paar Filmchen was funktioniert und dann heute probieren, dass es heute funktioniert und dann zu den Standardübung und dann heute noch mal das LCD üben, aus dem Kopf.