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
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
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
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!
:
Bearbeitet durch User
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
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
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
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). |
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
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
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.
:
Bearbeitet durch User
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. :)
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.