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?
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
https://www.mikrocontroller.net/articles/Serial_Peripheral_InterfaceGut, 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, lddKann ich auch beantworten der Witz bei dem ist das hat nichts anderes zu tun damit, dass sie
Z+kHaben das ist aber nicht Z plus K sondern
Z+5Das 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 - storeload 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+9jetzt 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:_Interruptsich 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:_Interruptsmit 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