commit
3d3ed50676
@ -0,0 +1 @@
|
|||||||
|
../shared/softtimer.c
|
||||||
@ -0,0 +1 @@
|
|||||||
|
../shared/softtimer.h
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
#include "softtimer.h"
|
||||||
|
|
||||||
|
volatile uint16_t timer1_acc;
|
||||||
|
uint16_t softtimer_last[SOFTTIMERNUMS];
|
||||||
|
|
||||||
|
void softtimer_reset(uint8_t timernum){
|
||||||
|
softtimer_last[timernum] = timer1_acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t softtimer(uint8_t timernum, uint16_t interval){
|
||||||
|
uint16_t timer1_acc_tmp = timer1_acc; // because of volatile
|
||||||
|
if((uint16_t)(timer1_acc_tmp - (uint16_t)(softtimer_last[timernum]) >= interval )){
|
||||||
|
softtimer_last[timernum] = timer1_acc_tmp;
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// SOFTTIMER( <YOUR TIMER NUM>, <YOUR INTERVAL>);
|
||||||
|
// #define SOFTTIMER(n,a) if(softtimer((n),(a*8)))
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
// NOTES:
|
||||||
|
// Please #define SOFTTIMERNUMS aNum before including this!
|
||||||
|
|
||||||
|
#ifndef __SOFTTIMER_H
|
||||||
|
#define __SOFTTIMER_H
|
||||||
|
|
||||||
|
extern volatile uint16_t timer1_acc;
|
||||||
|
extern uint16_t softtimer_last[SOFTTIMERNUMS];
|
||||||
|
|
||||||
|
|
||||||
|
void softtimer_reset(uint8_t timernum);
|
||||||
|
uint8_t softtimer(uint8_t timernum, uint16_t interval);
|
||||||
|
|
||||||
|
// SOFTTIMER( <YOUR TIMER NUM>, <YOUR INTERVAL>);
|
||||||
|
#define SOFTTIMER(n,a) if(softtimer((n),(a*8)))
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -1,23 +1,97 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "i2c_simple.h"
|
#include "i2c_simple.h"
|
||||||
|
|
||||||
|
void i2c_init()
|
||||||
|
{
|
||||||
|
TWBR = 0;//bit rate
|
||||||
|
TWSR = 0;//Prescaler
|
||||||
|
|
||||||
|
TWAR = 0x80;//our address 1000 000, don't listen to general call
|
||||||
|
TWAMR = 0;
|
||||||
|
|
||||||
void i2c_init(){
|
TWCR = TWEA | TWEN;/* TWINT clear -> we must do something; unset TWSTA manually!, TWSTO */
|
||||||
//TODO: implement
|
//TWDR - data
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data){
|
uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data)
|
||||||
return 0; //TODO: implement
|
{
|
||||||
|
TWCR &= ~TWSTO;
|
||||||
|
TWCR |= TWINT | TWSTA;
|
||||||
|
while(~TWCR & TWINT) {;}/* get bus access */
|
||||||
|
/* no error possible */
|
||||||
|
|
||||||
|
TWDR = addr | 1;
|
||||||
|
TWCR &= ~(TWSTA | TWSTO);
|
||||||
|
TWCR |= TWINT;
|
||||||
|
while(~TWCR & TWINT) {;}/* transmit address */
|
||||||
|
/* possible results: ACK, NAK, abitration lost */
|
||||||
|
if(TW_STATUS == TW_MR_SLA_NACK)
|
||||||
|
{
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if(TW_STATUS == TW_MR_ARB_LOST) {return 0;}
|
||||||
|
|
||||||
|
uint8_t done = 0;
|
||||||
|
while(done + 1 < len)
|
||||||
|
{
|
||||||
|
TWCR |= TWEA | TWINT;/* send ack after byte */
|
||||||
|
while(~TWCR & TWINT) {;}/* read data */
|
||||||
|
data[done] = TWDR;
|
||||||
|
done++;
|
||||||
|
TWCR |= TWINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
TWCR &= ~TWEA;
|
||||||
|
TWCR |= TWINT;/* send nak after byte */
|
||||||
|
while(~TWCR & TWINT) {;}/* read data */
|
||||||
|
data[done] = TWDR;
|
||||||
|
done++;
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return done;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data){
|
uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data)
|
||||||
return 0; //TODO: implement
|
{
|
||||||
|
TWCR &= ~TWSTO;
|
||||||
|
TWCR |= TWINT | TWSTA;
|
||||||
|
while(~TWCR & TWINT) {;}/* get bus access */
|
||||||
|
/* no error possible */
|
||||||
|
|
||||||
|
TWDR = addr;
|
||||||
|
TWCR &= ~(TWSTA | TWSTO);
|
||||||
|
TWCR |= TWINT;
|
||||||
|
while(~TWCR & TWINT) {;}/* transmit address */
|
||||||
|
/* possible results: ACK, NAK, abitration lost */
|
||||||
|
if(TW_STATUS == TW_MT_SLA_NACK)
|
||||||
|
{
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if(TW_STATUS == TW_MT_ARB_LOST) {return 0;}
|
||||||
|
|
||||||
|
uint8_t done = 0;
|
||||||
|
while(done < len)
|
||||||
|
{
|
||||||
|
TWDR = data[done];
|
||||||
|
TWCR |= TWINT;
|
||||||
|
while(~TWCR & TWINT) {;}/* write data */
|
||||||
|
/* possible results: ACK, NAK, abitration lost */
|
||||||
|
if(TW_STATUS == TW_MT_DATA_NACK)
|
||||||
|
{
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
else if(TW_STATUS == TW_MT_ARB_LOST) {return done;}
|
||||||
|
done++;
|
||||||
|
}
|
||||||
|
|
||||||
|
TWCR |= TWINT | TWSTO;
|
||||||
|
return done;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t* writedata, uint8_t readlen,
|
uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t *writedata, uint8_t readlen, uint8_t *readdata)
|
||||||
uint8_t* readdata){
|
{
|
||||||
return 0; //TODO: implement
|
return 0; //TODO: implement
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in new issue