i2c, Timer-interrupt, Interrupts

Also das eine ist ich hab jetzt noch mal Prozessoren und Speicher gekriegt also eeprom das eine ist was mir sowieso vor schwebt diesen i2c mal auszuprobieren Es gibt ja sozusagen die normalen Port. Rs232 hab ich ja schon ausprobiert. Muss ich aber auch eigentlich mit "Ubungen verfestigen, dann neben den ja und ich hab jetzt lauter attiny und ja, die funktionieren ja gar nicht anders als serielle. und da kann man das auch gleich ausprobieren muss grad meiner Mutter das Mobiltelefon bringen und dann ist das mit dem AD Wandler da h"atte ich heute auch Lust das mal auszuprobieren. Mal sehen ob das mit der Stimme klappt wie man diese aufgenommenen Werte bei der Sampingfrequenz dann um die umwandeln. Es wei"s immer noch nicht muss man mal gucken. Ich vermute mal ein mehr oder weniger als Lauftraining codiert auf oder so so jetzt hab ich noch was anderes. Ich hab ein Speicher und ich hab latches sind  gewisse, die eigenen sich  mit dem Speicher mit dem Speicher zusammen eignen Sie sich dazu, die Programme oder Daten in den externen Speicher unterzubringen ich hab ein Buch von Manfred schwabl Schmid und da nicht nur die Schaltung die ist ganz einfach mit samt dem Puffer eben, sondern auch das wie man das programmiert untergebracht und ja jetzt hab ich aber den in dem Speicher also eeprom ist ja sozusagen einerseits der atmega Mega  Code enthalten dann bei dieser Schaltung andererseits programmiert mit dem Programmierger"at und da interessiert mich das nat"urlich das gleiche auszuprobieren. Ich hab ja einmal probiert den Z 80 anzuschlie"sen, hatte bisher noch keinen Erfolg aber ich glaub das wird relativ einfach gehen. Daf"ur hab ich auch. Die Schaltung hat irgendwas halt nicht gestimmt und dann m"ussen sie halt auch das Programm dann in dem Speicher unterbringen. Ich glaub es geht schon da hat halt irgendwas nicht funktioniert.. Ich hab's nicht mit Steckboard gemacht aber mich interessiert genau das sozusagen. Was hei"st schon sinnvoll ich mein ich hab das ja programmiert. Ich hab sogar Schaltwerk damit gemacht aber einen eben f"ur den Prozessor funktionieren. Den Code in dem Fall dann halten hat atmega unterzubringen und es dann "uber die Software auch zu sehen, dass der Code dann da drin ist

Quelle: https://www.mikrocontroller.net

Mache ich das so, dass ich jetzt erst mal probiere diese attiny einzusetzen. Das ist an sich ja kein Grundstück und dann das Programm drauf zu machen. Dann gucke ich mal was mit dem i2c Bus dazu geschehen hat?

Image IMG_4075

Image IMG_4077

https://cdn-reichelt.de/documents/datenblatt/A300/DS_MIGRATION_13_ZU_13A.pdf
...

jetzt muss ich erst mal nach einem include file suchen, fuer das Ding und ich vermute, der Bus heisst sicher nicht pdip kann ich jetzt nicht sagen muss ich mir auch erst angucken was ist das finde ich alles auf.

https://www.mikrocontroller.net

So blöd sind ja auch nicht pdip wird für parallel Dual inline Package stehen

Ausführung Watchdog, 2-Draht, I2C, SPI Ausführung Watchdog, 2-Draht, I2C, SPI Da steht es. Ich meinte das auch das waren das, worum es ging. SPI, wie ist mit dem i2c steht, steht auf mikrocontroller.net schon geschrieben das selbe gilt dann wahrscheinlich hoffentlich auch für SPI

Image Screenshot_20241023_115554

https://www.mikrocontroller.net/articles/Serial_Peripheral_Interface
Gut, da steht und jetzt kann ich eine Zusammenfassung machen, von beiden bussen und zu dem RS232 mit UART und UBRR und UBRRH, BRRHL, UCSRA, UCSRB, UCSRC, UDR dann auch noch auswendig lernen. Trotzdem will ich das schon mal verwenden.

was ich heute auch gleich in dem atemzug mache, ich kuemmere mich um die interrupts, des atmega8 Wie gesagt, ich bin jetzt dabei, mir Zeug zusammen zu schreiben

