| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		
			lokken
 
 
  Joined: 21 Feb 2010 Posts: 17
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| Reading and writing problem with SD card | 
			 
			
				 Posted: Sun Mar 28, 2010 4:25 am     | 
				     | 
			 
			
				
  | 
			 
			
				I have compiled this code:
 
 	  | Code: | 	 		  
 
#include <18f452.h>
 
#FUSES NOWDT                    //No Watch Dog Timer
 
#FUSES HS                       //High speed Osc (> 4mhz)
 
#FUSES NOPROTECT                //Code not protected from reading
 
#FUSES NOBROWNOUT                 //Reset when brownout detected
 
#FUSES NOPUT                    //No Power Up Timer
 
#FUSES NODEBUG                  //No Debug mode for ICD
 
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
 
 
#use delay(clock=20000000)
 
#include <HDM64GS12x.c>
 
#include <graphics.c>
 
#include <stdlib.h> // for atoi32
 
#use rs232(baud=9600,parity=N,xmit=PIN_A3,rcv=PIN_B7,bits=8)
 
#use fast_io(c)
 
 
#define MMCSD_PIN_SCL     PIN_C3 //o
 
#define MMCSD_PIN_SDI     PIN_C4 //i
 
#define MMCSD_PIN_SDO     PIN_C5 //o
 
#define MMCSD_PIN_SELECT  PIN_C6 //o
 
 
#include <mmcsd.c>
 
#include <input.c>
 
 
   BYTE value, cmd,a;
 
   int32 address;
 
 
   void main()
 
   {
 
   char deg1[32];
 
   char deg2[]="Value";
 
 
   glcd_init(ON);
 
   glcd_fillScreen(off);
 
   a=0;
 
 
   while(true)
 
   {
 
   glcd_init(ON);
 
   address=0;
 
   value=100;
 
   glcd_text57(0, 50, deg2, 1, ON);
 
   delay_ms(1000);
 
   mmcsd_write_byte(address, value);
 
   mmcsd_flush_buffer();
 
   delay_ms(1000);
 
   mmcsd_read_byte(address, &a);
 
   delay_ms(1000);   
 
   sprintf(deg1, "%d",a);
 
   glcd_text57(0, 30, deg1, 1, ON);
 
   delay_ms(1000);
 
   }   
 
   }
 
 | 	  
 
And I have seen the correct value (100) on Graphic LCD. When I add this code shown below to this program I couldn't see anyvalue on graphic lcd:
 
 	  | Code: | 	 		  
 
   address=512;
 
   value=300;
 
   glcd_text57(0, 50, deg2, 1, ON);
 
   delay_ms(1000);
 
   mmcsd_write_byte(address, value);
 
   mmcsd_flush_buffer();
 
   delay_ms(1000);
 
   mmcsd_read_byte(address, &a);
 
   delay_ms(1000);   
 
   sprintf(deg1, "%d",a);
 
   glcd_text57(0, 30, deg1, 1, ON);
 
   delay_ms(1000);
 
 | 	  
 
What should I do? | 
			 
		  | 
	
	
		  | 
	
	
		
			Wayne_
 
 
  Joined: 10 Oct 2007 Posts: 681
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Mar 29, 2010 2:03 am     | 
				     | 
			 
			
				
  | 
			 
			
				This is probably not related to your problem but 
 
 
value=300; 
 
 
What size is value ?
 
 
mmcsd_write_byte(address, value);
 
 
By the name of the function I would say that you cannot write the value 300   | 
			 
		  | 
	
	
		  | 
	
	
		
			ckielstra
 
 
  Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Mar 29, 2010 5:45 am     | 
				     | 
			 
			
				
  | 
			 
			
				When debugging try to narrow down the problem to as small a change as possible. Now you have changed the two variables 'address' and 'value', what happens if you change only one of these?
 
 
As Wayne already indicated a byte can only contain a maximum value of 255, your 300 will not fit.
 
 
Most likely the problem is caused by the write to the SD card failing. The read and write functions do return a result code. Add a check in your program to test for this result value and show an error code on failure.
 
 
Also post your compiler version number. | 
			 
		  | 
	
	
		  | 
	
	
		
			lokken
 
 
  Joined: 21 Feb 2010 Posts: 17
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Apr 01, 2010 7:51 am     | 
				     | 
			 
			
				
  | 
			 
			
				I will ask one more simple question.
 
Are these explanations true?(MY compiler version is 4.068)
 
 	  | Code: | 	 		  
 
mmcsd_write_byte(address, value); ///  0.adress=value
 
mmcsd_read_byte(address, &a); /// a=0.adress | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		
			theasus
 
 
  Joined: 31 May 2009 Posts: 79
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Apr 01, 2010 12:43 pm     | 
				     | 
			 
			
				
  | 
			 
			
				I have same problem with lokken.I want to use SD card as a large EEPROM. But I couldn't understand usage of these codes:
 
 	  | Code: | 	 		  
 
mmcsd_write_byte(address, value); 
 
mmcsd_read_byte(address, &a); 
 
 | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		
			PCM programmer
 
 
  Joined: 06 Sep 2003 Posts: 21708
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Thu Apr 01, 2010 12:54 pm     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Quote: | 	 		  
 
I have same problem with lokken. I want to use SD card as a large 
 
EEPROM. But I couldn't understand usage of these codes: 
 
 
mmcsd_write_byte(address, value); 
 
mmcsd_read_byte(address, &a); 
 
 | 	   
 
 
Look at the comments in this file:
 
 	  | Quote: | 	 		  | c:\program files\picc\drivers\mmcsd.c   | 	  
 
It says:
 
 	  | Quote: | 	 		  
 
//// mmcsd_flush_buffer()                                           
 
////  The two user write functions (mmcsd_write_byte() and           
 
////  mmcsd_write_data()) maintain a buffer to speed up the writing 
 
////  process.  Whenever a read or write is performed, the write
 
////  buffer is loaded with the specified page and only the          
 
////  contents of this buffer is changed.  If any future writes     
 
////  cross a page boundary then the buffer in RAM is written   
 
////  to the MMC/SD and then the next page is loaded into the  
 
////  buffer.  mmcsd_flush_buffer() forces the contents in RAM 
 
////  to the MMC/SD card.  Returns 0 if OK, non-zero if errror.  
 
 | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		
			theasus
 
 
  Joined: 31 May 2009 Posts: 79
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Sat Apr 03, 2010 11:23 am     | 
				     | 
			 
			
				
  | 
			 
			
				Ok I have read the functions but i didn't understand one point.
 
Why are we using pointer for  getting a value from any address? | 
			 
		  | 
	
	
		  | 
	
	
		
			ckielstra
 
 
  Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Sun Apr 04, 2010 6:26 am     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | theasus wrote: | 	 		  | Why are we using pointer for  getting a value from any address? | 	  You mean, why was the function not defined as: value = mmcsd_read_byte(int32 address)
 
 
Only the original author can answer this question, but I think it was implemented like this because there is also the error code to be returned. You can only return a single value and because all other functions return an error code it made more sense to do the same here as well. | 
			 
		  | 
	
	
		  | 
	
	
		 |