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