#ifndef _GEVINO_OPTO_PNP_IO_H_ #define _GEVINO_OPTO_PNP_IO_H_ /* Define per GEVINO opto pnp from v1.3 Changelog 22/11/2022 More output current on some pins DRVSTR 26/01/2024 Exchanged A0 for A1 */ #include "ATSAMD21_ADC.h" #define In1_name 19 // A5 #define In2_name 38 #define In3_name 2 #define In4_name 3 #define In5_name 4 #define In6_name 5 #define In7_name 6 #define In8_name 7 #define In9_name 8 #define In10_name 9 #define In11_name 45 #define Rs485_TxEn A1 #define SD_CS 12 #define ETH_RES 11 #define ETH_CS 10 #define Out1_name A3 #define Out2_name A4 #define Out3_name 42 #define Out4_name 27 #define LedRx_name 25 #define LedTx_name 26 #define In1 !digitalRead(In1_name) #define In2 !digitalRead(In2_name) #define In3 !digitalRead(In3_name) #define In4 !digitalRead(In4_name) #define In5 !digitalRead(In5_name) #define In6 !digitalRead(In6_name) #define In7 !digitalRead(In7_name) #define In8 !digitalRead(In8_name) #define In9 !digitalRead(In9_name) #define In10 !digitalRead(In10_name) #define In11 !digitalRead(In11_name) #define Out1 digitalRead(Out1_name) #define Out2 digitalRead(Out2_name) #define Out3 digitalRead(Out3_name) #define Out4 digitalRead(Out4_name) #define setOut1 digitalWrite(Out1_name, HIGH) #define resOut1 digitalWrite(Out1_name, LOW) #define setOut2 digitalWrite(Out2_name, HIGH) #define resOut2 digitalWrite(Out2_name, LOW) #define setOut3 digitalWrite(Out3_name, HIGH) #define resOut3 digitalWrite(Out3_name, LOW) #define setOut4 digitalWrite(Out4_name, HIGH) #define resOut4 digitalWrite(Out4_name, LOW) #define setLed digitalWrite(LED_BUILTIN, HIGH) // Yellow front Led #define resLed digitalWrite(LED_BUILTIN, LOW) // Yellow front Led #define setLedRx digitalWrite(LedRx_name, LOW) #define resLedRx digitalWrite(LedRx_name, HIGH) #define setLedTx digitalWrite(LedTx_name, LOW) #define resLedTx digitalWrite(LedTx_name, HIGH) #define set_Rs485_TxEn digitalWrite(Rs485_TxEn, HIGH) #define res_Rs485_TxEn digitalWrite(Rs485_TxEn, LOW) void gevino_io_setup( void ){ PORT->Group[PORTA].PINCFG[22].bit.DRVSTR = 1; // More current on output pin SDA PORT->Group[PORTA].PINCFG[23].bit.DRVSTR = 1; // More current on output pin SCL PORT->Group[PORTB].PINCFG[10].bit.DRVSTR = 1; // More current on output pin MOSI PORT->Group[PORTB].PINCFG[11].bit.DRVSTR = 1; // More current on output pin SCK PORT->Group[PORTB].PINCFG[37].bit.DRVSTR = 1; // More current on output pin Serial-Tx PORT->Group[PORTA].PINCFG[10].bit.DRVSTR = 1; // More current on output pin Serial1-Tx PORT->Group[PORTA].PINCFG[19].bit.DRVSTR = 1; // More current on output pin D12 cs-SD PORT->Group[PORTA].PINCFG[16].bit.DRVSTR = 1; // More current on output pin D11 cs-Eth // Define Output pinMode(Out1_name, OUTPUT); // Set Out1_name digital pin as Output pinMode(Out2_name, OUTPUT); pinMode(Out3_name, OUTPUT); pinMode(Out4_name, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); // Yellow front Led pinMode(ETH_RES, OUTPUT); // Define Input Pullup pinMode(In1_name, INPUT_PULLUP); // In01 pinMode(In2_name, INPUT_PULLUP); // In02 pinMode(In3_name, INPUT_PULLUP); // In03 pinMode(In4_name, INPUT_PULLUP); // In04 pinMode(In5_name, INPUT_PULLUP); // In05 pinMode(In6_name, INPUT_PULLUP); // In06 pinMode(In7_name, INPUT_PULLUP); // In07 pinMode(In8_name, INPUT_PULLUP); // In08 pinMode(In9_name, INPUT_PULLUP); // In09 pinMode(In10_name, INPUT_PULLUP);// In10 pinMode(In11_name, INPUT_PULLUP);// In11 pinMode(Rs485_TxEn, OUTPUT); res_Rs485_TxEn; resOut1; resOut2; resOut3; resOut4; digitalWrite(ETH_RES, LOW); delay(300); digitalWrite(ETH_RES, HIGH); delay(300); } void testLeds( void ){ // Accende la maggior parte dei led per le foto // Define Output pinMode(Out1_name, OUTPUT); pinMode(Out2_name, OUTPUT); pinMode(Out3_name, OUTPUT); pinMode(Out4_name, OUTPUT); pinMode(In1_name, OUTPUT); pinMode(In2_name, OUTPUT); pinMode(In3_name, OUTPUT); pinMode(In4_name, OUTPUT); pinMode(In5_name, OUTPUT); pinMode(In6_name, OUTPUT); pinMode(In7_name, OUTPUT); pinMode(In8_name, OUTPUT); pinMode(In9_name, OUTPUT); pinMode(In10_name, OUTPUT); pinMode(In11_name, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); // Yellow front Led pinMode(Rs485_TxEn, OUTPUT); // Set Tx Enable pinMode(1, OUTPUT); // Set Tx Output pinMode(0, OUTPUT); // Set Rx Output // Tutto spento - All Off digitalWrite(Out1_name, LOW); digitalWrite(Out2_name, LOW); digitalWrite(Out3_name, LOW); digitalWrite(Out4_name, LOW); digitalWrite(In1_name, HIGH); digitalWrite(In2_name, HIGH); digitalWrite(In3_name, HIGH); digitalWrite(In4_name, HIGH); digitalWrite(In5_name, HIGH); digitalWrite(In6_name, HIGH); digitalWrite(In7_name, HIGH); digitalWrite(In8_name, HIGH); digitalWrite(In9_name, HIGH); digitalWrite(In10_name, HIGH); digitalWrite(In11_name, HIGH); digitalWrite(LED_BUILTIN, LOW); // Yellow front Led digitalWrite(Rs485_TxEn, HIGH); // Tx Enable High digitalWrite(1, HIGH); // Tx digitalWrite(0, HIGH); // Rx pinMode(26, OUTPUT); // Tx Led digitalWrite(26, LOW); delay(200); digitalWrite(26, HIGH); pinMode(25, OUTPUT); // Rx Led digitalWrite(25, LOW); delay(200); digitalWrite(25, HIGH); pinMode(LED_BUILTIN, OUTPUT); // Yellow Led digitalWrite(LED_BUILTIN, HIGH); delay(200); digitalWrite(LED_BUILTIN, LOW); pinMode(In1_name, OUTPUT); // In01 digitalWrite(In1_name, LOW); delay(200); digitalWrite(In1_name, HIGH); pinMode(In2_name, OUTPUT); // In02 digitalWrite(In2_name, LOW); delay(200); digitalWrite(In2_name, HIGH); pinMode(In3_name, OUTPUT); // In03 digitalWrite(In3_name, LOW); delay(200); digitalWrite(In3_name, HIGH); pinMode(In4_name, OUTPUT); // In04 digitalWrite(In4_name, LOW); delay(200); digitalWrite(In4_name, HIGH); pinMode(In5_name, OUTPUT); // In05 digitalWrite(In5_name, LOW); delay(200); digitalWrite(In5_name, HIGH); pinMode(In6_name, OUTPUT); // In06 digitalWrite(In6_name, LOW); delay(200); digitalWrite(In6_name, HIGH); pinMode(In7_name, OUTPUT); // In07 digitalWrite(In7_name, LOW); delay(200); digitalWrite(In7_name, HIGH); pinMode(In8_name, OUTPUT); // In08 digitalWrite(In8_name, LOW); delay(200); digitalWrite(In8_name, HIGH); pinMode(In9_name, OUTPUT); // In09 digitalWrite(In9_name, LOW); delay(200); digitalWrite(In9_name, HIGH); pinMode(In10_name, OUTPUT); // In10 digitalWrite(In10_name, LOW); delay(200); digitalWrite(In10_name, HIGH); pinMode(In11_name, OUTPUT); // In11 digitalWrite(In11_name, LOW); delay(200); digitalWrite(In11_name, HIGH); // RS485 Tx digitalWrite(1, LOW); delay(200); digitalWrite(1, HIGH); // RS485 Rx // digitalWrite(Rs485_TxEn, LOW); digitalWrite(0, LOW); delay(200); // digitalWrite(Rs485_TxEn, HIGH); digitalWrite(0, HIGH); pinMode(Out1_name, OUTPUT); // Set Out1_name digital pin as Output setOut1; delay(200); resOut1; pinMode(Out2_name, OUTPUT); setOut2; delay(200); resOut2; pinMode(Out3_name, OUTPUT); setOut3; delay(200); resOut3; pinMode(Out4, OUTPUT); setOut4; delay(200); resOut4; delay(200); // All On digitalWrite(0, LOW); digitalWrite(1, LOW); digitalWrite(26, LOW); // Tx Led digitalWrite(25, LOW); // Rx Led digitalWrite(LED_BUILTIN, HIGH); digitalWrite(In1_name, LOW); digitalWrite(In2_name, LOW); digitalWrite(In3_name, LOW); digitalWrite(In4_name, LOW); digitalWrite(In5_name, LOW); digitalWrite(In6_name, LOW); digitalWrite(In7_name, LOW); digitalWrite(In8_name, LOW); digitalWrite(In9_name, LOW); digitalWrite(In10_name, LOW); digitalWrite(In11_name, LOW); setOut1; setOut2; setOut3; setOut4; delay(1000); // All off digitalWrite(0, HIGH); digitalWrite(1, HIGH); digitalWrite(26, HIGH); // Tx digitalWrite(25, HIGH); // Rx digitalWrite(LED_BUILTIN, LOW); // Led digitalWrite(In1_name, HIGH); digitalWrite(In2_name, HIGH); digitalWrite(In3_name, HIGH); digitalWrite(In4_name, HIGH); digitalWrite(In5_name, HIGH); digitalWrite(In6_name, HIGH); digitalWrite(In7_name, HIGH); digitalWrite(In8_name, HIGH); digitalWrite(In9_name, HIGH); digitalWrite(In10_name, HIGH); digitalWrite(In11_name, HIGH); resOut1; resOut2; resOut3; resOut4; } // Analog // arduino analogRead() function, freezes the program for several milliseconds. This metodono do not alt it. // la funzione arduino analogRead(), blocca il programma per diversi millisecondi. Questo metodono lo blocca. uint32_t analogResult[6]; void analogPolling(void){ //A0 = PA2 = AIN0 //A1 = PB8 = AIN2 //A2 = PB9 = AIN3 //A3 = PA4 = AIN4 //A4 = PA5 = AIN5 //A5 = PB2 = AIN10 static byte pin = 0; if( ADC->INTFLAG.bit.RESRDY ){ // if conversion is done ADC->INTFLAG.reg = ADC_INTFLAG_RESRDY; switch(pin){ case 0: analogResult[0] = ADC->RESULT.reg; // save conversion value pin = 3; ADC->INPUTCTRL.bit.MUXPOS = pin; // Selection new conversion pin ADC->SWTRIG.bit.START = 1; // start new conversion break; case 3: analogResult[2] = ADC->RESULT.reg; // save conversion value pin = 10; ADC->INPUTCTRL.bit.MUXPOS = pin; // Selection new conversion pin ADC->SWTRIG.bit.START = 1; // start new conversion break; case 10: analogResult[5] = ADC->RESULT.reg; // save conversion value pin = 0; ADC->INPUTCTRL.bit.MUXPOS = pin; // Selection new conversion pin ADC->SWTRIG.bit.START = 1; // start new conversion } } } void analogEnable( void ){ while (ADC->STATUS.bit.SYNCBUSY == 1); ADC->CTRLA.bit.ENABLE = 0x01; // Enable ADC while (ADC->STATUS.bit.SYNCBUSY == 1); ADC->INPUTCTRL.bit.MUXNEG = ADC_PIN_IOGND; // set back muxneg to internal ground ADC_PIN_GND / ADC_PIN_IOGND while (ADC->STATUS.bit.SYNCBUSY == 1); ADC->INPUTCTRL.bit.MUXPOS = 2; // Selection new conversion pin while (ADC->STATUS.bit.SYNCBUSY == 1); ADC->SWTRIG.bit.START = 1; // start new conversion } #endif // _GEVINO_OPTO_PNP_IO_H_