Ein Schaltplan von der Platine wäre gut......weil so eine Fehleranalyse an hand von Fotos ist doof.
Hi,
ich habe mir eine eigene Platine in absoluter minimalkonfiguration gefräst. Ich habe nur einen 4,7kOhm Pullup am Resetpin und einen 104 Kondensator an VCC und GND. Auf meinem Steckbrett hat alles super funktioniert. Nur auf meiner Platine läuft der Controller nicht sauber durch.
Es handelt sich um den selben Controller wie auf dem Steckbrett.
Ich habe den Eindruck, das der Controller zwischendurch neustartet. Er soll ein RC-Empfängersignal auslesen und wenn es größer als 1,5ms ist die Ledblinken lassen. Aber die Led blinkt nicht immer und wenn sich das Empfängersignal nicht ändert kann es trotzdem sein das er ein paar Sekunden nicht blinkt wie er soll. An der Software habe ich nachdem es auf dem Steckbrett lief nichts mehr geändert. Den µC hab ich auf dem Steckbrett geflasht und dann eingelötet.
Habt ihr eine Idee woran das liegen kann?
Danke
Gruß Daniel
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Ein Schaltplan von der Platine wäre gut......weil so eine Fehleranalyse an hand von Fotos ist doof.
Das Problem mit ungewollten Resets kenne ich. Seit langem verwende ich daher unmittelbar nach der Portdefinition, noch vor dem Erlauben der Interrupts, eine markante Blinkroutine, siehe Code (ALLE programmrelevanten Zeilen aber viel Kommentar/Dokumentation gelöscht)Zitat von DanielSan
Das eindeutig identifizierbare Blinken nach einem Reset/Kaltstart hilft erstmal nix - aber man weiß dann sicher, dass es kam - und manchmal fällt einem etwas Kluges ein, wenn man sieht WANN es kommt . . . .HTML-Code:// ================================================================================= // === HAUPTProgramm ============================================================== // Initialisierungen, LED1 kurzblinken als Signal für Programmstart, // Ausgabe des Identifizierungsstrings per USART // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - int main(void) { uint8_t i; DDRB = 0b00011111; // siehe aktuell oben ... PORTB = 0b00100000; // und Port/Pull Ups (1) aktivieren DDRC = 0b01110000; // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168 PORTC = 0b00000111; // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !! DDRD = 0b11110000; // -> siehe unter DDRB, sowie PD2,3 extInt PORTD = 0b00001111; // Pull Ups aktivieren // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for(i=0; i<10; i++) // gLED auf PC5 i-fach blinken lassen // ###>>> bevor Interrupts erlaubt sind, um ungewollte // Resets u.ä. besser erkennen zu können { SetBit(PORTC, 5); // LED auf PC5 schalten EIN, HELL waitms(3); // ... damit man kurze resets besser erkennt ClrBit(PORTC, 5); // LED auf PC5 schalten AUS, Dunkel waitms(97); } ................................. } // Ende main // ================================================================================ /* ============================================================================== */ /* ============================================================================== */ /*### Programm pausieren lassen !! Der Pausenwert ist nur experimentell !*/ void waitms(uint16_t ms) { for(; ms>0; ms--) { uint16_t __c = 4000; __asm__ volatile ( "1: sbiw %0,1" "\n\t" "brne 1b" : "=w" (__c) : "0" (__c) ); } } /* ============================================================================== */ // Auszug aus headerdatei: #define SetBit(ADDR,BIT) ((ADDR) |= (1<<(BIT))) // Setzt Bit #define ClrBit(ADDR,BIT) ((ADDR) &= ~(1<<(BIT))) // Löscht Bit
Als Grund für ungewollte Resets hatte ich schon falsche Portinitialisierungen, falsche Interruptinitialisierung, mikroskopische Kurzschlüsse etc. Aber ich glaube, das ist noch nicht die Liste aller Möglichkeiten.
Ciao sagt der JoeamBerg
An sich sollte der Mega48 2 Abblock-kondensatoren bekommen und man sollte auch AVCC anschließen. Ist der Widerstand wirklich nach VCC, nicht nach GND ?. Den Widerstand am Reset Pin könnte man noch eher weglassen als den 2. Kondensator.
Ich könnte mir vorstellen das entweder die Spannung einbricht oder das du Störungen auf der RST Leitung hast. Du könntest einen Elko an parallel zum Abblockkondensator schalten (VCC und GND) bzw einen Abblockkondensator zusätzlich zwischen RST und GND schalten.
MfG Hannes
Hi,
danke für eure Tips!
Ich habe jetzt noch zusätzlich einen 100nF von Reset nach GND, einen 100nF von AVCC nach GND, 5V an AVCC und einen 100nF von AREF nach GND gelötet. Leider funktioniert das immer noch nicht.
Ich habe auch schon eine andere Spannungsversorgung ausprobiert weil ich dachte, das es evtl. daran liegt aber das ändert auch nichts.
Die resets scheinen so schnell zu kommen, das er es nicht mal bis zum ersten Timer überlauf schafft und der ist jede 1ms.
Wenn ich die Platine anfasse dann funktioniert es manchmal für 1-2 Sekunden so wie es soll. Aber dann bricht es wieder zusammen.
Einen Schaltplan habe ich aktuell garnicht. Ich habe die Platine in einem 2D-Cad gezeichnet.
Ich glaub ich entwickel das nochmal komplett neu und zeige euch dann erst hier den Schaltplan. Ich versteh das zwar nicht, weil ich schon einige deutlich komplexere Projekte umgesetzt habe. Vielleicht ist das zu einfach für mich .
Oder habt ihr noch eine Idee?
Edit: @021aet04: Den Elko hab ich noch nicht ausprobiert. Welchen Wert sollte der denn haben?
Danke
Gruß Daniel
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Da reichen auch 100nF
Das ist eigentlich relativ egal. Die Versorgungsspannung muss nur konstant sein und nicht einbrechen (z.B. beim Schalten eines Relais bzw andere Verbraucher mit hohem Stromverbrauch). Wenn nur der µC auf der Versorgung hängt würden schon ca. 10µF reichen. Je mehr desto besser ist es natürlich. Wenn du Verbraucher mit hohem Stromverbrauch hast könntest du auch den µC mit einer Diode entkoppeln und mit einem Elko den µC puffern (z.B. bei einem Servo). Bei einer Led sollte das aber egal sein.
Wenn du schreibst das wenn du die Platine berührst die Schaltung länger funktioniert kommt mir die Idee mit den Lötstellen. Kontrolliere einmal die Lötstellen und löte gegebenenfalls nach.
Du könntest noch kontrollieren ob der Watchdog aktiv ist. Der resettet den µC auch wenn du ihn nicht immer zurücksetzt.
MfG Hannes
Ok hilft alles nix.
Der einzige Verbraucher ist bis jetzt die Led. Als spannungsversorgung hab ichs mit dem 7805 vom Steckbrett und einem UBEC versucht. Bei beiden das gleiche Ergebniss.
Ich habe mir überlegt, das ich das ganze nochmal neu mache. Evtl. hab ich ja irgendwo einen Kurzschluss oder der Controller ist beim einlöten gestorben (glaub ich zwar nicht) oder sonst irgend etwas ist schief gelaufen.
Im Anhang hab ich mal den Schaltplan als PDF eingefügt.
Int0 und Int1 sind die beiden Pins mit denen ich das Empfängersignal (also 2 Kanäle) einlesen möchte. Wie gesagt auf dem Steckbrett hat alles bestens geklappt.
Meint ihr das der Schaltplan so ok ist?
Ich weiss das ginge sicherlich noch schöner, aber ich kenne das Programm (KiCad) noch nicht sooo gut.
Danke
Gruß Daniel * der eigentlich schon viel komplexere Sachen durchgezogen hat *
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Die Schaltung sieht schon OK aus. Du hast nur keinen Programmierstecker vorgesehen, da würde ich einen Sockel verwenden.
Wenn es auf dem Steckbrett funktioniert hat, dann dürfte doch mit der Hardware etwas nicht stimmen. Vielleicht doch ein Kurzschluss, beim fräsen legt sich schnell mal wo ein Span hinein.
Lesezeichen