Forum: Mikrocontroller und Digitale Elektronik Ausgang einlesen ATmega32


von Dieter (Gast)


Lesenswert?

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?

von Karl heinz B. (kbucheg)


Lesenswert?

Nein.
Aber du kannst den Pin über PORTD.4 wieder einlesen.
Das spiegelt dann den gesetzten Zustand an diesem Port
wieder.

von Holger M. (nezaya)


Lesenswert?

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

von Dieter (Gast)


Lesenswert?

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!

von Holger M. (nezaya)


Lesenswert?

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

von Dieter (Gast)


Lesenswert?

Es handelt sich um ein TSl108 von TAOS.
Hat 512 Dots mit ca. 65mm Länge.

von johnny.m (Gast)


Lesenswert?

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

von Dieter (Gast)


Lesenswert?

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?

von Holger M. (nezaya)


Lesenswert?

Hersteller www.ichaus.de
256 Dots auf knapp 2cm, BGA Gehäuse

von johnny.m (Gast)


Lesenswert?

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

von Dieter (Gast)


Lesenswert?

...hab leider die gegenteilige Erfahrung gemacht.

Erst seit ich den Registervergleich durchführe funktioniert mein Puls
sicher.

von johnny.m (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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

von inoffizieller WM-Rahul (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.