Merge branch 'master' of gitorious.ghostdub.de:avr/thermocouple

master
Matthias Merz 15 years ago
commit 3d3ed50676

@ -26,10 +26,12 @@
#include "spi.h"
#include "usb.h"
#define SOFTTIMERNUMS 4
#include "softtimer.h"
extern uint8_t newThermoData;
extern uint16_t thermoData[];
#define SOFTTIMERNUMS 4
#define LED1PORT PORTC
#define LED1APIN 0

@ -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 "i2c_simple.h"
void i2c_init(){
//TODO: implement
void i2c_init()
{
TWBR = 0;//bit rate
TWSR = 0;//Prescaler
TWAR = 0x80;//our address 1000 000, don't listen to general call
TWAMR = 0;
TWCR = TWEA | TWEN;/* TWINT clear -> we must do something; unset TWSTA manually!, TWSTO */
//TWDR - data
}
uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data){
return 0; //TODO: implement
uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data)
{
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){
return 0; //TODO: implement
uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data)
{
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* readdata){
return 0; //TODO: implement
uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t *writedata, uint8_t readlen, uint8_t *readdata)
{
return 0; //TODO: implement
}

@ -1,7 +1,5 @@
#ifndef I2C_SIMPLE_H
#define I2C_SIMPLE_H
/* initializes i2c interface (master, 400kHz) */
void i2c_init();
@ -13,5 +11,6 @@ uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data);
uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data);
/* writes, followed by a repeated start and a read */
uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t* writedata, uint8_t readlen,
uint8_t* readdata);
uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t *writedata, uint8_t readlen, uint8_t *readdata);
#endif

Loading…
Cancel
Save