Hallo,
ich habe ein Problem mit der Nulldruchgangerkennung von 230V/50Hz.
Erkennen tu ich die hardwaremäßig wie in dem beigefügten Schaltplan. Das
Oszibild habe ich an den Messpunkten gemacht wie im Schaltpan
eingezeichnet.
So...
Verwenden tu ich ein Atmega644, der Interrupteingang ist der INT0, also
PD2.
Jetzt will ich Anhand Software im ersten Schritt den Nulldurchgang an
der fallenden Flanke des Eingangs erkennen und eine Zahl auf 100
hochzählen, so müsste ich dann, da alle 10ms die Flanke kommt, 1HZ
erzeugen. Doch dieses scheint nicht zu funktionieren. Die Ausgabe an
UART ist wesentlich mehr als im 1HZ Zyklus. (Habe auch schon eine
grössere Zahl ausprobiert >1000, immer noch zu schnell) Wo mache ich
denn da noch was falsch? Ich würde sagen das meine Hardware richtig ist.
Laut Oszilloskop.
Entprellen würde ich laut Oszi auch nicht vermuten, das dass ein Problem
ist....
Hier mein Code:
Dieses hier über int main(void){
1 | // Deklaration der Countvariablen
|
2 |
|
3 | volatile uint8_t testcINT =0;
|
Dieses hier unter int main(void){
1 | ////////////////////////////////////////////////
|
2 | //INTerrupt konfigurieren
|
3 |
|
4 |
|
5 | MCUCR |= (1<<ISC01); // Int auslösen bei fallender Flanke
|
6 | EIMSK |= (1<<INT0); // External Interrupt 0 Enable PIN PD2
|
7 |
|
8 |
|
9 | //Globale Interrupts einschalten
|
10 | sei();
|
Dieses hier in der while-Schleife
1 | if (testcINT >= 100)
|
2 | {
|
3 | usart_write_str("1HZ");
|
4 | testcINT = 0;
|
5 | }
|
Und am Ende dann der Interrupt
1 | }//while (1) Ende
|
2 |
|
3 | return(0);
|
4 | }
|
5 |
|
6 | //==========================================
|
7 | //Interrupt 0
|
8 | //==========================================
|
9 | ISR(INT0_vect)
|
10 | {
|
11 | testcINT++;
|
12 |
|
13 | }
|