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