agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
adc.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_VFS_MODULE_AVR_ADC_H
8 #define ZRTOS_VFS_MODULE_AVR_ADC_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 #include <avr/io.h>
14 #include <avr/interrupt.h>
15 
16 #include <zrtos/vfs_plugin.h>
17 #include <zrtos/types.h>
18 #include <zrtos/cast.h>
19 #include <zrtos/binary.h>
20 
21 typedef enum{
30 
31 typedef enum{
37 
38 #ifndef ZRTOS_VFS_MODULE_AVR_ADC__CFG_PRESCALER
39 #error "define ZRTOS_VFS_MODULE_AVR_ADC__CFG_PRESCALER as zrtos_vfs_module_avr_adc_prescaler_t value"
40 #endif
41 
42 #ifndef ZRTOS_VFS_MODULE_AVR_ADC__CFG_VREF
43 #error "define ZRTOS_VFS_MODULE_AVR_ADC__CFG_VREF as zrtos_vfs_module_avr_adc_vref_t value"
44 #endif
45 
46 #ifndef ZRTOS_VFS_MODULE_AVR_ADC__CFG_MAX_CHANNEL
47 #error "define ZRTOS_VFS_MODULE_AVR_ADC__CFG_MAX_CHANNEL"
48 #endif
49 
50 #ifndef ZRTOS_VFS_MODULE_AVR_ADC__CFG_REFERENCE_VOLT
51 #warning "ZRTOS_VFS_MODULE_AVR_ADC__CFG_REFERENCE_VOLT not defined using 5 Volt"
52 #define ZRTOS_VFS_MODULE_AVR_ADC__CFG_REFERENCE_VOLT (5.0)
53 #endif
54 
56  //zrtos_vfs_module_avr_adc_prescaler_t prescaler;
57  //zrtos_vfs_module_avr_adc_vref_t vref;
60 
62 
63 float zrtos_vfs_module_avr_adc__to_volt(uint16_t val,float vref){
64  return (((float)val) * vref) / 1024.0;
65 }
66 
67 ISR(ADC_vect){
68  static uint8_t channel = 0;
69  uint16_t val = ADCL;
70  val |= (ADCH<<8);
71 
72  zrtos_vfs_module_avr_adc__data.data[channel] = val;
73 
74  channel++;
76  channel = 0;
77  }
78 
79 #ifdef MUX5
80  if (channel > 7) {
81  ADCSRB |= _BV(MUX5);
82  ADMUX = (ADMUX & ~(0x1F)) | ((channel-8) & 0x1F);
83  } else {
84  ADCSRB &= ~(_BV(MUX5));
85  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
86  }
87 #else
88  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
89 #endif
90 
91  ADCSRA |= _BV(ADSC);
92 }
93 
96 #ifdef MUX5
97  ADCSRB &= ~(_BV(MUX5));
98 #endif
99  ADCSRA = _BV(ADEN)
100  | _BV(ADSC)
101  | _BV(ADIE)
103  ;
104  return ZRTOS_ERROR__SUCCESS;
105 }
106 
108  ADCSRA = 0;
109  return ZRTOS_ERROR__SUCCESS;
110 }
111 
113  zrtos_vfs_file_t *thiz
114  ,char *path
115  ,void *buf
116  ,size_t len
117  ,zrtos_vfs_offset_t offset
118  ,size_t *out
119 ){
121  size_t start_offset = (size_t)offset;
122  size_t channel = start_offset/sizeof(float);
123 
124  if(len != sizeof(float)
125  ||(start_offset % sizeof(float)) != 0){
126  ret = ZRTOS_ERROR__INVAL;
127  }else if(channel < ZRTOS_VFS_MODULE_AVR_ADC__CFG_MAX_CHANNEL){
129  zrtos_vfs_module_avr_adc__data.data[channel]
131  );
132 
133  zrtos_mem__cpy(buf,&val,sizeof(float));
134 
135  ret = ZRTOS_ERROR__SUCCESS;
136  }
137 
138  return ret;
139 }
140 
141 ZRTOS_VFS_PLUGIN__INIT(avr_adc,
152 );
153 
154 
155 #ifdef __cplusplus
156 }
157 #endif
158 #endif
#define ZRTOS_VFS_MODULE_AVR_ADC__CFG_VREF
Definition: cfg.h:30
#define ZRTOS_BINARY__00000101
Definition: binary.h:52
size_t zrtos_vfs_offset_t
Definition: vfs_plugin.h:49
#define ZRTOS_BINARY__01000000
Definition: binary.h:111
#define ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT()
Definition: vfs_plugin.h:148
#define ZRTOS_BINARY__00000111
Definition: binary.h:54
#define ZRTOS_VFS_MODULE_AVR_ADC__CFG_PRESCALER
Definition: cfg.h:28
#define ZRTOS_VFS_PLUGIN__9_ON_IOCTL_DEFAULT()
Definition: vfs_plugin.h:319
zrtos_error_t zrtos_vfs_module_avr_adc__on_mount(zrtos_vfs_dentry_t *thiz)
Definition: adc.h:94
#define ZRTOS_VFS_PLUGIN__5_ON_WRITE_DEFAULT()
Definition: vfs_plugin.h:238
#define ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT()
Definition: vfs_plugin.h:294
#define ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT()
Definition: vfs_plugin.h:165
#define ZRTOS_BINARY__00000011
Definition: binary.h:50
#define ZRTOS_VFS_MODULE_AVR_ADC__CFG_MAX_CHANNEL
Definition: cfg.h:27
#define ZRTOS_VFS_PLUGIN__3_ON_UMOUNT(callback)
Definition: vfs_plugin.h:198
struct zrtos_vfs_module_avr_adc_t zrtos_vfs_module_avr_adc_t
#define ZRTOS_VFS_PLUGIN__6_ON_CAN_READ_DEFAULT()
Definition: vfs_plugin.h:260
#define ZRTOS_BINARY__10000000
Definition: binary.h:175
#define ZRTOS_VFS_PLUGIN__2_ON_MOUNT(callback)
Definition: vfs_plugin.h:181
uint16_t data[ZRTOS_VFS_MODULE_AVR_ADC__CFG_MAX_CHANNEL]
Definition: adc.h:58
#define ZRTOS_VFS_PLUGIN__4_ON_READ(callback)
Definition: vfs_plugin.h:215
zrtos_error_t zrtos_vfs_module_avr_adc__on_read(zrtos_vfs_file_t *thiz, char *path, void *buf, size_t len, zrtos_vfs_offset_t offset, size_t *out)
Definition: adc.h:112
uint16_t size_t
Definition: types.h:22
void zrtos_mem__cpy(void *dest, void *src, size_t length)
Definition: mem.h:105
Successful program execution status.
Definition: error.h:22
Bad address.
Definition: error.h:38
zrtos_error_t zrtos_vfs_module_avr_adc__on_umount(zrtos_vfs_dentry_t *thiz)
Definition: adc.h:107
Invalid argument.
Definition: error.h:46
zrtos_vfs_module_avr_adc_vref_t
Definition: adc.h:31
#define ZRTOS_VFS_MODULE_AVR_ADC__CFG_REFERENCE_VOLT
Definition: adc.h:52
ZRTOS_VFS_PLUGIN__INIT(avr_adc, ZRTOS_VFS_PLUGIN__0_ON_OPEN_DEFAULT() ZRTOS_VFS_PLUGIN__1_ON_CLOSE_DEFAULT() ZRTOS_VFS_PLUGIN__2_ON_MOUNT(zrtos_vfs_module_avr_adc__on_mount) ZRTOS_VFS_PLUGIN__3_ON_UMOUNT(zrtos_vfs_module_avr_adc__on_umount) ZRTOS_VFS_PLUGIN__4_ON_READ(zrtos_vfs_module_avr_adc__on_read) ZRTOS_VFS_PLUGIN__5_ON_WRITE_DEFAULT() ZRTOS_VFS_PLUGIN__6_ON_CAN_READ_DEFAULT() ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(zrtos_vfs_plugin__default_can_write_read_only) ZRTOS_VFS_PLUGIN__8_ON_SEEK_DEFAULT() ZRTOS_VFS_PLUGIN__9_ON_IOCTL_DEFAULT())
#define ZRTOS_BINARY__00000010
Definition: binary.h:49
#define ZRTOS_VFS_PLUGIN__7_ON_CAN_WRITE(callback)
Definition: vfs_plugin.h:276
zrtos_vfs_module_avr_adc_t zrtos_vfs_module_avr_adc__data
Definition: adc.h:61
ISR(ADC_vect)
Definition: adc.h:67
static uint8_t
Definition: mcp2515.h:159
float zrtos_vfs_module_avr_adc__to_volt(uint16_t val, float vref)
Definition: adc.h:63
#define ZRTOS_BINARY__11000000
Definition: binary.h:239
zrtos_error_t
Definition: error.h:20
#define ZRTOS_BINARY__00000100
Definition: binary.h:51
#define ZRTOS_BINARY__00000000
Definition: binary.h:47
#define ZRTOS_BINARY__00000110
Definition: binary.h:53
zrtos_error_t zrtos_vfs_plugin__default_can_write_read_only(struct _zrtos_vfs_file_t *thiz)
Definition: vfs_plugin.h:127
zrtos_vfs_module_avr_adc_prescaler_t
Definition: adc.h:21