Es geht um die Programmierung einer Lichtstärkemessers mit 80c552. Der Timer wird wie im source code im Anhang beschrieben anfangs initialisiert. Für das Erfassen der Timer2 Werte bei einem externen Interrupt der CT0I verwendet. Der nächste Schritt ist die Werte zweier aufeinanderfolgende Rechtecksignale zu messen. Dazu muss nach dem ersten Signal der CT0I auf einen Speicherplatz kopiert werden, wenn der 2.Interrupt kommt muss die Differenz gebildet werden. Hier scheitert es bei mir leider, kann mir jemand bitte beim code auf die sprünge helfen? mfg
naja vielleicht wenn ich den source code shcicke, dass ihr versteht was ich meine: orl TM2CON,#10110001b ;16bit überlauf+externer reset möglich(pin)+Vorteiler:00->fosc+t2 betrieb als timer(Zeitgeber) orl CTCON,#00000010b ;sichern des zähler-inhaltes in Register0. Nach Setzen dieses Bits->Sicherung des Inhaltes durch Anlegen einer fallenden Flanke an Pin CT0I orl TM2IR,#10000001b ;CT0 Interruptflag, damit externer Int.am Pin möglich ;org 8003h ; (((( externer Interrupt SFR )))) Adresse mov r0,#30h ;30h in R0 geschoben mov @r0,CT0I reti ----> so wird der inhalt vom CT01 aber immer überschrieben?! wie macht ihr das denn? wie rechnet ihr mit werten die dann beim nächsten interrupt überschrieben werden?
kann mir denn keiner helfen? irgendwelche vorschläge würden mir auch schon helfen. ich sitz nämlcih in grad in meiner abschlussarbeit und muss das bis am donnerstag schaffen. ich bin auch schön langsam verzweifelt... gebt mir doch einige tipps damit ich wieder in die richtige bahn komme.... bitte;(
Na ja, wenn du einen Wert im nächsten ISR Durchlauf wieder brauchst, dann wirst du den halt irgendwo zwischenspeichern müssen. Entweder in einer Speicherzelle oder in einem Register. so nach den Muster: Funktion: ; berechne den neuen_Wert ; zur Differenzbildung nutze den vorhergehenden_Wert ; und den neuen_Wert ; damit der jetzige neue Wert im nachsten Durchlauf ; wieder zur Verfügung steht: ; vorhergehender_Wert = neuer_Wert Sollte für jemanden der seine Abschlussarbeit schreibt nicht allzu schwer sein :-). Frag dich einfach, wie Du (als Person) solche Dinge machst: Du willst zb. verfolgen wie sich die Temperatur jeden Tag ändert. Dich interessiert nur, ob sie steigt oder fällt, und um wieviel. Also ich wuerde mir heute die Temperatur aufschreiben und wenn ich morgen die Temperatur ablese, lese ich die von heute vom Zettel ab und bilde die Differenz. Dann streiche ich am Zettel die Temperatur durch und schreibe die abgelesene drauf. Usw. usw. Am Zettel steht dann immer die Temperatur von Vortag.
ich habe übrigens noch ein weiteres problem bei dem ihr mir vl.behilflich sein könntet, es eht nämlich um folgendes.. der messbereich der lichtstärkemessung soll von 1uW/cm^2 bis 1000uW/cm^2 reichen. Auf der Seite 4 des Datenblattes ist die Ausgangsfrequenz über die Strahlungsintensität aufgetragen. Aus dem Diagramm erkenne ich dass ich die mittlere Kennlinie einstellen muss. Jetzt ist aber meie Frage folgende. Die Sache ist die dass der Bereich bei der mittleren Kennlinie nur mit den Frequenzen auf der y-Achse gemessen werden kann. Ich kann nun meinen Timer2 durch eine Vorstufe einstellen(den Messbereich erweitern). Dies macht man durch 2 Bits im TM2CON Register. ICh bitte um Interpreation wie ich die Vorstufe einstellen muss damit ich den benötigten Messbereich habe.
Der Sinn einer Abschlussarbeit besteht doch darin zu dokumentieren, dass man eigenständig arbeiten kann. So wie das hier aussieht, ist es eher so, dass du anscheinend keinen Tau von der Materie hast und auch nicht gross darüber nachdenken willst. Von mal ein bischen rumrechnen (mit dem Taschenrechner. Gott bewahre, Überschlägig mal im Kopf rumrechnen ist ja sowas von mega-uncool-out) reden wir mal gar nicht. Im Übrigen: Üblicherweise gibt es auch bei Abschlussarbeiten jemanden der einen dabei betreut.
ich will hier keine diskussion über das schulsystem anzapfen wirklich nicht. ich sags ja das ich nicht DER genie bin beim programmieren, ich tu mein bestes, und glaub mir ich hab wirklich genug herumgerechnet. vielleicht kannst du dir ja mal meine berlegung anhören und sagen ob das richtig sein könnte?- die oszillatorfrequenz beträgt 12mhz, wenn ich die biits für den vorkreis auf 01 setze wird die frequenz nicht ddividiert. 12/2^16 (da 16-bit register) =65535. so jetzt dividiere ich die 65ms/65535 und bekomme 9,99*10^-7, der ehrwert davon ergibt mir die maximal messbare Frequenz nämlich 1000549,62~1Mhz. Reicht im Prinzip eine Einstellung von 65ms. ps.der sinn einer abschlußarbeit ist mir schon klar, aber die tatsache dass man bei abschlußarbeiten neue themen bearbeitet ist depremierend, aber ich hab mich damit abgefunden und möchte been mit ein paar tipps das ziel erreichen. Unser betreuer hat mit mikrocontroller programmierung überhaupt nichts zu tun, der is dazu da einfach nur aufzupassen.
an meiner HTL wars genau eine Woche-Projektarbeit Hies damals noch anders und war in Chemie und nicht Elektronik. Dafür dann aber gleich in 4 Fächern mit vormittags eine theoretische Arbeit schreiben und nachmittags im Labor arbeiten. Sei ehrlich: Eine Woche ist mehr als ausreichend um eine Frequenz auszuwerten und in irgendwelche Einheiten umzurechnen. Da bewegen wir uns eher im Bereich von 5 Stunden als 5 Tagen (5 Stunden ist immer noch seeehr lang, aber 5 Minuten ist eindeutig zu kurz).
schau in zeiten von stundenkürzen die htl von früher mit htl von heute zu vergleichen ist nicht berechtigt. tatsache ist dass das rojekt gestern angefangen hat und bis donnerstag fertig sein muss. am freitag gibt nur noch dokumentationsarbeit und abgabe, aber is doch egal jetz oder nicht? ich möcht einfach nur ein paar tipps haben von leuten die sich mit programmieren beshcäftigen, bzw. mir meine fehler sagen bei meinen gedankengägen usw. also fangen wir hier bitte keine politische diskussion an über sinn und zeit.
Echt? Hätte ich nicht gedacht, was die Österreicher für ein "fieses" Schulsystem haben. Ich gehe aber davon aus, dass die Projektarbeit auf schon bekanntem Stoff aufbaut... Ich hatte 3 Monate für meine Diplomarbeit veranschlagt, dann wurden es 4, weil ein Lieferant (ATMEL) ein wichtiges Bauteil nicht liefern konnte.
Wieso habe ich nur das Gefühl, dass Ihr drei irgendwas gemeinsam habt: http://www.mikrocontroller.net/forum/read-1-354833.html#new http://www.mikrocontroller.net/forum/read-1-355510.html#new http://www.mikrocontroller.net/forum/read-1-355495.html#new
@feal Das hört sich doch schon mal besser an. Warum nicht gleich so. Sag doch, welche Überlegungen du bisher angestellt hast. Unterusuche auch noch den umgekehrten Fall: Was ist wenn die Frequenz sehr niedrig ist? Ich wuerde folgenden Gedankengang verfolgen: Bei einer gegebenen Frequenz, kommen die Pulse in x Zeiteinheiten daher (t=1/f). Wenn ich nun den Teiler für den Timer so-und-so einstelle, bis wie weit zählt dann der Timer in dieser Zeitspanne (Wie schnell der Timer zählt ist ja bekannt)? Hab ich mit einem 16-Bit Timer einen Überlauf oder nicht? Das ganze untersuche ich für die minimale und maximale Frequenz. Ev. schau ich mir auch noch die Werte nahe der minimalen/maximalen Frequenz an, damit ich ein Gefühl für den Messfehler durch die Diskretisierung zu erhalte.
stimmt daran hatte ich gar nicht gedacht;(! das werd ich mir morgen noch mal mit meinen unterlagen anschauen, ich habs mir zuhause ausgerechnet werd morgen simulieren probieren und meine werte vergleichen. weiters hab ich mir folgendes überlegt um die werte des timer2 auszulesen, das knifflige war dass der 2.interrupt die werte des 1.nicht überschreibt wie im posting von kh-puchegger beschrieben,müssen dazu die werte vom Capture Register ausgelesen werden noch bevor der 2.interrupt ausgelöst wird. ___|````|____|````|____ x=1.interrupt x y y=2.interrupt, die interrupts sind in der ctcon register so initialisiert worden dass sie bei fallenden flanken ausgelöst werden. nach deinen erklärungen karl-heinz puchegger, habe ich folgende bytes definiert: cthalt =die oberen 8 bit des timers2 beim 1.interrupt ctlalt =die unteren 8 bit des Timers2 beim 1.interrupt cthneu =die oberen 8 bit des timers2 beim 2.interrupt ctlneu =die unteren 8 bit des timers2 beim 2.interrupt ergl =ergebnis der low bytes ergh =ergebnis der high bytes ich überlege schon seit 6uhr und bin jetzt auf ein ergebnis gekommen...könnte das denn so in der art funktioniern? ich hab jetzt leider keine testmöglichkeit, also nur gedankespiel. main: mov a,ctlalt subb a,ctlneu mov ergl,a mov a,cthalt subb a,cthneu mov ergh,a 8003h (((ext.int.sfr)))<- adresse der ext.int.SR mov cthalt,cthneu mov ctlalt,ctlneu mov cthneu,cth mov ctlneu,ctl
ich habe gerade gelesen, dass es bei messungen mit dem timer2 sehr nahe gelegt wird mit interrupt flags zu arbeiten, damit es zu keinen verzögerungen und fehlern kommt. ist dass jetzt so zu verstehen dass ich wenn ein ext.interrupt kommt ein int.flag setzen muss? danach weiß das programm dass der wert des timers captured wurde. die frage ist nun muss ich das flag wieder löschen? bitte um aufklärung was es da wirklich mit den flags auf sich hat.
wie meinst das mit den flags? ich habe gerade gelesen, dass .... wo hast du das gelesen? ein link wär vl.zum nachlesen interessant. welche verzögerungen meinst du? mfg
ich habe das programm mit dem timer0 geschrieben, ich weiß nicht wie ich jetzt das programm auf den timer2 umändern kann damit es auch mit dem funktioniert, egal welche einstellungen ich vornehme bei der initialisierung des timers2 funktioniert das programm nicht;(! bitte um hilfe!
und hier die interrupts.(mit dem windos editor öffnen falls dateityp nicht erkannt wird) bitte um hilfe, ich bin wirklich schon verzweifelt
Du hast also das Programm mit dem Timer0 SELBST geschrieben... 1. Wir kennen ja schon viele Namen von Dir und das hier ist wohl ein weiterer im ASM-File "PROGRAMMNAME copyright by herbert kern - wien" 2. Wenn jemand ein Programm schreibt mit einem Timer, dann sollte es kein Problem sein, auf einen anderen Timer umzusatteln, denn derjenige weiß dann natürlich, wie man Timer nun einstellt. Auch wenn die Timer vielleicht ein bisschen variieren, das Prinzip ist das gleiche. sonst sag ich nur noch: no comment
verdammt nochmal wer auch immer du bist unfähig! ich hab das programm selber geschrieben ja, das copyright herbert kern bezieht sich auf den lehrer der in unserer schule die vorlage geschrieben hat. dies steht deswegen bei jedem programm! dir kommt das vielleich so vor weil ein paar aus unserer klasse hier im forum nach lösungen suchen, aber ich will einfach nur tipps, ich will weder dass mit jemand ein programm schreibt noch sonst was. was ich brauche ist, 1) die adresse vom timer2 Interrupt SR 2) capture and compare logic erklörung ich seh da irgendwie keinen unterschied zum timer0 weil ich bei beiden 2 8bit register für die höheren und niedrigeren bits habe! mir gehts darum dass ich das richtig mache deswegen brauche ich die erklärung von capture und compare programmierung. ich hab da jetzt schon zeimelich viel darüber gelesen und der einzige unterschied der besteht ist, dass es beim timer2 4 capture register und 3 compare register gibt. ich würde aber bei der erfassung des werte des timers bei der jeweiligen fallenden flanke nur einen dieses 4 capture register benützen. dann ist das doch im prinzip das gleich wie mit timer0, also was ist dann der sinn der capture&compare logic?
Sag mal ist es eigentlich schon so eilig, dass du keine Zeit hast deine Shifttaste zu benutzen? mIt KorRektER gROß- uND kLEiNsChreIbung lIEßt'S sICh bESsER, oder? Danke
1) Die Adresse/Register des Timer2 wird/werden vermutlich so ähnlich heissen, wie die des Timer0 (nur die Zahl wird sich ändern...) ==> Datenblatt-Lektüre... 2) Capture: Bei einem bestimmten Ereignis ([externer] Interrupt) wird der aktuelle Timer-Zählerstand in einem bestimmten Register (in der Regel 16Bit breit) gespeichert. Compare: Der aktuelle Zählerstand wird mit einem vorher festgelegtem Wert verglichen und bei Gleichheit ein Ereignis ausgelöst.
nein so eilig ist es nicht aber ich hab mir das so angewöhnt, aber falls es dich stört und du deswegen nicht denken kannst schreibe ich für dich auch gerne groß. mfg
@rahul OK, Danke! In meinem Fall bedeutet das für CTO 0033h! Aha, das versteh ich aber ehrlich gesagt noch immer nicht ganz. Wenn ich das Programm so programmiere dass es bei jeder fallenden Flanke die Werte in die Register CT0L und CT0H schreibt, dann ist das laut Theorie C&C Logic aber im Prinzip das gleich wie bei Timer 0 weil ich nur ein Capture Register benutze. Wenn ich das also so so programmiere dürfte es nicht falsch sein oder? mfg
habe das programm fertgi geschrieben,es funktioniert jedoch immer noch nicht richtig. das problem ist folgendes: bei der berechnung der Periodendauer bekomme ich immer eine differenz voon 0 zwischen den alten&neuen capture werten und somit auch eine periodendauer T von 0. ich habe mir folgendes gedacht u(t) | |++++ +++++ +++++ +++++ ++++ | | | | | | | | | | +++++ +++++ +++++ +++++ | >1 >2 >3 +--------------------------------------->t Meine Abtastzeitpunkte sind jeweils bei fallenden Flanken. Ich habe folgende Speicherplätze definiert: cth0neu ctl0neu cth0alt ctl0alt die aktuellen kommen immer in die vordefinierten Plätze beim Timer 2 in die Plätze cth0 und ctl0 beim Zustand1: cth0 ctlß beim Zustand2: cth0neu cth0 -->cth0 ins cth0neu verschieben bevor cth0 captured ctl0neu ctl0 -->ctl0 ins ctl0neu verschieben bevor ctl0 captured beim Zustand3: cth0alt cth0neu cth0 -->genauso weiter wie oben ctl0alt ctl0neu ctl0 -->genauso weiter wie oben das bedeutet doch im edeffekt dass bei der Subtraktion von cth0neu - cth0alt und ctl0neu - atl0alt immer die Periodendauer T bekomme. Ich bekomme dabei aber als Ergebnis 0!!!, weil cth0neu und cth0alt vor der Subtraktion den gleichen Wert haben! Bitte um Aufklärung! anbei mein source code
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.