Hi guys, I'm using a Ultrasonic sensor with MKR series and it's working as charm. (code below).
When I try to connect second Ultrasound sensor to different pins even with very same code - I'm unable to get data - seems I did not understand well Sercom and PAD configuration - can anyone point what is wrong ?
Pins 0,1 works - pins 4,5 - configured in identical way on different serial does not work.
https://www.arduino.cc/en/Tutorial/SamdSercom is nice tutorial - but when I change values to Serial3 (D4 D5) - and use the same code it does not work.
// Serial - Native USB interface
// Serial1 - Default serial port on D13, D14 (Sercom 5)
// Serial2 - Extra serial port on D0, D1 (Sercom 3)
// Serial3 - Extra serial port on D4, D5 (Sercom 4)
// 0/1 - SERCOM/UART (Serial1)
// { PORTA, 11, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 }, // RX: SERCOM0/PAD[3]
// { PORTA, 10, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_10 }, // TX: SERCOM0/PAD[2]
// { PORTB, 22, PIO_SERCOM_ALT, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // TX: SERCOM5/PAD[2] ==14
// { PORTB, 23, PIO_SERCOM_ALT, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // RX: SERCOM5/PAD[3]==13
//PA07 D9 SERCOM0.3
//PA08 D4 SERCOM0.0 SERCOM2.0
//PA09 D3 SERCOM0.1 SERCOM2.1
//PA10 D1 SERCOM0.2 SERCOM2.2
//PA11 D0 SERCOM0.3 SERCOM2.3
//PB10 D23 / MOSI SERCOM4.2
//PB11 D24 / SCK SERCOM4.3
//PA12 D22 / MISO SERCOM2.0 SERCOM4.0
//PA13 Used by EDBC SERCOM2.1 SERCOM4.1
//PA14 D2 SERCOM2.2 SERCOM4.2
//PA16 D11 SERCOM1.0 SERCOM3.0
//PA17 D13 SERCOM1.1 SERCOM3.1
//PA18 D10 SERCOM1.2 SERCOM3.2
//PA19 D12 SERCOM1.3 SERCOM3.3
//PA20 D6 SERCOM5.2 SERCOM3.2
//PA21 D7 SERCOM5.3 SERCOM3.3
//PA22 D20 / SDA SERCOM3.0 SERCOM5.0
//PA23 D21 / SCL SERCOM3.1 SERCOM5.1
//PA24 Used by USB SERCOM3.2 SERCOM5.2
//PA25 Used by USB SERCOM3.3 SERCOM5.3
//PB22 D30 / EDBG TX SERCOM5.2
//PB23 D31 / EDBG RX SERCOM5.3
#include <MKRGSM.h>
#include <Wire.h>
#include "wiring_private.h"
Uart myNiveau(&sercom3, 0, 1, SERCOM_RX_PAD_1, UART_TX_PAD_0); //OK
Uart myNiveau2(&sercom3, 4, 5, SERCOM_RX_PAD_1, UART_TX_PAD_0); //OK
unsigned char data[4]={};
float distance;
unsigned long cuMill;
void setup()
{
Serial.begin(9600);
myNiveau.begin(9600);
myNiveau2.begin(9600);
pinPeripheral(0, PIO_SERCOM); //Assign RX function to pin 1
pinPeripheral(1, PIO_SERCOM); //Assign TX function to pin 0
pinPeripheral(4, PIO_SERCOM); //Assign RX function to pin 1
pinPeripheral(5, PIO_SERCOM); //Assign TX function to pin 0
Serial.println("Serials started");
}
void loop(){
for(int i=0;i<4;i++)
{data[i]=myNiveau.read();}
while(myNiveau.read()==0xff);
myNiveau.flush();
if(data[0]==0xff)
{ int sum;
sum=(data[0]+data[1]+data[2])&255;
if(sum==data[3])
{ distance=(data[1]<<8)+data[2];
if(distance>20)
{Serial.print(distance/10);Serial.println("cm till full");
}else
{Serial.println("FULL");
}
}else Serial.println("ERROR");
}
delay(100);
for(int i=0;i<4;i++)
{data[i]=myNiveau2.read();}
while(myNiveau2.read()==0xff);
myNiveau2.flush();
if(data[0]==0xff)
{ int sum;
sum=(data[0]+data[1]+data[2])&255;
if(sum==data[3])
{ distance=(data[1]<<8)+data[2];
if(distance>20)
{Serial.print(distance/10);Serial.println("cm till full");
}else
{Serial.println("FULL");
}
}else Serial.println("ERROR");
}
delay(100);
}
void SERCOM3_Handler()
{ myNiveau.IrqHandler();myNiveau2.IrqHandler();}