RS-232 und Extern

Beim externen gibt es, die bits

ISC10, ISC10

die frage ist, wofür steht ISC - dann könnte man sich das einfacher merken. Mal gucken, vielleicht in der AVR Beschreibung.

Und was ist das für ein Register


GICR

gicer - das klingt scheisse, aber was ist

GICR
?

und was ist das hier


MCUCR
Wofür steht das? Das gucken wir in der AVR Beschreibung an.

Ach, so, ich verstehe wie das geht, was auch immer das heisst

  1. Ich muss die Interrupts allgemein aktivieren Das geht mit
    
    sei
    
    Dann sind alle Interrupts an
Problem - wenn alle Interrupts an wären und es ist keine Routine da, dann springen die irgendwo anders hin

Also, falsch

  1. Ich muss zu den Interrupts und den Routinen, die Addressen rein machen. Die sind da
  2. Ich muss die Interrupts aktivieren - allgemein
  3. Ich muss die einzelnen Interrutps aktivieren - extern, Timer, ..., jeweils
  4. Ich muss bei den Externen einstellen, steigende Taktflanke, fallende, ...

Aber was ist

ISC
- wofür steht das? Und wofür steht
GICR
?

Ohne zu gucken, weiss ich was

GICR
ist -

GICR
ist nicht etwa, das Register, wo man die Taktflanken für das externe einstellt, sondern
GICR
ist das wo man die Interrupts allgemein aktiviert

Also

  1. Sagen wir: Steigende Fallende Taktflanke, bei Extern
  2. Die Interrupts im einzelnen, also INT 0 bis irgendwas

Und wie heissen die Bits für die einzelnen Interrupts. Na ja, die Bits heissen


INT0, INT1, INT2, ...
Und - was ist dann
GICR

Global Interrupt Controll Register.
Würde ich mal sagen - weil global stelle ich die einzelnen Interrupts an. Gucken wir mal

Ich verstehe es noch besser.

Die interrupts heissen

INT0, INT1, ...
aber nicht


INT0, INT1, INT2, ...
weil, ich kenne die Adressen von den externen Interrupts - die gehen


INT0addr
INT1addr
Aber dann nicht so weiter.

Die Interrupts haben Namen.

INT0
und
INT1
stehen nur für die externen. Das ist logisch

das

INT0addr
ist die Adresse im interruptvektortabelle zur Einsprungsaddresse für die Interruptroutine

also, wenn das Interrupt

INT0
heisst, dann heisst die Addresse in der Interruptvektortabelle, das ist keiner ich weiss -
INT0addr

OK. Und aktivieren tue ich in

GICR
- global interrupt controll register, mit


ldi r16, (1 << INT0)
OK - dann ist
INT0
zum Beispiel eine Definition für
1, 2, 3, 4, 5, ...
.

Was das

.org
soll, weiss ich inzwischen

es ist halt


INT0addr
als Addresse definiert

Und


.org INT0addr
dann steht diese Addresse, da kommt das hin. Jetzt muss ich überprüfen ob meine annahme stimmt

Das stimmt nur zu 15Prozent bis 25Prozent.

Richtig ist, dass

GICR laut Seite 47 Atmega8, f"ur \begin{lstlisting}General Interrupt Controll Register
steht

Aber -

GICR
- aktiviert, das sind 100Prozent richtig, die Interrupts
INT1
und
INT0
und zwar sind das Bit 6 und 7

also steht


1 << INT1
für

1 << 7
Falsch ist, dass die anderen Interrupts - für UART und so hier aktiviert werden, also nur -
INT0
und
INT1
, extern. Der Rest muss in den spezifischen Registern des UART I2C Registern was auch immer aktiviert werden

Und trotzdem:

Global Interrupt Controll Register
, heisst,

IVSEL
steht für


Interrupt Vector Select
Ich habe ja - das ist zunächst ein Bit -
INT0addr
. Die ist jetzt egal wo. Und Interrupt Vector Select, heisst, gelösch, immer am Anfang. OK.

Und dann: Dann ist das eine relativ kompliziertere Sache, die braucht man nicht das

IVSEL
braucht man nicht, normal

Dann noch ein Bit, das

IVCE
- wenn man
IVSEL
braucht, dann muss das schreiben und das geht nicht so einfach, das hängt dann mit den Fuses beim schreiben zusammen, dann muss man da was machen. Das braucht man erst mal nicht

OK und was ist?

Also, jetzt kommt noch


MCUCR
das steht für
MCU Controll Register

Aber warum

MCU
- das geht bei mir Mikrocontroller - so wie CPU Central Processing Unit.

Oder irre ich mich. Wenn aber die externen interrupts im Mikrocontroller Controll Register eingestellt werden, warum ausgerechnet im Allgemeinen Controller Register, diese zwei?

