Forum: Mikrocontroller und Digitale Elektronik Problem mit SD Card Melzi Creality3D V1.1.3 Sanguino Atmega 1284


von Max M. (guilty_person_io)


Angehängte Dateien:

Lesenswert?

Hallo,

Das Board Melzi Creality 1.1.3 Sanguino mit dem Atmega 1284p stammt 
eigentlich aus einem 3D Ender Drucker. Da das Board ausgetauscht wurde, 
wird es für ein neues Projekt benutzt. Dieses Projekt ist eine PCB Fräse 
mit der Open Source Firmware cyclone.
Die Fräse und das Display mit Menuauswahl funktioniert schon 
einwandfrei, es fehlt nur noch der card reader, damit die Fräse ohne 
einen weiteres Gerät(PC) funktioniert und die Befehle aus der SD Karte 
ausliest und die Motoren steuert. Wenn ich das Board NUR am USB 
verbinde, kann ich die benötigten Befehle aus einem txt file lesen und 
abspeichern. Wenn ich aber das Netzteil mit 12 V mit dazustecke 
funktioniert es nicht mehr. Genauso wenn NUR das Netzteil von 12V 
angesteckt ist funktioniert es nicht.
Hier der Code den ich benutze um das File zu lesen:
1
#include <SPI.h>
2
#include <SD.h>
3
4
File data;
5
const int cs = 10;
6
7
8
void read_txt(){
9
10
  data = SD.open("test.txt");
11
  if(data){
12
    Serial.println("test.txt");
13
    while(data.available()){
14
      Serial.write(data.read());
15
    }
16
    data.close();
17
  }
18
  else{
19
    Serial.println("file can not open");
20
  }
21
22
}
23
24
void setup()
25
{
26
  Serial.begin(9600);
27
  while(!Serial){
28
  }
29
  if(!SD.begin(cs)){
30
    Serial.println("Initialization failed!");
31
    return;
32
  }
33
 Serial.println("Initialization succesfull.");
34
 read_txt();
35
}
36
37
void loop(){
38
39
}

Meine Vermutung war das die serial Verbindung(PC) mit der SD Karte 
kollidiert. Also hab ich den Code umgeschrieben und statt den Serial ein 
paar LED getoggelt:
1
#include <SPI.h>
2
#include <SD.h>
3
4
File data;
5
const int cs = 10;
6
7
int led_red = 20; 
8
int led_green = 19;
9
10
void read_txt(){
11
12
  data = SD.open("test.txt");
13
  if(data){
14
    while(data.available()){
15
    }
16
    data.close();
17
  }
18
  else{
19
  }
20
21
}
22
23
void setup()
24
{
25
  pinMode(led_red, OUTPUT);
26
  pinMode(led_green, OUTPUT);
27
28
  if(!SD.begin(cs)){
29
    digitalWrite(led_red, HIGH);
30
    return;
31
  }
32
  digitalWrite(led_green, HIGH);
33
  //read_txt();
34
}
35
36
void loop(){
37
}
Leider ist es hier unverändert, sobald ich den Netzstecker von 12V 
anschließe funktioniert es nicht mehr. Nur per USB funktioniert es.
Habt ihr noch Ideen?

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Die SD Karte benötigt "VCC3.3V", das hast du nur, wenn du USB 
anschliesst.
Aus dem 12V Netzteil werden nur die "VREG-5V" generiert.

Edit:
Ich glaub das war nicht ganz so richtig...
(nochmal genauer nachschauen)

Evtl. J5 / CON3 ...wo ist der auf dem Board.
Irgendwie bekomme ich den Schaltplan im Zusammenhang mit dem Bild nicht 
ganz nachvollzogen.

So wie es aussieht, kann man wohl über J5 / CON3 die Quelle der Spannung 
auswählen, ob vom Netzteil oder USB.

Was aber eigentlich kein Sinn ergibt, da es ja mit Netzteil auch laufen 
muss, bzgl. der Motortreiber.

: Bearbeitet durch User
von Max M. (guilty_person_io)


Angehängte Dateien:

Lesenswert?

ja würde ich dir Zustimmen, aber das Board hat ja vorher auch am 3D 
Drucker funktioniert, nur mit dem Netzstecker von 12 V. Deswegen bin ich 
mal mit einem multimeter ran gegangen und hab die Pins gemessen ohne 
Netzstecker und mit. Ergebniss siehe Bild. Komme aber mit den Daten 
nicht weiter.

von Adam P. (adamap)


Lesenswert?

Wenn du nur Netzteil ansteckst:

Hast am U2 Pin20 3.3V?
Und am U5 (Atmega) die 5V?

Edit:
Und wie schaut es mit dem J5 aus? Ist der auf der Unterseite?

: Bearbeitet durch User
von Max M. (guilty_person_io)


Lesenswert?

