summaryrefslogtreecommitdiff
path: root/src/c/hardware/avr
diff options
context:
space:
mode:
authorsiddhu89902015-11-28 11:01:40 +0530
committersiddhu89902015-11-28 11:01:40 +0530
commit88c02bb9dad7d955676fe44f6595f996bde3f07e (patch)
treee8c018a5a9535b2bd06356d4c5abf0368bbe9845 /src/c/hardware/avr
parentdd343609eabf4afcee2aa8eeeda3a383333d30e5 (diff)
downloadScilab2C_fossee_old-88c02bb9dad7d955676fe44f6595f996bde3f07e.tar.gz
Scilab2C_fossee_old-88c02bb9dad7d955676fe44f6595f996bde3f07e.tar.bz2
Scilab2C_fossee_old-88c02bb9dad7d955676fe44f6595f996bde3f07e.zip
Intermediate commit aith support added for AVR (GPIO,ADC). Does not support other targets.
Diffstat (limited to 'src/c/hardware/avr')
-rw-r--r--src/c/hardware/avr/adc/u8AVRADCSetups.c42
-rw-r--r--src/c/hardware/avr/adc/u8AVRReadADCs.c46
-rw-r--r--src/c/hardware/avr/gpio/u8AVRDigitalIns.c54
-rw-r--r--src/c/hardware/avr/gpio/u8AVRDigitalOuts.c69
-rw-r--r--src/c/hardware/avr/gpio/u8AVRDigitalSetups.c71
-rw-r--r--src/c/hardware/avr/includes/AVRPeripheralADC.h27
-rw-r--r--src/c/hardware/avr/includes/AVRPeripheralGPIO.h45
-rw-r--r--src/c/hardware/avr/interfaces/int_AVRPeripheralADC.h26
-rw-r--r--src/c/hardware/avr/interfaces/int_AVRPeripheralGPIO.h30
9 files changed, 410 insertions, 0 deletions
diff --git a/src/c/hardware/avr/adc/u8AVRADCSetups.c b/src/c/hardware/avr/adc/u8AVRADCSetups.c
new file mode 100644
index 0000000..620f80f
--- /dev/null
+++ b/src/c/hardware/avr/adc/u8AVRADCSetups.c
@@ -0,0 +1,42 @@
+// Function to initialise ADC of AVR
+//
+// Calling Sequence
+// AVRSetupADC(uint8 prescalar, uint8 adc_ref)
+//
+// Parameters
+// prescalar: prescalar to be used for generating ADC clock (0-7)
+// adc_ref : reference voltage to be used for ADC conversion
+// 0 -> Voltage on VREF pin
+// 1 -> Voltage on AVCC pin
+// 2 -> Internal 2.56 reference voltage
+//
+// Description
+// This function initialises ADc of AVR with given parameters. 'prescalar' is
+// needed for deciding ADC clock. ADC clock should be between 50KHz and 200KHz
+// and it given as (MCU clock/2^prescalar). Select appropriate prescalar depending
+// on MCU clock. 'adc_ref' selects one of the available reference voltage sources
+// available
+// Examples
+// AVRADCSetup(128,0)
+//
+// Authors
+// Siddhesh Wani
+//
+
+#include "AVRPeripheralADC.h"
+
+
+uint8 u8AVRADCSetups(uint8 prescalar, uint8 adc_ref)
+{
+ /*Set the prescalar value*/
+ ADCSRA |= (prescalar & 0x07);
+
+ /*Set the adc reference voltage*/
+ ADMUX |= ((adc_ref & 0x03) << 6);
+
+ /*Enable ADC hardware. Set ADEN bit*/
+ ADCSRA |= (1<<7);
+
+ return 0;
+}
+
diff --git a/src/c/hardware/avr/adc/u8AVRReadADCs.c b/src/c/hardware/avr/adc/u8AVRReadADCs.c
new file mode 100644
index 0000000..71fe136
--- /dev/null
+++ b/src/c/hardware/avr/adc/u8AVRReadADCs.c
@@ -0,0 +1,46 @@
+// Function to get voltage on analog pin on AVR
+//
+// Calling Sequence
+// u8AVRReadADCs(channel)
+//
+// Parameters
+// channel : Select which channel is to be read. Values from 0-7 select one
+// of the pins ADC0-ADC7. For other possible channel values refer
+// datasheet
+// Returns->
+// result : Digital value for the voltage present on channel selected
+//
+// Description
+// This function returns digital value for present on adc pins. 'channel'
+// selects which of the ADC0-ADC7 is to be used for reading analog value.
+// Apart from reading just ADC0-ADC7 other it can also read differential
+// voltages between some pins. For channel values for those options, please
+// refer datasheet.
+//
+// Examples
+// adc_result = u8AVRReadADC(0) //Read ADC0
+//
+// Authors
+// Siddhesh Wani
+//
+
+
+#include "AVRPeripheralADC.h"
+
+uint16 u8AVRReadADCs(uint8 channel)
+{
+ /*Set ADC conversion channel*/
+ ADMUX |= (channel & 0x1F);
+
+ /*Start ADC conversion. Set 'ADSC' bit*/
+ ADCSRA |= (1<<6);
+
+ /*Wait for conversion to complete. Check 'ADIF' bit*/
+ while(!(ADCSRA & (1<<4)));
+
+ /*Clear ADIF flag*/
+ ADCSRA |= (1<<4);
+
+ /*ADC conversion result is stored in ADCH/L registers*/
+ return (ADC);
+}
diff --git a/src/c/hardware/avr/gpio/u8AVRDigitalIns.c b/src/c/hardware/avr/gpio/u8AVRDigitalIns.c
new file mode 100644
index 0000000..6b61a56
--- /dev/null
+++ b/src/c/hardware/avr/gpio/u8AVRDigitalIns.c
@@ -0,0 +1,54 @@
+// Function to get current state (high\low) of a digital pin on AVR
+//
+// Calling Sequence
+// u8AVRDigitalIns(port,pin)
+//
+// Parameters
+// port : port of microcontroller to be used (1 for PORTA, 2 for PORTB,...)
+// pin : pin of port (mentioned above) to be used
+// Returns->
+// state : state of the pin (0 for low and 1 for high)
+//
+// Description
+// Each AVR microcontroller has pins which can be configured as digital
+// outputs. These are normally divided among some 'ports' (group of pins).
+// User has to select one of these port and which pin of that port is to
+// be read. Function returns current state of the pin '1' (high) or '0' (low).
+//
+//
+// Examples
+// state = u8AVRDigitalIns(1,0)
+//
+// Authors
+// Siddhesh Wani
+//
+
+
+#include "AVRPeripheralGPIO.h"
+
+uint8 u8AVRDigitalIns(uint8 port,uint8 pin)
+{
+ uint8 state = 0;
+ if(port == PORT_A)
+ {
+ state = (uint8)(PINA & (1<<pin));
+ return state;
+ }
+ if(port == PORT_B)
+ {
+ state = (uint8)(PINB & (1<<pin));
+ return state;
+ }
+ if(port == PORT_C)
+ {
+ state = (uint8)(PINC & (1<<pin));
+ return state;
+ }
+ if(port == PORT_D)
+ {
+ state = (uint8)(PIND & (1<<pin));
+ return state;
+ }
+
+//return state;
+}
diff --git a/src/c/hardware/avr/gpio/u8AVRDigitalOuts.c b/src/c/hardware/avr/gpio/u8AVRDigitalOuts.c
new file mode 100644
index 0000000..5ee84a8
--- /dev/null
+++ b/src/c/hardware/avr/gpio/u8AVRDigitalOuts.c
@@ -0,0 +1,69 @@
+// Function to change state (high\low) of a digital output pin on AVR
+//
+// Calling Sequence
+// u8AVRDigitalOuts(port,pin,state)
+//
+// Parameters
+// port : port of microcontroller to be used (1 for PORTA, 2 for PORTB,...)
+// pin : pin of port (mentioned above) to be used
+// state : state to be outputed on pin (0 for low and 1 for high)
+//
+// Description
+// Each AVR microcontroller has pins which can be configured as digital
+// outputs. These are normally divided among some 'ports' (group of pins).
+// User has to select one of these port and which pin of that port as
+// digital output. Also, desired output state must be specified as
+// '1' (high) or '0' (low).
+//
+// Examples
+// u8AVRDigitalOuts(1,0,1)
+//
+// Authors
+// Siddhesh Wani
+//
+
+
+#include "AVRPeripheralGPIO.h"
+
+uint8 u8AVRDigitalOuts(uint8 port,uint8 pin,uint8 state)
+{
+ if(state == LOW)
+ {/*Make output pin high*/
+ if(port == PORT_A)
+ {
+ PORTA = PORTA & ~(1<<pin);
+ }
+ if(port == PORT_B)
+ {
+ PORTB = PORTB & ~(1<<pin);
+ }
+ if(port == PORT_C)
+ {
+ PORTC = PORTC & ~(1<<pin);
+ }
+ if(port == PORT_D)
+ {
+ PORTD = PORTD & ~(1<<pin);
+ }
+ }
+ else
+ {/*Make output pin high*/
+ if(port == PORT_A)
+ {
+ PORTA = PORTA | (1<<pin);
+ }
+ if(port == PORT_B)
+ {
+ PORTB = PORTB | (1<<pin);
+ }
+ if(port == PORT_C)
+ {
+ PORTC = PORTC | (1<<pin);
+ }
+ if(port == PORT_D)
+ {
+ PORTD = PORTD | (1<<pin);
+ }
+ }
+return 0;
+}
diff --git a/src/c/hardware/avr/gpio/u8AVRDigitalSetups.c b/src/c/hardware/avr/gpio/u8AVRDigitalSetups.c
new file mode 100644
index 0000000..46697f7
--- /dev/null
+++ b/src/c/hardware/avr/gpio/u8AVRDigitalSetups.c
@@ -0,0 +1,71 @@
+// Function to decide direction of a digital pin on AVR
+//
+// Calling Sequence
+// AVRDigitalSetup(port,pin,direction)
+//
+// Parameters
+// port : port of microcontroller to be used (1 for PORTA, 2 for PORTB,...)
+// pin : pin of port (mentioned above) to be used
+// direction : direction to be set for pin (0 for input, 1 for output)
+//
+// Description
+// Each AVR microcontroller has pins which can be configured as digital
+// outputs/inputs. These are normally divided among some 'ports' (group of pins).
+// User has to select one of these port and which pin of that port to be
+// used as digital output/input. Also, desired direction must be specified as
+// 'INPUT' or 'OUTPUT'.
+//
+// Examples
+// AVRDigitalSetup(1,0,1)
+//
+// Authors
+// Siddhesh Wani
+//
+
+#include "AVRPeripheralGPIO.h"
+
+
+uint8 u8AVRDigitalSetups(uint8 port,uint8 pin,uint8 direction)
+{
+
+ if (direction == INPUT)
+ {/*Set pin as input*/
+ if(port == PORT_A)
+ {
+ DDRA = DDRA & ~(1<<pin);
+ }
+ if(port == PORT_B)
+ {
+ DDRB = DDRB & ~(1<<pin);
+ }
+ if(port == PORT_C)
+ {
+ DDRC = DDRC & ~(1<<pin);
+ }
+ if(port == PORT_D)
+ {
+ DDRD = DDRD & ~(1<<pin);
+ }
+ }
+ else
+ {/*Set pin as output*/
+ if(port == PORT_A)
+ {
+ DDRA = DDRA | (1<<pin);
+ }
+ if(port == PORT_B)
+ {
+ DDRB = DDRB | (1<<pin);
+ }
+ if(port == PORT_C)
+ {
+ DDRC = DDRC | (1<<pin);
+ }
+ if(port == PORT_D)
+ {
+ DDRD = DDRD | (1<<pin);
+ }
+ }
+return 0;
+}
+
diff --git a/src/c/hardware/avr/includes/AVRPeripheralADC.h b/src/c/hardware/avr/includes/AVRPeripheralADC.h
new file mode 100644
index 0000000..e343de6
--- /dev/null
+++ b/src/c/hardware/avr/includes/AVRPeripheralADC.h
@@ -0,0 +1,27 @@
+//This file defines constants corresponding to gpios and digital input functions.
+//
+// Authors
+// Siddhesh Wani
+//
+
+#ifndef __AVRPERIPHERALADC_H__
+#define __AVRPERIPHERALADC_H__
+
+#include <avr/io.h>
+#include "types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//Function prototypes
+uint8 u8AVRADCSetups(uint8 prescalar, uint8 adc_ref);
+
+uint16 u8AVRReadADCs(uint8 channel);
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* !__AVRPERIPHERALGPIO_H__ */
diff --git a/src/c/hardware/avr/includes/AVRPeripheralGPIO.h b/src/c/hardware/avr/includes/AVRPeripheralGPIO.h
new file mode 100644
index 0000000..ddbeb2d
--- /dev/null
+++ b/src/c/hardware/avr/includes/AVRPeripheralGPIO.h
@@ -0,0 +1,45 @@
+//This file defines constants corresponding to gpios and digital input functions.
+//
+// Authors
+// Siddhesh Wani
+//
+
+#ifndef __AVRPERIPHERALGPIO_H__
+#define __AVRPERIPHERALGPIO_H__
+
+#include <avr/io.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#include <avr/io.h>
+#include "types.h"
+
+//Port definitions
+#define PORT_A 1
+#define PORT_B 2
+#define PORT_C 3
+#define PORT_D 4
+
+//Direction definitions
+#define INPUT 0
+#define OUTPUT 1
+
+//Pin state definitions
+#define LOW 0
+#define HIGH 1
+
+//Function prototypes
+uint8 u8AVRDigitalSetups(uint8 port,uint8 pin,uint8 direction);
+
+uint8 u8AVRDigitalIns(uint8 port,uint8 pin);
+
+uint8 u8AVRDigitalOuts(uint8 port,uint8 pin,uint8 state);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* !__AVRPERIPHERALGPIO_H__ */
diff --git a/src/c/hardware/avr/interfaces/int_AVRPeripheralADC.h b/src/c/hardware/avr/interfaces/int_AVRPeripheralADC.h
new file mode 100644
index 0000000..073f8a0
--- /dev/null
+++ b/src/c/hardware/avr/interfaces/int_AVRPeripheralADC.h
@@ -0,0 +1,26 @@
+//This file defines constants corresponding to gpios.
+//
+// Authors
+// Siddhesh Wani
+//
+
+#ifndef __INT_AVRPERIPHERALADC_H__
+#define __INT_AVRPERIPHERALADC_H__
+
+#include <avr/io.h>
+#include "AVRPeripheralADC.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define d0d0AVRDigitalSetupu80(in1,in2) u8AVRADCSetups((uint8) in1,\
+ (uint8) in2);
+
+#define d0AVRDigitalOutu160(in1) u8AVRReadADC((uint8) in1);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* !__AVRPERIPHERALADC_H__ */
diff --git a/src/c/hardware/avr/interfaces/int_AVRPeripheralGPIO.h b/src/c/hardware/avr/interfaces/int_AVRPeripheralGPIO.h
new file mode 100644
index 0000000..88e4c63
--- /dev/null
+++ b/src/c/hardware/avr/interfaces/int_AVRPeripheralGPIO.h
@@ -0,0 +1,30 @@
+//This file defines constants corresponding to gpios.
+//
+// Authors
+// Siddhesh Wani
+//
+
+#ifndef __INT_AVRPERIPHERALGPIO_H__
+#define __INT_AVRPERIPHERALGPIO_H__
+
+#include <avr/io.h>
+#include "AVRPeripheralGPIO.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define d0d0d0AVRDigitalSetupu80(in1,in2,in3) u8AVRDigitalSetups((uint8) in1,\
+ (uint8) in2, (uint8) in3);
+
+#define d0d0AVRDigitalOutu80(in1,in2) u8AVRDigitalIns((uint8) in1,\
+ (uint8) in2);
+
+#define d0d0d0AVRDigitalOutu80(in1,in2,in3) u8AVRDigitalOuts((uint8) in1,\
+ (uint8) in2, (uint8) in3);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* !__AVRPERIPHERALGPIO_H__ */