PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum will das nicht?



Import-Script
16.09.2003, 23:48
Hallo. <BR> <BR>Kann mir da vielleicht jemand sagen, warum diese Schleife mit CALL <BR>funktioniert und mit JNC loop nicht? <BR> <BR>Funktioniert nicht <BR> <BR> <BR> <BR>Interruptbehandlung: <BR> <BR>CLR C <BR>JNC loop <BR>reti <BR> <BR> <BR> <BR>--------------------- <BR>loop: <BR> <BR>. <BR>. <BR>. <BR>ret <BR> <BR> <BR> <BR>-------------------------------------- <BR>-------------------------------------- <BR>Funktioniert <BR> <BR> <BR> <BR>Interruptbehandlung: <BR> <BR>CALL loop <BR>reti <BR> <BR> <BR>--------------------- <BR>loop: <BR>. <BR>. <BR>. <BR>ret <BR> <BR> <BR> <BR>Ich seh da keinen UNterschied. <BR> <BR>Das ganze soll ein Frequenzzähler bis ca. 30kHz werden. <BR>Hab mir das so vorgestellt, daß wenn externer Interrupt auftritt mitgezählt wird. <BR>Alle Sekunden ruft Timer einen Interrupt hervor und gibt den Zählerstand aus <BR>und setzt diesen wieder auf 0 für neue Zählung. <BR> <BR>Falls da jemand bessere Vorschläge hat bin ich wie immer dankbar. <BR> <BR> <BR>Nebenbei, warum muß man eigentlich den Stackpointer immer auf einen bestimmten Wert <BR>setzen? &#40;Konflikte zb mir Registerbänke, seh ich das richtig?&#41; <BR> <BR> <BR>mfg <BR>hannes

Import-Script
16.09.2003, 23:57
Moin, <BR>also ein CALL ist ein Aufruf, wie der Name schon sagt. Und man kehrt mit dem RET zurück. <BR>Ein JMP ist ein sprung, von dem es so keine Rückkehrmöglichkeit gibt, also ist dein RET im ersten Programm falscht. <BR>Beim Call wird die Adresse, von der das Programm kommt, in den Stack geschrieben und der Stackpointer erhöht. Das RET liest den Stack, verringert den Pointer und schreibt die Rückkehradresse in den Program-Counter woraufhin es diese Adresse wieder anspringt. <BR> <BR>Beim JMP wird hingegen keine Notiz angelegt, wo das Programm geradeherkommt, statt dessen wird einfach die Zieladresse in den Programmcounter geladen und dann angesprungen, wo das Programm dann weiterläuft, ohne eine Möglichkeit der Rückkehr. <BR>Außerman trixt &#42;g&#42; <BR> <BR>Beste Grüße, Marek <BR> <BR>P.S. Den Stackpointer zeigt normalerweise auf auf 07hex also das Regsiter 7 in der ersten Bank. Schreibst ein Funktionsaufruf seine Rücksprungadresse hier rein und schreibst du nachher was in Register 7, so wird die Rücksprungadresse zerstört und das Programm stützt ab. Andererseits kann es passieren, dass du was in den Registern der höheren Bänke gespeichert hast und dnan irgenwelche Aufrufe machst und oder Daten Pushst und machst dir deine Werte in den Registern kaputt. <BR>Darum mache setzte ich schon der initialisierung des Programms den Stack-Pointer auf 20hex, also über die vier Registerbänke. <BR>Manchml kann es aber von vorteil sein, wenn Register und Stack sich überschneiden, das sind dann wieder diese Trix und Schweinerein. <BR> <BR>

Import-Script
17.09.2003, 10:35
@Bruder_m: <BR>Bei 20h beginnt aber der bitaddressierbare Bereich, den man auch für diverse Sachen gebrauchen kann. Daher den SP am besten gleich auf 30h setzen. Das aber nur so als Idee, nicht als Kritik.

Import-Script
17.09.2003, 11:49
Du springst zu einer Routine, die mit einem RET endet. D.h. die CPU denkt immer noch, sie ist im Interrupt und denkt garnicht daran, den nächsten Interrupt ausführen. <BR> <BR>Also Interrupts immer mit RETI verlassen. <BR> <BR> <BR>Peter <BR>

Import-Script
17.09.2003, 12:00
mal ne Frage von einem 8031 Newbie &#40;68000 und 808xx geschädigtem&#41;: <BR>Kann der 8031 keinen Interrupt im Interrupt? <BR>Andere CPUs haben Flags, Controlregister etc. um sowas wenn´s zeitkrtisch ist zu unterbinden oder halt auch zuzulassen; je nach...<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0> <BR> <BR>Die Sachr mit RETI statt einfachem RET leuchtet ja ein wg. Stackinhalt usw.

Import-Script
17.09.2003, 12:23
Man kann für einen bestimmten Interrupt die Priorität erhöhen &#40;Bit im Register IP setzen&#41;; dann kann dieser Interrupt andere unterbrechen &#40;die keine höhere Priorität haben, also deren Bit im IP nicht gesetzt ist&#41;.