Also, ueber I^2C habe ich ordentlich was erfahren das erste ist, dass das genauso twi heisst, oder iic. Die Sache arbeitet mit 127 Slaves und einem Master. Wie gesagt, ich muss das alles genau auswendig lernen. Ich bin auch noch dabei das RS 232 weiter auswendig zu lernen. Das tue ich heute gerade nicht. Hab ich die letzten Tage auch nicht getan, aber das werde ich ab sofort dann auch wieder tun. Spätestens ab morgen. Genauso lerne ich dieses Thema hier 100 Gut, dass wir das LCD mit dem I im Quadrat C Bus tut dann müssen Sie eigentlich nichts anderes machen als die zwei Leitungen verbinden und ich vermute, dass sie einfach dann eben in das Register, wo sie die Daten reinschreiben statt dass sie die Daten eben auf die vier Bits ausgeben bei dem LCD, wo sie die sonst ausgeben obwohl sie halt die Parallelen Pins haben haben ja müssen Sie einfach stattdessen die selben Daten, die sie da sonst reinschreiben einfach in das Register machen. Keine Sorge, was diesen Facebook Beiträge betrifft ich mache aus dem alle eine Zusammenfassung. Ich mache aus dem allen ein zusammen ein ein Beitrag. Ich muss halt nur jetzt gerade hier weitermachen deswegen fällt es alles ein bisschen auseinander das werde ich nachher korrigieren. Jedenfalls müssen die selben Daten einfach in das Register schreiben und dann kommt die genauso beim LCD an das andere was es gibt ist ebenso zum Beispiel EEPROM die gibt es damit hat man früher oder später was zu tun, wenn sie halt mit i Quadrat C arbeiten Steht es haben sozusagen 127 Slaves. Dann brauchen Sie 7 Bit, um die Slave zu adressieren, da der Master klar ist. Es gibt nur ein Master. Normalerweise braucht dieser keine Adresse und alles kommuniziert mit dem Master. Wenn sie 127 Slaves haben dann reichen 7 Bit sieben bitte damit können Sie 128 verschiedene Werte darstellen so, dann haben Sie 9 Bit für ein Adresspaket. Das Adresspaket gibt an an, mit welchem Slave kommuniziert wird. Dabei sind 7 Bit für die Adresse des Laes. 1 Bit sagt, ob ein Laser unterschreib Zugriff stattfindet. Es geht eben zyklisch die Kommunikation geht nicht vom Slave aus und wenn die Kommunikation stattfindet, dann werden hintereinander vom Master bis hin und her gesendet und dabei sendet er zunächst selber Daten. Danach kann er Bits einschalten, dass das Slave Daten senden darf. Das geht zyklisch in dem in das Register des Masters, die entsprechend die bits verändert werden, die die Kommunikation steuern ein sollte klar sein, wie man im AVR beim normalen AVR Mikrocontroller in Register schreibt. Es sollte kein Problem sein die haben halt Namen und dann müssen wir reinschreiben können. Das muss funktionieren also Lade und Speicherbefehle die müssen funktionieren und den Register reinschreiben, die haben halt Namen das muss auch funktionieren. So, jetzt kann man da reinschreiben und jetzt beginnt der Master mit der Kommunikation der schreibt was ins Register rein. Dabei schreibt deinerseits Daten rein und er schreibt rein die Kommunikationsreihenfolge und dabei kann er angeben, dass die Bit Steuern, dass das Slave im Anschluss selber Daten sendet der Slave kann ich von alleine sehen und er muss sich an das halten, was der Master vorgegeben hat. So die ersten 7 Bit, die übertragen werden, sind die Adresse die zweiten sagen, ob es in Lese und schreibt. Zugriff ist. Also die das 8 Bit die II nach dem sieben und des neuen Gebiet ist ne Bestätigung so und das neunte Gebiet. Jetzt muss man bedenken, es gibt hier Taktzyklen die beziehen sich nicht auf den Prozessor sondern die beziehen sich auf den Tag der Kommunikation und der neunte Tagzyklus ist der so genannte ack Takt Zyklus deswegen muss man auch den ascii Code lernen dann weiß man, es gibt NAK und ack und jetzt heißt dieser zufälligerweise ack, d.h. Acknowledge so heißt der Zyklus. Und hier legt, hier muss das SDA auf high gesetzt werden. Doch noch mal ein bisschen anders. Das SDA ist nur das Bit nach außen genauso wie das SDC nur Bit nach außen ist. Es ist nur die Schnittstelle also Pins so, und dann gibt es ein twi Bit rate Register und ein prescaler da muss noch ne kleine Formel rein die hängt vom CPU Takt ab so, und das mit dem Start. Stop Bit da hab ich was falsches verraten. haben sie wohl eigenen Controller? Das macht er selber auf jeden Fall. Sie haben ein Daten und Adressschieberregister. Also da hab ich was falsches verraten. Sie haben eine Daten und Adressschieberregister also Adressregister. Da kommt also Safe rein und Datenregister die Daten. Ich vermute, dass die Start stop Controller zwei gesteuert wird. Ich bin gerade am Lesen aber dass der alleine der Start stop Bit beendet

    TWBR - TWI Bit Rate Register
    TWPS - TWI Prescaler Bits im TWI Status Register
    TWDR (TWI Data Register)
    TWCR (TWI Control Register)
    TWAR (TWI Adress Register)

