working with leds now
This commit is contained in:
		
							parent
							
								
									8ea404c3fa
								
							
						
					
					
						commit
						b9a402d64b
					
				@ -7,5 +7,5 @@ project(slider_firmware C)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
add_subdirectory(SliderCommunication)
 | 
					add_subdirectory(SliderCommunication)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
add_avr_executable(slider_firmware led.c main.c adc.c button.c)
 | 
					add_avr_executable(slider_firmware led.c main.c adc.c button.c comm.c)
 | 
				
			||||||
target_link_libraries(slider_firmware DSPLAB_SliderCommunication)
 | 
					target_link_libraries(slider_firmware DSPLAB_SliderCommunication)
 | 
				
			||||||
 | 
				
			|||||||
@ -16,21 +16,9 @@ adc_t adc;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* adc driver */
 | 
					/* adc driver */
 | 
				
			||||||
void adc_init(uint8_t * channels) {
 | 
					void adc_init(uint8_t * channels) {
 | 
				
			||||||
	adc.current_channel = 0;
 | 
					//	adc.current_channel = 0;
 | 
				
			||||||
	adc.channel_map = channels;
 | 
					//	adc.channel_map = channels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ADMUX = channels[0];
 | 
						ADMUX = channels[0];
 | 
				
			||||||
	ADCSRA = (1<<ADATE) | (1<<ADEN) | 7; // enable adc, maximum prescaler value
 | 
						ADCSRA = /*(1<<ADATE) | */ (1<<ADEN); // enable adc, maximum prescaler value
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
ISR(ADC_vect) {
 | 
					 | 
				
			||||||
	adc.buffer[adc.current_channel] = ADC;
 | 
					 | 
				
			||||||
	adc.current_channel++;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (adc.current_channel == ADC_BUFFER_SIZE) {
 | 
					 | 
				
			||||||
		adc.current_channel = 0;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ADMUX = adc.channel_map[adc.current_channel];
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -19,10 +19,11 @@ typedef struct {
 | 
				
			|||||||
} adc_buffer_t;
 | 
					} adc_buffer_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct adc {
 | 
					typedef struct adc {
 | 
				
			||||||
	adc_sample_t buffer[ADC_BUFFER_SIZE];
 | 
						//adc_sample_t buffer[ADC_BUFFER_SIZE];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	volatile uint8_t current_channel;
 | 
						/*volatile uint8_t current_channel;
 | 
				
			||||||
	uint8_t * channel_map;
 | 
						uint8_t * channel_map;
 | 
				
			||||||
 | 
						*/
 | 
				
			||||||
} adc_t;
 | 
					} adc_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// the adc instance
 | 
					// the adc instance
 | 
				
			||||||
@ -30,7 +31,9 @@ extern adc_t adc;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void adc_init(uint8_t * channels);
 | 
					void adc_init(uint8_t * channels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define adc_start() ADCSRA |= (1<<ADIE) | (1<<ADSC)
 | 
					#define adc_start() do { ADCSRA |= (1<<ADSC); } while(0)
 | 
				
			||||||
#define adc_stop()  ADCSRA &= ~(1<<ADIE)
 | 
					#define adc_finished() (ADCSRA & (1<<ADIF))
 | 
				
			||||||
 | 
					#define adc_set_channel(channel) do { ADMUX = channel; } while(0)
 | 
				
			||||||
 | 
					#define adc_value() ADC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ADC_H_ */
 | 
					#endif /* ADC_H_ */
 | 
				
			||||||
 | 
				
			|||||||
@ -25,7 +25,7 @@ button_state_t button_is_pressed()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ISR(PCINT1_vect) {
 | 
					ISR(PCINT1_vect) {
 | 
				
			||||||
	if(!(BUTTON_REG&(1<<BUTTON_PIN))) {
 | 
						if(!(BUTTON_REG&(1<<BUTTON_PIN))) {
 | 
				
			||||||
		app.state.state.button = !app.state.state.button;
 | 
							app.button = !app.button;
 | 
				
			||||||
		led_toggle();
 | 
							led_toggle();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										14
									
								
								firmware/slider/comm.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								firmware/slider/comm.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * comm.c
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  Created on: 13.02.2019
 | 
				
			||||||
 | 
					 *      Author: julian
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <avr/io.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void comm_init()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						DDRA |= (1<<PA5); // setup MOSI as output
 | 
				
			||||||
 | 
						USICR = (1<<USIWM0)|(1<<USICS1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								firmware/slider/comm.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								firmware/slider/comm.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * comm.h
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *  Created on: 13.02.2019
 | 
				
			||||||
 | 
					 *      Author: julian
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef COMM_H_
 | 
				
			||||||
 | 
					#define COMM_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void comm_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* COMM_H_ */
 | 
				
			||||||
@ -4,6 +4,7 @@
 | 
				
			|||||||
#include "led.h"
 | 
					#include "led.h"
 | 
				
			||||||
#include "button.h"
 | 
					#include "button.h"
 | 
				
			||||||
#include "main.h"
 | 
					#include "main.h"
 | 
				
			||||||
 | 
					#include "comm.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Communication driver */
 | 
					/* Communication driver */
 | 
				
			||||||
#define SLAVE_ENABLE_DDR DDRA
 | 
					#define SLAVE_ENABLE_DDR DDRA
 | 
				
			||||||
@ -12,16 +13,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <interface.h>
 | 
					#include <interface.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "main.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void comm_init();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// the public instance of the app buffer
 | 
					// the public instance of the app buffer
 | 
				
			||||||
struct app app = {};
 | 
					struct app app = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t channel_map[ADC_BUFFER_SIZE] = {
 | 
					uint8_t channel_map[ADC_BUFFER_SIZE] = {
 | 
				
			||||||
	0,
 | 
					 | 
				
			||||||
	1,
 | 
						1,
 | 
				
			||||||
 | 
						0,
 | 
				
			||||||
	2,
 | 
						2,
 | 
				
			||||||
	3,
 | 
						3,
 | 
				
			||||||
	7
 | 
						7
 | 
				
			||||||
@ -49,12 +46,8 @@ void init()
 | 
				
			|||||||
	sei();
 | 
						sei();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void comm_init()
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	DDRA |= (1<<PA5); // setup MOSI as output
 | 
					 | 
				
			||||||
	USICR = (1<<USIWM0)|(1<<USICS1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// All states of the transaction state machine
 | 
				
			||||||
volatile enum {
 | 
					volatile enum {
 | 
				
			||||||
	COMM_WAIT       = 0,
 | 
						COMM_WAIT       = 0,
 | 
				
			||||||
	COMM_SEND_START ,
 | 
						COMM_SEND_START ,
 | 
				
			||||||
@ -69,25 +62,33 @@ static inline void comm_service()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (USISR & (1<<USIOIF))
 | 
						if (USISR & (1<<USIOIF))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		led_on();
 | 
					 | 
				
			||||||
		cli();
 | 
							cli();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch(comm_state)
 | 
							switch(comm_state)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
		case COMM_WAIT:
 | 
							case COMM_WAIT:
 | 
				
			||||||
 | 
								// only trigger on start of transmission
 | 
				
			||||||
			if (IS_EOM(USIDR)) {
 | 
								if (IS_EOM(USIDR)) {
 | 
				
			||||||
				// pass package through
 | 
					 | 
				
			||||||
				USIDR &= ~0x80;
 | 
									USIDR &= ~0x80;
 | 
				
			||||||
				comm_state = COMM_SEND_START;
 | 
									comm_state = COMM_SEND_START;
 | 
				
			||||||
				adc_stop();
 | 
					
 | 
				
			||||||
 | 
									// sample first channel
 | 
				
			||||||
 | 
									adc_start();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case COMM_SEND_START:
 | 
							case COMM_SEND_START:
 | 
				
			||||||
			temp = adc.buffer[count];
 | 
								// transmit LSByte of value
 | 
				
			||||||
 | 
								temp = adc_value();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// sample next channel
 | 
				
			||||||
 | 
								adc_set_channel(channel_map[count+1]);
 | 
				
			||||||
 | 
								adc_start();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			USIDR = temp & 0x7F;
 | 
								USIDR = temp & 0x7F;
 | 
				
			||||||
			comm_state = COMM_SEND_WAIT;
 | 
								comm_state = COMM_SEND_WAIT;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case COMM_SEND_WAIT:
 | 
							case COMM_SEND_WAIT:
 | 
				
			||||||
 | 
								// transmit MSByte
 | 
				
			||||||
			USIDR = (temp>>7)&0x7F;
 | 
								USIDR = (temp>>7)&0x7F;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (++count == ADC_BUFFER_SIZE) {
 | 
								if (++count == ADC_BUFFER_SIZE) {
 | 
				
			||||||
@ -97,20 +98,23 @@ static inline void comm_service()
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case COMM_SEND_END:
 | 
							case COMM_SEND_END:
 | 
				
			||||||
 | 
								// cleanup the transaction
 | 
				
			||||||
			count = 0;
 | 
								count = 0;
 | 
				
			||||||
			USIDR = app.state.state.button | 0x80;
 | 
								// transmit the button state and end of transaction
 | 
				
			||||||
 | 
								USIDR = app.button | 0x80;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			comm_state = COMM_WAIT;
 | 
								comm_state = COMM_WAIT;
 | 
				
			||||||
			adc_start();
 | 
								// reset channel of adc back to 0
 | 
				
			||||||
 | 
								adc_set_channel(channel_map[0]);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		USISR |= (1<<USIOIF);
 | 
							USISR |= (1<<USIOIF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sei();
 | 
							sei();
 | 
				
			||||||
		led_off();
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <util/delay.h>
 | 
					#include <util/delay.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// little debug helper function
 | 
					// little debug helper function
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,7 @@
 | 
				
			|||||||
#include <slave/slave.h>
 | 
					#include <slave/slave.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct app {
 | 
					struct app {
 | 
				
			||||||
	slave_t state;
 | 
						volatile uint8_t button;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct app app;
 | 
					extern struct app app;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user