mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Portpinabfrage bei PWM


Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ist es möglich, bei einem Atmega32 einen der PWM-Portpins (OC0 bis OC2) 
während der Phase-Correct-PWM auf High oder Low abzufragen?! Die 
einzelnen Portpinregister (für Pnx) sind ja gesperrt..?!
Oder bin ich gezwungen, das Ausgangssignal auf einen anderen 
Eingangsportpin zu legen, damit überhaupt eine Abfrage möglich ist?


Vielen Dank für jede Antwort!


Dennis

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, siehe dazu

  Bild 26 "Alternate Port Functions"
  Tabelle 27 "Overriding Signals for Alternate Functions in PB3..PB0"
  Tabelle 32 "Overriding Signals for Alternate Functions in PD7..PD4"

Die DIEOE-Leitungen der OCx-Pins liegen statisch auf 0, damit wird die
standardmäßige Aktivierung/Deaktivierung der Eingänge nicht außer Kraft
gesetzt. Standardmäßig heißt: Die Eingänge werden nur im Sleep-Zustand
deaktiviert und sinst sonst immer nutzbar.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"sinst" ist die Abkürzung für "sind sonst" :)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und das "ja" bezog sich auf deine erste Frage (bin gerade etwas 
schusselig)

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, dann würde das ja bedeuten, dass man sie über z.B. das Bit PD7 
abfragen kann. Aber in meinem schlauen Buch steht, dass das nicht geht. 
Und probiert habe ich es auch schon ... geht echt nicht?! :-O

Oder habe ich Dich nun verkehrt verstanden?


Danke!

Dennis

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe das gerade nochens probiert. Das geht echt nicht..^^

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Okay, dann würde das ja bedeuten, dass man sie über z.B. das Bit PD7
> abfragen kann. Aber in meinem schlauen Buch steht, dass das nicht
> geht. Und probiert habe ich es auch schon ... geht echt nicht?! :-O

Ich hab's nicht ausprobiert, sondern nur nachgelesen, aber die
Informationen im Datenblatt erschienen mir relativ eindeutig, so dass
ich eine Antwort gewagt habe, ohne es nachgeprüft zu haben ;-)

Vielleicht haben wir uns aber auch nur missverstanden: Über welches
I/O-Register wolltest du OC2 (PD7) abfragen?

Über Bit 7 von PORTD geht sicher nicht. Darin steht nur das, was bei
irgendeinem früheren Schreibzugriff hineingeschrieben wurde. Mit OC2 hat
also der Inhalt nichts zu tun.

Ich meinte aber, aus dem Datenblatt herauslesen zu können, dass man den
Zustand von PD7 über Bit 7 von Register PIN7 lesen kann, da der Eingang
im wachen Zustand des Controllers immer aktiv ist. Dem Eingang ist es
egal, von welcher Quelle das Signal kommt, ob vom PORTD-Register, vom
OC2 oder von extern. Da das PORTD-Register im PWM-Modus nicht zum
Ausgang durchgeschaltet ist und hoffentlich kein externes Signal am
Ausgang anliegt, sollte man also OC2 lesen können. Zu beachten ist
allerdings die Verzögerungszeit von 0,5 bis 1,5 Taktzyklen bei allen
Eingängen. Man wird also eine Pegeländerung erst nach dieser Zeit
erkennen können.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Register Pin7? Du meinst das Bit 7 von PIND, oder?
Geht aber auch nicht. Aber vielleicht habe ich da auch was falsch 
gemacht.

Wie würdest Du denn in C die Abfrage machen?


Grüße und Danke für den Support! ;)


Dennis

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist zwar schon zwei Tage her, aber vielleicht trotzdem noch von
Interesse:

> Register Pin7? Du meinst das Bit 7 von PIND, oder?

Ja, das war ein Schreibfehler, statt PIN7 sollte es PIND heißen.

> Wie würdest Du denn in C die Abfrage machen?

Die Abfrage geschieht wie üblich durch Maskieren:
  if(PIND & (1<<PD7) ...

Um zu testen, ob auf diese Weise der Zustand von OC2 gelesen werden
kann, habe ich auf einen ATmega32 folgendes Progrämmchen aufgespielt:
#include <avr/io.h>

int main(void) {
  DDRD = 1<<PD7;          // OC2 als Ausgang schalten
  DDRC = 1<<PC0;          // PC0 als Ausgang schalten 
  TCCR2 = 0x61;           // phase correct PWM, no prescaling
  OCR2 = 85;              // Tastverhältnis 1/3

  for(;;) {
    if(PIND & (1<<PD7))   // Wenn OC2 high ist,
      PORTC &= ~(1<<PC0); // PC low setzen,
    else                  // sonst
      PORTC |= 1<<PC0;    // PC0 high setzen
  }
  return 0;
}

In der Endlosschleife wird laufend das an PD7 über PIND gelesene Signal
invertiert¹ auf PC0 ausgegeben. Mit dem Oszi kann man tatsächlich an PC0
das invertierte Signal von PD7 erkennen, mit einer Verzögerung von ein
paar Taktzyklen, die durch die Schleifenlaufzeit und den Latch-Mechanis-
mus der Eingangsschaltung von PD7 erklärbar ist.

> Geht aber auch nicht. Aber vielleicht habe ich da auch was falsch
> gemacht.

Jetzt weißt du ja, dass und wie es geht. Falls immer noch Probleme
auftreten, kannst du ja dein Testprogramm posten.

¹) invertiert deswegen, um sicher zu gehen, dass die Übertragung des
Signals von PD7 nach PC0 tatsächlich durch die Software und nicht durch
Schaltungsprobleme (Kurzschluss oder Übersprechen) erfolgt.

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.