Hallo,
als Anfänger habe ich eine Frage zu Taster Auswertung.
Im Tut wird beschrieben wie man einen ganzen PORT abfragt.
1
ldi r16, 0xFF ; Alle Pins am Port B durch Ausgabe von 0xFF ins
2
out DDRB, r16 ; Richtungsregister DDRB als Ausgang konfigurieren
3
4
ldi r16, 0x00 ; Alle Pins am Port D durch Ausgabe von 0x00 ins
5
out DDRD, r16 ; Richtungsregister DDRD als Eingang konfigurieren
6
7
loop:
8
in r16, PIND ; an Port D anliegende Werte (Taster) nach r16 einlesen
9
out PORTB, r16 ; Inhalt von r16 an Port B ausgeben
10
rjmp loop ; Sprung zu "loop:" -> Endlosschleife
Was trage ich in der loop statt PIND ein, wenn ich beispielsweise nur
den PIN 4 aus dem Port D abfragen möchte?
Ich stehe hier völlig auf dem Schlauch.
Gruß Peter
Peter schrieb:> Ich stehe hier völlig auf dem Schlauch.
Merkt man. Der Code ist vollig sinnlos. Da wird überhaupt nichts
ausgewertet, da wird nur stumpf und nutzlos der Zustand der Eingänge von
PortD auf die Ausgänge von PortB kopiert.
Da kann man den µC leicht einsparen und durch acht Stückchen Leiterbahn
oder Draht ersetzen...
Lerne die verwendete Sprache, lerne Logik. Dann geht's langsam weiter zu
sinnvollen Anwendungen.
c-hater schrieb:> Der Code ist vollig sinnlos. Da wird überhaupt nichts> ausgewertet, da wird nur stumpf und nutzlos der Zustand der Eingänge von> PortD auf die Ausgänge von PortB kopiert.
der Code ist aus dem Tutorial aus dem ich was lernen möchte.
In dem Code wird der ganze PORT D Überprüft/ausgewertet/abgefragt.
Ich würde gern wissen wie man ein einzelnes Bit aus PORT D
überprüft/auswertet/abfragt.
P.S.
Wenn man den µC weg lässt wie du schreibst, nimmt man da vorzugsweise
Leiterbahn oder eher Draht ?
c-hater schrieb:> Der Code ist vollig sinnlos.
Nein.
> Da wird überhaupt nichts ausgewertet, da wird nur stumpf und nutzlos der> Zustand der Eingänge von PortD auf die Ausgänge von PortB kopiert.
Das ist ja auch Beispielcode aus dem Tutorial, dessen Sinn es ist, zu
zeigen, wie man Ports liest und schreibt.
Peter schrieb:> Ich würde gern wissen wie man ein einzelnes Bit aus PORT D> überprüft/auswertet/abfragt.
Per Bitmanipulation.
Peter schrieb:> Was trage ich in der loop statt PIND ein, wenn ich beispielsweise nur> den PIN 4 aus dem Port D abfragen möchte?
Du musst den Wert nach dem Einlesen maskieren (UND-Verknüpfung), für
PIN4 normalerweise mit 0b00010000. Dann wird der Inhalt des Gelesenen
überall auf Null gesetzt, außer der Info von PIN4. Dann Abfrage auf !=
0.
Ich kann nicht in Assembler programmieren, sonst würde ich ein Bespiel
liefern.
Wer "etwas lernen" möchte sollte am besten nicht gleich mit der
Programmierung in Assembler anfangen. Aber trotzdem hier ein paar
Hinweise. Zuerst wäre wichtig gewesen darauf hinzuweisen, dass es sich
hier um eine Arduino-CPU handelt. Gerade beim Verhalten der IO-Ports
sind da große Unterschiede. Wenn Taster abgefragt werden sollen, so ist
es üblich, am Port bei geöffnetem Taster einen High-Pegel zu haben und
diesen beim Schließen des Tasters nach Low zu ziehen. (Es geht auch
anders herum, aber die beschriebene Weise ist Tradition.) Wichtig beim
Arduino ist, dass man den High-Pegel NICHT erzeugen darf, indem man den
Port auf Ausgang schaltet. Die Ausgänge beim Arduino können nämlich laut
Datenblatt recht hohe Ströme (40 mA) liefern und wenn man den Pin dann
mit einem Schalter hart nach Low zieht, ist das Ende des Prozessors
nahe. (Bei anderen Prozessoren geht das und ist nicht unüblich.) Beim
Arduino muss man also den Port, an dem die Taster sind, als Input
schalten. Wenn man nun aber per Output-Befehl ein High (eine Eins)
ausgibt, schaltet der Arduion Pull-up-Widerstände von etwa 20 kOhm nach
High. Wenn die Taster geöffnet sind, erhält man so eine Eins, sind
einzelne Taster geschlossen erhält man für diese eine Null. Das steht im
Datenblatt des ATMega328 Prozessors. Statt den ganzen Port abzufragen,
kann man auch einzelne Bits abfragen. Dazu einfach eine Beschreibung des
Befehlssatzes ansehen.
Aber als guten ?? Rat: Ein Anfänger sollte anfangen, in C zu
programmieren. Wer sich da das Leben für erste Schritte einfacher machen
will, programmiert die Ports als Input und schließt an jedem Port einen
Pull-Up-Widerstand an, der bei geöffnetem Schalter ein High-Potential
erzeugt. Der Schalter zieht dann das Potential auf Low und bei Abfrage
wird eine Null erkannt. (Dann nutzt man zwar die Möglichkeit der
internen Pull-Ups nicht, spart sich aber den entsprechenden Befehl.)
Peter schrieb:> Was trage ich in der loop statt PIND ein, wenn ich beispielsweise nur> den PIN 4 aus dem Port D abfragen möchte?
Nichts andetes, denn du HAST Pin4 'abgefragt'.
Wenn du im folgenden Programmlauf nur das Bit von Pin4 berücksichtigst,
ist egal, was in den anderen 7 bit szand.
Bloss die Ausgabe nach PortB ist schwieriger, denn der Befehl dort
ändert alle 8 bits und damit Ausgänge.
DORT muss man ansetzen, wenn msn nur Bit4 ersetzen will durch den Pin4
den man eingelesen hat.
Und das erfordert ganz anderen Code, üblicherweise mit einer Abfrage,
einer Verzweigung und bit-Maskiererei.
Günni schrieb:> Aber als guten ?? Rat: Ein Anfänger sollte anfangen, in C zu> programmieren.
Nee, wirklich nicht!
Wer verstehen will, was der Controller tut, der muss mit Assembler
ran.
Günni schrieb:> Wer "etwas lernen" möchte sollte am besten nicht gleich mit der> Programmierung in Assembler anfangen.
Warum nicht? Was du hier an Logik lernst, kannst du in jeder Hochsprache
genauso anwenden. Mußt halt nur die dort jeweils gültige Syntax lernen,
um dasselbe mit den Mitteln der Hochsprache auszudrücken.
Das ist nicht schwerer als der umgekehrte Weg, eher einfacher.
Hallo Günni,
vielen Dank für deine ausführlichen Erklärungen, aber es handelt sich
nicht um einen Arduino sondern um einen ATmega8. Ich möchte Assembler
in der Anwendung (zunächst mit ATmega8) erlernen. ich habe mal vor
ca. 30 Jahren (oder 35?) mit der Sucosoft PS 3 von KlöMö Programme
geschrieben die unter anderem die Steuerung von Turmdrehkranen
simuliert hatten, dass hat in der Werkstatt viel Zeit gespart da die
Führerhäuser (9 to schwer) nicht mehr extra herangeschafft werden
mussten. Nun habe ich µC entdeckt und es gefällt mir mich damit zu
beschäftigen (erinnert mich an die alten Zeiten). Das C würde ich
vielleicht später mal lernen.
Zu meinem Post kann ich sagen, dass Rolf Magnus mir den entscheidenden
Hinweis (Bitmanipulation) gegeben hat. Da habe ich erst mal eine Menge
Stoff den ich durcharbeiten sollte.
Dir nochmals vielen Dank für deine gut ausgeführten Erläuterungen.
Gruss Peter
c-hater schrieb:> da wird nur stumpf und nutzlos der Zustand der> Eingänge von PortD auf die Ausgänge von PortB kopiert.>> Da kann man den µC leicht einsparen und> durch acht Stückchen Leiterbahn oder Draht ersetzen...
c-hater ist ein nutzloses Großmaul!
@Peter: Genau der richtige Weg für den Anfang.
Mit genau einem solchen "nutzlosen" Aufbau habe ich meine ersten
Gehversuche am Mikroprozessor gemacht: Eine LED und einen Schalter. Als
dann nach Tagen die LED endlich dem Schalter folgte, konnte ich also ein
Programm assemblieren und in das Prozesorboard einspielen.
Dann kam eine Blinklampe, ein Lauflicht und dann ein Lauflicht, dessen
Geschwindigkeit per BCD-Codierschalter einstellbar war.
Erst nachdem man diese Grundlagen erfolgreich laufen hat, bestehen
Chancen, eine echte Aufgabe anzugehen. Ich wiederhole mich: Der Ansatz
ist richtig, erstmal kleine und scheinbar sinnlose Dinge abarbeiten.
Manfred schrieb:> c-hater ist ein nutzloses Großmaul!
Das stimmt zwar, aber du solltest auch den Grund für sein Verhalten
kennen: Er ist mit JEDEM Wissen der gesamten Menschheit geboren worden
und kann damit auf die "nutzlosen" Dinge der kleinen Leute verächtlich
herabschauen und alles gnadenlos niedermachen, was nicht seinem
hasserfüllten Niveau entspricht.
man kann aber auch direkt den nächsten Befehl überspringen falls ein bit
gesetzt oder gelöscht ist, dann braucht man die UND-Verknüpfung nicht
per Hand machen und muss sich keine Registerwerte ändern lassen die man
sich später wieder holen muss.
>Wer "etwas lernen" möchte sollte am besten nicht gleich mit der> in Assembler anfangen.
Der Beginn in Assembler sollte zur Pflicht werden, danach kann sich
jeder einer Hochsprache zuwenden.
npn schrieb:> Manfred schrieb:>> c-hater ist ein nutzloses Großmaul!>> Das stimmt zwar, aber du solltest auch den Grund für sein Verhalten> kennen: Er ist mit JEDEM Wissen der gesamten Menschheit geboren worden> und kann damit auf die "nutzlosen" Dinge der kleinen Leute verächtlich> herabschauen und alles gnadenlos niedermachen, was nicht seinem> hasserfüllten Niveau entspricht.
Den einzigen dummen Hass und den Neid (!) über die Kenntnisse von
c-hater erkenne ich in den Äußerungen von euch Beiden.
Hi
Warum enden viele Postings in persönlichen Anfeindungen? Mein Gott,
Peter will Assembler programmieren. Warum nicht, wenn er es für sinnvoll
hält, ist seine Entscheidung doch richtig. Warum auf C schwenken? Ich
programmiere auch in Assembler. Ist doch meine eigene Entscheidung. Und
ich habe dafür ein paar Informationen veröffentlicht. Z.B. unter"keine
Angst vor Assembler" in der Rubrik FAQ bei makerconnect.de. Auch das
hier bereits erwähnte Buch "PC und μC programmieren in Visual Basic und
Assembler". Grade Anfänger finden dort einen Leitfaden für eigene Ideen.
Anstatt sinnlose Diskussionen über euer ach so tolles Wissen hier zu
führen, sollten Einige vielleicht doch besser schweigen. Also Peter,
schau mal bei Makerconnect vorbei. Ist ein wenig kleiner und nicht so
hoch frequentiert, aber dafür passt der Umgangston.
Gruß oldmax
Route_66 H. (route_66) schrieb:
>Den einzigen dummen Hass und den Neid (!) über die Kenntnisse von
<c-hater erkenne ich in den Äußerungen von euch Beiden.
Welche Kenntnisse denn?
Er hat ja noch nicht mal zur Kenntnis genommen, daß der TO doch erst
seine ersten Schritte beim Assemblern macht, und da fängt man
üblicherweise erstmal klein und einfach an, und freut sich über die
kleinen Erfolge.
Route_66 H. schrieb:> Den einzigen dummen Hass und den Neid (!) über die Kenntnisse von> c-hater erkenne ich in den Äußerungen von euch Beiden.
Darauf, dass er in seiner unglaublich arroganten Art alle verachtet, die
weniger können als er, bin ich nun wirklich nicht neidisch!
Keine Ahnung, wie du auf sowas kommst?
Peter schrieb:> Was trage ich in der loop statt PIND ein, wenn ich beispielsweise> nur den PIN 4 aus dem Port D abfragen möchte?
Das geht nicht. Du kannst nur alle Pins aus dem Port auf einmal
abfragen. Allerdings steht es dir frei, alles, was dich nicht
interessiert, zu ignorieren. (Genauso wie die pfostigen Beiträge hier.)
Das heißt, du liest erst PIND ein (alle 8 Bits) und nimmst dann den Wert
AND 0x10 (= 0b00010000).
Danach sind alle Bits, die dich nicht interessieren, gleich null.
Und Bit 4 hat genau den Wert, den es vorher auch schon hatte.
Meistens vergleichst du dann das Ergebnis mit 0 - wenn das Ergebnis 0
ist, dann war Bit 4 auch null. Und wenn es nicht null ist, dann war
Bit 4 gleich eins. Weil alle anderen Bits sind ja null.
npn schrieb:> Darauf, dass er in seiner unglaublich arroganten Art alle verachtet, die> weniger können als er
Ich verachte nur Leute, die zu faul zum Lernen sind, die allerdings
zutiefst.
Und das war hier definitiv der Fall. Da hat jemand das erste Stück Code
aus dem Tutorial kopiert und hier rumgeheult, dass das, was er will,
damit nicht geht.
Anstatt sich einfach selbstständig wenigstens weiter durch das
Tutorial zu arbeiten.
Denn da kommt natürlich (sogar relativ bald) auch das vor, was der TO
zur Lösung seines Problems benötigt hätte...
Aber ist ja viel einfacher, zu sagen, man stünde auf dem Schlauch und
eine fertige Wichsvorlage einzufordern.
Diese unsägliche Attitüde der grenzenlosen Faulheit, verbunden mit durch
nichts begründetem Anspruchsdenken ist, was mir so unendlich auf den
Sack geht.
npn schrieb:> Die Ausdrucksweise eines Menschen offenbart seinen Charakter...
Stimmt. Klare Kante bei klaren Sachverhalten = offen und ehrlich.
Rest: Betrüger, Manager, Politiker usw...
c-hater schrieb:> Stimmt. Klare Kante bei klaren Sachverhalten = offen und ehrlich.
Die Wahrheit liegt meist in der Mitte. Extreme sind selten richtig oder
hilfreich.
Diplomatie richtig angewendet ist durchaus sinnvoll und notwendig - es
müssen ja nicht gleich dumme Lügen sein. Ohne sie wäre diese Welt
bestimmt noch chaotischer.
> Rest: Betrüger, Manager, Politiker usw...
Ja, so einfach kann man sich seine Welt machen...
Na, habt ihr es wieder mit eurer ach so qualifizierten Art geschafft,
einen ratsuchenden Anfänger zu vertreiben? Es ist schade, das vielleicht
hilfreiche Informationen wegen dieser äußerst wertlosen Diskussion
nicht mehr gelesen werden.
Gruß oldmax
Martin V. schrieb:> Also Peter,> schau mal bei Makerconnect vorbei. Ist ein wenig kleiner und nicht so> hoch frequentiert, aber dafür passt der Umgangston.> Gruß oldmax
Danke für den Tipp.
Bin dabei.
Gruß Peter
Hi
Nicht, das man mich falsch versteht, es gibt hier wirklich viele, von
denen man etwas lernen kann und die gern bereit sind, auf Fragen
vernünftig zu antworten. Ihnen bin ich aus meiner Vergangenheit auch
dankbar, da ich auch von den wichtige Informationen bekommen habe. Viele
Beiträge zeugen von der Qualität, die auch dieses Forum hat. Die Arbeit,
die dahintersteckt, verdient nicht nur meinen sondern unser aller
Respekt und Dank.
Verständnis allerdings fehlt mir, wenn darüber sinnlos debakelt wird,
welche Programmiersprache doch gefälligst gelernt weden muß. Auch wenn
ich C nicht beherrsche, denke ich nicht, das es andere nicht anwenden
sollen, sondern wenn ich C einmal brauche, werde ich mich damit
befassen. Ob Bascom, C oder was auch immer, programmieren hat nix mit
der Sprache zu tun, sondern wie man es versteht, das Werkzeug "Sprache"
einzusetzen. Also, macht doch bitte Anfängern Mut und unterstützt sie
weiter durch vernünftige Ratschläge. ich bin sicher, ihr könnt das
(fast) alle.
In diesem Sinne, bleibt gesund.
Gruß oldmax
S. R. schrieb:> Das geht nicht.
Nö,
bei dem von mir gebrauchten DCF77-Decoder geht das.
Man muss nur gucken, dass Registerinhalte von "Flaggenregister" immer
schön auf Stapel gesichert werden, damit die "Arithmetics" zwischendurch
von einer "Mainroutine" nicht eventuell überschrieben, zerstört werden.
Gerade bei Gebrauch von zahlreichen ISRs ist "Pushen" und "Poppen"
absolut angesagt.
Der Ausgangsport D kann quasi simultan als RS232-Schnittstelle und
Eingang für die DCF77 Sekundenmarken verwendet werden. Ohne Probs.
Eine "Port-Bitmaskierung" kann man über verschiedene Wege
bewerkstelligen.
@MaWin hat das oben schon mit dem Verunden und Verodern klar
demonstriert.
Beitrag "Re: Frage zur Tasterabfrage"
Wobei eine Eselsbrücke hilft: Verodern (ori) => auf Eins,
Verunden (andi) => auf Null.
ciao
gustav
Hi Gustav
Dein letzter Beitrag enthält einen kleinen Denkfehler, eine Mainroutine
verändert sicherlich das Statusregister, doch in der Regel wertest du
danach die Statusbits aus, weil das im Programm überall erforderlich
ist. Es sind die Isr-Routinen, die unkontrolliert zuschlagen und
Registerinhalte verändern. Deshalb müssen in allen ISR -Routinen und den
durch diese aufgerufenen Unterprogrammen die verwendeten Register sowie
das Statusregister auf dem Stack gesichert werden.
Z.B.
Während einer Addition zweier Registerinhalten tritt ein Interrupt auf,
in dessen ISR ein bedingter Sprungbefehl erfolgt. Damit wären die
Statusbits aus der Addition verloren und das Programm ist nicht
zuverlässig. Das gilt natürlich auch für Programmteile, die aus einer
ISR aufgerufen werden. Auch hier ein Beispiel
Normal liest du Eingänge im Programmzyklus einmal ein.(Pollen) Hast du
aber Eingänge, die sofort erfasst werden müssen, weil die Signale nur
ganz kurz anstehen, setzt du einen Interrupt ein, der dann auf die
gepollte Leseroutine zugreift. Hier ist in der ISR sowohl auch in der
Leseroutine das Sichern der verwendeten Register erforderlich.
Allerdings kannst du genauso gut ein Register z. B. für das
Statusregister Opfern und mußt nicht den Stack benutzen. Ein mov ist
halt etwas schneller wie Push und Pop, aber in der Regel ist dieser
Geschwindigkeitsvorteil zu vernachlässigen.
Gruß oldmax
Karl B. schrieb:>> Das geht nicht.> Nö, bei dem von mir gebrauchten DCF77-Decoder geht das.
Ja, meine Aussage wurde bereits korrigiert.
Es ist eine AVR-Spezialität, dass das möglich ist (Bitbanding ist eine
ARM-Spezialität). Im Allgemeinen ist soetwas nicht möglich, und
Bitmasking sollte man trotzdem lernen.
Martin V. schrieb:> Ein mov ist> halt etwas schneller wie Push und Pop, aber in der Regel ist dieser> Geschwindigkeitsvorteil zu vernachlässigen.
Hi, manchmal muss man sogar in diesem Sinee "mov-en", damit der
Stackunderrun nicht vorkommt.
Ist aber eher eine Sache vom jeweils verwendeten Target-
Speicherplatzreserven.
OK, meinte natürlich ISRs "schießen" quer. War schon richtig verstanden
worden.
Peter schrieb:> Martin V. schrieb:>> Also Peter,>> schau mal bei Makerconnect vorbei. Ist ein wenig kleiner und nicht so>> hoch frequentiert, aber dafür passt der Umgangston.>> Gruß oldmax>> Danke für den Tipp.> Bin dabei.>> Gruß Peter
Hmm. Da gibt es, wie in anderen Foren auch, "Platzhirsche", die es gerne
wissen möchten... Habe den Eindruck, die hartgesottenen "Bascom Freaks"
bleiben da unter sich. Und "Dirk" kann bei Bedarf auch Leute abbügeln,
wenn es ihm zu bunt wird.
ciao
gustav
Hi
Ich wollte keinesfalls dieses Forum schlechtreden. Es ist wesentlich
mehr tangiert und lebendiger. Allerdings ist mir schon früher
aufgefallen, das Foren, in denen man anonym schreibt, oftmals den guten
Ton verlieren. Und bei Makerconnect ist das halt viel seltener,
allerdings nicht absolut auszuschließen. Was mich betrifft, ob anonym
oder angemeldet, ich möchte mich so verhalten, als wenn ich mit euch in
einer Runde sitze. Wär schön, wenn das ein wenig Schule macht.
Gruß oldmax
Martin V. schrieb:> Es sind die Isr-Routinen, die unkontrolliert zuschlagen
Na hoffentlich nicht wirklich "unkontrolliert". Was du meinst ist eher:
zu einem (aus Sicht von main) beliebigen Zeitpunkt.
> und> Registerinhalte verändern. Deshalb müssen in allen ISR -Routinen und den> durch diese aufgerufenen Unterprogrammen die verwendeten Register sowie> das Statusregister auf dem Stack gesichert werden.
Nicht notwendigerweise.
Flags braucht man nur dann zu sichern, wenn sie in der ISR verändert
werden. Eine effiziente ISR zeichnet sich oft u.a. gerade dadurch aus,
dass man darin ohne die Veränderung von Flags auskommt. Gerade beim AVR
gibt es recht vielfältige Möglichkeiten dafür, denn man kann z.B. ohne
Flagveränderung einzelne Bits in allen MCU-Registern testen und darüber
hinaus in vielen IO-Registern (alles unterhalb von IO-Adresse 0x20).
Und Register braucht man nur zu sichern, wenn sie auch anderswo benutzt
werden und nichtmal dann zwingend, denn es gibt da noch den Sonderfall
ausschließlich für die Verwendung in exclusivem Code reservierter
Register, deren Status nicht über subsequente Instanzen des exclusiven
Codes bewahrt bleiben muss und den etwas anders gelagerten Sonderfall
explizit für eine bestimmte Funktion reservierter Register, die dann
ggf. sogar zwischen main und einer oder sogar mehreren ISRs geshared
werden.
Gerade diese Sachen machen in den meisten Fällen den großen
Performancevorteil der Assemblerprogrammierung gegenüber der in einer
Hochsprache aus. Innerhalb eines Codebaumes können heutige
Hochsprachencompiler sehr ordentlich optimieren. Da muss man sich schon
etwas anstrengen, um in Asm besser zu sein.
Aber über mehrere Codebäume hinweg sieht das aber bei den Hochsprachen
immer noch ziemlich grausam aus. Dazu sind die Optimizer schlicht zu
doof. Sie können einfach nicht abschätzen, wieviel solche Optimierungen
bringen, weil sie nicht das Gesamtwerk sehen (schon garnicht deren
relativen Gewichte), sondern maximal nur den jeweiligen Baum.
Aber klar, all das sind keine Asm-Anfänger-Themen. Solange man noch mit
der Sprache selber kämpft, sollte man immer in den ISRs die Flags und
alle benutzten Register sichern.
Hi
c-hater schrieb:> Aber klar, all das sind keine Asm-Anfänger-Themen. Solange man noch mit> der Sprache selber kämpft, sollte man immer in den ISRs die Flags und> alle benutzten Register sichern.
Ja, sicher weiß ich, das man das nicht immer machen muß, aber schnell
legt man sich ein Ei, besonders, wenn man ja noch nicht so routiniert
ist, oder gar Anfänger. Da sollte man die paar zusätzlichen Takte dem
Programm spendieren, um sicher zu sein, das auch nach ein paar
Änderungen sich keine Fehler einschleichen..
Gruß oldmax
Karl B. schrieb:> Man muss nur gucken, dass Registerinhalte von "Flaggenregister" immer> schön auf Stapel gesichert werden
Man kann aber auch einen Satz Register als Scratchpad definieren, d.h.
der Aufrufer erwartet nicht, daß sie erhalten bleiben. So muß man nicht
ständig Push/Pop benutzen, bis der Arzt kommt. C-Compiler machen das
z.B.
In Assembler kann man auch Register für Interrupts reservieren.
Insbesondere, da nestetd Interrupts nicht von Haus aus unterstützt
werden, können diese Register von allen Interrupts benutzt werden. So
kann man viele Unterfunktionen und Interrupthandler ohne jegliches
Push/Pop schreiben.
Und wenn Interrupts den Z-Pointer benötigen, können sie ihn bequem per
MOVW in zerstörbare Register sichern. Das ist schneller (2 statt 8
Zyklen) und weniger Code.
Hi
Peter schrieb:> Was trage ich in der loop statt PIND ein, wenn ich beispielsweise nur> den PIN 4 aus dem Port D abfragen möchte?> Ich stehe hier völlig auf dem Schlauch.
Wir sind weit weg von der ursprünglichen Frage und dabei, kleine
Pfiffigkeiten auszutauschen. Ich denke, wir können davon ausgehen, das
diese Vorgangsweise Programmierern durchaus geläufig ist. Ich glaub
nicht, das es einem Anfänger bei seinem momentanen Stand hilft. Und ich
glaube auch nicht, das der von ihm erstellte Code und die davon
resultierende Zykluszeit den Controller an seine Grenzen bringt.
Gruß oldmax
Karl B. schrieb:> Schnipsel aus "Netzuhr" für die beiden Timer Interrupts.
Sowas meinte ich mit: "... bis der Arzt kommt."
Da hätte man auch gleich alle 32 Register sichern können, das macht den
Kohl auch nicht mehr fett. Und als Unterfunktionen, dann spart man sich
das Kopieren in jeden Interrupt.
Gibt es nen Link zur "Netzuhr"?
Peter D. schrieb:> Gibt es nen Link zur "Netzuhr"?
Voilà:
http://jtxp.org/tech/netzuhr.htm
Hi,
habe Hex-File 'mal zu disassemblieren versucht. (Mit ReAVR)
BTW: Was noch für mich ungewöhnlich ist, ist der Gebrauch des
"Displacement"-Befehls bei der EEprom-Routine.
ciao
gustav
Peter schrieb:> Was trage ich in der loop statt PIND ein, wenn ich beispielsweise nur> den PIN 4 aus dem Port D abfragen möchte?> Ich stehe hier völlig auf dem Schlauch.
die Frage ist so nicht passend
Du musst eh immer den ganzen Port abfragen, also PIND komplett, was du
davon verwendest also nur Bit 4 (Zählweise von 0-7, somit repräsentiert
Bit 4 hex 10-> 0x10) musst du halt auslesen.
Peter schrieb:> in r16, PIND
ausmaskieren bit4
and r16, 0b00010000 oder and r16, 0x10
http://www.avr-asm-tutorial.net/avr_de/beginner/commands.htmlhttp://www.avr-asm-tutorial.net/avr_de/beginner/rechnen.html#And
r16 hat 0bxx111xxx // x beliebig mit
0bxx111xxx // and
0b00010000 // mit and ergibt sich
----------
0b00010000
du brauchst für and also für das and ein 2tes Register wo deine Maske
für Bit 4 reinkommt.
Du weisst aber nicht oder evtl. doch weil du dieses Register nicht
nutzt) ob es FREI ist, also sicherst du es auf dem hoffentlich
eingerichteten
Stack
push r1
http://www.avr-asm-tutorial.net/avr_de/beginner/sram.html#PushPop
lade r1 mit 0x10
http://www.avr-asm-tutorial.net/avr_de/beginner/register.html#LDI
LDI r1, 0x10
in r16, PIND
AND r1, r16
http://www.avr-asm-tutorial.net/avr_de/beginner/rechnen.html#And
in r1 steht nun das Ergebnis von AND, benutzen wie gewünscht
am ENDE
pop r1 um den Inhalt r1 wieder herzustellen wenn es weiter gebraucht
wird.
Hast du nicht genug Register kannst du ja hilfsweise auch im freien
ungenutzen RAM auslagern.
Dafür gibt es das DATA Segment wo du Platz reservieren kannst.
https://www.mikrocontroller.net/articles/AVR-Tutorial:_SRAM
Ich habe zugegeben noch nie ASM auf dem AVR gemacht aber prizipiell ist
es seit dem 6502 auf fast alle single CPU gleich.
Schwieriger wird es auf multi core CPU wie dem ESP32
Erwin D. schrieb:> Joachim B. schrieb:>> somit repräsentiert Bit 4 hex 10-> 0x10> Meinst du nicht 0x100?
Nein, das wäre Bit 8, das es in dem Register gar nicht gibt. Der
mögliche Wertebereich geht nur von 0x00 bis 0xFF.
Rolf M. schrieb:> Erwin D. schrieb:>> Joachim B. schrieb:>>> somit repräsentiert Bit 4 hex 10-> 0x10>> Meinst du nicht 0x100?>> Nein, das wäre Bit 8, das es in dem Register gar nicht gibt. Der> mögliche Wertebereich geht nur von 0x00 bis 0xFF.
Klar, sorry. Hatte 0b100 im Kopf :-)
Joachim B. schrieb:> Ich habe zugegeben noch nie ASM auf dem AVR gemacht aber prizipiell ist> es seit dem 6502 auf fast alle single CPU gleich.
Da habe ich mit meinem Rat, besser in C anzufangen ja eine heftige
Debatte ausgelöst. Nun muss ich zugeben, dass ich viel mehr Assembler
programmiert habe, als in Hochsprachen. Das liegt einfach daran, dass
ich oft hardwarenah mikrosekundengenau arbeiten kann. Das geht mit
Assembler am besten (alle Interrupts aus und los geht's). Auch ist es
gut, wenn man jedes Bit und jedes Register persönlich kennt. Ich habe
einigen Leuten erfolgreich das Programmieren in Assembler beigebracht,
musste aber feststellen, dass inzwischen vielen Leuten die Geduld fehlt,
sich um Carry, Bitwertigkeiten, Sprungbedingungen (und manchmal auch
begrenzte Sprungweiten) usw. zu kümmern. So entstand mein Rat. Ich grüße
hiermit alle Assemblerfreunde und freue mich, dass es davon doch noch
einige gibt.
Peter schrieb:> Ich stehe hier völlig auf dem Schlauch.
Die Schwierigkeit bei Anfängern besteht darin, daß sie alles als einen
großen monolithischen Block ansehen und gleich direkt Code hinschreiben
wollen. Man muß ein Problem aber erstmal durchdenken und in einzelne
Abläufe unterteilen.
Z.B.:
Wenn Input A_7 = 1, mache dies.
Wenn Input A_7 = 0, mache jenes.
...
dies:
Setze Output B_5 = 1.
...
jenes:
Setze Output B_5 = 0.
Usw.
Also richtig schön in Worten.
Dann überprüft man es nochmal und danach kann man es Zeile für Zeile in
Code umsetzen.
Peter D. schrieb:> Die Schwierigkeit bei Anfängern besteht darin, daß sie alles als einen> großen monolithischen Block ansehen und gleich direkt Code hinschreiben> wollen. Man muß ein Problem aber erstmal durchdenken und in einzelne> Abläufe unterteilen.
ist wie Kuchen backen, nicht einfach alle Zutaten in die Schüssel und
dann in den Backofen, es geht erst mal darum das richtig zu beschreiben:
welcher Kuchen?
welche Zutaten?
habe ich alle?
wenn nicht, woher bekomme ich die?
wenn ich das Geschäft kenne, geben sie mir es?
ah, ich brauche Geld um zu bezahlen, woher bekomme ich es?
Ist ein Geldautomat in der Nähe?
Habe ich am Sonntag Zugang oder ist das Einkaufszentrum mit dem
Geldautomat verschlossen?
irgendwann sind alle Fragen auf dem Papier, vielleicht alles geklärt und
DANN vielleicht erst DANN kann das Backen losgehen.
Dann kommen nur noch so Kleinigkeiten wie:
Wann mache ich die Zutaten wie in die Schüssel, kalt oder zimmerwarm.
uvam.
321 Kekse mögen noch leicht sein, eine Käsesahnetorte mit Bisquitboden
schon schwerer.