Import-Script
17.09.2003, 13:39
@Andreas, <BR> <BR>wie Martin schon sagte, haben alle 8051-er mindestens 2 Interruptprioritäten und die meisten neueren sogar 4, z.B. der T89C51RD2. <BR> <BR>Vom Stack her gesehen sind RET und RETI vollkommen gleich. Man kann sogar statt RET immer nur RETI nehmen. <BR>Die einzige Ausnahme sind Unterprogramme innerhalb eines Interrupts, dann muß man RET nehmen. <BR> <BR>Die Interruptlevel werden intern verwaltet und sind nicht abfragbar. D.h. die CPU hat einen internen Zähler 0...2 &#40;4&#41;, der bei jedem Interrupteintritt erhöht und bei jedem RETI erniedrigt wird. Und nur, wenn dieser Zähler &#60;= der gewählten Interruptpriorität ist, wird der Interrupt auch angesprungen. <BR> <BR>Praktisch ist das aber noch etwas komplizierter: <BR>Wenn ein hoch priorisierter Interrupt zuerst ausgeführt wird, springt dieser Zähler auch gleich auf dessen Level 0-&#62;4 und das RETI danach auch wieder von 4-&#62;0 zurück. <BR> <BR> <BR>Peter <BR>

Import-Script
17.09.2003, 19:39
??? was findet ihr bloss an diesen CPUs so schön?<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0> <BR> <BR>Trotzdem Danke für die Info; ich hoffe der Pascal Compiler, den ich vorhabe drauf loszulassen handelt das intern; sonst Gute Nacht vorab schon. <BR>Nix gegen 8031 Assembler; ich maße mir auch nicht an, einen Power-PC-G4/G5 oder einen &#34;SparcXX&#34; mehr in Assembler zu versuchen zu verstehen; das MMX von den 80586ern reicht; solange FreePascal das ordentlich macht. <BR> <BR>Dumm gelaufen, wenn nicht - früher hätte man &#40;ich&#41; siwas in den Griff bekommen; aber es sind echt andere Zeiten angebrochen; Gruss von Delphi...

Import-Script
17.09.2003, 20:55
Zitat : <BR>??? was findet ihr bloss an diesen CPUs so schön? <BR> <BR>Ich finde es schön , dass ich als 42-jähriger es in kurzer Zeit &#40; ca. 2 Wochen &#41; geschafft habe , mir im Selbststudium beizubringen , mit dem 8051 in Assembler klarzukommen . <BR>Hilfsmittel : Elektor &#40; auf Papier &#41; , Internet allgemein und <b>Batronix</b> !

Import-Script
18.09.2003, 09:05
&#34;ich hoffe der Pascal Compiler, den ich vorhabe drauf loszulassen handelt das intern; sonst Gute Nacht vorab schon.&#34; <BR> <BR>Nein, das macht nicht der Compiler. <BR>Das macht doch die CPU alles intern. Ich wollte nur mal das Prinzip verdeutlichen. <BR> <BR>Du must nichts weiter machen, als einmal die entsprechende Priorität in den dafür vorgesehenen Registern zu setzen, mehr nicht. <BR>Ansonsten haben nach dem Reset alle Interupts die gleiche Priorität, d.h. keiner kann den anderen unterbrechen. <BR> <BR>Der Compiler kann ja auch nicht wissen, welcher Interrupt Dir am dringensten ist <BR> <BR> <BR>Peter <BR>

Import-Script
18.09.2003, 15:40
@icke: ja!!! Gratulation, so geht es allen, die sich damit auseinandersetzen, gleich welche CPU... <BR>Man muss sich damit beschäftigen - that´s all. <BR> <BR>@Peter: Da läuft doch von vornherein ein Bootloader usw. und der korkst sich seine Welt schon passend zusammen - so hoffe ich... <BR>Was ich wissen wollte, ob das Ding überhaupt mehrere ineinander verschachtelte kann. <BR>Die Frage ist wohl damit beantwortet: Es kann! <BR> <BR>Ging mir darum: PICs können noch nichtmal das<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0> <BR>Danke.

Import-Script
18.09.2003, 16:37
Das mit dem Bootloader ist wieder ein völlig anderes Ding. <BR> <BR>Es gibt 8051-er mit Bootloader, mit ISP, mit Flash und auch noch welche als OTP. <BR>Bloß die Fensterversionen werden nicht mehr hergestellt, da zu teuer und zu wenig Abnehmer. <BR> <BR> <BR>Es gibt etwa 40 verschiedene Hersteller der 8051 und jeder hat dann nochmal zig verschiedene Varianten. <BR>Ihnen allen ist nur gemeinsam, daß man sie mit dem gleichen Assembler / Compiler programmieren kann. <BR> <BR>Das ist übrigends einer der Vorteile der 8051-er, die ungeheure Vielfalt. Egal, ob Ethernet, CAN, MP3 , USB, 24Bit-ADC, CPLD, für alles gibts den passenden 8051-er, der das schon intern hat. <BR> <BR> <BR>Peter <BR>