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:
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.