Övrigt
Övrigt
Sara Alvandi
Rapport &
Nora Lindgren
Design &
Hampus Anderstedt
Mjukvara
Johannes Kull
Mjukvara
Henrik Berthilsson
3D-Design &
Lars & Bertil
KOD FÖR ATMEGA:
/*
* projektWalle.c
*
* Created: 2023-05-17 17:19:41
* Author : jo6612ku-s
*/
#define F_CPU 8000000UL
#include
#include
#include
#include
#define ECHO 0b00100000
#define TRIGGER 0b00001000
volatile double distance = 0;
int i = 0;
int bugfix = 0;
int start = 0;
int truedist = 0;
volatile int light = 0;
ISR(INT2_vect){ //vad som sker när ECHO ändras
if(start == 0)
{
TCCR1B |= (1 << CS10); //startar timer
start = 1;
}
else if(start == 1)
{
distance = TCNT1 * pow(10, -6) * 0.125 * 17150; //räknar ut distans i cm
TCCR1B = 0x00;
//TCCR1B &= ~(1 << CS10);
TCNT1 = 0;
start = 0;
_delay_ms(50);
}
}
void trigger(){ //skickar en signal på trigger pinnen som varar i 15 mikrosekunder
PORTD = 0b00001000;
_delay_us(15);
PORTD = 0x00;
}
void m_init(){ //motorerna
DDRB = 0x00;
PORTA = 0x00;
PORTB = 0x00;
DDRB = 0b11011000;
//PWM pin PINB3
TCCR3A |= (1 << WGM32) | (1 << WGM30);
TCCR3B |= (1 << CS32) | (0 << CS31) | (1 << CS30);
OCR3A = 30;
//
TCCR0A |= (1 << WGM00) | (1 << WGM01);
TCCR0B |= (1 << CS02) | (0 << CS01) | (1 << CS00);
OCR0B = 30;
}
void u_init(){ //ultraljud sensorn
DDRD = 0xff;
DDRB &= ~(1 << ECHO);
PORTD |= 0x00;
EIMSK |= (1 << INT2);
EICRA |= (1 << ISC20);
TCNT1 = 0;
sei();
}
void adc_init(){ //A/D omvandling
ADMUX = 0;
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0);
ADMUX |= (1 << REFS0) | (0 << MUX0);
ADCSRB = 0x00;
ADCSRA |= (1 << ADEN);
}
int main(void)
{
m_init();
u_init();
adc_init();
int foundlight = 0;
int searching = 0;
int motor = 0;
int STOP = 0;
while (1)
{
ADCSRA |= (1 << ADSC);
light = ADC;
trigger();
if(distance <= 20 && distance > 0){ //kollar ifall ett objekt är nära
if(motor == 1){
TCCR3A &= ~(1 << COM3A1);
}
else{
TCCR0A &= ~(1 << COM0B1);
}
STOP = 1;
}
else{
STOP = 0;
if(motor == 1){
TCCR3A |= (1 << COM3A1);
}
else{
TCCR0A |= (1 << COM0B1);
}
}
if(light < 300 && foundlight == 0){ //motorerna ska vara avstängda från början
TCCR3A &= ~(1 << COM3A1);
TCCR0A &= ~(1 << COM0B1);
}
if(light > 300 && foundlight == 0 && STOP == 0){ //hittar den ljus ska den starta ena motorn
foundlight = 1;
motor = 1;
TCCR3A |= (1 << COM3A1);
}
if(light > 300 && STOP == 0){
searching = 0;
}
if(foundlight == 1 && light < 300 && searching == 0 && STOP == 0){ //byt motor ifall ljuset minskat
searching = 1;
motor *= -1;
TCCR3A ^= (1 << COM3A1);
TCCR0A ^= (1 << COM0B1);
}
_delay_ms(250);
}
}
