Show Posts
Pages: [1]
1  Using Arduino / Storage / Re: Arduino Uno and ATMEL memory chip using SPI on: March 09, 2011, 04:20:15 pm
Yes, I should have included the memory chip I am using now in my post. Its a winbond: http://www.winbond.com.tw/NR/rdonlyres/591A37FF-007C-4E99-956C-F7EE4A6D9A8F/0/W25Q64BV.pdf

This chip requires three address bytes of B00000000 after the read manufacturer id command.

And thanks sark, I didnt catch that.
2  Using Arduino / Storage / Re: Arduino Uno and ATMEL memory chip using SPI on: March 09, 2011, 02:31:38 pm
Hey all,

I've been using a new memory chip since the last time (still working on same problem). I tried what sark did, as far as reading the manufacturer ID using this code:

Code:
#include <SPI.h>

const int SlaveSelect = 10;
const int MOSI = 11;
const int MISO = 12;
const int CLK = 13;
byte myByte;

void setup()
{
  Serial.begin(9600);
   
  pinMode(MISO, INPUT);
 
  SPI.begin();
 
  delay(10);
 
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV128);
 
  delay(10);
 
 
  digitalWrite(SlaveSelect,LOW);
  delay(10);
  SPI.transfer(0x06);
  delay(10);
  digitalWrite(SlaveSelect,HIGH);
 
  delay(10);
 
   digitalWrite(SlaveSelect,LOW);
  delay(10);
  SPI.transfer(0x02);
  SPI.transfer(0x00);
  SPI.transfer(0x00);
  SPI.transfer(0x05);
  myByte = SPI.transfer(0x255);
   digitalWrite(SlaveSelect,HIGH);
 
 
  Serial.println("done");
 
 
}


void loop()
{
 
  digitalWrite(SlaveSelect,LOW);
  delay(10);
  SPI.transfer(0x90);
  SPI.transfer(0x00);
  SPI.transfer(0x00);
  SPI.transfer(0x00);
  myByte = SPI.transfer(0x01);
  digitalWrite(SlaveSelect,HIGH);
 
 
  Serial.println(myByte,DEC);
  delay(500);

 
}

with the following output:
Code:
done
0
239
0
0
0
239
0
0
0
239
0
0
0
239

239 is the correct ID, but does anyone have an idea why its not continuous and there are 0s in between?


3  Using Arduino / Storage / Re: Arduino Uno and ATMEL memory chip using SPI on: February 19, 2011, 08:22:31 pm
So I've still been working on it to no avail. Any chance it's a timing issue? Maybe I need to throw some delays in there. I'm just not sure what the problem is; it seems as if I'm doing everything in the proper order.
4  Using Arduino / Storage / Re: Arduino Uno and ATMEL memory chip using SPI on: February 17, 2011, 08:15:39 am
Don't you to print eeprom_output_data after the read, and not testdata?

eeprom_output_data = read_eeprom(address);
 
  Serial.print("Data: ");Serial.print(testdata,DEC);Serial.print(" from Address: "); Serial.println(address,DEC);