Nebenbei deutlich verbessern will, sind die AVR Befehl. Ich möchte die AVR Kurzbefehle komplett im Kopf haben zumindest vom atmega8 gibt es gewisse Ungereimtheiten also eines ist mir ganz klar

X,-X,X+
ld , ldi,

ldd
Kann ich auch beantworten der Witz bei dem ist das hat nichts anderes zu tun damit, dass sie
Z+k
Haben das ist aber nicht Z plus K sondern
Z+5
Das sind unsere adressierungsarten Computersystem eins und zwei

Absolut Direktwert unmittelbar direkt indirekt indirekt mit autoinkrement/dekrement, (postinkrement,praedekrement) indirekt mit verschiebung indiziert indiziert mit verschiebung

jetzt haben wir das. Dann haben wir die Speicherbefehle. Das ganze noch mal mit

st - store
load and store

und jetzt kommt -

das -X ist autodekrement, und zwar praedrekement und das X+ ist postinkrement

Dasist das eine. Jetzt gibt es mit Verschiebung. Da ist der Atmega speziell

das ist

Z+k
also Z+5, aber!
Das geht nur bei Y und Z. Bei X nicht

Und dafuer ist ldd

das ist der unterschied

Direktwert rein, ldi
ld, das ist mit X, -X, X+
Das ist und dann wozu ist das ldd
eben fuer X+9
jetzt gibt es ein lds. Das muss ich zugeben, weiss ich nicht zu 100 Ich vermute eine Addresse

dass er die Addressse laedt oder so

Jetzt fehlt es mir beim Atmega8, da fehlen mir die Befehle im Kopf

Das wichtigste ist ja, laden und speichern, mal 100pro nicht so la, la. Sondern wie es sich gehoert, das geht ja bei mir

aber es gibt genuegend, spezialtaeten an befehlen, die muss man genau kennen. Die kommen in die Liste.

An der Stelle eine Runde fachsimpeln ihre Simkarte zum Beispiel oder ihre emv Karte ich mach gleich weiter normales lernen hat ja ein VPP eine Programmierspannung und während sie das Betriebssystem mit der Karte nicht nützen können, um Programme auszuführen. Zumindest nicht bei EMV, weil das Betriebssystem ist schon drauf. Sie werden ihre Karte trotzdem als Computer benutzen können. Voraussage der Prognose. Fragen Sie jemand anderen es gibt sicher Leute, die wissen das besser wie ich aber ich weiß es bald. Ich weiß es bald so gut wie die Leute, die es jetzt schon besser wissen. Fahren Sie der hat ne VPP also ne Programmierspannung und ich sag ihm mal folgendes sie können zwar nicht das Betriebssystem auf der Karte nutzen, um ihre Programme auszuführen. Aber sie können was anderes machen, Sie können die Karte neu programmieren und da ist genau dieser AVR drauf den ich jetzt hier als klein gekauft habe neben den großen die ich gekauft habe noch mal neu und da können Sie ja ihr eigenes Programm drauf machen und dann können Sie ihre Karte zum Computer machen, da irgendwelche Programme ausgeführt

LDS Rd, k Load Direct from SRAM

Unterschied müssen Sie schon verstehen ich hab nicht vor die Bank auszurauben wenn sie erst mal ein Programm zur einfacher Natur auf der Karte untergebracht haben wir auf ihren normalen Baustein dann wird es allenfalls, wenn Sie den entsprechenden Adapter haben, wenn sie da an dem lcd haben, irgendwie ihre eigenen Programme ausführen so und wenn die erst mal drauf sind, dann wird es Nix weiter tun dann sag ich dir und dann ist ja sowieso nichts mehr drauf. Also das werden sie dann auch nicht mehr irgendwie benutzen, was sie da alles tun könnten. Da sag ich einfach nichts dazu aber das möcht ich gar nicht was sie da einstecken ist. Das sind ja dann auch Programme drauf und die wiederum machen dann die APD U befehlen aber das möcht ich alles gar nicht. Ich möchte einfach dein kleines Programm drauf machen und deshalb soll dann mein LCD entsprechend so wie ich auf dem normalen irgendwie wenn ich das überhaupt mache wenn das mit dem VPP geht, dann ist es was anderes weiß ich auch nicht ob das geht schreib grad Befehle offen jetzt gehe ich gleich zu den Interrupts über

ich bin gleich so weit mit den interrupts

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts
ich probiere es dann mal aus und schreibe ein eigenes programm.

Das habe ich hier gleich verstanden und umgesetzt

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts
mit dem Timer lasse ich jetzt gleich mal die LED blinken, ein paar momente bitte.

ich kann auch noch ein interrupt fuer das antippen machen, dann kommt zum LCD eine vernuenftige Tastatur.

; also, das mit den interrupts habe ich verstanden, das ist das da

.def temp = r16
.def leds = r17

.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler

main:

...

sei

dann muss man den stack setzen, dann beim timer interrupt kommt hier der prescaler rein

TCCR0

und da muss TCCR0 bei overflow aktiviert werden. aber das programm taugt fuer die simulation

wir haben eine endlosschleife, bei der zwischen das interrupt kommt, aber, der prescaler alleine reicht ja nicht, weil - irgendwo muss der zaehler geladen sein

ach so, doch ich bin bloed. der timer zaehlt immer 1 byte von 0 bis 255. das ist einfach ein zaehler. der zaehlt immer von 0 bis 255 und dann ein interrupt. der prescaler stellt dann ein, wann eben das zaehlen ein interrupt gibt, bei 1x, 8x, 64x ..oder so

Zitat:

Da der Timer jedes Mal von 0 bis 255 zählt, bevor ein Overflow auftritt,

ach das stimmt auch nicht

TCNT0

es gibt das Timer counter register

https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf

steht hier im Datenblatt

das waere ja auch stumpfsinnig, wenn man den timer nicht einstellen koennte. Man muss ja nicht von blinkenden LED's ausgehen, sondern von Zeitkritischen Anwendungen im Mikrosekunden bereich, dann braucht man einen genauen timer

Prognose, einstellung in

TCNT0

Timer Counter Register 0

Ich mache jetzt zu Hause weiter mit dem Timer interrupt. Ich muss meine Mutter ein bisschen helfen. Dann mache ich weiter mit dem i^2c Bus und dem anderen seriellen. Da bin ich auf einer guten Spur. Ich hab das gut im Griff und ich mach weiter mit interrupt überhaupt überhaupt mache ich interrupt beim AVR, das mache ich überhaupt heute Abend noch zumindest schreibe ich mir Sachen auf. Ich bin da auf einer guten Linie gerade und diese kleinen attiny die ich mir gekauft habe die passen sehr gut zu diesen zwei seriellen Bussen die können nämlich gar nicht anders kommunizieren nach außen Sind übrigens die selben wie sie auf den meisten Smartcards oder zumindest, wie sie auf Smartcard verwendet werden

ok, ich mache jetzt eine ganz einfache sache. Natuerlich kein Timer Interrupt gleich am Anfang, die sind easy, aber nicht ganz so easy. Es gibt zwei interrupts fuer aeussere Pins. ich mache das jetzt so, mit der positiv edge triggered Taktflanke des einen Pins, Tasters, geht die LED an, mit dem anderen aus. Da durch

ldi r16, 0xff
out PORTB

der Wert in PORTB erhalten bleibt bis man ihn aendert. Wird zwar das Interrupt nur durch eine Taktflanke ausgeloest, aber der Wert bleibt danach gleich.

genau das beispiel steht hier auch, faellt mir auf

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts
... ein bisschen anders.

