/Designs/Fluxgate_magnetometer/SW/firmware/main.c
0,0 → 1,145
// Template - Roman Pavelka, 2011
// written for atmega8
 
#define F_CPU 16000000
#define BAUD 1000000
//#define MYUBRR F_CPU/8/BAUD-1
#define MYUBRR 1
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
#include "./libs/usart.h"
#include "./libs/spi.h"
//#include "./libs/mcp4922.h"
//#include "./libs/adc.h"
//#include "./libs/timer.h"
 
 
#define LEN 128
 
void act(void);
void drive(unsigned char t);
 
int main (void) {
USART_Init(MYUBRR);
PORTC = 0b00000000; // drive port
DDRC = 0b00000011; // drive port out
 
DDRB = 0b00101110; //MOSI out CONV out, DAC CS out
PORTB = 0b00101010; // SCK, MOSI, CONV, DAC high
SPI_MasterInit();
 
sei();
 
while (1) ;
return 0;
}
 
 
void act(void) {
 
unsigned char data[2*LEN];
unsigned char i,j;
 
for(j=0;j<40;j++) {
for(i=0;i<LEN;i++) {
drive(i);
_delay_us(5);
}
}
 
for(i=0;i<LEN;i++) {
drive(i);
 
PORTB |= 0b00000100;
_delay_us(4); // converting
PORTB &= 0b11111011;
 
data[2*i]=SPI_MasterTransmit(0x0);
data[2*i+1]=SPI_MasterTransmit(0x0);
}
 
PORTC=0;
 
for(i=0;i<LEN;i++) {
USART_Transmit(data[2*i]);
// USART_Transmit(data[2*i+1]);
}
 
}
 
 
void value(void) {
 
unsigned char i,j;
long resultH,resultL;
 
resultH=0;
resultL=0;
 
for(j=0;j<32;j++) {
for(i=0;i<LEN;i++) {
drive(i);
_delay_us(5);
}
}
 
for(j=0;j<4;j++) {
for(i=0;i<LEN/2;i++) {
drive(i);
 
PORTB |= 0b00000100;
_delay_us(4); // converting
PORTB &= 0b11111011;
 
resultH+=(unsigned char)SPI_MasterTransmit(0x0);
resultL+=(unsigned char)SPI_MasterTransmit(0x0);
}
for(i=LEN/2;i<(LEN/4)*3;i++) { //dela podivnou kvantitatizaci vysledku
drive(i);
 
PORTB |= 0b00000100;
_delay_us(4); // converting
PORTB &= 0b11111011;
 
resultH-=(unsigned char)SPI_MasterTransmit(0x0);
resultL-=(unsigned char)SPI_MasterTransmit(0x0);
}
}
 
PORTC=0; // drive off
 
// resultH *= 256;
// USART_Transmit_longnum(resultH+resultL);
 
USART_Transmit_longnum(resultH);
 
USART_Transmit('\n');
}
 
 
ISR(USART_RXC_vect) {
cli();
char c;
 
c=UDR; //must be read to untrigger interupt
 
if (c=='a')
act();
else if (c=='v')
value();
 
sei();
}
 
 
void drive(unsigned char t) {
if (t<LEN/2)
PORTC = 0b00000001;
else
PORTC = 0b00000010;
}