• Non ci sono risultati.

I L F IRMWARE PER IL CONTROLLO DEL SENSORE DI INCLINAZIONE

N/A
N/A
Protected

Academic year: 2021

Condividi "I L F IRMWARE PER IL CONTROLLO DEL SENSORE DI INCLINAZIONE "

Copied!
9
0
0

Testo completo

(1)

APPEN D I CE C

I L F IRMWARE PER IL CONTROLLO DEL SENSORE DI INCLINAZIONE

main.c

#include <avr/io.h>

#include "spi_via_usi_driver.h"

#include "SensorDef.h"

unsigned char UART_data;

int main (void) {

//Set the ADIS16201 reset high DDRB |= (1<<DDB2);

PORTB |= (1<<PB2);

spiX_initmaster();

USART_Init();

while(1) {

if(UCSRA & (1<<RXC)) {

UART_data = UDR;

switch (UART_data) {

//Factory Setting

case 0x30: {FactorySettings();

break;

}

(2)

APPENDICE C IL FIRMWARE PER IL CONTROLLO DEL SENSORE DI INCLNAZIONE

//Calibrate

case 0x32: {calibrate();

break;

}

case 0x33: {FilterEnable();

break;

}

case 0x34: {USART_Transmit(spiX_read(XINCL_OUT) & 0x0FFF);

USART_Transmit(spiX_read(YINCL_OUT) & 0x0FFF);

break;

}

case 0x35: {USART_Transmit(spiX_read(XACCL_OUT) & 0x3FFF);

USART_Transmit(spiX_read(YACCL_OUT) & 0x3FFF);

break;

}

case 0x36: {USART_Transmit(spiX_read(SUPPLY_OUT) & 0x0FFF);

break;

}

case 0x37: {USART_Transmit(spiX_read(TEMP_OUT) & 0x0FFF);

break;

}

case 0x38: {USART_Transmit(spiX_read(STATUS) & 0x01FF);

break;

}

default : {break;

} } //switch

}// if } //while return (0);

} //main

(3)

APPENDICE C IL FIRMWARE PER IL CONTROLLO DEL SENSORE DI INCLNAZIONE

SensorDef.h

#ifndef _SENSORDEF_H_

#define _SENSORDEF_H_

//ADIS16201 Register Addresses

#define SUPPLY_OUT 0x02

#define XACCL_OUT 0x04

#define YACCL_OUT 0x06

#define AUX_ADC 0x08

#define TEMP_OUT 0x0A

#define XINCL_OUT 0x0D

#define YINCL_OUT 0x0F

#define XACCL_OFF 0x10

#define YACCL_OFF 0x12

#define XACCL_SCALE 0x14

#define YACCL_SCALE 0x16

#define XINCL_OFF 0x18

#define YINCL_OFF 0x1A

#define XINCL_SCALE 0x1C

#define YINCL_SCALE 0x1E

#define ALM_MAG1 0x20

#define ALM_MAG2 0x22

#define ALM_SMPL1 0x24

#define ALM_SMPL2 0x26

#define ALM_CTRL 0x28

#define AUX_DAC 0x30

#define GPIO_CTRL 0x32

#define MSC_CTRL 0x34

#define SMPL_PRD 0x36

#define AVG_CNT 0x38

#define PWR_MDE 0x3A

#define STATUS 0x3C

#define COMMAND 0x3E

//functions definitions void FilterEnable(void);

void calibrate(void);

(4)

APPENDICE C IL FIRMWARE PER IL CONTROLLO DEL SENSORE DI INCLNAZIONE

sensor.c

#include "SensorDef.h"

#include "spi_via_usi_driver.h"

#include <avr/io.h>

#include <avr/interrupt.h>

void FilterEnable(void) {

spiX_write(AVG_CNT, 0x08);

}

void calibrate(void) {

spiX_write(COMMAND, 0x01);

}

void FactorySettings(void) {

spiX_write(COMMAND, 0x02);

spiX_write(MSC_CTRL, 0x00);

spiX_write(ALM_CTRL, 0x00);

spiX_write(ALM_CTRL+1, 0x00);

spiX_write(AVG_CNT, 0x08);

}

void SW_reset(void) {

spiX_write(COMMAND, 0x80);

}

(5)

APPENDICE C IL FIRMWARE PER IL CONTROLLO DEL SENSORE DI INCLNAZIONE

uart_driver.c

#include <avr/io.h>

#include <avr/interrupt.h>

#include "spi_via_usi_driver.h"

#include "SensorDef.h"

#include "spi_via_usi_driver.h"

extern unsigned short X_INCL, Y_INCL;

extern unsigned int *X_INCL_P, *Y_INCL_P;

void USART_Init() {

/* Set baud rate to 115200 with no internal prescaler and fosc=8Mhz */

UBRRH = 0;

UBRRL = 0x8;

/* Enable receiver and transmitter. Enable the receive interrupt */

UCSRB = (1<<RXEN)|(1<<TXEN);

UCSRA = (1<<U2X);

/* Set frame format: 8data, no parity, 1 stop bit */

UCSRC = (3<<UCSZ0);

}

void USART_Transmit( unsigned short data ) {

unsigned char data_L, data_H;

data_L = data & 0x00FF;

data_H = (data & 0xFF00) >> 8;

/* Wait for empty transmit buffer */

while ( !( UCSRA & (1<<UDRE)) );

/* Put data into buffer, sends the data */

UDR = data_H;

/* Wait for empty transmit buffer */

while ( !( UCSRA & (1<<UDRE)) );

(6)

APPENDICE C IL FIRMWARE PER IL CONTROLLO DEL SENSORE DI INCLNAZIONE

spi_via_usi_driver.c

#include <avr/io.h>

#include <avr/interrupt.h>

#include "spi_via_usi_driver.h"

void spiX_initmaster() {

DDRB |= (1<<PB6) | (1<<PB7) | (1<<PB0); // Outputs DDRB &= ~(1<<PB5); // Inputs

PORTB |= (1<<PB5)|(1<<PB7); // Pull-ups DDRB &= ~(1<<PB1); // Inputs

}

char spiX_write(unsigned char address, unsigned char value) {

unsigned short LoopEnd = 0;

//setting write address address |= 0x80;

address &= ~0x40;

//Chip select

PORTB &= ~(1<<PB0);

// Put data address in USI data register USIDR = address;

//****************SPI TRANSMISSION*******************************************

USISR |= (1<<USIOIF);

do {

USICR = (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);

LoopEnd = USISR & 0x40;

}

while (LoopEnd == 0);

//***************************************************************************

// Put data in USI data register USIDR = value;

(7)

APPENDICE C IL FIRMWARE PER IL CONTROLLO DEL SENSORE DI INCLNAZIONE

//****************SPI TRANSMISSION*******************************************

USISR |= (1<<USIOIF);

do {

USICR = (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);

LoopEnd = USISR & 0x40;

}

while (LoopEnd == 0);

//***************************************************************************

//Chip deselect PORTB |= (1<<PB0);

return 0;

}

unsigned short spiX_read(unsigned char address) {

unsigned short DataRead_H, DataRead_L, DataRead;

unsigned short LoopEnd = 0;

//----What I want to read---

//Chip select

PORTB &= ~(1<<PB0);

// Put data address in USI data register USIDR = address;

//****************SPI TRANSMISSION*******************************************

USISR |= (1<<USIOIF);

do {

USICR = (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);

LoopEnd = USISR & 0x40;

}

while (LoopEnd == 0);

//***************************************************************************

(8)

APPENDICE C IL FIRMWARE PER IL CONTROLLO DEL SENSORE DI INCLNAZIONE

//****************SPI TRANSMISSION*******************************************

USISR |= (1<<USIOIF);

do {

USICR = (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);

LoopEnd = USISR & 0x40;

}

while (LoopEnd == 0);

//***************************************************************************

//Chip deselect PORTB |= (1<<PB0);

//---Wait--- int i;

for(i=0;i<0xFFF ;i++ );

//---Reading---

//Chip select

PORTB &= ~(1<<PB0);

// Put data address in USI data register USIDR = address;

//****************SPI TRANSMISSION*******************************************

USISR |= (1<<USIOIF);

do {

USICR = (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);

LoopEnd = USISR & 0x40;

}

while (LoopEnd == 0);

//***************************************************************************

//Get data high DataRead_H = USIDR;

// Put data address in USI data register USIDR = 0x00;

(9)

APPENDICE C IL FIRMWARE PER IL CONTROLLO DEL SENSORE DI INCLNAZIONE

//****************SPI TRANSMISSION*******************************************

USISR |= (1<<USIOIF);

do {

USICR = (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);

LoopEnd = USISR & 0x40;

}

while (LoopEnd == 0);

//***************************************************************************

//Get data Low DataRead_L = USIDR;

//Chip deselect PORTB |= (1<<PB0);

DataRead = DataRead_H & 0x00FF;

DataRead = (DataRead << 8) & 0xFF00;

DataRead |= DataRead_L & 0x00FF;

return DataRead;

}

// end of file

spi_via_usi_driver.h

#ifndef _SPI_VIA_USI_DRIVER_H_

#define _SPI_VIA_USI_DRIVER_H_

void spiX_initmaster();

unsigned short spiX_read(unsigned char address);

char spiX_write(unsigned char address, unsigned char value);

Riferimenti

Documenti correlati

• Dopo ogni utilizzo l’attrezzo deve essere spento e il cavo di alimentazione staccato dalla presa (non tirando il cavo); non schiacciare il cavo sotto oggetti pesanti e

(2) Per x negativo 1/x assume valori negativi: valori negativi quanto si voglia piccoli in valore assoluto per x negativo abbastanza grande in valore assoluto (1/x ha limite 0 − per

Restringendo opportunamente il dominio della funzione tangente tan si ha una funzione invertibile, la cui inversa e’ la funzione ”arcotangente” arctan.. Si faccia lo stesso per

Per ciascuna delle seguenti proposizioni si dica se e’ vera o falsa, motivando la risposta: (1) La funzione somma di due funzioni monotone crecenti e’ una funzione monotona

Matematica I, Esercizi

MASTER DI I LIVELLO IN MANAGEMENT E FUNZIONI DI COORDINAMENTO NELLE PROFESSIONI SANITARIE conseguito presso la Libera Università LUSPIO il 27-09-2011. IL SISTEMA SANITARIO:

[r]

Dedurre dal punto precedente (se possibile) se l’origine ` e un punto di estremo