Ich meine ist halt so - ich will mir das nur vor Augen führen.

OK, erst gucken, was ist MCU -

Microcontroller Unit, siehe Mikrocontroller

steht bei wikipedia. Also tatsächlich

Dann die Bits darin

-

ISC11, ISC10
:
Interrupt Sense Control
1 Bit 1 and Bit 0

ISC
- steht für
Interrupt Sense Control

Das ergibt für mich einen Sinn. Weil

INT0
und
INT1
in
GICR
-
Global Interrupt Control Register
- sind - das aktivieren, von
INT0
und
INT1
und
ISC00
... sind dazu da

  1. Steigende Taktflanke
  2. Fallende
  3. HIGH

OK

Dann gibt es

Global Interrupt Controll Register
MCU Controll Register

alles klar.

OK, Englisch unterricht


The House of the Rising sun
The House of the falling sun
Das muss wissen

negative edge triggered - ist - falling edge

Das muss man sich merken

Negative Taktflanke - ist negative edge ist falling edge

Und dagegen

positive Taktflanke - rising edge

Dann gibt es low level - einfach LOW - aktiv und logical change

logical change = rising edge OR falling edge

OK, klar dann gibt


0 0
0 1
1 0
1 1
je nachdem,
ISC11
und
ISC10

Also 2 Bit - 4 Einstellungen für

INT1

\begin{lstlisting}ISC11
und
ISC10
und dann für
INT0 ISC01 ISC00

Und das ist

Interrupt Sence Controll
. Alles klar. Jetzt der UART.

SM2, SM1, ...
spielt keine Rolle.

Dann lohnt sich das Blockschaltbild vom USART

Also, wenn ich was seriell übertrage - ein Byte - was nehme ich dafür ein Schieberegister das wäre das einfachste

Entweder einen MUX - also

8:1
MUX oder - ein schieberegister. Beim USART ein Schieberegister

was brauche ich noch - das lohnt sich

Wenn ich das Schieberegister nehme, dann kann ich ja Parität machen. Ich schiebe das Wort oder Byte durch

Jetzt zähle ich mit - ich zähle - 4 Bit - HIGH - dann Parität?

HIGH
oder
LOW
? Egal

Aber es gibt eine bessere Logik

entweder vermutet mit

XOR
- das alte Ergebnis oder eben immer invertieren

Also, wenn ich 1er durchzähle durch das Schieberegister, kommen die einzeln raus, dann jedes Mal, wenn eine 1 kommt, invertieren und wieder invertieren,parität ist gefunden.

Das ist ja jetzt nicht kompliziert vom Blockschaltbild

  1. Baud Rate Generator - da gibt es auch ein Bit -
    XCK
    
  2. Transmitter - Schieberegister - Transmit Shift Register + Parity Generator +
    UDR
    
  3. Reciever - Recieve Shifter Register + Parity Checker +
    UDR
    
    + ...
  4. Dann Controll Register -
    UCSRA, UCSRB, UCSRC
    
    - ..

UDR = UDR Transmit + UDR Recieve

OK, einen Fehler habe ich immer gemacht

Ich habe das

USCRA, UCSRB, USCRC
richtiger weise, zu UART Controll Register benannt und fälschlicherweise Status ausgelassen

UART Controll and Status Register
.

Dann kann ich mir was erklären, die Formel für die Baudrate ist


UBRR = CPU_CLK / (BAUDRATE * 16) -1
Und Prescaler - der zählt halt mit den CPU Takt und nur beim Prescaling so und so gibt es halt einen UART Takt. Baudrate ... Aber die Formel lautet
/16*...

und da ist ein

/2 /4 /2

macht

/2*4*2 = /16

Das klingt logisch

Ah, jetzt ist alles klar

Was ist

CCITT-1
? Das ist Baudot Code - 5 Bit synchroner digitaler Code. OK - und was ist der synchron

Und wofür ist Data Flow

Das habe ich früher immer verwechselt

Es gibt einen Programm Fluss. Und einen Data Flow

Und der Datenfluss - also es gibt ja ASM Diagramme - das lernt in Computersysteme I/II das sind Hardware algorithmen, darstellung

Dann gibt es Flowcharts - und die sind aber teilweise für Assembler, also Programm Fluss. Das eine ist Hardware Algorithmus ASM Diagramm, der Flowchart ähnlich für Assembler, ich sage mal Flowchart - wenn das Wort stimmt

  1. Assembler
  2. Hardware Algorithmus

Und - RTL - Notation ist Hardware, nicht Assembler

Und dann gibt es den Data Flow, da haben die mich durcheinander gebracht

Das ist Handshaking. Das

ACK/NAK
,
X-ON/X-OFF
-

Das ist entweder

  1. Protokoll
  2. Software
  3. Hardware

Das ist beim assynchronen - und der