;; so, das habe ich zum groessten teils selber geschrieben, ohne zu gucken, ich erklaere

;; die interrupts liegen ab 0x000 im Programmspeicher. Anders als bei intel bei dem die Interrupt Vektoren in der Interrupt Vektor Tabelle, ebenso an diesen Stellen im RAM liegen, beim x86, zeigen die interrupt Vektoren aber (Segment:Offset) oder (Offset:Segment) jeweils 2 Byte zusammen vier, auf den Interrupt Handler - Vorsicht, hier muss man unterscheiden, Computersysteme i/ii. Das ist eine Stelle, die ich schon laenger kenne, mir vor der Pruefung herausgeschrieben habe, wo ich aber noch ganz genau unterscheiden lernen muss

;; absolut klar ist mir, dass es die Begriffe
;; device handler - interrupt handler, Interrupt Service Routine gibt. Wir muessen aber zwischen einem Interrupt handler und Device Handler unterscheiden. Der Interrupt handler - Computersysteme 1/2 ist so weit ich weiss das ding, was alle Interrupts insgesamt behandelt. Das heisst, die gesamt behandlung aller interrupts. der Device handler bezieht sich auf ein interrupt. Moment, ich habe ausschnitte.

.include "m8def.inc"

.org 0x000
         rjmp main            ; Reset Handler
.org INT0addr
         rjmp int0_handler    ; IRQ0 Handler
.org INT1addr
         rjmp int1_handler    ; IRQ1 Handler

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

end:    rjmp end

Startaddresse der Service-Routine 1.) Abfragemethode 2.) Vektormethode 3.) Codemethode

Abfragemethode: Polling

Interrupt-Handler: Verwaltet alle Interrupts

Device-Handler

1.) Die Interrupt-Anforderungen der einzelnen E/A-Bausteine werden durch OR-Funktion miteinander verknüpft 2.) Wenn IRQ = 1 3.) CPU ruft ISR auf 4.) Dieses Programm verwaltet alle Interrupts: Interrupt-Handler 5.) Interrupt-Quelle ermitteln 6.) Statusregister der einzelnen E/A-Bausteine prüfen, ob Interrupt-Flag gesetzt ist 7.) Der Interrupt-Handler kennt die Startaddressen der Service-Routinen für jeden einzelnen Baustein 8.) Zum ISR verzweigen: Device Handler

ISR Interrupt-Handler Device-Handler

ISR Interrupt-Handler: Alle Interrupts Device-Handler: Routine für einen Baustein

Vektormethode Besonderes Register: ISRQ: Interrupt Service ReQuest Interrupt-Maske: IM

Codemethode: Wenn ein E/A-Baustein auf eine Interrupt-Anforderung Quittungssignal erhält, antwortet er mit einem Codewort auf dem Datenbus

Also, es scheint aehnlich, da muss ich genau gucken, aber!

Der interrupt Handler ist kein Device Handler

ich stelle mir das so vor. Sie haben ein Interrupt 0x21 MS-DOS, das ist der Interrupt Handler

Der Interrupt Handler hat aber verschiedene Subroutine Datei, Bildschirm und so weiter. Diese bedienen verschiedene Geraete

Oder es heisst, mit Interrupt Handler,ist die Abarbeitung von Interrupts durch die CPU gemeint. Waehren der Device handler die geschriebene Methode ist

Gut - dann muss man unterscheiden zwischen

Abfragemethode, Vektormethode, Codemethode

Was soll diese Abfragemethode.Ein Baustein loest ein Interrupt aus. Wo liegt die Addresse? Ueber in und out befehle legt der Baustein die Addresse auf den Bus

Vektormethode - Intel x86 fuehrt zur Interrupt Routine

Und - Codemethode das ist Atmega8. Weil die Interrupts liegen bei

0x000

Dahin wird gesprungen. Je nachdem ob interrupt 0 bis 3, entweder ich wuerde sagen 2 oder 4 byte * 0 * 1 * 2 ...

Da springt der einfach hin. Aber hier steht ein Sprungbefehl. Wenn Interrupt so und so kommt, springt der da halt hin. OK.

da steht ein Sprungbefehl

es gibt ein Problem. Wir muessen ja, die gesamte Interrupt Vektortabelle ausfuelllen. Wenn wir

Nein da wollte ich gerade unsinn erzaehlen sorry.

