Forum: Mikrocontroller und Digitale Elektronik Frage zur Tasterabfrage


von Peter (Gast)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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 ?

von Rolf M. (rmagnus)


Lesenswert?

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.

Beitrag #6308467 wurde von einem Moderator gelöscht.
Beitrag #6308471 wurde von einem Moderator gelöscht.
von HildeK (Gast)


Lesenswert?

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.

von Günni (Gast)


Lesenswert?

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.)

von MaWin (Gast)


Lesenswert?

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.
1
  in r16,PIND
2
  andi r16,16  ; hex 10 bit 4
3
  brne bitsetzen
4
  in r16, PORTB
5
  andi r16,239 ; hex EF bit 4 fehlt
6
  out PORTB, r16
7
  rjmp bitgeloescht
8
bitsetzen:
9
  in r16, PORTB
10
  ori r16, 16  ; hex 10 bit 4
11
  out PORTB r16
12
bitgeloescht:
Man könnte den code noch kürzer schreiben.

von Alles Gute, Ute (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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

von Manfred (Gast)


Lesenswert?

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.

von npn (Gast)


Lesenswert?

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.

von Thomas (kosmos)


Lesenswert?

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.
1
sbis pind, 0         ;überspringe nächstem Befehl falls pind,0 gesetzt ist
2
rjmp Bit0_geloescht  ;oder sbic pind,0 = überspringe falls bit gelöscht
3
4
Bit0_gesetzt:
5
......
6
jmp weiter
7
8
Bit0_geloescht:
9
......
10
11
weiter:
12
......

: Bearbeitet durch User
von Thomas (kosmos)


Lesenswert?

>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.

von Route_66 H. (route_66)


Lesenswert?

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.

: Bearbeitet durch User
von Martin V. (oldmax)


Lesenswert?

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

von Jens G. (jensig)


Lesenswert?

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.

von npn (Gast)


Lesenswert?

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?

von S. R. (svenska)


Lesenswert?

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.

von Eberhard H. (sepic) Benutzerseite


Lesenswert?

S. R. schrieb:
> Das geht nicht.

Freilich geht das, und zwar für alle Ports 0-31 per SBIS und SBIC, wie 
bereits geschrieben.

von c-hater (Gast)


Lesenswert?

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.

von npn (Gast)


Lesenswert?

c-hater schrieb:
> Wichsvorlage

Die Ausdrucksweise eines Menschen offenbart seinen Charakter...
Und genau DAS ist es, was ich verachte.

von c-hater (Gast)


Lesenswert?

npn schrieb:

> Die Ausdrucksweise eines Menschen offenbart seinen Charakter...

Stimmt. Klare Kante bei klaren Sachverhalten = offen und ehrlich.

Rest: Betrüger, Manager, Politiker usw...

von Dietrich L. (dietrichl)


Lesenswert?

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...

von Martin V. (oldmax)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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

von Martin V. (oldmax)


Lesenswert?

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

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

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

: Bearbeitet durch User
von Martin V. (oldmax)


Lesenswert?

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

von S. R. (svenska)


Lesenswert?

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.

von Karl B. (gustav)


Lesenswert?

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

von Martin V. (oldmax)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Martin V. (oldmax)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von Martin V. (oldmax)


Lesenswert?

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

: Bearbeitet durch User
von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Peter D. schrieb:
> So muß man nicht
> ständig Push/Pop benutzen,

Hi,
Schnipsel aus "Netzuhr" für die beiden Timer Interrupts.
Also...;-)

ciao
gustav

von Peter D. (peda)


Lesenswert?

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"?

von Karl B. (gustav)


Lesenswert?

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

von Joachim B. (jar)


Lesenswert?

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.html
http://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

: Bearbeitet durch User
von Erwin D. (Gast)


Lesenswert?

Joachim B. schrieb:
> somit repräsentiert Bit 4 hex 10-> 0x10
Meinst du nicht 0x100?

von Rolf M. (rmagnus)


Lesenswert?

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.

: Bearbeitet durch User
von Erwin D. (Gast)


Lesenswert?

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 :-)

von Günni (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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.

: Bearbeitet durch User
Beitrag #6312213 wurde von einem Moderator gelöscht.
von Joachim B. (jar)


Lesenswert?

Pasteten-Bäcker schrieb im Beitrag #6312213:
> Alles ohne Hefe

wer macht denn Biskuitboden mit Hefe?

Beitrag #6312236 wurde von einem Moderator gelöscht.
von Joachim B. (jar)


Lesenswert?

Pasteten-Bäcker schrieb im Beitrag #6312236:
> damit Zeit, meine Programme vernünftig zu kommentieren.

ja die fehlt mir oft!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.