Gast
#4791513
Hi, mit welchem Befehl kann man in Assembler eine Zeitverzögerung einprogrammieren? Danke im Voraus Pascal
|
Anzeige
|
Assembler Zeitverzögerung
Gast
#4791513
Hi, mit welchem Befehl kann man in Assembler eine Zeitverzögerung einprogrammieren? Danke im Voraus Pascal
Gast
#4791518
nop !?!?
Gast
#4791520
WAIT
Gast
#4791522
Gast
#4791524
Den Befehl Wait gibt es aber laut doc0856 von Atmel nicht...
Gast
#4791526
Pascal schrieb: > doc0856 von Atmel nicht... Hast Du irgendwas von Atmel gesagt? Pascal schrieb: > Den Befehl Wait gibt es aber laut doc0856 von Atmel nicht... Du hättest bei Deiner Frage schon erwähnen müssen, um welchen Controller/Prozessor es geht, denn Assembler != Assembler != Assembler. Was auf einem AVR hü heißt, heißt auf einem ARM hott und auf einem 8051 brr, und ein STM8 ist schon längst durchgegangen, während für einen 78k noch die Scheuklappen 'rausgesucht werden müssen. eine Schleiphe, Pseudocode: Delay: ;Einsprungpunkt 'von Aussen' Lade Reg1, Verzögerung ;Anzahl der Durchläufe Label1: dec Reg1 ; Schleiphenzähler runterzählen jnz Label1 ; Wenn Zähler != 0 nächste Runde! ret ; Rücksprung zum MainPrg. Das kannst Du als Prozedur schreiben, oder als Macro, soll die Verzögerung länger sein verschachtelst Du zwei Schleiphen
Gast
#4791596
Seiphen machen sauber den Reiphen, geele!?
Gast
#4791609
Da fällt mir ganz spontan ein daß ich meine Winterreiphen noch nicht montiert habe.... Keppler schrieb: > Seiphen machen sauber den Reiphen, geele!? eggsackt! Vielleicht kannst Du mal irgendwo einflechten ob Du Mikrosekunden als Verzögerung ansiehst oder Stunden? Muss aber nicht sein...
Gast
#4791639
Pascal schrieb: > eine Zeitverzögerung einprogrammieren? Zählschleifen sind taktabhängig. DCF77 auswerten und nach xx Jahren kommt evtl. Dein Wert atomgenau (falls DCF77 noch verfügbar ist). https://www.mikrocontroller.net/articles/AVR
Gast
#4791672
EINEN Befehl gibt es bei den meisten µCs nur für das Nichtstun über eine Befehlszykluszeit. Der Name ist meist NOP (No OPeration) Wenn es um mehr, als einige µs geht - und das Programm auch noch mehr erledigen soll, ist es fast immer günstiger, dafür einen Timer zu bemühen. Variante 1: Einen Timer darauf konfigurieren, dass er regelmäßig das Programm jede ms o.ä. unterbricht (Interrupt). In der Interruptroutine wird eine Variable, die man vorher auf die gewünschte Verögerung in ms gesetzt hat, (falls sie nicht schon NULL ist,) heruntergezählt und beim Erreichen von NULL die LED ausgeschaltet, oder was da sonst gemacht werden soll... Variante 2: Einen Timer so konfigurieren, dass er nach x µs einen Interrupt auslöst. In der Interruptroutine sperrt man die folgenden Interrupts und schaltet die LED ....
Zyklen gelten für Einsprung mit RCALL bei AVR mit 16-Bit Programmzähler Gruß Jobst Jobst M. schrieb: > wait7516192768clk: rcall wait3758096384clk > ... Der ATtiny13 wird sich bedanken mit Stacküberlauf. Spätestens ab der 2. Rekursion ist ne Schleife im Vorteil. Jobst M. schrieb: > wait7516192768clk: rcall wait3758096384clk wer denkt sich denn solche Zahlen (Sprunglabel) aus?
Gast
#4791977
Jacko schrieb: > Nichtstun über eine Befehlszykluszeit. > Der Name ist meist NOP (No OPeration) Wenn man 2 Zyklen warten will, geht auch goto $+1 oder D8 nop ; Zyklen 8 warten D8 nop ; Zyklen 7 warten D8 nop ; Zyklen 6 warten D8 nop ; Zyklen 5 warten D4 return Zyklen 4 warten Aufgerufen werden Sie mit call. Ansonsten geht auch noch Schleifen runterzählen. Ich habe mir Delay-Routinen (8MHz) gebaut mit 4-512 µS, 500µS-127,5 mS und 100ms-22,5 Sec (beinhaltet ein clrwdt) Wenn der MCU zwischen durch was tun soll. Kann man das ganez über Timer lösen. Man setzt dann ein Timeout und prüft Zyklisch ob es schon abgelaufen ist. Das geht mit und ohne Interrupt.
Gast
#4792033
Da uns Pascal immer noch nicht verraten hat, um welchen Zeitbereich es sich handelt, ist raten oder spekulieren angesagt. Peter D. schrieb: > Der ATtiny13 wird sich bedanken mit Stacküberlauf. > Spätestens ab der 2. Rekursion ist ne Schleife im Vorteil. Wenn man nichts Anderes im RAM hat, reicht es gerade so. Nicht alles geht auf jedem Controller. (Welcher uns ja auch noch nicht genannt wurde) Auf Controllern mit ausreichend RAM macht es keinen Unterschied. Wegstaben V. schrieb: > wer denkt sich denn solche Zahlen (Sprunglabel) aus?
Sind die benötigten Taktzyklen. Gruß Jobst
Gast
#4792231
Vielleicht hilft dir ja das Programm "PicLoops"
Gast
#4792250
>Vielleicht hilft dir ja das Programm "PicLoops"
Nachdem Pascal, im zweiten Anlauf verraten hat, dass es um Atmels geht,
sollte alles, was mit "Pic" anfängt, vorsichtig angewandt werden.
Gast
#4792315
Pascal hat sich jetzt ein neues Hobby gesucht, nachdem er gemerkt hat, dass Assembler doch nicht so einfach ist, wie er es sich gedacht hat. Der Arduino dient jetzt als Wurfgeschoss gegen diebische Elstern.
Gast
#4792358
ASM Superprofi schrieb: > Pascal hat sich jetzt ein neues Hobby gesucht, nachdem er gemerkt > hat, > dass Assembler doch nicht so einfach ist, wie er es sich gedacht hat. > Der Arduino dient jetzt als Wurfgeschoss gegen diebische Elstern. Ein Kumpel meintet das C Programmieren ist wie barfuß durch den Schnee zu laufen. Dann ist der Definition nach Assembler Programmieren wie nackt durch den Schnee zu kriechen. Wenn man denken kann wie ein MCU arbeitet ist ASM nicht mehr so kompliziert. jannyboy schrieb: > Ein Kumpel meintet das C Programmieren ist wie barfuß durch den Schnee > zu laufen. > Dann ist der Definition nach Assembler Programmieren wie nackt durch den > Schnee zu kriechen. > > Wenn man denken kann wie ein MCU arbeitet ist ASM nicht mehr so > kompliziert. Deshalb sehe ich es umgekehrt. Erst bei größeren CPUs, wo nicht mehr alles syncron läuft, bevorzuge ich auch C. Da macht ASM dann nur noch wenig Spaß. Gruß Jobst
Gast
#4792789
Ich würde auch ungern ARM ASM programmieren. Das ist dann eher Masochismus. Bei den Atmels macht es dann doch noch Spass. Man ist quasi in der ersten Reihe und bekommt bare metal alles mit. Ein riesengrosser Lerneffekt. Aber ich will jetzt keine unnötige ASM vs C Debatte starten. Beide Sprachen haben Ihren Anwendungsfall. jannyboy schrieb: > geht auch > goto https://www.youtube.com/watch?v=2haQJ-dfNFE Eine einfache Verzögerung kann man mit dem Befehl "DLY" realisieren. Zumindest auf einem SC/MP. Oder ist dieser Befehl erst beim SC/MP 2 hinzugekommen? Befehlssatz war gleich. SC/MP: PMOS, +5V,-7V, 1MHz SC/MP II: NMOS, +5V only, 2Mhz oder 4MHz
Gast
#4793266
jannyboy schrieb: > Ein Kumpel meintet das C Programmieren ist wie barfuß durch den Schnee > zu laufen. Er darf gerne versuchen einen kleinen 8bitter mit 2K Flash in Erlang zu programmieren :-) > Dann ist der Definition nach Assembler Programmieren wie nackt durch den > Schnee zu kriechen. Ist doch nach der Sauna ganz nett. ALLE Programmierspachen sind doof. Wo bleibt der Simultanübersetzer der Forumgestammel in super effizienten ASM Code umsetzt ?
Gast
#4793744
Michael K. schrieb: > ALLE Programmierspachen sind doof. Ich laufe gerne barfuß und nackt durch den Schnee.
Gast
#4794267
jannyboy schrieb: > Ich laufe gerne barfuß und nackt durch den Schnee. Ist wie mit Assembler. Man kommt nur langsam voran, stößt sich an jedem kleinen Stein und nach einer Zeit spürt man die Schmerzen nicht mehr was manche dahingehend interpretieren das man weder Schuhe noch motorisierte Fortbewegungungsmittel braucht. Durch die bald einsetzende Hypothermie fühlt man sich richtig gut, sogar zu warm ist einem aber eigentlich befindet man sich nur auf dem Weg zum Sterbeprozess. War in Mobys diversen Assembler Threads sehr anschaulich zu beobachten. Nein nein, mach mal. Assembler ist der kleinste gemeinsame Nenner und besser kann man seine MCU nicht kennenlernen. Später ist man dann froh wenn der Compiler einen riesen Klumpen Arbeit erledigt um den man sich früher selbst gekümmert hat. Michael K. schrieb: > Man kommt nur langsam voran, stößt sich an jedem kleinen Stein und nach > einer Zeit spürt man die Schmerzen nicht mehr was manche dahingehend > interpretieren das man weder Schuhe noch motorisierte > Fortbewegungungsmittel braucht. Das ist eben etwas für richtige, harte Männer, nicht für Memmen! ;-) Gruß Jobst Jobst M. schrieb: > Das ist eben etwas für richtige, harte Männer, nicht für Memmen! ;-) Jep, eine Fourier-Transformation in Assembler mit Bruchzahlen führt zu orgiastischen Glücksgefühlen, wenns dann mal perfekt läuft.
Gast
#4795907
Jobst M. schrieb: > Das ist eben etwas für richtige, harte Männer, nicht für Memmen! ;-) Du meinst die Typen die Bienen kauen statt Honig zu essen ? Wegstaben V. schrieb: > Jep, eine Fourier-Transformation in Assembler mit Bruchzahlen führt zu > orgiastischen Glücksgefühlen, wenns dann mal perfekt läuft. Chuck Norris schreibt sowas vor dem Frühstück. Michael K. schrieb: > jannyboy schrieb: >> Ein Kumpel meintet das C Programmieren ist wie barfuß durch den Schnee >> zu laufen. > Er darf gerne versuchen einen kleinen 8bitter mit 2K Flash in Erlang zu > programmieren :-) Oder noch besser mit der bo8-CPU. Duck und wech... jannyboy schrieb: > Ein Kumpel meintet das C Programmieren ist wie barfuß durch den Schnee > zu laufen. C ist der Schraubenschlüssel für Assemblerprogrammierer (weil es auf Dauer nicht gut tut, Schrauben mit den Zähnen auf und zu zu machen). C++ hat den Schraubenschlüssel auch, man kann ihn sogar direkt verwenden, oder - wenn man will - über Drähte an einem Fly-By-Wire Joystick ferngesteuert. Michael K. schrieb: > jannyboy schrieb: >> Ich laufe gerne barfuß und nackt durch den Schnee. > > Ist wie mit Assembler. > ... > Später ist man dann froh wenn der Compiler einen riesen Klumpen Arbeit > erledigt um den man sich früher selbst gekümmert hat. Merksatz Das schönste an Assembler ist der Umstieg auf C
Gast
#4796120
Witkatz :. schrieb: > Merksatz Das schönste an Assembler ist der Umstieg auf C Für den der von guter Asm-Programmietung keine Ahnung hat. Die eigentliche Programmlogik umzusetzen ist mit C nicht einfacher als mit Asm.
Gast
#4796384
Und hier noch eine Analogie: ^^ Assembler: Schraubenschlüssel, Hammer und Feile. Die Teile muss man zuerst mit der Feile "ausarbeiten", bevor man sie zusammenschrauben kann. C: Fräse, Dreh- und Bohrmaschine. Feile nach bedarf. C++: CNC und weitere Computergesteuerte Werkzeuge. Die muss aber auch bedienen können. Hand- und Elektrowerkzeuge nach bedarf. Feile ist in der Nähe. Java/DOTNET/BASIC usw: LEGO und Fischertechnik. Vorgefertigte Teile. :) MfG, Andreas
Gast
#4796396
Hi
>Und hier noch eine Analogie: ^^
Ich habe selten solche dümmlichen Aussagen über Assembler wie in diesem
Thread gelesen.
MfG Spess
Arduino F. schrieb: > http://www.bretmulvey.com/avrdelay.html Dazu hier noch eine, die nur ein Register und ein wenig Stack braucht und weite Bereiche abdeckt:
Frei nach Steve Wozniak im Apple ][ Monitor ROM. Das geht mit jedem MC mit Stack.
Gast
#4796436
>Java/DOTNET/BASIC usw: LEGO und Fischertechnik. Vorgefertigte Teile.
Oh man, was haben umfangreiche Frameworks mit der leistungsunfähigkeit
einer Sprache zu tun, genau nichts?
Gruß J
Gast
#4796466
Matthias S. schrieb: > onesec: ldi del,second > wozwait: push del > wwait3: push del > wwait2: push del > wwait1: subi del,1 > Bullshit > ret Ist das hier ein Wettbewerb für die weltweit dümmsten Delayroutinen? Ich glaub mir wird schlecht.
Gast
#4796485
Achtung PIC-Code :D
Gast
#4796582
Schlecht. Aber besser als die davor. Natürlich werde ich meine NICHT posten. Aber den Aufruf einer guten Routine sieht so aus: delayms 12345 oder, wenn man Mikrosekunden möchte: delayus 12345 Reichweite von 1-65535. Genau so muss sowas aussehen und nicht anders.
Gast
#4796634
Hi
>Genau so muss sowas aussehen und nicht anders.
ASM Superprofi. Das ich nicht lache.
MfG Spess
ASM Superprofi schrieb: > Ist das hier ein Wettbewerb für die weltweit dümmsten Delayroutinen? Ich > glaub mir wird schlecht. Tja du hast sie nicht kapiert - war mir klar, das es welche davon gibt. Die Zeile mit dem 'onesec' label ist ein Beispiel, wie man 'wozwait' aufruft, du Superprofi :-P
Gast
#4796656
ASM Superprofi schrieb: > Schlecht. Aber besser als die davor. > > Natürlich werde ich meine NICHT posten. Das sind die richtigen erst große Klappe und dann kommt nix. Naja wer nicht programmieren kann... Kann ja nichts posten... Ich verstehe das.
Gast
#4796710
Natürlich habe ich die Drecksroutine kapiert. Aber wer heute noch sowas abliefert, der hat doch nicht mehr alle Tassen im Schrank. So eine unnötige Stackquälerei. Von der Wartbarkeit reden wir besser gar nicht erst. Aufgabe: Warte 325ms! Ooooh, kaputt. Aufgabe: Warte 5us! Mist, geht nicht.
Gast
#4796717
ASM Superprofi schrieb: > Natürlich werde ich meine NICHT posten. Ich meine auch nicht. Wäre mir einfach peinlich, so deutlich zu zeigen, dass ich mal relativ viel Lebenszeit damit verschwendet habe, sowas Sinnloses zu programmieren... > Aber den Aufruf einer guten > Routine sieht so aus: > > delayms 12345 > oder, wenn man Mikrosekunden möchte: > delayus 12345 > > Reichweite von 1-65535. Genau so muss sowas aussehen und nicht anders. Nö. Meine verbraucht Takte und zwar absolut exakt die spezifizierte Menge davon (nennen wir sie mal: "n"). Und man kann ihr als Parameter 0<=n<=2^32-1 übergeben. Will man irgendeine Zeiteinheit warten, übergibt man als Parameter irgendwas wie dieses: n/FCLOCK für Sekunden oder n/(1000.0*FCLOCK) für ms oder n/(10000000.0*FCLOCK) für µs. Es spricht natürlich auch garnix dagegen, für Leute, die nicht einmal solche simplen Sachverhalte nachvollziehen können, einen zusätzlichen Satz von Makros zu schaffen, die diese Trivialitäten dann auch noch vor dem völlig hirnlosen Benutzer verbergen, der dann irgendwo in der Region generischer C-C&Pler liegen würde... Im Endeffekt hätte man dann ziemlich genau den Delay-Schwachsinn, den z.B. der avrgcc bietet. Der ist recht schick, weil recht resourcen-effizient umgesetzt. Natürlich nicht ganz so effizient wie meine Lösung, aber darauf bin ich ausnahmsweise einmal NICHT stolz. Denn beides ist gleichermaßen vollkommen verblödete, vollkommen sinnlose, absolut schwachsinnige Scheiße! (Und ich schäme mich, Lebenszeit in meine Lösung investiert zu haben, zumal ich es schon zum Zeitpunkt der Implementierung zumindest im Prinzip besser wusste...) Der Punkt ist nämlich: Software-Delays an sich sind in den allermeisten Fällen vollkommener Schwachsinn. Jedenfalls immer dann, wenn ihre Dauer die Dauer eines Interruptframes des Zielsystems nennenswert übersteigt, sagen wir mal ganz grob: >Faktor 2..3. Jegliche SINNVOLLEN Software-Delays lassen sich also beim AVR8-Zielsystem mit einer ziemlich kleinen NOP-Rampe mit etwas Macro-Magie für die ganz kleinen Zeiten abhandeln (die NOP-Rampe kam irgendwo im Thread auch bereits vor, bin jetzt zu faul, hochzuscrollen und nachzuschauen, wer sich da als ein Mensch mit Durchblick geoutet hat). Alles andere ist sinnlose Beförderung der Entropie durch sinnlose Umwandlung von elektrischer Energie in Abwärme durch den sinnlosen Verbrauch von Rechenzeit. Wer sowas braucht oder zu brauchen glaubt, kann einfach nur nicht programmieren. That's all.
Gast
#4796755
Es geht hier um ZEIT verzögerung, nicht um TAKT verzögerung. Dir ist der Unterschied anscheinend nicht klar. Anscheinend programmierst du Assembler. Das macht die Sache noch korioser. Du solltest wissen, dass es keine allgemeine Lösung für alle Probleme gibt und wenn man TAKTE abwarten muss, dann heisst der Befehl sicher nicht delayus x, sondern nops x! Und ich glaube nichtmal du verwendest eine taktorientierte Routine, um z.B. eine LED 20ms lang einzuschalten. Ob man dafür den Prozessor in eine nop-Schleife schickt oder in einen sleep-state, ist wieder ein ganz anderes Thema und lohnt sich umso weniger, je kürzer die Zeiteinheit ist. Und wenn ich einmalig in der Initialisierungsphase 200ms warten muss, werde ich sicher keinen Timer programmieren, sondern die 200ms lang Däumchen drehen. Obendrein laufen die MCUs von GUTEN Programmierern immer in der niedrigstmöglichen Taktrate. Ich tippe mal darauf, dass die meisten C-Programmierer gar nicht wissen, was CLKPR macht, oder haben es einmal gesehen, sich gewundert, dass man es nicht beschreiben kann (muss kaputt sein!) und haben es dann vergessen. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|