So I've sleuthed pretty hard for a solution to this problem, but before I drop a new chip into my arduino, I want to try and understand why I am having this issue, so as not to simply end up where I am once again.
Basically I have an arduino UNO R3 with ATMega 328P. Working on it with mac OS10.8.2.
Things were going along swimmingly until I got into reading and writing to/from EEPROM. Even that was working perfectly, until it wasn't. I wanted to verify that I was saving data between power cycles, so I pressed the reset button. I had done this a few times without issue. This time, once the board reset, it started driving my stepper motors [hooked up via driver boards [sparkfun BED's to be specific]] at full throttle. I pulled the power before they could reach their stops and hurt themselves, but now whenever I try to load code onto board it gives me the following issue:
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0003
0x00 != 0x80
avrdude: verification error; content mismatch
avrdude: Send: Q [51] [20]
avrdude: Recv: . [14]
avrdude: Recv: . [10]
avrdude done. Thank you.
Happy to paste the full verbose output if that would be helpful.
So from what I've been able to find out, this seems to be an issue that pops up sometimes if one has been uploading programs with lots of 0XFF in them. I have nothing like that in my code. At this point I can't even upload 'blink'. Whats more, it won't let me reburn the bootloader, giving me the following error:
avrdude: Version 5.11, compiled on Sep 2 2011 at 18:52:52
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2009 Joerg Wunsch
System wide configuration file is "/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf"
User configuration file is "/Users/robertcollier/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : usb
Using Programmer : stk500v2
avrdude: usbdev_open(): did not find any USB device "usb"
Whenever I try to upload anything, both TX and RX flash, but thats about it.
Here's the original code I was trying to upload:
//Robert Collier, David Reuss, Ben Cunkelman
#include <AccelStepper.h>
#include "EEPROMAnything.h"
#include <EEPROM.h>
int maxSpeed = 800; //maximum steps per second (about 3rps / at 16 microsteps)
int maxAccel = 500; //steps/second/second to accelerate
int inStop = 11000;
int outStop = 0;
int motor1DirPin = 4;
int motor1StepPin = 5;
int motor2DirPin = 6;
int motor2StepPin = 7;
int motor3DirPin = 8;
int motor3StepPin = 9;
int I_potX = A4;
int I_potY = A1;
int I_potZ = A2;
int I_force = A3;
int I_stickButton = 12;
int I_home = 3; //interrupt attached
float Xpot, Ypot, Zpot, Aspeed, Bspeed, Cspeed, force;
int userEN = 0;
int step1add = 0;
int step2add = 10;
int step3add = 20;
long stepper1pos = 0;
long stepper2pos = 0;
long stepper3pos = 0;
int O_LEDred = 11;
int O_LEDgrn = 13;
int O_LEDblu = 2; //pin 2 can serve as an interrupt
int O_enable = 10; //low=boards enabled. PD resistor on their side.
int HOME = 5500;
//set up the accelStepper intances
//the "1" tells it we are using a driver
AccelStepper stepper1(1, motor1StepPin, motor1DirPin);
AccelStepper stepper2(1, motor2StepPin, motor2DirPin);
AccelStepper stepper3(1, motor3StepPin, motor3DirPin);
void setup(){
stepper1.setMaxSpeed(maxSpeed);
stepper2.setMaxSpeed(maxSpeed);
stepper3.setMaxSpeed(maxSpeed);
stepper1.setSpeed(maxSpeed);
stepper2.setSpeed(maxSpeed);
stepper3.setSpeed(maxSpeed);
stepper1.setAcceleration(maxAccel);
stepper2.setAcceleration(maxAccel);
stepper3.setAcceleration(maxAccel);
pinMode(O_LEDred, OUTPUT);
pinMode(O_LEDgrn, OUTPUT);
pinMode(O_LEDblu, OUTPUT);
pinMode(I_home, INPUT_PULLUP);
// EEPROM_readAnything(step1add, stepper1pos);
// EEPROM_readAnything(step2add, stepper2pos);
// EEPROM_readAnything(step3add, stepper3pos);
stepper1.setCurrentPosition(stepper1pos);
stepper2.setCurrentPosition(stepper2pos);
stepper3.setCurrentPosition(stepper3pos);
stepper1.moveTo(HOME); //set target as home
stepper2.moveTo(HOME); //set target as home
stepper3.moveTo(HOME);
attachInterrupt(1,goHome,LOW); //interrupt1 is on pin 3 - takes the buttons on the housing pressed simultaneously, while they are held, goHome drives the thing home
digitalWrite(O_LEDgrn, HIGH);
// goHome(); //set it home
Serial.begin(9600);
}
void loop(){
Xpot = analogRead(I_potX);
Ypot = analogRead(I_potY);
Zpot = analogRead(I_potZ);
Aspeed = (Xpot+Zpot-1024)/1024;
Bspeed = (-Xpot+Zpot)/1024;
Cspeed = (-Ypot+Zpot)/1024; //All [-1,1]. All take input from correct pots... not necessarily the right sign
stepper1.setSpeed(maxSpeed*Aspeed); // Serial.println(Aspeed);
stepper2.setSpeed(maxSpeed*Cspeed); // Serial.println(Cspeed);
stepper3.setSpeed(maxSpeed*Bspeed); //Serial.println(Bspeed);
/* if((stepper1.currentPosition() == inStop) || stepper1.currentPosition() == outStop){
// stepper1.setSpeed(0);
stepper1.run();
}
if((stepper2.currentPosition() == inStop) || stepper2.currentPosition() == outStop){
// stepper2.setSpeed(0);
stepper2.run();
}
if((stepper3.currentPosition() == inStop) || stepper3.currentPosition() == outStop){
// stepper3.setSpeed(0);
stepper3.run();
}*/
if((userEN != digitalRead(I_stickButton)) && userEN){
stepper1pos = stepper1.currentPosition();
stepper2pos = stepper2.currentPosition();
stepper3pos = stepper3.currentPosition();
Serial.println(stepper1pos);
Serial.println(stepper2pos);
Serial.println(stepper3pos);
// EEPROM_writeAnything(step1add, stepper1pos);
// EEPROM_writeAnything(step2add, stepper2pos);
// EEPROM_writeAnything(step3add, stepper3pos);
}
if(digitalRead(I_stickButton)){
stepper1.runSpeed();
stepper2.runSpeed();
stepper3.runSpeed();
userEN=1;
}
else{
userEN=0;
}
force=analogRead(I_force);
if(force<50){
digitalWrite(O_LEDred, HIGH);
digitalWrite(O_LEDgrn, LOW);
digitalWrite(O_LEDblu, LOW);
}
else if(force<220){
digitalWrite(O_LEDred, LOW);
digitalWrite(O_LEDgrn, LOW);
digitalWrite(O_LEDblu, HIGH);
}
else{
digitalWrite(O_LEDred, LOW);
digitalWrite(O_LEDgrn, HIGH);
digitalWrite(O_LEDblu, LOW);
}
}
void goHome(){
stepper1.moveTo(HOME);
stepper2.moveTo(HOME);
stepper3.moveTo(HOME);
while( (stepper1.distanceToGo()!=0) && (stepper2.distanceToGo()!=0) && (stepper3.distanceToGo()!=0)){
stepper1.run();
stepper2.run();
stepper3.run();
}
}
So, I have a new ATMega chip in the mail, ready to be put in... but before it gets here [tomorrow hopefully] I would really love to understand how this became a problem... what did I do wrong? Any work around with my current chip?
Moderator edit:
[code] [/code] tags added.