From 900988633e8eda2d692b58398c846ddd2e2f28c8 Mon Sep 17 00:00:00 2001 From: Yohan Boujon Date: Tue, 5 Apr 2022 20:26:58 +0200 Subject: [PATCH] Additions from 03/12/2021: Refactoring to multiple files. --- i2c_test_attiny85/USI_TWI_Slave.c | 220 ++++++++++++++++++++++ i2c_test_attiny85/USI_TWI_Slave.h | 176 +++++++++++++++++ i2c_test_attiny85/i2c_test_attiny85.cproj | 24 +++ i2c_test_attiny85/led_gen.c | 34 ++++ i2c_test_attiny85/led_gen.h | 19 ++ i2c_test_attiny85/led_receptor.c | 81 ++++++++ i2c_test_attiny85/led_receptor.h | 31 +++ i2c_test_attiny85/led_test.c | 34 ++++ i2c_test_attiny85/led_test.h | 16 ++ i2c_test_attiny85/main.c | 186 +++++------------- i2c_test_attiny85/test_led.c | 7 + 11 files changed, 686 insertions(+), 142 deletions(-) create mode 100755 i2c_test_attiny85/USI_TWI_Slave.c create mode 100755 i2c_test_attiny85/USI_TWI_Slave.h create mode 100755 i2c_test_attiny85/led_gen.c create mode 100755 i2c_test_attiny85/led_gen.h create mode 100755 i2c_test_attiny85/led_receptor.c create mode 100755 i2c_test_attiny85/led_receptor.h create mode 100755 i2c_test_attiny85/led_test.c create mode 100755 i2c_test_attiny85/led_test.h create mode 100755 i2c_test_attiny85/test_led.c diff --git a/i2c_test_attiny85/USI_TWI_Slave.c b/i2c_test_attiny85/USI_TWI_Slave.c new file mode 100755 index 0000000..dfaa86f --- /dev/null +++ b/i2c_test_attiny85/USI_TWI_Slave.c @@ -0,0 +1,220 @@ +// This file has been prepared for Doxygen automatic documentation generation. +/*! \file ******************************************************************** +* +* Atmel Corporation +* +* File : USI_TWI_Slave.c +* Compiler : IAR EWAAVR 4.11A +* Revision : $Revision: 1.14 $ +* Date : $Date: Friday, December 09, 2005 17:25:38 UTC $ +* Updated by : $Author: jtyssoe $ +* +* Support mail : avr@atmel.com +* +* Supported devices : All device with USI module can be used. +* +* AppNote : AVR312 - Using the USI module as a I2C slave +* +* Description : Functions for USI_TWI_receiver and USI_TWI_transmitter. +* +* +****************************************************************************/ + +#include +#include +#include "USI_TWI_Slave.h" + +/*! Static Variables + */ + +static unsigned char TWI_slaveAddress; +static volatile unsigned char USI_TWI_Overflow_State; + + +/*! Local variables + */ +static uint8_t TWI_RxBuf[TWI_RX_BUFFER_SIZE]; +static volatile uint8_t TWI_RxHead; +static volatile uint8_t TWI_RxTail; + +static uint8_t TWI_TxBuf[TWI_TX_BUFFER_SIZE]; +static volatile uint8_t TWI_TxHead; +static volatile uint8_t TWI_TxTail; + +/*! \brief Flushes the TWI buffers + */ +void Flush_TWI_Buffers(void) +{ + TWI_RxTail = 0; + TWI_RxHead = 0; + TWI_TxTail = 0; + TWI_TxHead = 0; +} + +//********** USI_TWI functions **********// + +/*! \brief + * Initialise USI for TWI Slave mode. + */ +void USI_TWI_Slave_Initialise( unsigned char TWI_ownAddress ) +{ + Flush_TWI_Buffers(); + + TWI_slaveAddress = TWI_ownAddress; + + PORT_USI |= (1<>1 ) == TWI_slaveAddress)) + { + if ( USIDR & 0x01 ) + USI_TWI_Overflow_State = USI_SLAVE_SEND_DATA; + else + USI_TWI_Overflow_State = USI_SLAVE_REQUEST_DATA; + SET_USI_TO_SEND_ACK(); + } + else + { + SET_USI_TO_TWI_START_CONDITION_MODE(); + } + break; + + // ----- Master write data mode ------ + // Check reply and goto USI_SLAVE_SEND_DATA if OK, else reset USI. + case USI_SLAVE_CHECK_REPLY_FROM_SEND_DATA: + if ( USIDR ) // If NACK, the master does not want more data. + { + SET_USI_TO_TWI_START_CONDITION_MODE(); + return; + } + // From here we just drop straight into USI_SLAVE_SEND_DATA if the master sent an ACK + + // Copy data from buffer to USIDR and set USI to shift byte. Next USI_SLAVE_REQUEST_REPLY_FROM_SEND_DATA + case USI_SLAVE_SEND_DATA: + + // Get data from Buffer + tmpTxTail = TWI_TxTail; // Not necessary, but prevents warnings + if ( TWI_TxHead != tmpTxTail ) + { + TWI_TxTail = ( TWI_TxTail + 1 ) & TWI_TX_BUFFER_MASK; + USIDR = TWI_TxBuf[TWI_TxTail]; + } + else // If the buffer is empty then: + { + SET_USI_TO_TWI_START_CONDITION_MODE(); + return; + } + USI_TWI_Overflow_State = USI_SLAVE_REQUEST_REPLY_FROM_SEND_DATA; + SET_USI_TO_SEND_DATA(); + break; + + // Set USI to sample reply from master. Next USI_SLAVE_CHECK_REPLY_FROM_SEND_DATA + case USI_SLAVE_REQUEST_REPLY_FROM_SEND_DATA: + USI_TWI_Overflow_State = USI_SLAVE_CHECK_REPLY_FROM_SEND_DATA; + SET_USI_TO_READ_ACK(); + break; + + // ----- Master read data mode ------ + // Set USI to sample data from master. Next USI_SLAVE_GET_DATA_AND_SEND_ACK. + case USI_SLAVE_REQUEST_DATA: + USI_TWI_Overflow_State = USI_SLAVE_GET_DATA_AND_SEND_ACK; + SET_USI_TO_READ_DATA(); + break; + + // Copy data from USIDR and send ACK. Next USI_SLAVE_REQUEST_DATA + case USI_SLAVE_GET_DATA_AND_SEND_ACK: + // Put data into Buffer + tmpUSIDR = USIDR; // Not necessary, but prevents warnings + TWI_RxHead = ( TWI_RxHead + 1 ) & TWI_RX_BUFFER_MASK; + TWI_RxBuf[TWI_RxHead] = tmpUSIDR; + + USI_TWI_Overflow_State = USI_SLAVE_REQUEST_DATA; + SET_USI_TO_SEND_ACK(); + break; + } +} diff --git a/i2c_test_attiny85/USI_TWI_Slave.h b/i2c_test_attiny85/USI_TWI_Slave.h new file mode 100755 index 0000000..219eb47 --- /dev/null +++ b/i2c_test_attiny85/USI_TWI_Slave.h @@ -0,0 +1,176 @@ +// This file has been prepared for Doxygen automatic documentation generation. +/*! \file ******************************************************************** +* +* Atmel Corporation +* +* File : USI_TWI_Slave.h +* Compiler : IAR EWAAVR 4.11A +* Revision : $Revision: 1.14 $ +* Date : $Date: Friday, December 09, 2005 17:25:38 UTC $ +* Updated by : $Author: jtyssoe $ +* +* Support mail : avr@atmel.com +* +* Supported devices : All device with USI module can be used. +* The example is written for the ATmega169, ATtiny26 & ATtiny2313 +* +* AppNote : AVR312 - Using the USI module as a TWI slave +* +* Description : Header file for USI_TWI driver +* +* +* +****************************************************************************/ +//! Prototypes +void USI_TWI_Slave_Initialise( unsigned char ); +void USI_TWI_Transmit_Byte( unsigned char ); +unsigned char USI_TWI_Receive_Byte( void ); +unsigned char USI_TWI_Data_In_Receive_Buffer( void ); +void Timer_Init(void); + +#define TRUE 1 +#define FALSE 0 + +typedef unsigned char uint8_t; + +////////////////////////////////////////////////////////////////// +///////////////// Driver Buffer Definitions ////////////////////// +////////////////////////////////////////////////////////////////// +// 1,2,4,8,16,32,64,128 or 256 bytes are allowed buffer sizes + +#define TWI_RX_BUFFER_SIZE (8) +#define TWI_RX_BUFFER_MASK ( TWI_RX_BUFFER_SIZE - 1 ) + +#if ( TWI_RX_BUFFER_SIZE & TWI_RX_BUFFER_MASK ) + #error TWI RX buffer size is not a power of 2 +#endif + +// 1,2,4,8,16,32,64,128 or 256 bytes are allowed buffer sizes + +#define TWI_TX_BUFFER_SIZE (8) +#define TWI_TX_BUFFER_MASK ( TWI_TX_BUFFER_SIZE - 1 ) + +#if ( TWI_TX_BUFFER_SIZE & TWI_TX_BUFFER_MASK ) + #error TWI TX buffer size is not a power of 2 +#endif + + + +#define USI_SLAVE_CHECK_ADDRESS (0x00) +#define USI_SLAVE_SEND_DATA (0x01) +#define USI_SLAVE_REQUEST_REPLY_FROM_SEND_DATA (0x02) +#define USI_SLAVE_CHECK_REPLY_FROM_SEND_DATA (0x03) +#define USI_SLAVE_REQUEST_DATA (0x04) +#define USI_SLAVE_GET_DATA_AND_SEND_ACK (0x05) + + +//! Device dependent defines +/*#if defined(__AT90tiny26__) | defined(__ATtiny26__) + #define DDR_USI DDRB + #define PORT_USI PORTB + #define PIN_USI PINB + #define PORT_USI_SDA PORTB0 + #define PORT_USI_SCL PORTB2 + #define PIN_USI_SDA PINB0 + #define PIN_USI_SCL PINB2 + #define USI_START_COND_INT USISIF + #define USI_START_VECTOR USI_STRT_vect + #define USI_OVERFLOW_VECTOR USI_OVF_vect +#endif*/ + +/*#if defined(__AT90Tiny2313__) | defined(__ATtiny2313__) + #define DDR_USI DDRB + #define PORT_USI PORTB + #define PIN_USI PINB + #define PORT_USI_SDA PORTB5 + #define PORT_USI_SCL PORTB7 + #define PIN_USI_SDA PINB5 + #define PIN_USI_SCL PINB7 + #define USI_START_COND_INT USISIF + #define USI_START_VECTOR USI_START_vect + #define USI_OVERFLOW_VECTOR USI_OVERFLOW_vect +#endif*/ + +/*#if defined(__ATtiny25__) | defined(__ATtiny45__) | defined(__ATtiny85__)*/ + #define DDR_USI DDRB + #define PORT_USI PORTB + #define PIN_USI PINB + #define PORT_USI_SDA PB0 + #define PORT_USI_SCL PB2 + #define PIN_USI_SDA PINB0 + #define PIN_USI_SCL PINB2 + #define USI_START_COND_INT USISIF //soit USISIF ou USISIE + #define USI_START_VECTOR USI_START_vect + #define USI_OVERFLOW_VECTOR USI_OVF_vect +/*#endif*/ + +/*#if defined(__AT90Mega165__) | defined(__ATmega165__) | \ + defined(__ATmega325__) | defined(__ATmega3250__) | \ + defined(__ATmega645__) | defined(__ATmega6450__) | \ + defined(__ATmega329__) | defined(__ATmega3290__) | \ + defined(__ATmega649__) | defined(__ATmega6490__) + #define DDR_USI DDRE + #define PORT_USI PORTE + #define PIN_USI PINE + #define PORT_USI_SDA PORTE5 + #define PORT_USI_SCL PORTE4 + #define PIN_USI_SDA PINE5 + #define PIN_USI_SCL PINE4 + #define USI_START_COND_INT USISIF + #define USI_START_VECTOR USI_START_vect + #define USI_OVERFLOW_VECTOR USI_OVERFLOW_vect +#endif*/ + +/*#if defined(__AT90Mega169__) | defined(__ATmega169__) + #define DDR_USI DDRE + #define PORT_USI PORTE + #define PIN_USI PINE + #define PORT_USI_SDA PORTE5 + #define PORT_USI_SCL PORTE4 + #define PIN_USI_SDA PINE5 + #define PIN_USI_SCL PINE4 + #define USI_START_COND_INT USISIF + #define USI_START_VECTOR USI_STRT_vect + #define USI_OVERFLOW_VECTOR USI_OVF_vect +#endif*/ + +//! Functions implemented as macros +#define SET_USI_TO_SEND_ACK() \ +{ \ + USIDR = 0; /* Prepare ACK */ \ + DDR_USI |= (1< + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + compile + + compile + + + compile + \ No newline at end of file diff --git a/i2c_test_attiny85/led_gen.c b/i2c_test_attiny85/led_gen.c new file mode 100755 index 0000000..b6e15ac --- /dev/null +++ b/i2c_test_attiny85/led_gen.c @@ -0,0 +1,34 @@ +/* + * led_gen.c + * + * Created: 03/12/2021 14:25:05 + * Author: 40008304 + */ + +#include "led_gen.h" + +void led1_init(void) +{ + DDRB |= (1< + +void led1_init(void); +void led2_init(void); +void led1_stop(void); +void led2_stop(void); + +#endif /* LED_GEN_H_ */ \ No newline at end of file diff --git a/i2c_test_attiny85/led_receptor.c b/i2c_test_attiny85/led_receptor.c new file mode 100755 index 0000000..2b076e9 --- /dev/null +++ b/i2c_test_attiny85/led_receptor.c @@ -0,0 +1,81 @@ +/* + * led_receptor.c + * + * Created: 03/12/2021 14:29:43 + * Author: 40008304 + */ + +#include "led_receptor.h" + +void ADC_init(void) +{ + DDRB &=~(1< 0 ; precision --) + { + valeur_finale = valeur_finale +(((ADC_read_value() * 0.01961) - valeur_finale) / 15); + } + return valeur_finale; +}; + +float measureLed1(void) +{ + float adcLed; + led2_stop(); + led1_init(); + _delay_ms(TIMING); + adcLed=ADC_averaging(); + _delay_ms(TIMING); + return adcLed; +}; + +float measureLed2(void) +{ + float adcLed; + led1_stop(); + led2_init(); + _delay_ms(TIMING); + adcLed=ADC_averaging(); + _delay_ms(TIMING); + return adcLed; +}; + +char compareLed(void) +{ + float adcLed1 = measureLed1(); + float adcLed2 = measureLed2(); + float adcCompare = adcLed1 - adcLed2; + if (adcCompare < -VOLTMIN) // adcLed2 > adcLed1 + { + return LEFT; + } + else if (adcCompare > VOLTMIN) + { + return RIGHT; + } + else + { + if((adcLed1 > VOLTMIN) && (adcLed2 > VOLTMIN)) + { + return FRONT; + } + else + { + return NOTHING; + }; + }; +}; diff --git a/i2c_test_attiny85/led_receptor.h b/i2c_test_attiny85/led_receptor.h new file mode 100755 index 0000000..12d6de4 --- /dev/null +++ b/i2c_test_attiny85/led_receptor.h @@ -0,0 +1,31 @@ +/* + * led_receptor.h + * + * Created: 03/12/2021 14:29:30 + * Author: 40008304 + */ + + +#ifndef LED_RECEPTOR_H_ +#define LED_RECEPTOR_H_ + +#include "led_gen.h" +#define F_CPU 1000000 +#include + +#define FRONT 0x51 +#define RIGHT 0x52 +#define LEFT 0x53 +#define NOTHING 0x54 +#define ERROR 0xF0 +#define VOLTMIN 1 +#define TIMING 250 + +void ADC_init(void); +char ADC_read_value(void); +float ADC_averaging(void); +float measureLed1(void); +float measureLed2(void); +char compareLed(void); + +#endif /* LED_RECEPTOR_H_ */ \ No newline at end of file diff --git a/i2c_test_attiny85/led_test.c b/i2c_test_attiny85/led_test.c new file mode 100755 index 0000000..fc46c35 --- /dev/null +++ b/i2c_test_attiny85/led_test.c @@ -0,0 +1,34 @@ +/* + * led_test.c + * + * Created: 03/12/2021 15:28:35 + * Author: 40008304 + */ + +#include "led_test.h" + +void testLed(void) +{ + char sendingData = compareLed(); + switch(sendingData) + { + case NOTHING: + PORTB |= (1< -#define F_CPU 1000000 -#include -#define FRONT 0x51 -#define RIGHT 0x52 -#define LEFT 0x53 -#define NOTHING 0x54 -#define ERROR 0xF0 -#define VOLTMIN 1 +#include "led_gen.h" +#include "led_receptor.h" +#include "led_test.h" +#include "USI_TWI_Slave.h" -void led1_init(void); -void led2_init(void); -void led1_stop(void); -void led2_stop(void); -void ADC_init(void); -char ADC_read_value(void); -float ADC_averaging(void); -float measureLed1(void); -float measureLed2(void); -char compareLed(void); +#define MSTR_TEST_WR 0x31 +#define MSTR_TEST_RE 0x32 + +#define SLAVE_ADRESS 0x01 +#define NOM_CONSTRUC 0x08 +#define NOM_CAPTEUR 0x10 +#define VALEUR_DEMAN 0x49 +#define BASIC_MODE 0x42 int main(void) { - DDRB |= (1< 0 ; precision --) - { - valeur_finale = valeur_finale +(((ADC_read_value() * 0.01961) - valeur_finale) / 15); - } - return valeur_finale; -}; - -float measureLed1(void) -{ - float adcLed; - led2_stop(); - led1_init(); - _delay_ms(250); - adcLed=ADC_averaging(); - _delay_ms(250); - return adcLed; -}; - -float measureLed2(void) -{ - float adcLed; - led1_stop(); - led2_init(); - _delay_ms(250); - adcLed=ADC_averaging(); - _delay_ms(250); - return adcLed; -}; - -char compareLed(void) -{ - float adcLed1 = measureLed1(); - float adcLed2 = measureLed2(); - float adcCompare = adcLed1 - adcLed2; - if (adcCompare < -VOLTMIN) // adcLed2 > adcLed1 - { - return LEFT; - } - else if (adcCompare > VOLTMIN) - { - return RIGHT; - } - else - { - if((adcLed1 > VOLTMIN) && (adcLed2 > VOLTMIN)) - { - return FRONT; - } - else - { - return NOTHING; - }; - }; -}; - + val++; +} \ No newline at end of file diff --git a/i2c_test_attiny85/test_led.c b/i2c_test_attiny85/test_led.c new file mode 100755 index 0000000..1913af6 --- /dev/null +++ b/i2c_test_attiny85/test_led.c @@ -0,0 +1,7 @@ +/* + * test_led.c + * + * Created: 03/12/2021 15:25:24 + * Author: 40008304 + */ +