Jaecko
18.01.2016, 16:29
Moin.
Hab nach langer Zeit mal wieder ein elektr(on)isches Problem mit einem AVR, Kategorie "Kopfnuss aus Granit".
Schaltung: http://cihome.de/forendaten/rn/tr_schaltplan.png
ATMega644 mit 16MHz, soll als Temperaturregler für eine bestimmte Apparatur dienen; soll temperaturabhängig 2 Heizungen/Motor für Rührgerät steuern. Die Bedienung erfolgt über ein 128x64-LCD (KS0108-Controller) und 2 Drehimpulsgeber mit Tastfunktion. Und genau an einem dieser Impulsgeber bzw. den Pins, an denen der angeschlossen ist, gibt es ein Problem. An den VCC/GND-Pin-Paaren des AVR sind direkt noch weitere 100nF-Kerkos gelötet (nicht im Schaltplan eingezeichnet)
Betroffen ist Encoder 1; an PD2 (INT0) ist einer der beiden Signalpins des Encoders angeschlossen. Auf eine fallende Flanke hin wird ein Interrupt ausgelöst, in dem ich mir dann PD0 anschau und in Abhängigkeit des Pegels die Drehrichtung weiss.
Dreh ich in die eine Richtung, scheint alles ok zu sein. Dreh ich jedoch in die andere Richtung, startet mit fast jedem Schritt des Impulsgebers der AVR neu.
Erste Vermutung: Irgendas stimmt mit den Interrupts nicht, falsch konfiguriert, irgend ein Überlauf etc. Darum hab ich das ganze auf nen minimalen Code gestaucht (s.u.), der nix anderes macht, als den an PB4 angeschlossenen Buzzer mal kurz "klicken" zu lassen. D.h. jeden Neustart des AVR krieg ich durch einen Klick mit.
int main(void)
{
PORTB &=~ (1 << 4);
DDRB |= (1 << 4);
PORTB |= (1 << 4);
_delay_ms(2);
PORTB &=~ (1 << 4);
while(1);
return 0;
}
Dreh ich in die eine Richtung: stille.
Dreh ich in die andere Richtung: *tickticktickticktick*, also ständige Neustarts bei so gut wie jedem Drehschritt.
Encoder 2 (PD1/PD3) funktioniert perfekt. Auch wenn ich die beiden Encoder umstecke, bleibt das Problem bei dem, der an PD0/PD2 angeschlossen ist.
Auch der Verdacht, dass evtl. der Quarz gestört wird, dessen Pins ja direkt daneben verlaufen, haben sich als nicht ganz zutreffend erwiesen. Ich kann zwar am Oszi sehen, dass beim Drehen des Encoders XTAL2 kurz mit der Spannung leicht hochgeht. Aber auch, wenn ich auf den internen Taktgeber mit 8 MHz umschalte, (und auch den Quarz auslöte) bleibt dieses Problem bestehen.
Ansonsten kann ich mit dem Oszi keine weiteren Spannungseinbrüche o.ä. sehen.
Auch die Art der Spannungsversorgung spielt keine Rolle. Sowohl über ein 12V-Netzteli über den 7805, als auch direkt versorgt über ISP gibts das Problem.
Gibts da beim M644 irgendwas bestimmtes zu beachten? Oder weiss jemand, was das sonst für ein Problem sein könnte?
MfG
Hab nach langer Zeit mal wieder ein elektr(on)isches Problem mit einem AVR, Kategorie "Kopfnuss aus Granit".
Schaltung: http://cihome.de/forendaten/rn/tr_schaltplan.png
ATMega644 mit 16MHz, soll als Temperaturregler für eine bestimmte Apparatur dienen; soll temperaturabhängig 2 Heizungen/Motor für Rührgerät steuern. Die Bedienung erfolgt über ein 128x64-LCD (KS0108-Controller) und 2 Drehimpulsgeber mit Tastfunktion. Und genau an einem dieser Impulsgeber bzw. den Pins, an denen der angeschlossen ist, gibt es ein Problem. An den VCC/GND-Pin-Paaren des AVR sind direkt noch weitere 100nF-Kerkos gelötet (nicht im Schaltplan eingezeichnet)
Betroffen ist Encoder 1; an PD2 (INT0) ist einer der beiden Signalpins des Encoders angeschlossen. Auf eine fallende Flanke hin wird ein Interrupt ausgelöst, in dem ich mir dann PD0 anschau und in Abhängigkeit des Pegels die Drehrichtung weiss.
Dreh ich in die eine Richtung, scheint alles ok zu sein. Dreh ich jedoch in die andere Richtung, startet mit fast jedem Schritt des Impulsgebers der AVR neu.
Erste Vermutung: Irgendas stimmt mit den Interrupts nicht, falsch konfiguriert, irgend ein Überlauf etc. Darum hab ich das ganze auf nen minimalen Code gestaucht (s.u.), der nix anderes macht, als den an PB4 angeschlossenen Buzzer mal kurz "klicken" zu lassen. D.h. jeden Neustart des AVR krieg ich durch einen Klick mit.
int main(void)
{
PORTB &=~ (1 << 4);
DDRB |= (1 << 4);
PORTB |= (1 << 4);
_delay_ms(2);
PORTB &=~ (1 << 4);
while(1);
return 0;
}
Dreh ich in die eine Richtung: stille.
Dreh ich in die andere Richtung: *tickticktickticktick*, also ständige Neustarts bei so gut wie jedem Drehschritt.
Encoder 2 (PD1/PD3) funktioniert perfekt. Auch wenn ich die beiden Encoder umstecke, bleibt das Problem bei dem, der an PD0/PD2 angeschlossen ist.
Auch der Verdacht, dass evtl. der Quarz gestört wird, dessen Pins ja direkt daneben verlaufen, haben sich als nicht ganz zutreffend erwiesen. Ich kann zwar am Oszi sehen, dass beim Drehen des Encoders XTAL2 kurz mit der Spannung leicht hochgeht. Aber auch, wenn ich auf den internen Taktgeber mit 8 MHz umschalte, (und auch den Quarz auslöte) bleibt dieses Problem bestehen.
Ansonsten kann ich mit dem Oszi keine weiteren Spannungseinbrüche o.ä. sehen.
Auch die Art der Spannungsversorgung spielt keine Rolle. Sowohl über ein 12V-Netzteli über den 7805, als auch direkt versorgt über ISP gibts das Problem.
Gibts da beim M644 irgendwas bestimmtes zu beachten? Oder weiss jemand, was das sonst für ein Problem sein könnte?
MfG