CCITT-1
ist synchron, also mit Taktübertragung

Jetzt ist RS-232, aber Asynchron - mit dem UART und jetzt kommt der AVR - Atmega8 und hat einen USART

Und was das ist

Universal Synchron/Asynchron Reciever Transmitter -

und was heisst das - es geht synchron - ich kann jetzt den

  1. Normal assynchron
  2. Doppelte Geschwindigkeit
  3. Master synchron
  4. Slave synchron

Also, Master und Slave, und dann muss das Taktsignal, ich kann es einspeisen, von aussen. Alles klar

Und das muss ich einestellen, dafür gibt es bit.

OK, schlussendlich nicht kompliziert, die Bit halt


UCSRA, UCSRB, UCSRC

Was muss ich machen, bei überhaupt Interrupt oder wie auch immer - ich meine RS-232

  1. Mit Interrupt
  2. Ohne (Polling)

Dann muss wohl noch Interrupts aktivieren

aber ich muss getrennt davon, RS-232 aktivieren

Dann gibt es das mit

  1. Senden
  2. Empfangen

Und das ist -


TXEN - Transmit Enable
RXEN - Recieve Enable
Und das ist Zufall in
UCSRB
- alles klar

dann kommt -

das muss ich lernen

  1. 1 start bit
  2. 5, 7, 8, 9 data bits
  3. no, even, odd parity
  4. stop bits

das habe ich bisher nie angeguckt

Parität ist klar - odd oder even

Dann ist mir klar wann 0 oder 1

Wenn die Parität even - gerade ist - dann sind es 7 1er. Dann ist die Parität auf even eingestellt, dann ist das Paritätsbit 0. Aber jetzt 8 1er und jetzt das Paritätsbit 1

Und jetzt machen wir die Parität odd und es kommen 1er - dann 1...

Dann muss man wisssen

  1. Start Bit - das habe ich bei RS-232 immer verwechselt - muss man nicht kann man
  2. Stop Bit kann man muss man nicht oder gleich 2, alles klar

unabhängig ist start bit immer LOW und Stopbit immer HIGH

alles klar. Und was ist

IDLE
begegnet bei Minix, nachgucken -
IDLE
steht für untätig/leerlauf, alles klar. Untätiger Prozess. Alles klar.

und jetzt weiter. Ich verstehe was

IDLE bei RS-232 ist. Wenn ich einen Text mit 5 Byte "ubertrage und jetzt ist vorher nichts und nachher nichts, ich habe die 5 Byte "ubertragen, ich habe das Kabel dran gelassen, was ist dann?

\begin{lstlisting}IDLE
- natürlich

Da steht für die Parität tatsächlich eine Formel


XOR


d_(n-1) XOR ... d_1 XOR d_0 ...
Und dann bei der geraden ist es:


d_(n-1) XOR ... d_1 XOR d_0 XOR 0
odd und even nicht verwechseln - even ist gerade, das habe ich falsch gemacht. - OK - dass muss ich lernen

Und dann ist das logisch. Wenn ich 8 Bit habe und ich mache XOR 0, dann ist das gerade. Sonst


d_(n-1) XOR ... d_1 XOR d_0 XOR 1

klar

Und jetzt kann ich das einstellen

  1. 0 .. 7 (?) Bit pro Zeichen
  2. Stop Bit 1/2
  3. Parität
Und dann kann ich einstellen
  1. UCSZ2:0
    
    USART Character Size
    
    - alles klar - USART Character Size, ist logisch - 3 Bit, reicht für 0..7 oder 1..8
  2. UPM1:0
    
    :
    USART Parity Mode
    
    - 2 Bit - odd, even, no
  3. USART
    
    Stop Bit Select - USBS
    
    - alles klar.
OK, der Rest ist easy (1.) Ich muss noch die Interrupts wenn ich will

es gibt noch das Bit - das ist kein Register


UDRE - UART Data Register Empty
Und jetzt gibt es

  1. Init
  2. Recieve
  3. Transmit

Und das geht so

Init ist beschrieben, Recieve


in r16, UDR
Transmit


out UDR, r16
bleibt die Frage, was ist bei 9 Bit - geht nicht. weil


in r16, UDR
geht mit 9 bit nicht. Bei 8 bit r16, aber da ist eine Lösung

Dann verschiedenen Bit, in

UCSRA, UCSRB, UCSRC
- beim Recieve und Transmit, muss status abfrage noch rein und bleibt, bits:

RXC, TXC, UDRE, FE - Frame Error
- lauter status bit,
Frame Error, Data OverRun, Parity Error,
...


RXCIE, ...

lauter so Sachen, kann man lernen. Und dann bleibt die Baud Rate. Dafür brauche ich keinen rechner, da sind lauter tabellen, die geben die Baudrate an.