Wer hat meinen Mikrocontroller getötet?

Ok, ich wars! Die weitaus interessantere Frage ist aber - wie!

Zeitpunkt des Todes: 08.07.2018, 14:37
Todesursache: keine Ahnung
Letzte Tätigkeit bevor Exitus:
Ich war gerade dabei, Versuchssketches zu programmieren, die es ermöglichen sollten, einen mcp23017 Portexpander nach Änderungen der Inputs auszulesen und auf dem Bildschirm darzustellen. Programme, die nur per i2c die Ports abfragten und auf dem TFT ausgaben, liefen einwandfrei. Erst als ich anfing, das ganze per Interrupts zu perfektionieren, zeigten sich erste Probleme. Der angehängte Sketch funktionierte zunächst, blieb aber nach unterschiedlicher Anzahl an Tasteneingaben stecken. Nachdem ich die (im angehängten Sketch wieder auskommentierten) detatch- und attachinterrupt-Befehle eingebaut hatte, ging nach dem Setup gar nichts mehr. Als ich sie dann wieder entfernte, funktionierte der Code, der vorhin immerhin noch bis zum sich-selbst-Aufhängen funktionierte, auch nicht mehr. Wenig später zeigte der Screen nur noch schwarz und der Controller erschien nicht mehr bei der Portauswahl und ist kurz darauf auch per atmel ice programmer nicht mehr ansprechbar. Da die Spannung an der Batterie und am Regler noch wunderbar im Lot sind, scheint mir klar, dass die mcu futsch ist.

Es drängt sich der Verdacht auf, dass die Interrupts mit dem Ableben meines geliebten Mikrocontrollers zu tun haben. Ebenfalls sehr wahrscheinlich ist ein Hardwarefehler auf der Platine, schliesslich handelt es sich um ein diletantisch selbst gebruzeltes Customboard. Doch wie falsch muss man sowas löten, um einen Mikrocontroller mit einem Interrupt zu braten???

Den Controler auszuwechseln ist nicht das Problem. Solange ich nicht weiss, was zu seinem Tod geführt hat, scheint mir das aber wenig sinnvoll. Hat irgend jemand eine Idee, was das Problem sein könnte? Ich weiss, die Frage schreit ein wenig nach Kristallkugel, aber manchmal lassen sich Hardwareprobleme durch die Art der Symptome erkennen und vielleicht kennt jemand von euch die genauen Abläufe beim Aufrufen der Interruptfunktionen. Ich konnte nicht mal die entsprechende Library finden…

Bitte helft mir! Der Frust ist gerade riesig! Gerne liefere ich auch Schaltplan und Platinendesign mit.

edit: Attach- und Detachbefehle da eingefügt, wo ich sie hatte

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <SparkFunBQ27441.h>

//pin definitions
#define tft_led_pwm 10
#define tft_rst     6
#define tft_dc      7
#define tft_cs      27
#define sd_en       42
#define sd_cs       25
#define audio_en    3
#define audio_out   A0
#define int_input   8
#define int1_axel   9
#define ir_in       4
#define ir_out      13
#define gpout       5
#define wake_hw     30
#define cmd_mldp    26
#define wake_sw     31
#define ldr_in      A5
#define push_right  11
#define push_left   12
#define miso        22
#define mosi        23
#define sclk        24

// values
const unsigned int BATTERY_CAPACITY = 550;

int interruptPin = 0;
int interruptPinValue = 0;

uint16_t buttonValues = 1;
uint16_t previousButtonValues = 1;

//flags
volatile byte buttonChange = 0;

//classes
Adafruit_ST7735 tft = Adafruit_ST7735(tft_cs, tft_dc, PIN_SPI_MOSI, PIN_SPI_SCK, tft_rst);
Adafruit_MCP23017 mcp;


void setup() {

  Serial.begin(9600);
  Serial1.begin(9600);

  pinMode(tft_led_pwm, OUTPUT); digitalWrite(sd_cs, LOW);
  pinMode(tft_dc, OUTPUT);
  pinMode(tft_rst, OUTPUT);
  pinMode(tft_cs, OUTPUT);      digitalWrite(tft_cs, LOW);
  pinMode(audio_out, OUTPUT);   digitalWrite(audio_out, LOW);
  pinMode(audio_en, OUTPUT);    digitalWrite(audio_en, LOW);
  pinMode(sd_en, OUTPUT);       digitalWrite(sd_en, LOW);
  pinMode(sd_cs, OUTPUT);       digitalWrite(sd_cs, LOW);
  pinMode(wake_hw, OUTPUT);
  pinMode(cmd_mldp, OUTPUT);
  pinMode(wake_sw, OUTPUT);
  pinMode(ir_out, OUTPUT);      digitalWrite(sd_cs, LOW);
  pinMode(ir_in, INPUT);        digitalWrite(ir_in, HIGH);
  pinMode(int_input, INPUT);    digitalWrite(int_input, HIGH);
  pinMode(int1_axel, INPUT);    digitalWrite(int1_axel, HIGH);  
  pinMode(gpout, INPUT);        digitalWrite(gpout, HIGH);
  pinMode(ldr_in, INPUT);
  pinMode(push_left, INPUT);    digitalWrite(push_left, HIGH);
  pinMode(push_right, INPUT);   digitalWrite(push_right, HIGH);

  mcp.begin();
  mcp.pinMode(0, OUTPUT);           //Vibra
  mcp.digitalWrite(0, LOW);
  for (int i = 1; i < 16; i++) {    //15 Tasteninputs
    mcp.pinMode(i, INPUT);
    mcp.pullUp(i, HIGH);
  }
  mcp.setupInterrupts(true, false, LOW);
  for (int i = 1; i < 16; i++) {
    mcp.setupInterruptPin(i, CHANGE);
  }

  attachInterrupt(int_input,handleInputInterrupt,LOW);

  tft.initR(INITR_BLACKTAB);
  tft.setRotation(1);
  tft.fillScreen(ST7735_BLACK);
  tft.setTextColor(ST7735_CYAN);
 // tft.setTextWrap(true);
  tft.setTextSize(2);
  tft.setCursor(20, 50);
  tft.print("Rusterwood");
  analogWrite(tft_led_pwm, 150);

}


