mikrocontroller.net

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


Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.