Hallo.
Ich versuche seid einigen Tagen mti einem ATmega328P den Timer0 im CTC
Modus zu betreiben.
EIgentlich läuft das schon soweit, nur ich möchte über OCR0B den
dazugehörigen Portpin schalten.
Allerdimgs bekomme ich das nocht hin. Der Timer läuft, da ein am ANfang
der Routine auf high geschalteter Portpin am Ende wieder auf low
geschaltet wird.
Ich evrsuche mit dem ganzen mein Autoradio etwas zu erweitern. Es
handelt sich hierbei um ein Alpine Autoradio mit AiNet (der Bus, über
denm Erweiterungen gesteuert werden).
Dieser Bus arbeitet mit einem Pulsweitenkodierten Signal.
Der Empfang klappt einwandfrei. Nur das generieren eines Sendesignal
geht nicht mit OCR0B.
Kannn ich OCR0B-out überhaupt im CTC Mode nutzen? Würde ja sonst
eigentlich keinen Sinn machen...
Falls jemand mal auf den Code schauen würde/möchte, wäre das echt toll.
Bin aber nicht der beste Programmierer, also habt Nachsicht mit meinem
Programmierstil.
Arno Nüm schrieb:> nur ich möchte über OCR0B den> dazugehörigen Portpin schalten.
Im CTC Modus ist nur OCR0A aktiv. Es kann den OC0A Pin toggeln
(Polarität wechseln) und/oder einen Interrupt auslösen. Wenn du jetzt
schon OC0B verdrahtet hast und das nicht mehr ändern kannst, müsstest du
in der ISR für OCRA Compare Match den Pin händisch toggeln.
Du kannst auch auf einen PWM Modus ausweichen, indem du dann OCR0B
benutzen kannst.
Dein Archiv packe ich jetzt nicht aus, aber im DB steht eigentlich auch
alles dazu.
Hallo und Danke für Deine Antwort.
Das ist leider das, womit ich auch gerechnet habe.
Werde mich dann nochmal mit dem DB beschäftigen.
Hatte das schonmal so am laufen, das der Level Pin dann in der ISR
geändert wurde. vielleicht lasse ich das dann auch so.
Das mit dem OCR0B steht ja auch nicht im DB drin beim CTC Modus...
Viele Grüsse
Jürgen
EDIT:
Frei nach dm Motto 'kaum macht man es irchtig, funktioniert es sogar'
habeich jetzt auf den Fast PWM Mode gewechselt. Die restlichen
Schwachstellen bekomme ich hoffnetlich hin.
Arno Nüm schrieb:> Das mit dem OCR0B steht ja auch nicht im DB drin beim CTC Modus...
Ist ja auch Quatsch, was Matthias da geschrieben hat. Du kannst OCR0B
und "seinen" Pin genauso zum Toggeln verwenden. Nur das Timer-TOP wird
natürlich trotzdem über OCR0A festgelegt.
Softwaremässig funktioniert das ja auch. Der IRQ feuert und alles ist
gut...
Nur kann ich den PORTD5 nicht mit OCR0B verbinden.
Im Fast PWM Modus geht das einwandfrei. Hätte ich nur eher drauf kommen
können.
Ich habe ja sogar selbst schon mehrfach die Erfahrung gemacht, was nicht
im DB drinsteht geht auch nicht. Es wird nicht explizit gesagt, was
nicht geht, sondern nur das, was geht.
EDIT: Ich wil OCR0B nicht toggeln!
Arno Nüm schrieb:> Nur kann ich den PORTD5 nicht mit OCR0B verbinden.
Das geht natürlich nicht. Jeder OCR0x hat seinen "eigenen" Pin.
Was genau ist dann überhaupt dein Problem? Wenn du PORTD5 toggeln
willst, warum willst du dann dafür überhaupt OCR0B verwenden, und nicht
OCR0A?
EDIT: Dein OP ist überhaupt sehr missverständlich.
Du schreibst
> nur ich möchte über OCR0B den dazugehörigen Portpin schalten
aber in Wirklichkeit geht es um PD5.
Du schreibst
> Timer0 im CTC Modus zu betreiben
und später heißt es dann
> Pulsweitenkodierten Signal
Stefan Ernst schrieb:> Wenn du PORTD5 toggeln> willst, warum willst du dann dafür überhaupt OCR0B verwenden, und nicht> OCR0A?
Weil du anscheinend nicht weisst, Stefan, das PD5 OC0B als alternative
Pinfunktion hat.
@TE: Gut, Stefan behauptet, das OCR0B auch im CTC Mode aktiv ist ist.
Dann probier es doch mal aus, indem du OCR0A mit dem gewünschten TOP
Wert vorlädst und OCR0B mit einem kleineren. Output von OCR0B routest
mit den COM0Bn Bits auf den Pin. Schau mal, ob da was passiert.
Ich möchte, das bei compoare B der PORTD5 auf 0 gesetzt (geht ja
automatisch im richtigen Timer Modus) und beim compare A wieder auf 1.
In der ISR werden dann die Werte für OCR0B gesetzt um den
Pulsweitenkodierten Datenstron zu erzeugen.
Ich habe es aber jetzt raus. Hängt nur noch nach dem Senden. Ist aber
nur ein Statusproblem, da das serielle Echo in der while-Schleife geht.
OCR0A bestimmt die Periodenzeit und OCR0B das Tastverh#ltnis, da ja
PWM-Kodierter Datenstrom.
Ich hänge mal einem Screenshot von einem Dtaentelegramm mit Ack an. Die
Spikes sind noch zu klären...
EDIT: Oebn im Screenshot ist TX, mitte ist RX, unten ist Mode, was den
Transceiver umschalktet.
EDIT2:
>@TE: Gut, Stefan behauptet, das OCR0B auch im CTC Mode aktiv ist ist.>Dann probier es doch mal aus, indem du OCR0A mit dem gewünschten TOP>Wert vorlädst und OCR0B mit einem kleineren. Output von OCR0B routest>mit den COM0Bn Bits auf den Pin. Schau mal, ob da was passiert.
Das geht nicht. Ist doch der Grund für diesen Thread. CTC kann wohl nur
Frequenzen erzeugen. Ein schlichtes ändern der WG Bits auf Fast PWM
lässt das ganze wie gewpnscht funktionieren. Incl. Ausgabe an PORTD5.
Beim CTC funzt die Ausgabe am Portpin einfahc nicht. Der OCR0B-IRQ
feuert aber.
Matthias Sch. schrieb:> Weil du anscheinend nicht weisst, Stefan, das PD5 OC0B als alternative> Pinfunktion hat.
Ach mist, jetzt hat er mich mit dem "Ich wil OCR0B nicht toggeln!" ganz
durcheinander gebracht. Ich dachte er meint doch OC0A, und nicht OC0B.
Matthias Sch. schrieb:> @TE: Gut, Stefan behauptet, das OCR0B auch im CTC Mode aktiv ist ist.
Warum sonst sollte dies im Datenblatt stehen:
1
When OC0B is connected to the pin, the function of the COM0B1:0 bits depends on the
2
WGM02:0 bit setting. Table 15-5 shows the COM0B1:0 bit functionality when the WGM02:0 bits
Arno Nüm schrieb:>>Dann probier es doch mal aus, indem du OCR0A mit dem gewünschten TOP>>Wert vorlädst und OCR0B mit einem kleineren. Output von OCR0B routest>>mit den COM0Bn Bits auf den Pin. Schau mal, ob da was passiert.> Das geht nicht.
Doch, DAS geht.
Das ganze Problem hier ist, dass du sinngemäß schreibst "kann OCR0B im
CTC-Mode nicht mit PD5 verbinden" (was Quatsch ist), aber eigentlich
meinst du "kann mit CTC kein PWM erzeugen".
Da steht aber auch (Seite 95 unten, unter Figure 15-5)
> For generating a waveform output in CTC mode, the OC0A output> can be set to toggle its logical level on each compare match> by setting the Compare Output mode bits to toggle mode> (COM0A1:0 = 1).
Und eben kein Wort von OC0B. Da habe ich rausgelesen, das es nur mit
OC0A geht - und scheint ja auch so zu sein. Man könnte natürlich in der
ISR den Pin toggeln, aber wenn es mit PWM ganz simpel geht, ist das ja
o.k.
Matthias Sch. schrieb:> das es nur mit> OC0A geht - und scheint ja auch so zu sein.
Definitiv nicht.
Das Datenblatt scheint in den Beschreibungen diesbezüglich aber wirklich
ziemlich inkonsequent zu sein. Über dem Absatz ist ja noch ein
Timing-Diagramm, und darunter eine Formel.
Timer 0:
Timing-Diagramm: OCn und OCnx
Text: OC0A
Formel OCnx
Timer 1:
Timing-Diagramm: OCnA
Text: OC1A
Formel OCnA
Timer 2:
Timing-Diagramm: OCnx
Text: OC2A
Formel OCnx
Das zeigt hier wieder einmal, wie schwierig es ist, ein techisches
Problem korrekt zu umschreiben. :(
Ich war mit ziemlich sicher, das alle verstehen, was ich will. Aber
jeder hat die Frage etwas anders aufgefasst.
Ich für mich gehe jetzt auf alle Fälle davon aus, das im CTC OCR0B nur
als Interrupt funktionert und nicht als alternative Funktion auf PORTD5
genutzt werden kann. Der Beweis ist ja, wie oben schon geschrieben, das
Fast PWM mit allen anderen identischen Werten Funktioniert. Habe beim
Initalisieren nur die 3 WGM Bits geändert.
Wenn ich mir den Zweck (erzeugen von Frequenzen - nicht PWM) des CTC
Modus ansehe, dann leuchtet das für mich auch ein. :D
Hinterher macht alles Sinn... :)
Arno Nüm schrieb:> Der Beweis ist ja, wie oben schon geschrieben, das> Fast PWM mit allen anderen identischen Werten Funktioniert. Habe beim> Initalisieren nur die 3 WGM Bits geändert.
Ohne Code beweist das gar nichts. Der Code im ZIP kann es ja nicht sein,
denn dort sind alle COM-Bits auf 0. Da würde sich auch im PWM-Mode
nichts an den Pins tun. Ich vermute eher, dass in deinem "Beweis-Code"
OCR0B > OCR0A ist.
Sobald ich in meinem oben angehängten Code die WGM Bits ändere geht die
Ausgabe von OCR0B an PORTD5.
Läuft aufgrund einiger Fehler noch nicht glatt durch, aber die Ausgabe
ist da.
Deine Vermutung ist falsch.
Stefan Ernst schrieb:> Der Code im ZIP kann es ja nicht sein,> denn dort sind alle COM-Bits auf 0.
Sag nichts. Ich sehe schon, da stecken Änderungen der COM-Bits in den
Makros.
Arno Nüm schrieb:> Deine Vermutung ist falsch.
Mag sein. Aber deine OCR0B-PD5-Verbindung ist ein
Clear-On-Compare-Match. Was soll sich da im CTC-Mode am Pin auch schon
tun. Mach daraus ein Toggle, und dann sag mir nochmal, dass sich am Pin
nichts tut.
Aber wenn ich toggle habe ich nur eine Frequenz mit einem Tastverhältnis
von 50:50, oder nicht?
Ich brauche aber ein setzen bei TCNT0 = 0 und ein rücksetzen bei TCNT0 =
OCR0B mit überlauf bei OCR0A.
Vielleicht versuche ich das morgen mal, da es aber mit Fats PWM geht
habe ich nicht viel ntrieb dazu.
Da es ohne andere Bits ,ausser WGM, zu ändern geht liegt der Fehler a
falschen Timer Modus. Fertig für mich. :)
Einen Herzlichen Dank an alle, die hier mitgemacht haben.
Ist oft (r)echt hilfreich, wenn man sich mit anderen einfach nur
austauscht.
Arno Nüm schrieb:> Aber wenn ich toggle habe ich nur eine Frequenz mit einem Tastverhältnis> von 50:50, oder nicht?
Richtig.
Arno Nüm schrieb:> Ich brauche aber ...
Es geht doch aber gar nicht mehr um das, was du eigentlich bezwecken
wolltest. Es geht um eine grundsätzliche Frage, und um deine Behauptung,
dein Code würde bezüglich dieser grundsätzlichen Frage etwas beweisen.
Dann wünsch eich euch noch viel Erfolg bei der weiteren
Grundsatzdiskussion.
EDIT:
Für mich geht es in meinem_ Thread primär um _mein Problem! Dafür habe
ich den eröffnet. :)