Vielen Dank für die schnelle Hilfe.
AN U5 liegen 5V an Pin 5.
Woher weis ich welcher pin der pin20 ist am board?
Hab einen Fehler im Bild gehabt mit netzteil liegen nicht 3,36V an 
sondern 3,5V bei den zwei Pins. Ist es der Pin 20? Warum sind sind zwei 
Pins auf 3,5V oder 3,36V?

von Max M. (guilty_person_io)


Lesenswert?

Adam P. schrieb:
> nd wie schaut es mit dem J5 aus? Ist der auf der Unterseite?

Wo finde ich die Bezeichnung J5? Sehe die nirgends.

von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

Max M. schrieb:
> Woher weis ich welcher pin der pin20 ist am board?

von Adam P. (adamap)


Lesenswert?

Max M. schrieb:
> Wo finde ich die Bezeichnung J5? Sehe die nirgends.

Mach mal ein Foto von der Unterseite.

von Max M. (guilty_person_io)


Lesenswert?

Ah Ok Danke.
Pin 20 hat 3,5V nur mit Netzstecker und 3,3V nur mit USB Versorgung.

von Adam P. (adamap)


Lesenswert?

Max M. schrieb:
> Pin 20 hat 3,5V nur mit Netzstecker und 3,3V nur mit USB Versorgung.

Ja dann haben ja alle benötigten Bauteile ihre Spannungsversorgung.

Sehr seltsam.

von Max M. (guilty_person_io)


Angehängte Dateien:

Lesenswert?

wie gewünscht die Rückseite.
Edit:
SD Module liegt oben links

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Dein ISP Programmer hast aber nicht gleichzeitig angeschlossen gelassen?

von Max M. (guilty_person_io)


Lesenswert?

Adam P. schrieb:
> Dein ISP Programmer hast aber nicht gleichzeitig angeschlossen
> gelassen?

Nein der hängt nicht mit dran.

von Adam P. (adamap)


Lesenswert?

Weiterhin habe ich so das Gefühl, das der Schaltplan nicht zu dem Board 
passt.

von Max M. (guilty_person_io)


Angehängte Dateien:

Lesenswert?

Adam P. schrieb:
> Weiterhin habe ich so das Gefühl, das der Schaltplan nicht zu dem
> Board
> passt.

Ja das ist gut möglich. Vom Hersteller gibt es keinen Schaltplan. Ich 
hab noch einen im Netz gefunden. Vielleicht kannst du mit dem mehr 
anfangen.

von Adam P. (adamap)


Lesenswert?

Max M. schrieb:
> Ich hab noch einen im Netz gefunden.

Grad wollte ich dir das auch hochladen...ja der sieht besser aus.

von Adam P. (adamap)


Lesenswert?

Also die 3.5V find ich ein wenig zu viel, aber ok.
Sonst sehe ich keinen Grund warum es nicht funktionieren sollte.

Wo springt er denn rein im Source, wenn du Netzteil verwendest:
Serial.println("file can not open"); ?

von Max M. (guilty_person_io)


Lesenswert?

Adam P. schrieb:
> Also die 3.5V find ich ein wenig zu viel, aber ok.
> Sonst sehe ich keinen Grund warum es nicht funktionieren sollte.
>
> Wo springt er denn rein im Source, wenn du Netzteil verwendest:
> Serial.println("file can not open"); ?

Nein er springt beim initialisieren schon hier rein:

  if(!SD.begin(cs)){

    Serial.println("Initialization failed!");

    return;

Edit:
Es sind eher sogar 3,6V.
Wenn ich das board mit USB starte und danach die 12V mit anschließe 
bleibt der Pin 20 bei 3,3V. Sobald ich den USB stecker ziehe wandert der 
Wert auf 3,6V.

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Zusammengefasst:

Nur USB: Das lesen funktioniert.
Und sobald du das Netzteil anschliesst funktioniert das lesen nicht 
mehr?

von Max M. (guilty_person_io)


Lesenswert?

Adam P. schrieb:
> Zusammengefasst:
>
> Nur USB: Das lesen funktioniert.
> Und sobald du das Netzteil anschliesst funktioniert das lesen nicht
> mehr?

Ja genau.
Die Initialisierung SD.begin(sc) funktioniert mit USB einwandfrei.
Nehme ich das board komplett vom Strom und schalte es nur über das 
Netzteil 12V an funktioniert SD.begin(sc) nicht mehr.
mhhhhh
Kann sich eine Pin Belegung irgenwie ändern wenn das board eine andere 
Spannung bekommt. Magie?

von Adam P. (adamap)


Lesenswert?

Max M. schrieb:
> Kann sich eine Pin Belegung irgenwie ändern wenn das board eine andere
> Spannung bekommt. Magie?

Nein.

Aber probier mal folgendes,
setz mal ein Delay in das Setup rein:
1
void setup()
2
{
3
  Serial.begin(9600);
4
5
  while(!Serial){
6
  }
7
  
8
  delay(5000);
9
10
  if(!SD.begin(cs)){
11
    Serial.println("Initialization failed!");
12
    return;
13
  }
14
15
  Serial.println("Initialization succesfull.");
16
  read_txt();
17
}

Hab da so eine Vermutung und will mal wissen ob es das sein könnte.

: Bearbeitet durch User
von Max M. (guilty_person_io)


Lesenswert?

Wie zum Teufel.... Wahnsinn. Adam P. ich nehme dich in mein Abend Gebet 
mit auf. Geil Danke dir es funktioniert. Kannst du mir das erklären? So 
simpel? Kann ich mir nicht erklären!!!

Edit:
bin jetzt total gespannt...! Wenn du natürlich noch Zeit hast. Wenn ich 
das delay auf 0,5s mache funktioniert es schon nicht mehr.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Max M. schrieb:
> Kannst du mir das erklären?

Vermutlich startet der Mikrocontroller schneller als das Netzteil. 
Manche Netzteile liefern in den ersten paar hundert ms noch keine 
stabile Ausgangsspannung.

von Max M. (guilty_person_io)


Lesenswert?

Stefan ⛄ F. schrieb:
> Max M. schrieb:
>> Kannst du mir das erklären?
>
> Vermutlich startet der Mikrocontroller schneller als das Netzteil.
> Manche Netzteile liefern in den ersten paar hundert ms noch keine
> stabile Ausgangsspannung.

Du warst mir 5000ms schneller. Wollte ich gerade auch als Gedanke mit 
rein bringen. VIELEN VIELEN DANK. Schönen Tag noch

von Adam P. (adamap)


Lesenswert?

Stefan ⛄ F. schrieb:
> Vermutlich startet der Mikrocontroller schneller als das Netzteil.

Das war aber nicht meine Vermutung :-P

Und zwar was ich mir dachte:
Mit USB (UART) startet dein Atmega langsamer, da er wohl die Verbindung 
erkennt etc. (siehe main() von Arduino: USB Init.)
Mit Netzteil ohne USB, startet er schneller.

Da aber die SD Karte auch eine gewisse Zeit braucht um Betriebsbereit zu 
sein, fällt es mit USB nicht auf, aber mit Netzteil schon.

Ja man müsste in die Specs schauen was SD da definiert hat, aber ja OK..
mach 1000ms und gut ist ;-)

Edit:
Hatte das Problem bei meinem Projekt mit nem Cortex-M4.
Zu schnell nach Power ON ist die Karte mal da, mal nicht gewesen.

Max M. schrieb:
> Wahnsinn. Adam P. ich nehme dich in mein Abend Gebet
> mit auf.

Ah passt schon ;) Hat mich ja selbst interessiert.
Sowas ist immer weider lustig.

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Könntest ja im Setup eine LED einschalten und dann mal schauen
ob sie nach USB Connect länger braucht bis sie angeht als mit Netzteil.

von Adam P. (adamap)


Lesenswert?

Siehe hier:

C:\Program Files 
(x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp
1
int main(void)
2
{
3
  init();
4
  initVariant();
5
6
#if defined(USBCON)
7
  USBDevice.attach();
8
#endif
9
  
10
  setup();
11
    
12
  for (;;) {
13
    loop();
14
    if (serialEventRun) serialEventRun();
15
  }
16
        
17
  return 0;
18
}

Das USBDevice.attach(); dauert wohl ohne bestehender Verbindung nicht so 
lange wie mit USB.
Somit ist er viel schneller in der setup().

von Max M. (guilty_person_io)


Lesenswert?

LED nach dem USBDevice.attach() aufleuchten lassen:
Mit USB ca. nach 5sec, LED geht an.
Mit Netzteil, LED geht instantly an.

Durch die initialisierung des USB Devices dauert es ein paar sec. länger 
wie beim delay.
Wenn ich mit dem Multimeter, beim anstecken, am HC541 Pin 20 messe, kann 
ich eine Latenzzeit beobachten.
In dieser Zeit hat aber der Controller versucht die SD Karte schon zu 
initialisieren. Konnte es aber nicht weil das SD Modul noch kein Strom 
hatte. Ist das so richtig?

Vielen Dank nochmal!

von Adam P. (adamap)


Lesenswert?

Max M. schrieb:
> Ist das so richtig?

Ich glaub in diesem Fall kommen mehrere Dinge zusammen.
Angenommen alle Bauteile erhalten gleichzeitig eine stabile Spannung,
dann benötigen diese aber unterschiedlich viel Zeit um betriebsbereit zu 
sein.

Selbst wenn der HC541 genau dann schon betriebsbereit ist, wenn der 
controller den Zugriff startet, heißt das noch lange nicht, dass zu 
diesem Zeitpunkt die SD Karte auch schon so weit ist.

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.