Problem mit SD Card Melzi Creality3D V1.1.3 Sanguino Atmega 1284

#6705291
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?
Angehängte Dateien:
#6705303
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.
#6705390
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.
#6705397
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?
#6705411
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.
#6705424
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.
#6705465
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.
#6705485
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().
#6706139
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!
#6706216
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren