using ringbuffer and printf now

master
Dario Ernst 15 years ago
parent 2aaeee4e55
commit 27e9c3b23a

@ -3,6 +3,7 @@
#ifndef SPI_MASTER
#include "main.h"
#include "filter.h"
#endif
/***** MASTER *****/

@ -2,7 +2,6 @@
#define SPI_PROTO_H
#include <stdint.h>
/***** MASTER *****/
#define SPI_WRITE_DATA 0x01
@ -22,7 +21,6 @@ void call_func(uint8_t number);
/***** MASTER END *****/
/***** SLAVE *****/
#include "spi_pointers.h"
uint16_t spi_proto_slaveaction(uint8_t opcode, uint8_t addr, uint16_t data);
/***** SLAVE END *****/

@ -8,7 +8,7 @@ CFLAGS += -ffunction-sections -Wl,--gc-sections -Wl,--relax
COMPILE = avr-gcc $(CFLAGS) $(DEFINES)
OBJECTS = main.o mcp_adc.o i2c_simple.o softtimer.o spi_proto.o spi.o spi_pointers.o muxer.o debug.o filter.o
OBJECTS = main.o mcp_adc.o i2c_simple.o softtimer.o spi_proto.o spi.o spi_pointers.o muxer.o debug.o filter.o ringbuf_small.o
# symbolic targets:
all: firmware.hex

