Ausgang einlesen ATmega32

Gast #393752
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?
#393754
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
Gast #393755
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!
Gast #393758
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).
Gast #393759
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?
Gast #393761
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...
Gast #393763
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.
Gast #393764
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".
Gast #393765
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...)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren