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; |
} |
|
|