.include "m8def.inc"

.org 0x000                    ; kommt ganz an den Anfang des Speichers
         rjmp RESET           ; Interruptvektoren "uberspringen
                              ; und zum Hauptprogramm
         rjmp EXT_INT0        ; IRQ0 Handler
         rjmp EXT_INT1        ; IRQ1 Handler
         rjmp TIM2_COMP
         rjmp TIM2_OVF
         rjmp TIM1_CAPT       ; Timer1 Capture Handler
         rjmp TIM1_COMPA      ; Timer1 CompareA Handler
         rjmp TIM1_COMPB      ; Timer1 CompareB Handler
         rjmp TIM1_OVF        ; Timer1 Overflow Handler
         rjmp TIM0_OVF        ; Timer0 Overflow Handler
         rjmp SPI_STC         ; SPI Transfer Complete Handler
         rjmp USART_RXC       ; USART RX Complete Handler
         rjmp USART_DRE       ; UDR Empty Handler
         rjmp USART_TXC       ; USART TX Complete Handler
         rjmp ADC             ; ADC Conversion Complete Interrupthandler
         rjmp EE_RDY          ; EEPROM Ready Handler
         rjmp ANA_COMP        ; Analog Comparator Handler
         rjmp TWSI            ; Two-wire Serial Interface Handler
         rjmp SPM_RDY         ; Store Program Memory Ready Handler

RESET:                        ; hier beginnt das Hauptprogramm

wenn sie 16 interrupts haben und sie wollen interrupt 15 ausloesen, dann muessen sie bei allen vorher hin schreiben, rjmp. Fuer jedes der davor. wenn sie nur die ersten vier haben dann muessen sie die letzten 12 nicht hinschreiben

mit .org kenne ich mich tatsaechlich nicht aus

Aber, wenn sie - wenn sie - jetzt speziall fall. In Computersysteme I/ii steht

RESET:

1. RESET Initialisiere Prozessor(-Register): z.B. Programmzähler PC <- xxxx

RESET ist tatsaechlich initialisiere Programmzaehler mit Startaddrese.

Gut, aber der Atmega8 faengt bei Reset bei 0x000 an. Zum Glueck. das ist gleichzeitig das 0x000 interrupt. Zum Glueck. wenn dem nicht so waere, er faengt ja bei 0x000 an. Wenn da jetzt die Sprungbefehle der Interrupts steht, werden die alle ausgefuehrt schaltetman den prozessor ein, wuerde nicht 0x000 das RESET interrupt sein

Was ich gerade fuer einen Stuss erzaehlt habe war was anderes. Zum einen kann man in der Interrupt Vektor Tabelle das .org schreiben, was ist das ueberhaupt?

ich gucke in Manfred schwabl Schmid

Zum anderen, wir muessen die EinsprungAddressen der Routinen und die Interrupt Vektoren natuerlich unterscheiden, das ist schon klar

https://www.mikrocontroller.net/topic/73262

Das .org - ich kann es erklaren

sie haben ja X, Y, Z.

Sie haben attiny90S4433 mit 256 Byte RAM. dafuer brauchen sie ein Byte zur Addressierung

Atmega8 hat mehr. sie brauchen 2 Byte.

Dabei sind X, Y, Z pointer

Sie sind in Wirklichkeit

r27:r26
r29:r28
r31:r30

wenn ich jetzt zwei Byte zur Addressierung habe, kann ich trotzdem x+1, +2, +3, ... ansprechen

Aber wenn es darum geht, dass sie genau auf den geraden landen, weil ich mit r31:r30 ja so zu sagen, auch zwei Byte verwende. na ja, es gibt ungerade Befehlsformate, sagen wir mal

3 Byte. Nach 3 Befehlen sind das 9 byte. ich haette aber gerne 12.

das register muss man halt auswendig lernen, das aktiviert das entsprechende Interrupt

Ich probiere es mal aus, mit einer aenderung

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

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

sorry war ein kleiner fehler drin

https://www.ituenix.de/html/vid/IMG_4076.mov

