Forum: Mikrocontroller und Digitale Elektronik OC1 im Compare-Modus ausschalten


von Ralph (Gast)


Lesenswert?

Hallo!

Ich bastle mir ein Messgerät mit dem AVR 90S2313. Die Torzeit soll
dabei so exakt wie möglich 1 Sekunde betragen. Durch den Timer0 steuere
ich gemultiplext eine 9-stellige LED-Anzeige an. Da dadurch der
Timer1-Interrupt nicht immer zeitnah ausgeführt wird, dachte ich mir,
mittels Compare-Interrupt das OC1-Pin (PinB3) und damit einen externen
"Hold" zu schalten. So weit, so schön, ABER:

Mir gelingt es einfach nicht, das PinB3 wieder auszuschalten. Ich habe
schon alle möglichen I/O-Ports ein- und ausgeschaltet. Mir will es
einfach nicht gelingen und ich habe auch noch kein Beispielprogramm
gefunden, in dem das Pin wieder ausgeschaltet wird.

Mit C habe ich übrigens nicht viel am Hut, ich programmiere in
Assembler.

Vielen Dank für Eure Hilfe.

viele grüße
ralph

von crazy horse (Gast)


Lesenswert?

tja, das Problem hatte ich vor Jahren auch, ist ziemlich undurchsichtig
bis gar nicht beschrieben.
Die Sache funktioniert folgendermassen:
Solange COM1A0 oder/und COM1A1 gesetzt sind, übernimmt der Timer die
Kontrolle des Ausgangs PB3. Das steht nirgendwo explizit, und
offensichtlich sind selbst die Atmel-Leute dabei ein bisschen
durcheinander gekommen. In der Pin-Schaltung sieht man wie es
funktioniert, aber nicht von der Bezeichnung verrückt machen lassen,
ich habe hier 3 verschiedene Datenblätter, einmal heisst es "PORTB
Schematic Diagram Pin PB4", im nächsten "PORTB Schematic Diagram Pin
PB2", spasseshalber habe ich mir gerade mal das neueste von Atmel
geladen, da heisst es dann "PORTB Schematic Diagram (Pins PB2 and
PB4)", korrekt wäre natürlich PB3.
Frage in die Runde: gibts noch mehr falsche Varianten? Hat irgendjemand
eine Version, bei der es korrekt ist?

Lange Rede, kurzer Sinn: Wenn du nach einem "clear on compare" den
Ausgang wieder setzen willst, musst du entweder:
-COM1A1/COM1A2 auf 00 setzen, dann erscheint wieder die Information von
PortB.3 am Pin
-o.g. Bits auf 11 setzen, dann setzt der nächste compare den Ausgang
wieder auf 1

von Ralph (Gast)


Lesenswert?

Hallo crazy_horse!

Vielen Dank für Deine Hinweise, nun komme ich mir wenigstens nicht gar
so deppenhaft vor und konnte die Suche nach verwegenen Bit-Operationen
einstellen. Ich hatte vergessen zu erwähnen, dass ich mit ICE200
simuliere und dort funktionierte Dein Lösungsvorschlag nicht. Nun habe
ich ein Bauteil geflasht und siehe: es funktioniert.

Jetzt bin ich natürlich auf der Suche, wie man das ICE200 überlisten
könnte.

viele grüße
ralph

von Peter D. (peda)


Lesenswert?

Ja, im meinem alten Datenbuch (1997, damals bekam man sogar noch
richtige Datenbücher) ist auch PB4 in der Schaltung mit einem OR-Glied,
d.h. COM1A0 und COM1A1 müssen 0 sein, damit der PORTB4(3) durchgreift
(Figure 40).

In der Beschreibung steht aber, das bei COM1A1,COM1A0 = 0,x der Port
durchgeschaltet ist. Was stimmt denn nun ?

Müssen beide auf 0 sein oder reicht COM1A1 = 0.


Bei den neuen AVRs bist Du die Sorgen aber los, die habe extra ein
"Force Output Compare Match" dafür.


Peter

von Ralph (Gast)


Lesenswert?

Fehlanzeige, ein Programmierfehler hat mir den Wunscherfolg
vorgegaukelt. Folgende Befehlsfolge:

ldi ax, (0<<COM1A1) | (0<<COM1A0)
out TCCR1A, ax
clr ax
out PortB, ax
ldi ax, (1<<COM1A1) | (1<<COM1A0)
out TCCR1A, ax

führt dazu, dass zunächst wie gewünscht das Bit gelöscht wird. Beim
Wiederherstellen der COM1Ax-Bits wird aber auch der vorige Zustand
hergestellt. Das Bit soll aber bis zum nächsten Compare Match gelöscht
bleiben. Der Prozessor soll folgendes machen:

1) Jede Sekunde wird ein Timer1-Compare-Interrupt ausgelöst und OC1
gesetzt.

2) In der Interrupt-Routine werd über einen 8-Bit-Bus (PortB) die Daten
von 4 externen 8-Bit-Zählern abgeholt, die durch OC1 auf "Hold"
geschaltet worden sind.

3) Nachdem die Daten verarbeitet worden sind, soll OC1 gelöscht werden,
so dass der "Hold" beim zum nächsten Timer1-Interrupt ermöglicht
wird.

Mein Datenblatt von 06/02 (.pdf-Datei) scheint das Schema richtiger
wiederzugeben. Dort gibt es eine Leitung von einem "Output Mode
Select" direkt zu einem AND-Buffer, der zusammen mit (COM1A1 OR
COM1A2) PB3 treibt. Dieses Signal müsste man löschen bzw. manipulieren,
ohne den Compare abzuschalten. Mir scheint aber, dass es keinen Zugriff
auf das Signal gibt.

Also muss ich wohl halb-sekündlich toggeln. Wenn ich an die
Rechenarbeit zur Kalibrierung denke ... :-(

Vielen Dank nochmal für Eure Hilfe!

viele grüße
ralph

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.