Forum: Mikrocontroller und Digitale Elektronik ATmega328P, Timer0, OCR0B an PORTD5 geht nicht


von Arno N. (jjuueerrggeenn)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von Arno N. (jjuueerrggeenn)


Lesenswert?

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.

: Bearbeitet durch User
von Stefan E. (sternst)


Lesenswert?

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.

von Arno N. (jjuueerrggeenn)


Lesenswert?

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!

: Bearbeitet durch User
von Stefan E. (sternst)


Lesenswert?

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

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von Arno N. (jjuueerrggeenn)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von Stefan E. (sternst)


Lesenswert?

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
3
are set to a normal or CTC mode (non-PWM).

von Stefan E. (sternst)


Lesenswert?

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

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von Stefan E. (sternst)


Lesenswert?

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

von Arno N. (jjuueerrggeenn)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Arno N. (jjuueerrggeenn)


Lesenswert?

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.

: Bearbeitet durch User
von Stefan E. (sternst)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von Arno N. (jjuueerrggeenn)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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.

von Arno N. (jjuueerrggeenn)


Lesenswert?

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

: Bearbeitet durch User
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.