View previous topic :: View next topic |
Author |
Message |
mvanvliet
Joined: 02 Jun 2009 Posts: 123 Location: The Netherlands
|
Vdrive2 and 16f1824 |
Posted: Tue Feb 26, 2013 7:07 am |
|
|
I would like to store some data on a 64MB flash drive and I think that a Vdrive2 is an easy solution for that.
I've based my software on the software in this thread:
http://www.ccsinfo.com/forum/viewtopic.php?t=43446&highlight=vdrive2
Here is my (shortened) code:
Code: |
#use rs232(baud=9600, xmit=PIN_A0)
int data = 42;
delay_ms(8000);
// create file and open it
printf("OPW test.txt");
// write to file
printf("WRF ");
putc(0x00); // number of bytes of data
putc(0x00);
putc(0x00);
putc(0x02); // two bytes (1) data (2) carriage return
putc(0x0d); // carriage return
printf("%u\t", data); // send data to the text.txt file
putc(0x0d); // carriage return
// close the file
printf("CLF test.txt");
putc(0x0d); // carriage return
while(1); |
When I put the oscilloscope on my pin 13 I see data coming out after 8 seconds. So the hardware seems to be fine. I have Uart/SPI pin pulled up to 3V3 for Uart mode.
I've also tried to burn the new firmware in the Vdrive2. And I choose the following mode:
Code: |
Firmware Settings
Firmware Version: 03.69-001 (Modified)
Firmware Type: VDAP FTD Upgrader File for Main Code
Default Monitor Settings: 9600 baud, 8 bits, 1 stop bit, no parity, no flow control
Initial Mode: ECS, IPA, LED Flash at Power-on
Options: Allow Firmware Upgrades, Allow Data Mode,
Show Prompt, Show Device Connects/Removals, Show Version Report at Startup.
|
The Led of the Vdrive turns green when I apply power and flashed one time after 8 seconds, but there is no test.txt on my flash drive.
VCC = 5V, but my micro is running at 3V3 so my tx is at 3V3.
Is there anyone who knows what I did wrong?
CCS 4.132 |
|
|
mvanvliet
Joined: 02 Jun 2009 Posts: 123 Location: The Netherlands
|
|
Posted: Tue Feb 26, 2013 8:56 am |
|
|
I've changed my VCC of my micro from 3V3 to 5V and now I get a test.txt on my flash disk. It's only empty. Anyone? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Tue Feb 26, 2013 10:36 am |
|
|
You are not sending the size correctly. The size is hex not binary. _Text_.
So:
Code: |
int16 size=2;
//This is what you need if size is going to vary in the future
printf("WRF %04x\r",size);
//or for the fixed value
printf(WRF 0002\r");
|
Beware also your data size. You are sending more than two characters.....
Best Wishes |
|
|
mvanvliet
Joined: 02 Jun 2009 Posts: 123 Location: The Netherlands
|
|
Posted: Wed Feb 27, 2013 3:02 am |
|
|
I tried some different things with the printf function, but stil no data in the text file.
Code: | int data = 42;
// create file and open it
printf("OPW test.txt");
// write to file
printf("WRF 2\r");
printf("%u\r", data); // send data to the text.txt file
// close the file
printf("CLF test.txt");
while(1); |
I've put the carriage return values also in the printf function. Maybe the data must be in binary instead of ASCII (which it is now I think). But how can that be done?
Quote: | Data to write to the file is taken directly from the Monitor input and written to the file. There is no conversion from ASCII to binary in IPA mode nor is a carriage return required after writing the data to the Monitor port.
In this example, the command is given in ECS mode, the data size in ASCII mode and the data is represented in binary values.
WRF 10
01 02 03 04 05 06 07 08 09 0a
<prompt>
In SCS mode and IPH mode (values in Binary Mode are sent MSB first):
08 20 00 00 00 0A 0d
01 02 03 04 05 06 07 08 09 0a
<prompt> |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Wed Feb 27, 2013 3:44 am |
|
|
The WRF command _requires four hex digits for size_. |
|
|
mvanvliet
Joined: 02 Jun 2009 Posts: 123 Location: The Netherlands
|
|
Posted: Wed Feb 27, 2013 4:02 am |
|
|
I also tried your suggestion
Code: | printf("WRF 0002\r");
|
and
Code: | int16 size=2;
//This is what you need if size is going to vary in the future
printf("WRF %04x\r",size);
|
But with this printf functions it also don't work. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Wed Feb 27, 2013 4:40 am |
|
|
See the other part of my comment. Your data size is _wrong_.
Best Wishes |
|
|
mvanvliet
Joined: 02 Jun 2009 Posts: 123 Location: The Netherlands
|
|
Posted: Wed Feb 27, 2013 5:29 am |
|
|
Sorry Ttelmah....I don't get it...and thank you for your patience.
Is this wrong, or is the number of ascii values which I send to the flash disk?
Code: | printf("WRF 0002\r"); |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Wed Feb 27, 2013 6:08 am |
|
|
Number of bytes you send.
Seriously, try printing the value to a string, and looking at how big it is. Remember also that things like a tab and a line feed are also characters.....
Far better, to sprintf the data to a string, then use strlen, to specify the size you are going to write to the drive, which will calculate the value for you.
Best Wishes |
|
|
mvanvliet
Joined: 02 Jun 2009 Posts: 123 Location: The Netherlands
|
|
Posted: Wed Feb 27, 2013 8:37 am |
|
|
I've tried some things:
Code: | int data = 42;
char strData[20];
char sData[20];
char Line[] = "\r";
int16 size=0;
delay_ms(8000);
// create file and open it
printf("OPW test.txt\r");
sprintf(sData,"%u", data);
strcat(sData, Line);
size = strlen(sData);
// write to file
printf("WRF %04x\r",size);
// send data to the text.txt file
printf("%u\r", data);
// close the file
printf("CLF test.txt\r");
while(1); |
This was the output with a hyperterminal kind of program:
Code: | OPW test.txt
WRF 0003
42
CLF test.txt |
But I did one stupid thing...connecting the Vdrive with the power on my controller. Now the led of the Vdrive keeps blinking when I write to it. I tried to flash new firmware in it, but it doesn't help. |
|
|
mvanvliet
Joined: 02 Jun 2009 Posts: 123 Location: The Netherlands
|
|
Posted: Wed Feb 27, 2013 9:39 am |
|
|
The Vdrive is running again...something strange with the C code. But still no data in the text file. |
|
|
mvanvliet
Joined: 02 Jun 2009 Posts: 123 Location: The Netherlands
|
|
Posted: Fri Mar 01, 2013 5:24 am |
|
|
I finally got it working (still without a string, but that's for later)!
But now another question:
is:
putc(0x06);
a different value then:
putc(6);
or
putc('6'); //this is 0x36 I think, so this is a different value.
For the length of the bytes who are transmitted, you must specify the number of bytes. But the first is working and the second not. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Fri Mar 01, 2013 8:50 am |
|
|
6, 0x6, 0b0110 are all the same. Just different representations of the same binary number.
'6' is the text (ASCII) character.
Best Wishes |
|
|
mvanvliet
Joined: 02 Jun 2009 Posts: 123 Location: The Netherlands
|
|
Posted: Mon Mar 04, 2013 4:44 am |
|
|
Why I asked this:
this is working:
Code: | printf("WRF ");
putc(0x00); // number of bytes of data
putc(0x00);
putc(0x00);
putc(size);
putc('\r'); |
and this not:
Code: |
printf("WRF %04x\r",size);
|
size is in both situations int16.
I can't see the difference, but maybe anyone else... |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Mon Mar 04, 2013 8:32 am |
|
|
putc sends a binary value, not a hex digit.
However I'm surprised the latter works, since this 'disagrees' with what the Vdrive manual says....
However the command with printf, would be something like:
Code: |
printf("WRF \0\0%c%c\r"size/256,size);
//That will handle sizes up to 65535, rather than the 256 you were using
//Or with putc
putc(0);
putc(0);
putc(size/256);
putc(size);
|
Syntactically, I'd slightly prefer to use make8, to fetch the bytes, but the compiler will automatically optimise /256 to a high byte fetch, so it is 'acceptable ish'.
Putting '0x' into a putc, says 'treat the number as hex', but 0x0, 0, '\0', '0b0', etc., are all the same number. It doesn't affect what is sent at all.
Best Wishes |
|
|
|