Forum: Mikrocontroller und Digitale Elektronik timer 2 interrupt?


von feal (Gast)


Angehängte Dateien:

Lesenswert?

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

von Rahul (Gast)


Lesenswert?


von Rahul (Gast)


Lesenswert?

x(t=1) - x(t=0)

Wo ist da das Problem?

von feal (Gast)


Lesenswert?

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?

von feal (Gast)


Lesenswert?

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;(

von Karl heinz B. (kbucheg)


Lesenswert?

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.

von feal (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Karl heinz B. (kbucheg)


Lesenswert?

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.

von Rahul (Gast)


Lesenswert?

und man hat dafür mehr als nur eine Woche Zeit...

von feal (Gast)


Lesenswert?

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.

von Karl heinz B. (kbucheg)


Lesenswert?

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

von feal (Gast)


Lesenswert?

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.

von Rahul (Gast)


Lesenswert?

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.

von Rahul (Gast)


Lesenswert?


von Karl heinz B. (kbucheg)


Lesenswert?

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

von feal (Gast)


Lesenswert?

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

von re:michael berger (Gast)


Lesenswert?

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.

von feal (Gast)


Lesenswert?

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

von feal (Gast)


Angehängte Dateien:

Lesenswert?

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!

von feal (Gast)


Angehängte Dateien:

Lesenswert?

hier das definitionsfile

von feal (Gast)


Angehängte Dateien:

Lesenswert?

und hier die interrupts.(mit dem windos editor öffnen falls dateityp
nicht erkannt wird)

bitte um hilfe, ich bin wirklich schon verzweifelt

von unfähig (Gast)


Lesenswert?

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

von feal (Gast)


Lesenswert?

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?

von Baitronic (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

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.

von feal (Gast)


Lesenswert?

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

von feal (Gast)


Lesenswert?

@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

von feal (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.