MCUdude / MicroCore

A light-weight Arduino hardware package for ATtiny13
548 stars 87 forks source link

analogRead compile errors #122

Closed pokearoo closed 3 years ago

pokearoo commented 3 years ago

The following program works well with version 1.0.7 of MicroCore. It's burnt in an IC and runs well. However I updated to version 2.0.2 and I get compile errors. In fact any versions more recent than 1.0.7 produce the same error.

"invalid conversion from 'int' to 'analog_pin_t' [-f permissive]

Thanks in advance Luc

int Ch1=1; //Digital output 1 int Ch2=0; //Digital output 2 int Pot1=A2; //Analogue input 1 int Pot2=A3; //Analogue input 2 int Val1=0; //Analogue reading 1 int Val2=0; //Analogue reading 2

void setup() { // put your setup code here, to run once:

pinMode(Ch1,OUTPUT); pinMode(Ch2,OUTPUT);

}

void loop() { Val1 = analogRead(Pot1); delay(2); if (Val1<5){ Val1=0; } analogWrite(Ch1,Val1/4); //PWM output 0 to 255

Val2 = analogRead(Pot2); if (Val2<5){ Val2=0; } delay(2); analogWrite(Ch2,Val2/4); //PWM output 0 to 255

MCUdude commented 3 years ago

MicroCore v2.0.0 and newer introduced a breaking change when handling analog pins.

use analog_pin_t instead of int for assigning analog pins:

int Ch1=1; //Digital output 1
int Ch2=0; //Digital output 2
analog_pin_t Pot1=A2; //Analogue input 1
analog_pin_t Pot2=A3; //Analogue input 2
int Val1=0; //Analogue reading 1
int Val2=0; //Analogue reading 2
pokearoo commented 3 years ago

That works.

Thanks

AchimPieters commented 3 years ago

@MCUdude I got the same error with this code:

//#define testrun // uncomment for test run the motor

#define LEFTSENSOR     3 // PIN 2
#define LEFTSENSORADC  3 // also PIN 2
#define LEFTMOTOR      4 // PIN 3
//#define LEFTDUTY     219 // for calibrate motor in same speed
#define RIGHTSENSOR    2 // PIN 7
#define RIGHTSENSORADC 1 // also PIN 7
#define RIGHTMOTOR     1 // PIN 6
//#define RIGHTDUTY    195 // for calibrate motor in same speed

#define THRESHOLD     56 // readings threshold for line detection
// Every analog readings from 0-1023,
// so an unsigned int allow accumulate 64 reads for average.
// Setting THRESHOLD 56 means white average * 56 / 64
// i.e. readings below 7/8 of white average means a line

unsigned int leftThreshold;
unsigned int rightThreshold;

unsigned int leftRead;
unsigned int rightRead;

bool lastTurnLeft = true;
bool firstMeetBlack = true;

void setup() {
  pinMode(LEFTMOTOR, OUTPUT);
  pinMode(RIGHTMOTOR, OUTPUT);

  delay(2000);

  readSensor(THRESHOLD);
  leftThreshold = leftRead >> 6; // divide by 64
  rightThreshold = rightRead >> 6; // divide by 64
}

void loop() {
#ifdef testrun
  turn(true, 0, 10); // minor turn left
  delay(500);
  turn(false, 0, 10); // minor turn right
  delay(500);
  turn(true, 0, 50); // turn left
  delay(500);
  turn(false, 0, 50); // turn right
  delay(500);
  turn(true, 0, 255); // full turn left
  delay(500);
  turn(false, 0, 255); // full turn right
  delay(500);
  turn(true, 10, 40); // minor dash and turn
  delay(500);
  turn(true, 30, 120); // dash and turn
  delay(500);
  turn(true, 63, 255); // full dash and turn
  delay(500);
  turn(true, 10, 0); // minor dash
  delay(500);
  turn(true, 50, 0); // dash
  delay(500);
  turn(true, 255, 0); // full dash
  delay(3000);
#else // normal run
// ========== real code start here ==========
  readSensor(4);
  leftRead >>= 2; // divide by 4
  rightRead >>= 2; // divide by 4

  bool leftBlack = (leftRead < leftThreshold);
  bool rightBlack = (rightRead < rightThreshold);

  if (firstMeetBlack && (leftBlack || rightBlack)) {
    // try to land on the line when first found it
    turn(false, 40, 160); // dash and turn
    firstMeetBlack = false;
    // todo: try to detect lost the line and set it to true again
  } else {
    if (leftBlack && rightBlack) {
      turn(lastTurnLeft, 0, 40);
    } else if (leftBlack) {
      turn(true, 0, 40);
    } else if (rightBlack) {
      turn(false, 0, 40);
    } else {
      turn(leftRead & 0b1, 0, 40); //use left readings as random run
    }
  }
  delay(40);
#endif //normal run
}

void turn(bool turnLeft, byte initTime, byte turnTime) {
  lastTurnLeft = turnLeft;

  motor(true, true);
  delay(initTime);

  motor(!turnLeft, turnLeft);
  delay(turnTime);

  motor(false, false);
}

void motor(bool leftOn, bool rightOn) {
#ifdef LEFTDUTY // PWM
  analogWrite(LEFTMOTOR, leftOn?LEFTDUTY:0);
#else
  digitalWrite(LEFTMOTOR, leftOn?HIGH:LOW);
#endif

#ifdef RIGHTDUTY // PWM
  analogWrite(RIGHTMOTOR, rightOn?RIGHTDUTY:0);
#else
  digitalWrite(RIGHTMOTOR, rightOn?HIGH:LOW);
#endif
}

void readSensor(byte count) {
  leftRead = 0;
  rightRead = 0;
  for (int i = 0; i < count; i++) {
    leftRead += analogRead(LEFTSENSORADC);
    rightRead += analogRead(RIGHTSENSORADC);
    delay(1);
  }
}
MCUdude commented 3 years ago

@AchimPieters the same solution applies for your code as well. Use analog_pin_t.