Created
June 13, 2015 21:24
-
-
Save Bouni/a9e22c9c59293e407f30 to your computer and use it in GitHub Desktop.
ulogger
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef F_CPU | |
#define F_CPU 16000000UL | |
#endif | |
#include <avr/io.h> | |
#include <util/delay.h> | |
#include <stdlib.h> | |
#define TEMPERATUR PF0 | |
#define BUTTON PF1 | |
#define WATER PF2 | |
#define TRIGGER PF3 | |
#define ECHO PF4 | |
char buffer[20]; | |
/* | |
* Init pins | |
*/ | |
void init_pins(void) { | |
// set all pins to INPUT except TRIGGER | |
DDRF = (0x00 | (1 << TRIGGER)); | |
// activate PULLUPS for all inputs except TRIGGER | |
PORTF = (0xff & ~(1 << TRIGGER)); | |
} | |
/* | |
* ADC | |
*/ | |
void init_adc(void) | |
{ | |
ADMUX = (1<<REFS0); | |
ADCSRA = (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler | |
ADCSRA |= (1<<ADEN); // ADC aktivieren | |
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung | |
while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten | |
(void) ADCW; | |
} | |
uint16_t read_adc( uint8_t channel ) | |
{ | |
ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F); | |
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" | |
while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten | |
return ADCW; // ADC auslesen und zurückgeben | |
} | |
uint16_t read_avg_adc( uint8_t channel, uint8_t nsamples ) | |
{ | |
uint32_t sum = 0; | |
for (uint8_t i = 0; i < nsamples; ++i ) { | |
sum += read_adc( channel ); | |
} | |
return (uint16_t)( sum / nsamples ); | |
} | |
void init_serial(void) { | |
uint16_t baudrate = 9600; | |
uint16_t baud = (F_CPU / 8 / baudrate - 1) / 2; | |
UBRR0H = (uint8_t) (baud >> 8); | |
UBRR0L = (uint8_t) (baud & 0x0ff); | |
UCSR0B |= (1 << 3); /* TXEN */ | |
UCSR0B |= (1 << 4); /* RXEN */ | |
UCSR0B |= (1 << 7); /* RXCIE */ | |
UCSR0C |= (1 << 1); /* UCSZ0 = 1 */ | |
UCSR0C |= (1 << 2); /* UCSZ1 = 1 */ | |
UCSR0B &= ~(1 << 2); /* UCSZ2 = 0 */ | |
UCSR0C &= ~(1 << 4); /* UPM0 = 0 */ | |
UCSR0C &= ~(1 << 5); /* UPM1 = 0 */ | |
UCSR0C |= (1 << 3); /* USBS = 1 */ | |
} | |
void uart_putc(char c) { | |
while (!(UCSR0A & (1<<UDRE0))); | |
UDR0 = c; | |
} | |
void uart_puts(char* s) { | |
while(*s) { | |
uart_putc(*s); | |
s++; | |
} | |
} | |
char getc(void) | |
{ | |
while (!(UCSR0A & (1<<RXC0))); | |
return UDR0; | |
} | |
/* | |
* Board functions | |
*/ | |
int button_pressed(void) { | |
return (PINF & (1 << BUTTON)); | |
} | |
int water_alert(void) { | |
return (PINF & (1 << WATER)); | |
} | |
int measure_distance(void) { | |
int t = 0; | |
PORTF |= (1 << TRIGGER); | |
_delay_ms(20); | |
PORTF &= ~(1 << TRIGGER); | |
while((PINF & (1 << ECHO)) == 0); | |
while((PINF & (1 << ECHO))) { | |
_delay_us(1); | |
t++; | |
} | |
return t / 58; | |
} | |
int main(void) { | |
init_pins(); | |
init_adc(); | |
init_serial(); | |
while(1) { | |
_delay_ms(500); | |
if(button_pressed()) { | |
uart_puts("Button pressed"); | |
uart_putc('\n'); | |
} | |
if(water_alert()) { | |
uart_puts("Water alert"); | |
uart_putc('\n'); | |
} | |
uart_puts("Analog value: "); | |
uart_puts(itoa(read_avg_adc(0,20),buffer,10)); | |
uart_putc('\n'); | |
uart_puts("Distance in cm: "); | |
uart_puts(itoa(measure_distance(),buffer,10)); | |
uart_putc('\n'); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment