www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ausgang einlesen ATmega32


Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Holger M. (nezaya)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Holger M. (nezaya)
Datum:

Bewertung
0 lesenswert
nicht 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.ä.

Autor: Dieter (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Holger M. (nezaya)
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...hab leider die gegenteilige Erfahrung gemacht.

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.