ลบกวนสอบถามเรื่องlib sd.h ตรงส่วนของการใช้ sd.beginหน่อยครับผม

Started by kanking1150, May 30, 2016, 07:34:53 PM

Previous topic - Next topic

kanking1150

 :o
มีปัญหามาถามอีกแล้วครับ
แต่ช่วงต้นเทิมก่อนจะซัมเมอร์ได้ความรู้ไปหลายแนวเลยจริงๆนะ :P

โมก่อนเข้าปัญหา:
ปกติตอนผมใช้ SD.h เนี่ยผมจะเขียนไปในทางว่าถ้าการ์ดเก็บข้อมูลมันไม่ได้เสียบอยู่กับเครื่องแล้วเราจะเอาการ์ดมาเสียบคืนใส่นั้นเมื่อเราเสียบไปแล้วให้ทำการรีบูทเครื่องของเราด้วยนะ
ซึ่งเป็นวิธีแก้ขัดเฉพาะหน้าตอนผมส่งโค้ดและตัวอย่างงานให้อาจารย์แล้วก็ผ่านไปได้ด้วยดี ซึ่งเลยเกิดความคิดว่าเอะทำไมผมไม่ทำให้มันไม่ต้องrebootหละ

เข้าปัญหาละ:
ปัญหาก็คือผมลองนำเจ้าsd.begin ไปไว้ในloopมันก็ไม่ได้นี่สิ เลยเขียนเป็นfunctionแยก ซึ่งตอนเรียกใช้ก็แลดูเหมือนจะใช้ได้ :'( เพราะจากความเข้าใจของผม SD.beginคือ
มันจะดูว่าขาของ sdcard หรือ cspin ต่ออยู่ใช่หรือไม่ เพราะฉะนั้นผมเลยต่อLEDเข้าไปตรงcspinด้วยเพื่อดูการทำงานตอนถอดการ์ดออกกับเสียบการ์ดเข้า ซึ่งเป็นไปดังคาดเมื่อถอดการ์ดออก
ledดับใส่การ์ดเข้าledสว่าง แต่พอลองทดสอบไปทดสอบมาจะมีจังหวะหนึ่งซึ่งยังไงๆก็ต้องทำให้รีบูทคืออยู่ๆledก็ส่วางเองเฉยเลยโดยที่ถอดการ์ดออกไปแล้ว แล้วพอเช็คดูจากความเข้าใจผมนั้น
ledสถานะไฟติดมันต้องมีsdcardเสียบอยู่สิเลยถอดสายcspinของโมดูลออกแล้วเอาสายจิ้มจากพอตไมโครที่ตั้งไว้มาใส่ledดูปรากฏว่าไฟมาจากพอตของขาไมโครที่เอาไว้เสียบcspinก็ยังงอยู่
ที่ไม่ได้น่าจะมาจากตรงจุดนนี้แหละเท่าที่ผมคิด

ในคลิปที่ผมอัดไว้ประมาณวินาทีที่ 19 - 20 ไฟจะติดค้างตลอดเลยครับซึ่งไม่ว่าจะถอดออกหรือใส่เข้าไฟก็ยังอยู่ - - ก็เลยรีบแจ้นมาขอความช่วยเหลือครับซึ่งอันนี้ผมเอาโค้ดdataloggerในแซมเปิ้ลมา
ทดลองทำนะครับอาจจะมั่วไปเยอะขออภัยในที่ี้ด้วย

#include <SPI.h>
#include <SD.h>

#define chipSelect 10

int i=0;

void connection_sd(void);

void setup()
{
  pinMode(chipSelect,INPUT);
  Serial.begin(9600);
  connection_sd();
}

void loop() {
  String cout = String(i++);
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile)
  {
    dataFile.println(cout);
    dataFile.close();
    SD.exists("datalog.txt");
    Serial.println(cout);
  }
  else {
    Serial.println("error opening datalog.txt");
    connection_sd();
  }
}
void connection_sd(void)
{
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
  }
  else
    Serial.println("card initialized.");
}


https://www.youtube.com/watch?v=w6ond5B81Aw&feature=youtu.be

avr_lover

ขณะที่ดึงการ์ดเข้าออกนั้นบอร์ดกำลังติดต่อกับการ์ดอยู่หรือเปล่าครับเลยทำให้เกิดปัญหา ทางที่ดีขณะจะเอาการ์ดออกควรจะ stop card access ก่อน ตอนผมทำ data log จะมีปุ่มให้กดเพื่อ stop ทุก process ก่อน แล้วใช้ LED หรือ แสดงผลบน LCD ว่า remove sd card ได้ครับ

kanking1150

จริงดังท่านว่าครับผมนั่งเพ่ง led อยู่เลยนานเลยปรากฏว่า ledตอนมันสว่างสุดๆพอเพ่งดีๆปรากฏว่ามันยังมัการกระพริบเป็นจังหวะอยู่ครับซึ่งผมมโนได้แบบนี้
"เหมือนประมาณว่าจะเกิดอาการนี้ตอนประมาณที่ถ้าผมถอดการ์ดออกตอนที่ยังเขียนไฟล์ไม่เสร็จมั่งเท่าที่ผมคิดแล้วมันเลยสั่งปิดชื่อไฟล์ชื่อนั้นไม่ได้ แต่libมันให้ข้ามไปเลยแล้วคืนค่าว่ายังเหมือนเชื่อมต่อไปอยู่
แต่ที่หลอดจ้ากว่าเพราะsdcardไม่ได้ต่ออยู่เลยทำให้โวลทั้งหมดมาตกที่led"
เดียวจะลองทำการปรับแก้ตามที่แนะนำครับ