Yes, I apologize; I accidentally posted an earlier version of my code that gave me an error (I'll change the original post). However, the output I posted is what I get even when I print eeprom_output_data.
5  Using Arduino / Storage / Arduino Uno and ATMEL memory chip using SPI on: February 16, 2011, 09:05:04 pm
Hey all.

I've been working hard the past 2 weeks trying to get my Arduino to successfully and consistently write/read from memory using SPI but I am having problems. I used the tutorial code for SPIEEPROM to get me started and have made the proper modifications for the memory chip I am using. I'm using the Arduino Uno and the Atmel AT25DF641 chip (data sheet here: http://www.atmel.com/dyn/resources/prod_documents/doc3680.pdf).

For the connections I used pins 13,12,11,10 from the Arduino to the chip (on a breadboard), and also tied the WP to Vcc.

Here's the code that I have so far:

Code:
int DATAOUT =  11;//MOSI
int DATAIN =  12;//MISO
int SPICLOCK =  13;//sck
int SLAVESELECT =  10;//ss
 
byte eeprom_output_data;
byte clr;
int address=0;
char buffer [128];

void setup()
{
  
  Serial.begin(9600);
  
  initPins();  //initialize data pins
  
  digitalWrite(SLAVESELECT,HIGH); //disable device
  
  DDRB = (1<<DDB5)|(1<<DDB3)|(1<<DDB2);  // set DDRB register
  
  delay(1000);      // delay
  
  // CPOL = 0 base value of clock is zero (SPI Mode0)
  // CPHA = 0 data captured on rising edge(SPI Mode0)
  // Arduino Master Mode
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);
  clr=SPSR;
  clr=SPDR;
  
  delay(1000);    // delay
  
  fill_buffer();    // fill a char array in code
  
  digitalWrite(SLAVESELECT,HIGH);
  digitalWrite(SLAVESELECT,LOW);   // start operation HIGH->LOW
  spi_transfer((char)6);                 //write enable
  digitalWrite(SLAVESELECT,HIGH);  //end operation LOW->HIGH  
  
  delay(1000);  // wait 1 second
  
  digitalWrite(SLAVESELECT,LOW); //start operation HIGH->LOW
  spi_transfer((char)2);       // write command
  spi_transfer((char)0);       //first address byte (MSB)
  spi_transfer((char)0);       //second address byte (next byte)
  spi_transfer((char)0);       //third address byte (LSB)
  
  // Loop sending each char in char array to memory chip
  for (int I=0;I<128;I++)
  {
    Serial.print("Sending "); Serial.print(buffer[I], DEC);
    Serial.println(" to memory.");
    spi_transfer(buffer[I]); //write data byte
    delay(3);
  }
 
  digitalWrite(SLAVESELECT,HIGH); //end operation LOW->HIGH
  
  delay(3000); // wait 3 seconds
  
  Serial.print('h',BYTE);
  Serial.print('i',BYTE);
  Serial.print('\n',BYTE);//debug
}

void loop()
{
  
  eeprom_output_data = read_eeprom(address);
  
  Serial.print("Data: ");Serial.print(eeprom_output_data,DEC);Serial.print(" from Address: ");Serial.println(address,DEC);
    
  address++;
  
  if(address == 128)
    address=0;
 
 delay(500);
 
}

void fill_buffer()
{
  for (int I=0;I<128;I++)
  {
    buffer[I]=I;
  }
}

char spi_transfer(char data)
{
  SPDR = data;                    // Start the transmission
    
  while (!(SPSR & (1<<SPIF)))     // Wait for the end of the transmission
  {
  };
  
  return SPDR;                    // return the received byte
}


byte read_eeprom(int EEPROM_address)
{
  int data;
  
  digitalWrite(SLAVESELECT,LOW);
  spi_transfer((char)11);                       //transmit read opcode
  spi_transfer((char)(EEPROM_address>>8)); // first address byte
  spi_transfer((char)(EEPROM_address>>8)); // second address byte
  spi_transfer((char)(EEPROM_address));   // third address byte
  spi_transfer((char)(B11111111)); // dummy byte
  data = spi_transfer((char)(B11111111)); // generate extra clock signals for data
  digitalWrite(SLAVESELECT,HIGH); //release chip, signal end transfer
  
  delay(10);
  
  return data;
}

void initPins()
{
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
}


My output is:
Code:
Data: 0 from Address: 0
Data: 0 from Address: 1
.
.

I get 0's for each address despite having the loop that writes to memory. Does anything in the code stick out as wrong? Any help is appreciated!!
6  Forum 2005-2010 (read only) / Interfacing / Re: Interfacing GPS with Arduino Board on: December 20, 2010, 12:10:46 pm
So would NewSoftSerial not be needed at all then?

I assumed the GPS was transmitting data through pins 0,1 to the Arduino board on the RS232 shield (by looking at connections on the shield). Through which pins would the GPS communicate with the board when using the RS232 shield?
7  Forum 2005-2010 (read only) / Interfacing / Interfacing GPS with Arduino Board on: December 20, 2010, 11:59:52 am
Hello all. I am having some problems interfacing a GPS with an Arduino Board and was looking for some help.

Hardware
-----------
Arduino Board: Uno
GPS: Garmin 18x PC
RS232 Shield

So far what I have done is:

1) Upload code to Arduino board.
2) Place RS232 Shield on top of Arduino board.
3) Connect Garmin 18x PC to serial port on RS232 Shield.
4) Open Serial terminal.

I downloaded the TinyGPS library and used the example code that was on there with a few changes (which I highlighted):

Code:
#include <TinyGPS.h>
#include <NewSoftSerial.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of NewSoftSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 2(rx) and 3(tx).
*/

TinyGPS gps;
[glow]NewSoftSerial mySerial = NewSoftSerial(0,1);[/glow]

void gpsdump(TinyGPS &gps);
bool feedgps();
void printFloat(double f, int digits = 2);

void setup()
{
  Serial.begin(4800);
  mySerial.begin(4800);
  
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));
  Serial.println();
}

void loop()
{
  bool newdata = false;
  unsigned long start = millis();
  
  // Every 5 seconds we print an update
  while (millis() - start < 5000)
  {
    if (feedgps())
      newdata = true;
  }
  
  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
     Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
  
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print(".");

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint;
  }
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
  
  feedgps(); // If we don't feed the gps during this long routine, we may drop characters and get checksum errors

  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): "); Serial.print(time);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  feedgps();

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/"); Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
  Serial.print("  Time: "); Serial.print(static_cast<int>(hour)); Serial.print(":"); Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second)); Serial.print("."); Serial.print(static_cast<int>(hundredths));
  Serial.print("  Fix age: ");  Serial.print(age); Serial.println("ms.");
  
  feedgps();

  Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): "); Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
  Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): "); printFloat(gps.f_course()); Serial.println();
  Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");  printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): "); printFloat(gps.f_speed_kmph()); Serial.println();

  feedgps();

  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: "); Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}
  
bool feedgps()
{  
  while (mySerial.available())
  {
    char serialchar = mySerial.read();
    [glow]Serial.print(serialchar, BYTE);[/glow]
    if (gps.encode(serialchar))
      return true;
  }
  
[glow]float flat, flon;
unsigned long fix_age;

// returns +- latitude/longitude in degrees
gps.f_get_position(&flat, &flon, &fix_age);

if (fix_age == TinyGPS::GPS_INVALID_AGE)
  Serial.println("No fix detected");
else if (fix_age > 5000)
  Serial.println("Warning: possible stale data!");
else
  Serial.println("Data is current.");[/glow]
  
  return false;
}

The output I get is:

Code:
Testing TinyGPS library v. 9
by Mikal Hart

Sizeof(gpsobject) = 103

No fix detected
No fix detected
No fix detected
No fix detected
No fix detected
No fix detected
No fix detected

As a side note, I noticed when I started to remove the shield to the point where the Analog In and Power Pins were not connected I got garbage, yet still no fix.

Code:
ÿ¿ïÿÿÿNo fix detected
ÿÿùÿÿÿÿNo fix detected
¿ÿÿNo fix detected
þÿÿÿïÿÿNo fix detected
ÿþÿÿÿNo fix detected
ÿÿþþÿÿÿÿNo fix detected
ÿüÿÿ¿No fix detected
ÿöÿÿ·÷¿ÿÿþüNo fix detected
ßø÷ÿÿþÿNo fix detected
ÿÿÿÿóúÿßÿÿÿßÿþþÿÿNo fix detected
ÿúÿÿøÿßÿÿÿßÿþþþNo fix detected
ÿúÿÿúÿßÿÿÿßÿþþNo fix detected

Any help to let me know if I am headed in the right direction or if I'm doing something wrong is greatly appreciated.
Pages: [1]