Forum: Mikrocontroller und Digitale Elektronik Frage zu Portpinabfrage bei PWM


von Dennis (Gast)


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

von yalu (Gast)


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.

von yalu (Gast)


Lesenswert?

"sinst" ist die Abkürzung für "sind sonst" :)

von yalu (Gast)


Lesenswert?

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

von Dennis (Gast)


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

von Dennis (Gast)


Lesenswert?

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

von yalu (Gast)


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.

von Dennis (Gast)


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

von yalu (Gast)


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:
1
  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:
1
#include <avr/io.h>
2
3
int main(void) {
4
  DDRD = 1<<PD7;          // OC2 als Ausgang schalten
5
  DDRC = 1<<PC0;          // PC0 als Ausgang schalten 
6
  TCCR2 = 0x61;           // phase correct PWM, no prescaling
7
  OCR2 = 85;              // Tastverhältnis 1/3
8
9
  for(;;) {
10
    if(PIND & (1<<PD7))   // Wenn OC2 high ist,
11
      PORTC &= ~(1<<PC0); // PC low setzen,
12
    else                  // sonst
13
      PORTC |= 1<<PC0;    // PC0 high setzen
14
  }
15
  return 0;
16
}

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.

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.