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
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.
Und das "ja" bezog sich auf deine erste Frage (bin gerade etwas schusselig)
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
Also ich habe das gerade nochens probiert. Das geht echt nicht..^^
> 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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.