Frage zur Nulldurchgangserkennung mit Interrupt

OP #2237102
Lesenswert?

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
}
Angehängte Dateien:
OP #2237113
Lesenswert?

Laut Datenblatt:

"When the external interrupt is enabled and is configured as level 
triggered, the interrupt will trigger as long as the pin is held low"

Drei mal durchgelesen, warum sehe ich das nicht beim ersten mal....

Das wirds sein denke ich...

Kann man das dann einstellen das der nur eine Zyklus in der Interrupt 
verweilt? Oder muss man da sich ne Variable zwischenmerken?
Gast #2237136
Lesenswert?

Markus P. schrieb:
> Laut Datenblatt:
>
> "When the external interrupt is enabled and is configured as level
> triggered, the interrupt will trigger as long as the pin is held low"
>
> Drei mal durchgelesen, warum sehe ich das nicht beim ersten mal....
>
> Das wirds sein denke ich...

Denk ich nicht, du löst ja nicht auf "low level" aus, sondern bei 
"falling edge". Sind die verwendeten Register und die Bits korrekt 
gesetzt?
Gast #2237211
Lesenswert?

Hallo,

> aber da fehlt noch eine antiparallele Schutzdiode an der LED des Optokopplers

Wozu? Was glaubst du, zu welchem Zweck der Brückengleichrichter vor der 
Optokoppler-LED verwendet wird? Deswegen ist die vorgeschlagene Diode 
überflüssig; die Polung der Spannung ist immer korrekt.
(Solch grobe Fehler sind in den Schaltungen von ELV nicht drin ...)
#2237239
Lesenswert?

Wissender schrieb:
>> aber da fehlt noch eine antiparallele Schutzdiode an der LED des Optokopplers
>
> Wozu? Was glaubst du, zu welchem Zweck der Brückengleichrichter vor der
> Optokoppler-LED verwendet wird?

Du hast natürlich recht! Das war Unsinn.

Das Oszi-Bild mit seinen -250V hat mich irritiert. Die Messung ist halt 
blöd, da sie nicht die Spannung am Optokoppler zeigt, sondern (wohl) die 
Spannung gegen N (PE) :-((

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren