Forum: Mikrocontroller und Digitale Elektronik Frage zur Nulldurchgangserkennung mit Interrupt


von Markus P. (sebastianwurst)


Angehängte Dateien:

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
}

von Markus P. (sebastianwurst)


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?

von Helfer (Gast)


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?

von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

Gute Frage,
hab mir gerade nochmal das Kapitel durchgelesen. JEtzt bin ich einwenig 
verwirt mit dem Register " EIMSK - External Interrupt Mask Register" und 
dem "EICRA-External Interrupt Control Register". Muss ich wohl beide 
also zusätzlich noch das EICRA beschalten? Ich probiere es mal aus...

von Dietrich L. (dietrichl)


Lesenswert?

Das hat zwar nichts (?) mit Deinem Problem zu tun, aber da fehlt noch 
eine antiparallele Schutzdiode an der LED des Optokopplers: in 
Sperrichting kann die LED nicht viel.
Mich wundert, dass er das überhaupt überlebt hat...

von Markus P. (sebastianwurst)


Angehängte Dateien:

Lesenswert?

Danke für deine Tip meinst du das so ? (Anhang)

Welchen Typ schlägst du dafür vor und warum eigentlich genau ?

von Wissender (Gast)


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

von Markus P. (sebastianwurst)


Lesenswert?

Ja mein ich doch auch.
So nun zum Eigentlichen....:

Register waren falsch!
So ist's richtig und funzt es auch.

  EIMSK  |= (1<<INT0);  // External Interrupt 0 Enable PIN PD2
  EICRA  |= (1<<ISC01);  // Int auslösen bei fallender Flanke


Schande über mein Haupt

von Dietrich L. (dietrichl)


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) :-((

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.