Hallo, mein mega32 gibt auf PortD4 ein PWM aus. Dazu muss ich noch einen Puls generieren, der kurz vor der steigenden Flanke des PWM beginnt und kurz danach auch schon wieder endet. Jetzt ist die PWM ziemlich schnell, deshalb hab ich folgendes gemacht: 1. PWM laeuft mit 200kHz völlig asynchron (Fast-PWM, Timer1) 2. irgendwann mal möchte ich den Puls generieren und aktiviere den CompareA1-Interrupt. In der ISR warte ich solange bis PIND.4 auf Low ist, erkenne ich das, setze ich den Puls high, wenn PIND.4 wieder high wird setze ich den Puls low. Das ganze funktioniert mehr oder weniger nach dem Zufallsprinzip. Frage: Kann ich den Zustand des Ausgangs PORTD.4 ueber PIND.4 wieder einlesen ???? Oder anderst gefragt: Werden die Bits von PIND gesetzt/gelöscht, wenn sie als Ausgang betrieben werden?
Nein. Aber du kannst den Pin über PORTD.4 wieder einlesen. Das spiegelt dann den gesetzten Zustand an diesem Port wieder.
Hallo Also deiner obigen Ausführung kann ich leider nicht ganz entnehmen was du tun willst. Viellicht kannst du das mal etwas klarer darstellen. Warten in einer ISR halte ich auch für bedenklich. Aber jetzt zur Frage: Ja die Bits von PIND werden gesetzt, auch wenn er als Ausgang betrieben wird. Die haben normalerweise den selben Zustand wie das PORTD Register. Aber dann kannst du natürlich auch direkt PORTD lesen. Holger
Als Hintergrund: Das PWM-Signal dient als Clock fuer ein 1-Zeilen-CCD. Um das auszulesen muss man waehrend einer steigenden Clock-Flanke einen Puls generieren... Das PINx Register ist mir bei den Atmel ein Rätsel!!! Aber gut... Mir kam noch eine weitere Idee... Ich kann ja das Timer-Register mit dem Compare-Register vergleichen, dann seh' ich auch, was draussen los sein muesste. Das scheint auch soweit zu funktionieren. @Karl Heinz: Sorry, dieser Beitrag wurde 2 mal ins Forum gepustet, sollte nicht sein. Danke fuer den Hinweis!
Interessehalber, was ist das denn für eine CCD Zeile? Ich hab nämlich grade Code für eine iC-LFL1402 auf einem Mega32 erstellt. Allerdings ohne PWM, Interrupts o.ä.
Es handelt sich um ein TSl108 von TAOS. Hat 512 Dots mit ca. 65mm Länge.
> Das PINx Register ist mir bei den Atmel ein Rätsel!!! Rätsel sind da, um gelöst zu werden. Bei den meisten AVRs ist das PINx-Register ein Read-Only-Register, das den aktuellen Zustand am Pin wiedergibt, allerdings synchronisiert mit dem Systemtakt, damit es nicht zu "Metastabilität" beim Auslesen kommt, wenn man grad auf einer Flanke einliest. Bei einigen neueren AVRs (wenn ichs recht im Kopf habe, dann ist das z.B. die ATMega48/88-Reihe) kann man diese Adressen im I/O-Space auch schreiben. Das Hineinschreiben einer '1' hat dann zur Folge, dass der betreffende Pin getoggelt (also umgeschaltet) wird. Der Sinn dieses Registers liegt einfach darin, dass man unabhängig vom Zustand des Porttreibers den Pinzustand abfragen kann, der sich ja vom Zustand des Porttreibers durchaus unterscheiden kann (z.B. Eingang mit Pull-Up, extern auf Masse gezogen: PORTx.n = 1, PINx.n = 0).
Genau diesen Sinn vermisse ich aber. Wenn der interne PWM-Generator ein high rausschreibt und das draussen auch ankommt, sollte das PINx Reg. das doch bitte uebernehmen, selbst wenn der Port grade Ausgang ist. Ich bin aber sowieso kein Freund von so dubiosen Mehrfachfunktionen,... das endet doch meist in Bugs. @Holger: Wer ist Hersteller der iC-LFL1402 Zeile ? Wieviel Dots hat sie und wie lang ist sie?
> Wenn der interne PWM-Generator ein high rausschreibt und das draussen > auch ankommt, sollte das PINx Reg. das doch bitte uebernehmen, selbst > wenn der Port grade Ausgang ist. Genau das tut es auch! Zitat aus Datenblatt von ATMEL: Independent of the setting of Data Direction bit DDxn, the port pin can be read through the PINxn Register bit. Also sollte das eigentlich funktionieren...
...hab leider die gegenteilige Erfahrung gemacht. Erst seit ich den Registervergleich durchführe funktioniert mein Puls sicher.
Was man dabei natürlich beachten muss, ist, dass PINx synchrinisiert mit dem Systemtakt ist. Da kann es u.U. zu unerwünschten Nebeneffekten kommen! Evtl. mal die Timing-Diagramme zu Rate ziehen.
> Independent of the setting of Data Direction bit DDxn, the port > pin can be read through the PINxn Register bit. Andererseits: If one or both of the COM1B1:0 bit are written to one, the OC1B output overrides the normal port functionality of the I/O pin it is connected to. Das Lesen des Zustandes über das PINx-Register ist doch Teil der "normal port functionality".
Wie ist das eigentlich mir OCR1B? Könnte damit nicht einfach ein Interrupt ausgelöst werden (so bei Halbzeit von OCR1A=TOP oder ICP1=TOP)? Dann bräuchte man nur die erzeugten Impulse zählen, und bei bestimmten Werten den Datenausgang hochsetzen und bei der nächsten Periode wieder herunter. Zumindest habe ich so das Datenblatt zum TSL208 (das des TSL108 habe ich nicht gefunden) verstanden (eine "1" wird 512 Mal weitergetaktet). Ansonsten würde ich statt des Fast-PWM-Mode den CTC-Mode benutzen... (@Johnny: Der Unterschied zwischen dem CTC-Mode und den anderen PWM-Modi ist die Pufferung. Beim CTC gibt es sie nicht. Soviel zu dem anderen Thread, in dem etwas derartiges diskuttiert wurde...)
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.