void loop() {
  if (buttonChange == 1) {
    interruptPin = mcp.getLastInterruptPin();               // welcher knopf hat gewechselt
    interruptPinValue = mcp.getLastInterruptPinValue();     // was ist sein wert?
    // pin und wert auf display ausgeben
      tft.fillRect(75, 85, 2*6, 7, ST7735_BLACK);
      tft.fillRect(75, 95, 2*6, 7, ST7735_BLACK);
      tft.setTextColor(ST7735_CYAN);
      tft.setTextSize(1);
      tft.setCursor(75, 85);
      tft.print(interruptPin);
      tft.setCursor(75, 95);
      tft.print(interruptPinValue);

    buttonChange = 0;
 //  attachInterrupt(int_input,inputInterrupt,FALLING);
  }

}

void handleInputInterrupt() {
 //  detachInterrupt(int_input);
  buttonChange = 1;
}

Bei einer selbstkonstruierten Platine mit SAM Microcontroller kann der Fehler überall liegen.
ZB ist der TPS61200 kein DC/DC Wandler mit Fixer Ausgangsspannung sondern die Einstellbare version. Der 3,3 Wandler ist TPS61201. Was Hast Du genommen? Welche Spannung hast Du?

Ist die Batterie einfach leer ( < 3,06V)?

Grüße Uwe

Ich hab den TSP61201 mit fixer 3.3V Ausgangsspannung. Musste mangels Eaglebauteile auf dieses ausweichen, ist aber baugleich, nur die Beschaltung des Feedbackpins weicht ab. (Selbiges übrigens beim BatterieladeIC, da habe ich das Modell BQ24072 verbaut und nicht den BQ24075, die Beschaltung aber dementsprechend auch angepasst).

Die Batterie ist randvoll → 4.15V, wird halt auch immer aufgeladen, sobald ich USB anschliesse, um zu programmieren.

Hallo,

ich habe keine Plan .... aber bei mir liegt es meistens daran, das zufällig die Spannung unter der Abschalt Spannung des Processors gerät. Das kann man deaktivieren. Ich weis aber nicht mehr wie. Irgendetwas mit fusebits oder so. Das kann auch eine pegeländerung an einem Pin sein die das dann auslöst. Hat mich Jahre meines Lebens gekostet.

Nur son ideen furz :slight_smile:

Gruss Temucin alias TFT

(deleted)

@temucin: Danke für den Hinweis. Das kann ich wohl erst testen, wenn ich die mcu ersetzt habe. Das würde möglicherweise das Anhalten des Programms erklären. Ich kann mir aber nicht wirklich vorstellen, dass sowas den Controler zerstören könnte.

@anwofis: Danke! :wink: Ich bin mir ziemlich sicher, dass der µC kaputt ist, da er auch nicht mehr am Port erscheint und auch nicht über die Programmierschnittstelle per Atmel ICE erreichbar ist. Pullups habe ich über den Controler gesetzt (digitalWrite(Pin, HIGH)). Ein Kurzschluss an den Tastern würde wohl ein beständiges High oder Low Signal zur Folge haben, je nach dem in welche Richtung der Kurzschluss geht. Zerstören sollte das aber nichts bei Pins, die als Eingang geschaltet sind. Gefährlicher wirds bei Outputpins, denke ich.

Könnte es sein, dass dem Vibramotor bloss eine Freilaufdiode fehlt?!?!?!?!?!?!?!?!?!?!?!?!?!

Könnte das eventuell bereits reichen, um das Einfrieren des Programmablaufs zu erklären und schlussendlich auch das Ableben des Controlers wegen wiederholten Überspannungen entgegen der eigentlichen Polarität?

Bitte sagt ja! :sweat_smile:

Ja!

combie:
Ja!

Das war die Antwort auf

Bitte sagt ja

oder auf die andere Frage? :wink: :wink: :wink:

Spaß bei Seite:
Ja, ein Motor ohne Schutzdiode kann den Microcontroller zerstören vor allem wenn's ein SAM ist. Ich würde auch einen Gatewiderstand benutzen.

Grüße Uwe

Ja!
Das war die Antwort auf
Quote
Bitte sagt ja
oder auf die andere Frage?

Natürlich auf "Bitte sagt ja".

Die Pläne habe ich gar nicht überprüft.

Danke Uwe.
Und auch danke an Combie für deine bedingungslose Bereitschaft, zu einer Bitte einfach mal "ja" zu sagen, ohne lange zu überlegen! :smiley:

Habe möglicherweise noch zwei Fehler gefunden:

Das eine war ein Kurzschluss nach GND unter dem Accelerometer. Habe da die Leiterbahnen etwas abenteuerlich gezogen, was ein Lötzinnblob unter dem Bauteil richtiggehend provoziert hat. Ist nun korrigiert.

Das andere betrifft den Pullup-Widerstand an der Fuel Gauge. Wenn ich das richtig sehe, zieht der die Leitung je nach Batterieladezustand hoch bis zu 4.1V, was wohl schon zu viel für den uC ist. Werde den auslöten und mit internem Widerstand des Controllers uppullen. Wäre froh, wenn mir das jemand, der mehr Ahnung hat, noch bestätigen könnte. :sweat_smile:

E: könnte der Pullup eventuell auch die Fuel Gauge zerstört haben?