@ -1,38 +1,21 @@
#include "debug.h"
#include <stdio.h>
#include "ringbuf_small.h"
char debugStr[DEBUGCHARS];
volatile char dbgCurChar;
volatile uint8_t dbgStrFill; // amount of available chars in debugStr
volatile uint8_t dbgHasNewSPI;
ringbuf_t rb;
char dbuf[DEBUGCHARS];
void dbgLog(const char* fmt, ...) {
uint8_t maxwrite = DEBUGCHARS - dbgStrFill;
va_list va;
va_start(va,fmt);
char* pos = debugStr + dbgStrFill;
dbgStrFill += vsnprintf(pos, maxwrite, fmt, va);
va_end(va);
}
FILE mystdout = FDEV_SETUP_STREAM(dbg_putchar, NULL,
_FDEV_SETUP_WRITE);
uint8_t dbgHasNew() {
dbgHasNewSPI = (dbgStrFill > 0);
return (dbgStrFill > 0);
void dbg_init() {
ringbuf_init(&rb,dbuf,sizeof(dbuf));
}
char dbgReadChar() {
if(dbgHasNew()) {
char ret = debugStr[0];
for(int i=0; i<dbgStrFill-1; i++) {
debugStr[i] = debugStr[i+1];
}
dbgStrFill--;
return ret;
} else {
return 0xFF;
}
uint8_t dbg_putchar(char c, FILE *stream) {
return ringbuf_put(&rb, (uint8_t) c);
}
void dbgAdvanceChar() {
dbgCurChar = dbgReadChar();
int16_t dbg_getchar(int16_t dummy) {
return ringbuf_get(&rb);
}

@ -2,16 +2,18 @@
#define __DEBUG_H
#include <stdint.h>
#include <stdio.h>
#include "ringbuf_small.h"
#define DEBUGCHARS 100
extern char debugStr[];
extern volatile uint8_t dbgStrFill; // amount of available chars in debugStr
extern volatile uint8_t dbgHasNewSPI;
extern volatile char dbgCurChar;
#define DEBUGCHARS 254
extern FILE mystdout;
ringbuf_t rb;
char dbuf[DEBUGCHARS];
void dbg_init();
int16_t dbg_getchar();
uint8_t dbg_putchar(char c, FILE* stream);
void dbgLog(const char* fmt, ...);
uint8_t dbgHasNew();
char dbgReadChar();
void dbgAdvanceChar();
#endif

@ -1,6 +1,7 @@
#include "filter.h"
#include <math.h>
#include <stdio.h>
Sensordata sensordata[4];
float ambient_temp=25.;
@ -13,7 +14,7 @@ float avg_noise[CHANNELCOUNT];
void process_thermocouple_value(int16_t raw_data, uint8_t channel){
dbgLog("procthermval, val %i, chan %i",raw_data,channel);
printf("procthermval, val %i, chan %i",raw_data,channel);
// This function does everything that needs to be done to raw adc values
float a = raw_data;
a -= sensordata[channel].offset;
@ -37,7 +38,7 @@ void process_ambient_value(int16_t raw_data){
a = a * 0.03125; //adc to mV after amp
a = a / 9.625;
ambient_temp = a;
dbgLog("ambient: %3.3f°C (lastval %i)\n",a, raw_data);
printf("ambient: %3.3f°C (lastval %i)\n", a, raw_data);
}

@ -16,7 +16,7 @@ void inline i2c_wait(){
while(!(TWCR & _BV(TWINT))){
cntr++;
if(cntr >= 1000){
dbgLog("i2c waittime exceeded!\n");
printf("i2c waittime exceeded!\n");
}
}
}

@ -4,9 +4,12 @@
#include "i2c_simple.h"
#include "mcp_adc.h"
#include "debug.h"
#include <math.h>
#include "filter.h"
#include <math.h>
#include <util/delay.h>
#include <stdio.h>
uint16_t timertmp;
uint16_t temperatures[4];
@ -45,6 +48,8 @@ void hardinit() {
void softinit() {
mcpadc_init(ADC_GAIN_2|ADC_CONV_CONT|ADC_BITS_16);
dbg_init();
stdout = &mystdout;
}
@ -56,11 +61,11 @@ int __attribute__((noreturn)) main(void) {
int16_t data;
for(;;){
dbgLog("loop iteration\n");
printf("loop iteration\n");
// measure temps 5*2 times
for(uint8_t i=0; i<5; i++) {
dbgLog("starting temp measuring");
printf("starting temp measuring");
for(uint8_t active_sensor=0; active_sensor<2; active_sensor++) { // only measuring two probes atm
muxer_set(active_sensor);
while(!mcpadc_has_new_data()) _delay_ms(10);
@ -70,13 +75,13 @@ int __attribute__((noreturn)) main(void) {
data = mcpadc_get_data();
process_thermocouple_value(data,active_sensor);
}
dbgLog("a");
printf("a");
}
dbgLog("now measuring offsets");
printf("now measuring offsets");
// measure 2 offsets
for(uint8_t active_sensor=0; active_sensor<2; active_sensor++) { // only measuring two offsets atm
dbgLog("active sensor: %i",active_sensor);
printf("active sensor: %i",active_sensor);
muxer_set(active_sensor);
offset_measure_start(active_sensor);
while(!mcpadc_has_new_data()) _delay_ms(10);
@ -84,7 +89,7 @@ int __attribute__((noreturn)) main(void) {
while(!mcpadc_has_new_data()) _delay_ms(10);
data = mcpadc_get_data();
dbgLog("retrieved offset data %i", data);
printf("retrieved offset data %i", data);
// TODO: what to do with the offset?
offset_measure_stop();

@ -1,3 +1,6 @@
#ifndef __RINGBSML_H
#define __RINGBSML_H
#include <stdint.h>
typedef struct {
@ -9,4 +12,7 @@ typedef struct {
void ringbuf_init(ringbuf_t* rb, char* buf, int size);
uint8_t ringbuf_put(ringbuf_t *rb, uint8_t value);
int16_t ringbuf_get(ringbuf_t *rb);
#endif

@ -1,15 +1,13 @@
#include "spi_pointers.h"
#include "main.h"
#include "debug.h"
uint8_t *spi_proto_globals8[] = {
&dbgHasNewSPI,
&dbgCurChar
};
uint16_t *spi_proto_globals16[] = {
};
funptr_t spi_proto_funcs[] = {
&dbgHasNew,
&dbgAdvanceChar
&dbg_getchar
};

Loading…
Cancel
Save