Hallo, ich habe mir die angehängte Nulldurchgangserkennung aufgebaut. INT geht an INT1 eines AT90CAN128. Wenn ich nun im Nulldurchgang einen Timer starte, der nach z.B. 5ms einen Triac zündet, funktioniert das wunderbar - die angeschlossene Lampe wird perfekt gedimmt. Nun habe ich zwei Schalter angeschlossen, mit denen ich die Wartezeit verändern kann. Verringere (oder verlängere) ich diese testweise so sehr, dass die Lampe ausgeht, bekomme ich sie danach nicht wieder an, auch nicht, wenn ich die Zeit wieder zurück regle. Es hilft nur noch ein Aus- und Einschalter ODER das Berühren eines Pins des Gleichrichters oder ein Bein des Widerstandes mit dem Schraubenzieher (d.h. einem metallischen Gegenstand). Und das kann ich mir überhaupt nicht erklären, aber es funktioniert jedesmal. Nur einmal kurz berühren, und die Lampe geht wieder an. Woran könnte das liegen? Grüße, Randy
versuch mal zu testen ob die ints überhaupt noch ankommen... z.B. eine LED blinken lassen oder so.. oder mit dem ossi an die int leitung ich vermute den Fehler im Code...
Nein sie kommen nicht an. Das ist ja das komische. Wenn ich aber einen Pin berühre, geht alles wieder. Code (Takt 16 MHz):
1 | volatile uint16_t delay; |
2 | ...
|
3 | // Nulldurchgangserkennung initialisieren
|
4 | delay = 1875; |
5 | |
6 | DDRC |= 0b00100000; // PC5 als Ausgang |
7 | |
8 | EICRA |= (1<<ISC11) | (0<<ISC10); // Interrupt bei fallender Flanke an INT1 |
9 | DDRD &= ~(1<<INT1); // INT1 als Eingang |
10 | EIMSK |= (1<<INT1); // INT1-Interrupt aktivieren |
INT1-Interrupt:
1 | ISR(INT1_vect) |
2 | {
|
3 | TCCR1B = 0; // Timer deaktivieren |
4 | |
5 | TCNT1H = 0; // Counter zurücksetzen |
6 | TCNT1L = 0; |
7 | |
8 | OCR1AH = (uint8_t)(delay >> 8); // Zeit setzen |
9 | OCR1AL = (uint8_t)delay; |
10 | |
11 | TIMSK1 = (1<<OCIE1A); |
12 | TCCR1B = (1<<WGM12) | (1<<CS11); // CTC + Prescaler 8 |
13 | }
|
Timer-Interrupt:
1 | ISR(TIMER1_COMPA_vect) |
2 | {
|
3 | TCCR1B = 0; // Timer deaktivieren |
4 | TIFR1 = TIFR1 | (1<<OCF1A); // Eventuell schon wieder aufgetretene Interrupts unterbinden |
5 | |
6 | PORTC = 0b00100000; |
7 | asm volatile ("nop"); // gekürzt: insgesamt 20 Stück |
8 | PORTC = 0b00000000; |
9 | }
|
Nur, wenn es ein Softwarefehler wäre, wieso gehts dann, wenn ich einen Pin berühre?
Wobei mir grad einfällt, dass ich nur im µC geprüft habe, ob die Interrupts aufgerufen werden (d.h. bei jedem Nulldurchgang schick ich eine 1 an den PC). Also ein Softwarefehler sei mal nicht ganz auszuschließen, aber was hat das ganze mit dem Berühren der Pins zu tun? Warum gehts damit?
is da irgendwo eine (parasitäre)kapazität nach dem gleichrichter, die sich eventuell auflädt und an der LED keine pulsierende Gleichspannung mehr anliegt, sondern eine "glatte" gleichspannung? mess mal über der LED oder über dem Transistor
Aber es funktioniert stundenlang, wenn ich das ganze einmal mit dem Berühren eines Pins "ins Rollen gebracht" habe. Hatte es heute mal testweise ne Stunde laufen. Ich kann dabei auch die Helligkeit ändern. Und wenn die Wartezeit zu groß ist, und ich nicht mehr zünde, hat das ja eigentlich nichts mit dieser Nulldurchgangserkennung zu tun. Also die läuft ja eigentlich weiter.
Vielleicht hast du irgend einen digitalen Eingang vergessen zu beschalten, und der ist jetzt offen und "empfängt" Störungen? Was für eine Spannung liefert der Brückengleichrichter?
Kann das sein, daß Du über der Last mißt? Das wäre dann natürlich nichts mehr. Gruß! Marc
@marc: Meinst du, ob ich den Nulldurchgang am Ausgang des Triacs gemessen habe? Wenn ja, dann hattest du recht. :-) Habs grad selbst auch gemerkt. Sowas kann nur mir passieren. Aufm Mikrocontroller ein Programm, das eine angeschlossene PS/2-Tastatur auswertet und ein Display ansteuert, aber dann das ganze falsch ans Netz angeschlossen. AHGRH. Ich hab praktisch am Ausgang meinen Nulldurchgang erkannt. Wenn ich nun an den Pin gekommen bin, hat diese Minispannung auf dem Schraubenzieher gereicht, um einen ersten Nulldurchgang zu erkennen, und dann hat der µC ja die Lampe angesteuert, und sich somit seinen eigenen Nulldurchgang generiert. Jetzt geht alles. Super, trotzdem vielen Dank!
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.