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 ;; • 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, r16und 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.