main.c
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <inttypes.h>
#include <avr/iom16.h>
#include <avr/delay.h>
#include <string.h>
void init_usart() {
UBRRL = 12;
UCSRA = _BV(U2X);
UCSRB = _BV(RXEN)
| _BV(TXEN);
UCSRC = _BV(URSEL)
| _BV(UCSZ0)
| _BV(UCSZ1);
}
void init_timer(void) {
TCCR1A = _BV(COM1A1)
| _BV(COM1B1)
| _BV(WGM11)
| _BV(WGM12)
| _BV(WGM13);
TCCR1B = _BV(WGM13)
| _BV(WGM12)
| _BV(CS11);
ICR1 = 2000;
OCR1A = 50;
DDRD = _BV(PD4)
| _BV(PD5)
| _BV(PD1);
}
void init_adc(void) {
ADMUX = _BV(REFS1)
| _BV(REFS0)
| _BV(ADLAR);
ADCSRA = _BV(ADEN)
| _BV(ADPS2);
}
void USART_Transmit(unsigned char data) {
while (! (UCSRA & (1<<UDRE)));
UDR = data;
}
void send_string(char* s) {
int size = strlen(s);
int i = 0;
for(i=0;i<size;i++){
unsigned char ch = s[i];
USART_Transmit(ch);
}
}
unsigned char read_adc(){
unsigned int i = 0;
unsigned int sum = 0;
for (i=0; i<10; i++){
ADCSRA |= _BV(ADSC);
while (ADCSRA & _BV(ADSC)) {}
sum = sum+ADCH;
}
unsigned char result = (sum/10);
return result;
}
int main(void) {
sei();
init_usart();
init_timer();
init_adc();
int i = 50;
int dir = 1;
while(1)
{
OCR1A = i;
i = i + (1*dir);
if (i == 280)
dir = dir*-1;
else if (i == 50)
dir = dir*-1;
unsigned char angle = (OCR1A-50);
char* data1[30];
sprintf(data1, "%u", angle);
send_string("angle: ");
send_string(data1);
send_string(";");
unsigned char dist = read_adc();
char* data[30];
sprintf(data, "%u", dist);
send_string("dist: ");
send_string(data);
send_string(";");
}
}
EDI021 - Digitala Projekt
Lunds Tekniska Högskola, HT 2005