wenn ich das i^2c erst fertig habe, ich habe ja ein display mit i^2c, dann kaufe ich 8 weitere davon. ich mache mit dem AVR ueber rs-232 ein Ausgabe Interface fuer meinen PC. Dabei werde ich die Daten ueber rs-232 an den AVR senden und der soll vorausgesetzt, RS-232 und I^2C kollidieren nicht, 8 Displays hintereinander geschaltet bedienen, bzw. nebeneinander, aber ausgabe hintereinander, weil 20x4 Zeichen sind fuer den PC zu wenig. Ansonsten mache ich fuer heute schluss und sie haben ja nicht vergessen, ich bastle jeden tag mit den TTL Gattern 74xx eine disjunktive und konjunkte Normalform - noch, bald sind es Schaltwerke eines mit Quine Mc Cluskey und eines mit 3 Zeilen 1 Das kommt zu den uebungen, so wir RS-232 und jetzt das Interrupt Ich schreib jetzt weiter an dem I2C und an den weiteren seriellen Schnittstellen und an den Interrupt

Das hab ich jetzt mit dem Timer interrupt gemacht. Man muss allerdings bedenken, dass die der CPU Takt hier wohl nicht auf 4 MHz eingestellt ist. So muss ich noch machen. Eigentlich sollte es 1 Sekunde sein. Aber ein Moment bitte ich stelle hier den Code vor ich habe ihn etwas abgewandelt und ich selber habe darüber nachgedacht. Was passiert eigentlich, wenn ich ein prescaler von 1024 habe besteht ja immer noch das Problem, dass zum Beispiel bei einem Takt von 4 MHz etwa alle 1/15 Sekunden der Takt ausgelöst wird. Ich möchte aber alle 1 Sekunde haben meine eine Problem ist ich meine das vom Intel zu kennen soweit ich nicht das bisher programmiert habe. Erstens mal vom Multitasking ist es ja so zum Beispiel. Da brauchen wir auch einen Timer Interrupt, dass wir ausgerechnet so in diesem drehrum den Task Switch machen, weil wir müssen nicht untertreiben das muss man sich nicht vor stehen, als hätte den Prozess überhaupt gar kein normales menschliches Times Slice also wir sind nicht im in der Atom Messung das andere ist, dass es ja trotzdem trotzdem keine Sekunde ist. Das ist das eine aber ich glaube bei also das ist es der Timer Baustein 8253 pit 8253 und soweit ich weiß, kann man da irgendwie noch durch das zweite Register oder irgendwas noch einstehen aber das andere ist Ich hab selber drüber nachgedacht. Ich hab mal anders drüber nachgedacht. Ich wollte jetzt keine Uhr machen. Ich wollte mein Timer Interrupt alle 1 Sekunde auslösen, ohne Uhr. Ich dachte dabei müsste ich ja sozusagen. Ich hab sogar drüber nachgedacht, ob ich den zweiten Timer nehme mit dem Priska arbeiten. Was soll ich machen und dann ist mir über die Uhren einfache Gedanke gekommen. Ich nehme in Register setze das auf null und da etwa alle 1/15 Sekunde des Interrupt auslöst wird, kann ich ja ein Register nach oben zählen und bei 15 wieder mit null initialisieren und nur bei jedem 15. auslösen, die LEDs sozusagen umschalten. Dann hab ich ein Fehl Gedanke gemacht. Also jetzt müssen wir zwei Sachen unterscheiden. Wenn der Mensch zuguckt, bei der 1 Sekunde, da hab ich den Fehler gemacht. Ich will jetzt, dass es für den Menschen so aussieht, als würde jede Sekunde einmal die LEDs umgeschaltet, wenn ich will, dass das so aussieht, als sei es jeder 1 Sekunde, dann ist es ja relativ egal, ob da ein kleiner Teil ist weil es ist nicht genau jedes fünfzehntel Sekunde Sondern da ist ein kleiner nachkomma Anteil,. Dazu habe ich aber was ganz anderes gedacht und darum geht es nämlich nicht, um den Teil sondern ich zähle ja das Register nach oben und dann dachte ich falsch gedacht. Ich hatte mit meinen zählschleifen gedacht. Bei der Zählschleife verbraucht ja jeder Befehl ne gewisse Zeit und irgendwie hab ich gedacht naja gut wenn die jetzt dann doch ne gewisse Zeit brauchen, dann wird es ja ungenau und hier sieht man den Unterschied zwischen der Unterbrechung und einer Zählschleife Natürlich kann ich ja sozusagen auch bei der Zählschleife. Die Anzahl der Takte für die Befehle zählen nichts anderes tue ich aber dazu kann ich auch das addieren was noch ansonsten anfällt außerhalb der Schleife. Aber jetzt ist hier ein Fehl Gedanke drin Die Timer Unterbrechung findet ja sowieso jedes Mal 1 Sekunde statt. D.h. ich habe ja gar nicht das Problem was ich bei der Zählschleife habe. Bei der Zählschleife addiert sich ja langfristig alles was dazu kommt aber die Timer Unterbrechung wird ja jede Sekunde einmal ausgelöst. D.h. was der dazu kommt das hat damit nichts zu tun weil mit jeder Timer Unterbrechung ist das alte vergessen das ist der eine Unterschied Deswegen kann ich, obwohl das der prescaler nicht erlaubt, es so zu machen dass es aussieht wie jeder 1 Sekunde trotzdem ein Register nach oben zählen und bei 15 dann zurücksetzen und die LEDs umschalten. Das ist das eine jetzt jetzt geht es zurück zur Uhr Ich wusste nicht, ob man das mit dem Register so macht ich meine, ich hab mir das Timer Interrupt auf mikrocontroller.net angeschaut und der Witz ist ja da steht es nicht für 1 Sekunde und ich wollte einfach wissen Hier der Quelltext, das mit dem Zählregister habe ich selber reingeschrieben. Das ist doch relativ einfach die Timer Unterbrechung zu nutzen

.include "m8def.inc"
.def temp = r16
.def leds = r17
.def seconds = r18
.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler
main:
        ; Stackpointer initialisieren
        ldi     temp, HIGH(RAMEND)
        out     SPH, temp
        ldi     temp, LOW(RAMEND)
        out     SPL, temp
        ldi     temp, 0xFF            ; Port B auf Ausgang
        out     DDRB, temp
        ldi     leds, 0xFF
        ldi     seconds, 0x00
        ldi     temp, (1<<CS02) | (1<<CS00) ; Teiler 1024       ; CS00 setzen: Teiler 1
        out     TCCR0, temp
        ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer Overflow
        out     TIMSK, temp
        sei
loop:   rjmp    loop
timer0_overflow:                      ; Timer 0 Overflow Handler
        cpi     seconds, 0x0a
        brlt    no_led_toggle
        out     PORTB, leds
        com     leds
        ldi     seconds, 0x00
no_led_toggle:
        inc     seconds
        reti

https://www.ituenix.de/html/vid/IMG_4079.mov

.include "m8def.inc"

.def temp = r16
.def leds = r17
.def seconds = r18

.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler

main:
        ; Stackpointer initialisieren
        ldi     temp, HIGH(RAMEND)
        out     SPH, temp
        ldi     temp, LOW(RAMEND)
        out     SPL, temp

        ldi     temp, 0xFF            ; Port B auf Ausgang
        out     DDRB, temp

        ldi     leds, 0xFF

        ldi     seconds, 0x00

        ldi     temp, (1<<CS02) | (1<<CS00) ; Teiler 1024       ; CS00 setzen: Teiler 1
        out     TCCR0, temp

        ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer Overflow
        out     TIMSK, temp

        sei

loop:   rjmp    loop

timer0_overflow:                      ; Timer 0 Overflow Handler
        cpi     seconds, 0x0a
        brlt    no_led_toggle
        out     PORTB, leds
        com     leds
        ldi     seconds, 0x00
no_led_toggle:
        inc     seconds

        reti


; man muss halt den Timer einstellen, dass man einen prescaler von 1024 hat

 ldi     temp, (1<<CS02) | (1<<CS00) ; Teiler 1024       ; CS00
        out     TCCR0, temp

und das Timer interrupt aktivieren
        ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer Overflow

Und alle interrupts aktivieren
        out     TIMSK, temp
        sei

Und jetzt sehe ich doch

.org 0x0000
        rjmp    main                  ; Reset Handler
.org OVF0addr
        rjmp    timer0_overflow       ; Timer Overflow Handler

Ich habe bei dem .org gestern doch kein Unsinn erzählt wie gesagt ich hab damit noch nicht so die Erfahrung irgendwo scheint die bezeichnet von den Unterbrechung für jede CPU in den Incloud Files in den Bibliotheken doch definiert zu sein und das .org legt sie eben doch an der entscheidenden Stelle ab im Interrupt Vektor und wie ich mir doch erst dachte und dann kann ich mir inzwischen die Definition der anderen Unterbrechungen ersparen