Skip to content

Instantly share code, notes, and snippets.

@Bouni
Created June 13, 2015 21:24
Show Gist options
  • Save Bouni/a9e22c9c59293e407f30 to your computer and use it in GitHub Desktop.
Save Bouni/a9e22c9c59293e407f30 to your computer and use it in GitHub Desktop.
ulogger
#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