Hallo NG, gibt es die Möglichkeit, über PWM einen Takt für einen am MC angeschlossenen IC zu erzeugen? Wenn dem so wäre gibt es auch eine Möglichkeit zu erfahren, wie es gerade auf dem PWM-Ausgang aussieht (high oder low)? Danke für jede Hilfe, Peter
>gibt es die Möglichkeit, über PWM einen Takt für einen am MC >angeschlossenen IC zu erzeugen? Ja. >Wenn dem so wäre gibt es auch eine Möglichkeit zu erfahren, wie es >gerade auf dem PWM-Ausgang aussieht (high oder low)? Ja.
Aha, gibt es da was zu beachten? Hast Du vielleicht ein Beispiel?
>Aha, gibt es da was zu beachten? Vieleicht. >Hast Du vielleicht ein Beispiel? Nein.
Nun ja, er hat umfassend und vollständig geantwortet, in Anbetracht der von dir gegebenen Informationen :-)
Habe gerade den Titel gesehen, also du hast zumindest schonmal die Microcontrollerfamilie angegeben, hatte ich eben übersehen, daher kann man schon etwas mehr antworten: Den AT91SAM7S128, den ich kenne, hat einen PWM-Controller. Den kann man so programmieren, daß er neben dem PWM-Ausgang auch einen Interrupt generiert, sodaß du zumindest den Anfang einer Periode mitbekommst (und ich glaube man könnte auch auf den Flankenwechsel einen Interrupt programmieren). Wenn du zu beliebigen Zeitpunkten den Status abfragen willst, wäre es am einfachsten, den Ausgang noch auf einen freien Port reinzugeben und den dann einfach auszulesen (ich glaube man kann den Port, der als PWM-Function geschaltet ist, nicht einlesen). Die Frequenz darf aber nicht zu hoch sein, sonst wird das nicht gehen. Warum brauchst du das denn? Meist sind externe Chips ja per SPI o.ä. angeschlossen.
Ja. Mit PWM kannst du hardwaremäßig nur durch 2^n teilen, wenn du einen Takt erzeugen willst. Die PWM wird auf 50% Tastverhältnis eingestellt. Fclk/2, Fclk/4 Fclk/8 Fclk/16 ... Vielleicht gibt es ja auch einen uP bei dem man den PWM-Mastertakt mit beliebigem Teilerfaktor aus dem Quartztakt erzeugen kann.
Helmut S. schrieb: > Mit PWM kannst du hardwaremäßig nur durch 2^n teilen, wenn du einen Takt > erzeugen willst. Die PWM wird auf 50% Tastverhältnis eingestellt. > > Fclk/2, > Fclk/4 > Fclk/8 > Fclk/16 > ... > > > Vielleicht gibt es ja auch einen uP bei dem man den PWM-Mastertakt mit > beliebigem Teilerfaktor aus dem Quartztakt erzeugen kann. Ja, geht mit der AT91SAM7-Famílie (siehe Titel des Postings). Diese Chips haben ein Capture Compare Register, sodaß man auch viele andere beliebige ganzzahlige Teiler hinbekommt.
PWM generieren mit 1 MHz ist kein Problem, aber kommt drauf an, was du sonst noch machen willst. Wenn du z.B. 55 MHz maximalen internen Takt verwendest, dann wird es eng per Interrupt, wegen Latenz und bei 55 Takten pro PWM-Takt kann man auch nicht allzuviel Code schreiben. Also in einer Endlosschleife einen Port-Pin testen, wo das Singal wieder reinkommt. Timings vorher anschauen, ob der PIO so schnell ist. Was willst du denn machen, vielleicht gibt es Alternativen?
...also eigentlich möchte ich einen "externen" Chip Takten (SID 8580). Der benötigt 1MHz. Ich muss nicht die ganze Zeit testen, ob der Pegel gerade high oder low ist. Ich brauche das eigentlich nur, wenn ich Daten an den Chip schicke... Benötigen die 1MHz PWM denn auch Rechenpower (wenn man nicht einen Interrupt verwendet, der immer was ausführt...). Es soll wirklich nur die Taktquelle sein, solange ich nichts "schreibe"...
Der PWM braucht keine Rechenpower, läuft parallel zum Programm in Hardware ab. Aber brauchst du wirklich den Status des Taktsignals zu messen? Hier ist ein Timing-Diagramm am Ende: http://www.sidmusic.org/sid/sidtech3.html für den Schreibzyklus und das steht nichts von einer Maximalzeit. Also Chipselect initial auf High, Adress- und Datenleitung auf Ausgang, r/w permanent auf low. Dann die Adresse- und Datenleitungen auf Ausgang setzen und das zu programmierende Register setzen. Dann Chipselect auf low, etwas warten (mindestens ein SID-Takt), chipselect wieder auf high und das Register sollte eigentlich beschrieben sein. Mit einem AT91SAM7 macht aber ein SID als externer Chip meiner Meinung nach keinen Sinn, da der bei 55 MHz schnell genug ist, daß man das in Software emulieren kann, notfalls auch mit Code aus dem VICE-Projekt einen original SID, mit Filter usw., falls du einen Chip-Tune Player bauen willst :-) Aber viel interessanter wäre es, selbst so eine Soundsynthese zu entwickeln.
Hallo Frank Buss, danke für Deine Beiträge. Ich habs schon mal probiert mit der Emulation im ARM komplett. Die ausgabe funktioniert auch schon. Allerdings ohne Filter. Selbst ohne Filter hat er es nicht geschafft, die Daten mit 44KHz zu erzeugen. Also ich bezweifle, dass das geht. Zumal man ja den 6510 auch noch emulieren muss. Zugegeben, das ist kein Hexenwerk, aber in der Summe wirds mit 55MHz schon sehr eng. Also wenn, dann denk ich geht das nur in 100% Assembler mit viel Gefühl fürs Optimieren... MfG Peter
Hallo, werde jetzt dann gleich mit dem Löten loslegen. Wäre klasse, wenn noch jemand ein Beispiel hätte, wie ich auf PA0, PA1 oder PA2 ein PWM mit 1MHz hinbekomme (brauche keine Interrupts. Soll nur "schwingen")... Vielen Dank schon mal, Peter
Welche Entwicklungsumgebung hast du denn? Oder ein Dev-Kit mit Linux? Da wäre glaube ich ein PWM-Treiber bereits enthalten. Standlone geht natürlich auch. Dazu bietet Atmel eine große Auswahl an fertigen Beispielen. Hast du dir schonmal das Software Package hier angesehen? http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4343 Dort drin unter packages\basic-pwm-project-at91sam7s-ek-*.zip findes du ein fertiges Beispiel für verschiedene Compiler. Brauchst nur noch die Frequenz in dem define zu ändern und schon sollte es laufen (ggf. noch anpassen an dein Board). Oder die Teile rauskopieren, die für dich interessant sind, wenn du schon eine Entwicklungsumgebung hast.
Also ich verwende yagarto. Hab das Demo-Projekt schon gesehen. Allerdings hab ich es noch nicht auseinandergenommen. Ich habe nur gesehen, dass die wohl per Interrupt die PWM ändern, so dass die LED "einblendet" und "ausblendet"... Aber wie gesagt. Wenig Zeit und ziemlich müde :-) Also am liebsten wäre mir <pseudocode> Watchdog aus PWM an Pin pa0 PWM 1MHz PWM start </pseudocode> MfG Peter
Den Interrupt-Code brauchst du ja nicht. Ein wenig mehr Eigeninitiave musst du aber schon zeigen, sonst kannst du das Projekt ja gleich an einen professionellen Entwickler in Auftrag geben :-)
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.