mirror of
https://codeberg.org/SiB64/turbo_weather.git
synced 2026-05-01 15:14:22 +02:00
Compare commits
6 commits
830afa308a
...
aba1d1fbfd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aba1d1fbfd | ||
|
|
c4d5c17549 | ||
|
|
4380513dfc | ||
|
|
c3f4e25dc3 | ||
|
|
bb25de31c0 | ||
|
|
da3c5d6842 |
12 changed files with 615 additions and 29 deletions
6
.gitignore
vendored
6
.gitignore
vendored
|
|
@ -10,3 +10,9 @@ gerber/*.gbr
|
||||||
gerber/*.cnc
|
gerber/*.cnc
|
||||||
gerber/*.zip
|
gerber/*.zip
|
||||||
gerber/*.pdf
|
gerber/*.pdf
|
||||||
|
*.d
|
||||||
|
*.hex
|
||||||
|
*.map
|
||||||
|
*.o
|
||||||
|
*.s
|
||||||
|
|
||||||
|
|
|
||||||
60
gerber/turbo-bot.gvp
Normal file
60
gerber/turbo-bot.gvp
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
(gerbv-file-version! "2.0A")
|
||||||
|
(define-layer! 9 (cons 'filename "turbo.bottommask.gbr")
|
||||||
|
(cons 'inverted #t)
|
||||||
|
(cons 'visible #f)
|
||||||
|
(cons 'color #(0 57568 6070))
|
||||||
|
(cons 'alpha #(21588))
|
||||||
|
)
|
||||||
|
(define-layer! 8 (cons 'filename "turbo.bottom.gbr")
|
||||||
|
(cons 'visible #t)
|
||||||
|
(cons 'color #(45177 46748 64893))
|
||||||
|
)
|
||||||
|
(define-layer! 7 (cons 'filename "turbo.bottomsilk.gbr")
|
||||||
|
(cons 'visible #t)
|
||||||
|
(cons 'color #(0 0 0))
|
||||||
|
)
|
||||||
|
(define-layer! 6 (cons 'filename "turbo.top.gbr")
|
||||||
|
(cons 'visible #f)
|
||||||
|
(cons 'color #(65535 29244 28836))
|
||||||
|
(cons 'alpha #(42662))
|
||||||
|
)
|
||||||
|
(define-layer! 5 (cons 'filename "turbo.toppaste.gbr")
|
||||||
|
(cons 'visible #f)
|
||||||
|
(cons 'color #(65535 0 6760))
|
||||||
|
)
|
||||||
|
(define-layer! 4 (cons 'filename "turbo.topmask.gbr")
|
||||||
|
(cons 'inverted #t)
|
||||||
|
(cons 'visible #f)
|
||||||
|
(cons 'color #(0 64984 7760))
|
||||||
|
(cons 'alpha #(13364))
|
||||||
|
)
|
||||||
|
(define-layer! 3 (cons 'filename "turbo.plated-drill.cnc")
|
||||||
|
(cons 'visible #t)
|
||||||
|
(cons 'color #(61307 61307 61307))
|
||||||
|
(cons 'alpha #(65535))
|
||||||
|
(cons 'attribs (list
|
||||||
|
(list 'autodetect 'Boolean 1)
|
||||||
|
(list 'zero_suppression 'Enum 0)
|
||||||
|
(list 'units 'Enum 0)
|
||||||
|
(list 'digits 'Integer 4)
|
||||||
|
))
|
||||||
|
)
|
||||||
|
(define-layer! 2 (cons 'filename "turbo.topsilk.gbr")
|
||||||
|
(cons 'visible #f)
|
||||||
|
(cons 'color #(0 0 0))
|
||||||
|
(cons 'alpha #(55512))
|
||||||
|
)
|
||||||
|
(define-layer! 1 (cons 'filename "turbo.outline.gbr")
|
||||||
|
(cons 'visible #t)
|
||||||
|
(cons 'color #(0 0 0))
|
||||||
|
(cons 'alpha #(65535))
|
||||||
|
)
|
||||||
|
(define-layer! 0 (cons 'filename "turbo.fab.gbr")
|
||||||
|
(cons 'visible #f)
|
||||||
|
(cons 'color #(0 0 0))
|
||||||
|
(cons 'alpha #(65535))
|
||||||
|
)
|
||||||
|
(define-layer! -1 (cons 'filename "/home/falbala/stephan/eda/turbo_weather/gerber")
|
||||||
|
(cons 'color #(65535 65535 65535))
|
||||||
|
)
|
||||||
|
(set-render-type! 3)
|
||||||
BIN
gerber/turbo-bot.png
Normal file
BIN
gerber/turbo-bot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
|
|
@ -2,31 +2,31 @@
|
||||||
(define-layer! 8 (cons 'filename "turbo.bottommask.gbr")
|
(define-layer! 8 (cons 'filename "turbo.bottommask.gbr")
|
||||||
(cons 'inverted #t)
|
(cons 'inverted #t)
|
||||||
(cons 'visible #f)
|
(cons 'visible #f)
|
||||||
(cons 'color #(0 57568 6070 21588))
|
(cons 'color #(0 57568 6070))
|
||||||
(cons 'alpha #(21588))
|
(cons 'alpha #(21588))
|
||||||
)
|
)
|
||||||
(define-layer! 7 (cons 'filename "turbo.bottom.gbr")
|
(define-layer! 7 (cons 'filename "turbo.bottom.gbr")
|
||||||
(cons 'visible #t)
|
(cons 'visible #t)
|
||||||
(cons 'color #(45177 46748 64893 45489))
|
(cons 'color #(45177 46748 64893))
|
||||||
)
|
)
|
||||||
(define-layer! 6 (cons 'filename "turbo.top.gbr")
|
(define-layer! 6 (cons 'filename "turbo.top.gbr")
|
||||||
(cons 'visible #t)
|
(cons 'visible #t)
|
||||||
(cons 'color #(65535 29244 28836 42662))
|
(cons 'color #(65535 29244 28836))
|
||||||
(cons 'alpha #(42662))
|
(cons 'alpha #(42662))
|
||||||
)
|
)
|
||||||
(define-layer! 5 (cons 'filename "turbo.toppaste.gbr")
|
(define-layer! 5 (cons 'filename "turbo.toppaste.gbr")
|
||||||
(cons 'visible #t)
|
(cons 'visible #t)
|
||||||
(cons 'color #(65535 0 6760 45489))
|
(cons 'color #(65535 0 6760))
|
||||||
)
|
)
|
||||||
(define-layer! 4 (cons 'filename "turbo.topmask.gbr")
|
(define-layer! 4 (cons 'filename "turbo.topmask.gbr")
|
||||||
(cons 'inverted #t)
|
(cons 'inverted #t)
|
||||||
(cons 'visible #f)
|
(cons 'visible #f)
|
||||||
(cons 'color #(0 64984 7760 13364))
|
(cons 'color #(0 64984 7760))
|
||||||
(cons 'alpha #(13364))
|
(cons 'alpha #(13364))
|
||||||
)
|
)
|
||||||
(define-layer! 3 (cons 'filename "turbo.plated-drill.cnc")
|
(define-layer! 3 (cons 'filename "turbo.plated-drill.cnc")
|
||||||
(cons 'visible #t)
|
(cons 'visible #t)
|
||||||
(cons 'color #(61307 61307 61307 65535))
|
(cons 'color #(61307 61307 61307))
|
||||||
(cons 'alpha #(65535))
|
(cons 'alpha #(65535))
|
||||||
(cons 'attribs (list
|
(cons 'attribs (list
|
||||||
(list 'autodetect 'Boolean 1)
|
(list 'autodetect 'Boolean 1)
|
||||||
|
|
@ -37,20 +37,20 @@
|
||||||
)
|
)
|
||||||
(define-layer! 2 (cons 'filename "turbo.topsilk.gbr")
|
(define-layer! 2 (cons 'filename "turbo.topsilk.gbr")
|
||||||
(cons 'visible #t)
|
(cons 'visible #t)
|
||||||
(cons 'color #(0 0 0 55512))
|
(cons 'color #(0 0 0))
|
||||||
(cons 'alpha #(55512))
|
(cons 'alpha #(55512))
|
||||||
)
|
)
|
||||||
(define-layer! 1 (cons 'filename "turbo.outline.gbr")
|
(define-layer! 1 (cons 'filename "turbo.outline.gbr")
|
||||||
(cons 'visible #t)
|
(cons 'visible #t)
|
||||||
(cons 'color #(0 0 0 65535))
|
(cons 'color #(0 0 0))
|
||||||
(cons 'alpha #(65535))
|
(cons 'alpha #(65535))
|
||||||
)
|
)
|
||||||
(define-layer! 0 (cons 'filename "turbo.fab.gbr")
|
(define-layer! 0 (cons 'filename "turbo.fab.gbr")
|
||||||
(cons 'visible #f)
|
(cons 'visible #f)
|
||||||
(cons 'color #(0 0 0 65535))
|
(cons 'color #(0 0 0))
|
||||||
(cons 'alpha #(65535))
|
(cons 'alpha #(65535))
|
||||||
)
|
)
|
||||||
(define-layer! -1 (cons 'filename "/home/blaulicht/stephan/eda/turbo/gerber")
|
(define-layer! -1 (cons 'filename "/home/blaulicht/stephan/eda/turbo/gerber")
|
||||||
(cons 'color #(65535 65535 65535 0))
|
(cons 'color #(65535 65535 65535))
|
||||||
)
|
)
|
||||||
(set-render-type! 3)
|
(set-render-type! 3)
|
||||||
|
|
|
||||||
BIN
gerber/turbo.png
BIN
gerber/turbo.png
Binary file not shown.
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
|
@ -1,6 +1,6 @@
|
||||||
# PcbBOM Version 1.0
|
# PcbBOM Version 1.0
|
||||||
# Date: So 18 Feb 2024 12:56:25 GMT UTC
|
# Date: Mo 19 Feb 2024 12:52:50 GMT UTC
|
||||||
# Author:
|
# Author: Stephan Boettcher
|
||||||
# Title: TURBO - PCB BOM
|
# Title: TURBO - PCB BOM
|
||||||
# Quantity, Description, Value, RefDes
|
# Quantity, Description, Value, RefDes
|
||||||
# --------------------------------------------
|
# --------------------------------------------
|
||||||
|
|
|
||||||
129
src/Makefile
Normal file
129
src/Makefile
Normal file
|
|
@ -0,0 +1,129 @@
|
||||||
|
|
||||||
|
PROJ=bate
|
||||||
|
|
||||||
|
default: all
|
||||||
|
all: $(PROJ).hex
|
||||||
|
|
||||||
|
SN_bate = 1
|
||||||
|
MCU_bate = attiny424
|
||||||
|
|
||||||
|
BATE_PERIOD=152
|
||||||
|
bate_CFLAGS = -DPERIOD=$(BATE_PERIOD)
|
||||||
|
SN_bate_wdt = $(SN_bate)
|
||||||
|
MCU_bate_wdt = $(MCU_bate)
|
||||||
|
bate_wdt_CFLAGS = $(bate_CFLAGS)
|
||||||
|
|
||||||
|
MCU = $(MCU_$(PROJ))
|
||||||
|
|
||||||
|
CC=avr-gcc -v -Wall -Wno-parentheses -MMD -std=c99 -O3 \
|
||||||
|
-mmcu=$(MCU) \
|
||||||
|
-funsigned-char \
|
||||||
|
-funsigned-bitfields \
|
||||||
|
-fpack-struct \
|
||||||
|
-fshort-enums \
|
||||||
|
-mtiny-stack \
|
||||||
|
-mint8 \
|
||||||
|
-fverbose-asm
|
||||||
|
|
||||||
|
SN = $(SN_$(PROJ))
|
||||||
|
CFLAGS = $($*_CFLAGS) $(DEBUG) -I. -DSN="$(SN)"
|
||||||
|
|
||||||
|
C_FILES = $(C_FILES_$(PROJ))
|
||||||
|
OBJS = $(patsubst %.c, %.o, $(C_FILES))
|
||||||
|
|
||||||
|
%.s: %.c
|
||||||
|
$(CC) $(CFLAGS) -S $<
|
||||||
|
|
||||||
|
%.o: %.c
|
||||||
|
$(CC) -g $(CFLAGS) -c $<
|
||||||
|
|
||||||
|
-include *.d
|
||||||
|
|
||||||
|
LDFLAGS =
|
||||||
|
|
||||||
|
%.elf: %.o $(OBJS)
|
||||||
|
$(CC) $(CFLAGS) -Wl,-Map=$*.map,--cref $^ --output $@ $(LDFLAGS)
|
||||||
|
|
||||||
|
OBJCOPY = avr-objcopy
|
||||||
|
|
||||||
|
%.hex: %.elf
|
||||||
|
$(OBJCOPY) -O ihex -R .eeprom $< $@
|
||||||
|
|
||||||
|
|
||||||
|
pMCU-attiny414 = t414
|
||||||
|
pMCU-attiny424 = t424
|
||||||
|
|
||||||
|
#
|
||||||
|
#avrdude> dump fuses
|
||||||
|
#>>> dump fuses 0x0 0x9
|
||||||
|
#
|
||||||
|
#Reading | ################################################## | 100% 0.13 s
|
||||||
|
#
|
||||||
|
#0000 00 00 7e ff ff f6 ff 00 00 |..~...... |
|
||||||
|
#
|
||||||
|
#avrdude>
|
||||||
|
|
||||||
|
# WDT
|
||||||
|
fuse0_bate= 0x00
|
||||||
|
|
||||||
|
# BOD
|
||||||
|
fuse1_bate= 0x00
|
||||||
|
|
||||||
|
# OSC, 20 MHz
|
||||||
|
fuse2_bate= 0x7e
|
||||||
|
|
||||||
|
# ???
|
||||||
|
fuse4_bate= 0xff
|
||||||
|
|
||||||
|
# SYS0 (default 0xf6) RESET, EEPROM erase
|
||||||
|
fuse5_bate= 0xf7
|
||||||
|
|
||||||
|
# SYS1 startup time (64ms)
|
||||||
|
fuse6_bate= 0xff
|
||||||
|
|
||||||
|
# APPEND
|
||||||
|
fuse7_bate= 0x00
|
||||||
|
|
||||||
|
# BOOTEND
|
||||||
|
fuse8_bate= 0x00
|
||||||
|
|
||||||
|
fuses_bate =$(patsubst %, 0x%, 00 00 7e ff ff f7 ff 00 00)
|
||||||
|
|
||||||
|
AVRDUDEPROG = avrdude
|
||||||
|
AVRDUDE = $(AVRDUDEPROG)
|
||||||
|
AVRDUDE_PROGRAMMER = serialupdi
|
||||||
|
AVRDUDE_PORT = /dev/ttyUSB1
|
||||||
|
|
||||||
|
AD = $(AVRDUDE) -p $(pMCU-$(MCU)) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
|
||||||
|
|
||||||
|
id: $(PROJ).id
|
||||||
|
%.id:
|
||||||
|
$(AD) -B 5 -U fuses:v:"$(fuses_$*)":m
|
||||||
|
|
||||||
|
ad: $(PROJ).ad
|
||||||
|
%.ad:
|
||||||
|
$(AD) -v -t
|
||||||
|
|
||||||
|
%.burn: %.hex
|
||||||
|
$(AD) -U flash:w:$<
|
||||||
|
|
||||||
|
fuse: $(PROJ).fuse$F
|
||||||
|
|
||||||
|
%.fuse$F:
|
||||||
|
echo "$*: fuse$F = $(fuse$F_$*)"
|
||||||
|
[ -n "$(fuse$F_$*)" ] && $(AD) -B 5 -U fuse$F:w:$(fuse$F_$*):m
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.hex *.o *.s *.map *.elf *.d
|
||||||
|
|
||||||
|
.PHONY: eeprom.eeprom
|
||||||
|
eeprom.eeprom:
|
||||||
|
$(AVRDUDE) -p $(pMCU-$(MCU)) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \
|
||||||
|
-U eeprom:r:$@:r
|
||||||
|
|
||||||
|
%.eeprom.burn: %.eeprom
|
||||||
|
$(AVRDUDE) -p $(pMCU-$(MCU)) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \
|
||||||
|
-U 'eeprom:v:$<:r' \
|
||||||
|
|| $(AVRDUDE) -p $(pMCU-$(MCU)) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \
|
||||||
|
-U 'eeprom:w:$<:r'
|
||||||
|
|
||||||
15
src/README.md
Normal file
15
src/README.md
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
## Turbo Weather
|
||||||
|
|
||||||
|
The ATtiny424 µC requires an up to date toolchain
|
||||||
|
- binutits: `./configure --target=avr --program-prefix=avr-`
|
||||||
|
- gcc: `../gcc/configure --program-prefix=avr- --with-avrlibc --target=avr --enable-languages=c --disable-nls`
|
||||||
|
- avr-libc: `./configure --host=avr`
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- Use the SPI hardware to talk to the sensor.
|
||||||
|
- Send results via UART hardware.
|
||||||
|
- Setup the watchdog.
|
||||||
|
- Control power to the RF transmitter
|
||||||
|
- Light the LED.
|
||||||
|
- Readout the ADCs, thermistors.
|
||||||
|
- Readout the internal temperature sensor.
|
||||||
338
src/bate.c
Normal file
338
src/bate.c
Normal file
|
|
@ -0,0 +1,338 @@
|
||||||
|
//
|
||||||
|
// bate.c
|
||||||
|
//
|
||||||
|
|
||||||
|
// !!! int = int8_t
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/sleep.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
|
#define Bit(x) (1<<(x))
|
||||||
|
|
||||||
|
#define BATE_PORT PORTA
|
||||||
|
#define SCK_PORT 3
|
||||||
|
#define DOUT_PORT 2
|
||||||
|
#define DIN_PORT 1
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Timer1 generates a 32768 Hz clock on OC0A, PB0, MCLK_PORT, RES_PORT
|
||||||
|
|
||||||
|
|
||||||
|
// The nominal f_{clkio} is 9.6 MHz,
|
||||||
|
// f_{MCLK} needs to be 32768 Hz
|
||||||
|
// f_{tick} needs to be 2×f_{MCLK}
|
||||||
|
// Timer 1 TOP needs to be f_{clkio}/65536
|
||||||
|
|
||||||
|
#ifndef PERIOD
|
||||||
|
# define PERIOD 153
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Save the calibrated period in EEPROM
|
||||||
|
|
||||||
|
#define MCLK TCA0.SINGLE
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void init_timer(uint8_t p)
|
||||||
|
{
|
||||||
|
if (p < 120 || p > 200)
|
||||||
|
p = PERIOD;
|
||||||
|
PORTB.DIRSET = Bit(0);
|
||||||
|
MCLK.INTCTRL = TCA_SINGLE_CMP0_bm;
|
||||||
|
MCLK.CMP0 = p;
|
||||||
|
MCLK.CTRLA = TCA_SINGLE_CLKSEL_DIV2_gc;
|
||||||
|
MCLK.CTRLB = TCA_SINGLE_CMP0EN_bm | TCA_SINGLE_WGMODE_FRQ_gc;
|
||||||
|
}
|
||||||
|
|
||||||
|
volatile uint8_t tick;
|
||||||
|
|
||||||
|
ISR(TCA0_CMP0_vect, ISR_NAKED)
|
||||||
|
{
|
||||||
|
__asm__ ("push r24" "\n\t"
|
||||||
|
"ldi r24,1" "\n\t"
|
||||||
|
"sts %[tick], r24" "\n\t"
|
||||||
|
"pop r24" "\n\t"
|
||||||
|
"reti" "\n"
|
||||||
|
:[tick] "+m" (tick)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Read data from an MS5534C pressure sensor
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint8_t b[16];
|
||||||
|
uint16_t w[8];
|
||||||
|
struct {
|
||||||
|
uint16_t H[2];
|
||||||
|
uint16_t W[4];
|
||||||
|
uint16_t D[2];
|
||||||
|
};
|
||||||
|
struct {
|
||||||
|
uint16_t H1;
|
||||||
|
uint16_t H2;
|
||||||
|
uint16_t W1;
|
||||||
|
uint16_t W2;
|
||||||
|
uint16_t W3;
|
||||||
|
uint16_t W4;
|
||||||
|
uint16_t D1;
|
||||||
|
uint16_t D2;
|
||||||
|
};
|
||||||
|
} bate;
|
||||||
|
|
||||||
|
__attribute__ ((noinline, noclone))
|
||||||
|
static
|
||||||
|
uint8_t bate_bit(uint8_t r, uint8_t c, uint8_t ii)
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
__asm__(
|
||||||
|
/*
|
||||||
|
; bate.c:136: if (c&ii)
|
||||||
|
and r22,r20 ; _1, ii
|
||||||
|
; bate.c:137: BATE_PORT.OUTSET = Bit(DIN_PORT);
|
||||||
|
ldi r25,lo8(2) ; tmp53,
|
||||||
|
; bate.c:136: if (c&ii)
|
||||||
|
cp r22, __zero_reg__ ; _1
|
||||||
|
breq .L2 ; ,
|
||||||
|
; bate.c:137: BATE_PORT.OUTSET = Bit(DIN_PORT);
|
||||||
|
sts 1029,r25 ; MEM[(struct PORT_t *)1024B].OUTSET, tmp53
|
||||||
|
; bate.c:140: if (BATE_PORT.IN & Bit(DOUT_PORT))
|
||||||
|
lds r25,1032 ; _2, MEM[(struct PORT_t *)1024B].IN
|
||||||
|
; bate.c:140: if (BATE_PORT.IN & Bit(DOUT_PORT))
|
||||||
|
sbrs r25,2 ; _2,
|
||||||
|
rjmp .L4 ;
|
||||||
|
.L7:
|
||||||
|
; bate.c:141: r |= ii;
|
||||||
|
or r24,r20 ; <retval>, ii
|
||||||
|
; bate.c:144: BATE_PORT.OUTSET = Bit(SCK_PORT);
|
||||||
|
ldi r25,lo8(8) ; tmp60,
|
||||||
|
sts 1029,r25 ; MEM[(struct PORT_t *)1024B].OUTSET, tmp60
|
||||||
|
; bate.c:145: BATE_PORT.OUTCLR = Bit(SCK_PORT);
|
||||||
|
sts 1030,r25 ; MEM[(struct PORT_t *)1024B].OUTCLR, tmp60
|
||||||
|
; bate.c:149: }
|
||||||
|
ret
|
||||||
|
.L2:
|
||||||
|
; bate.c:139: BATE_PORT.OUTCLR = Bit(DIN_PORT);
|
||||||
|
sts 1030,r25 ; MEM[(struct PORT_t *)1024B].OUTCLR, tmp55
|
||||||
|
; bate.c:140: if (BATE_PORT.IN & Bit(DOUT_PORT))
|
||||||
|
lds r25,1032 ; _2, MEM[(struct PORT_t *)1024B].IN
|
||||||
|
; bate.c:140: if (BATE_PORT.IN & Bit(DOUT_PORT))
|
||||||
|
sbrc r25,2 ; _2,
|
||||||
|
rjmp .L7 ;
|
||||||
|
.L4:
|
||||||
|
; bate.c:143: r &=~ ii;
|
||||||
|
com r20 ; _4
|
||||||
|
; bate.c:143: r &=~ ii;
|
||||||
|
and r24,r20 ; <retval>, _4
|
||||||
|
; bate.c:144: BATE_PORT.OUTSET = Bit(SCK_PORT);
|
||||||
|
ldi r25,lo8(8) ; tmp60,
|
||||||
|
sts 1029,r25 ; MEM[(struct PORT_t *)1024B].OUTSET, tmp60
|
||||||
|
; bate.c:145: BATE_PORT.OUTCLR = Bit(SCK_PORT);
|
||||||
|
sts 1030,r25 ; MEM[(struct PORT_t *)1024B].OUTCLR, tmp60
|
||||||
|
; bate.c:149: }
|
||||||
|
ret
|
||||||
|
*/
|
||||||
|
"ldi r25, %[DI]" "\n\t"
|
||||||
|
"and %[c], %[ii]" "\n\t"
|
||||||
|
"brne .+6" "\n\t"
|
||||||
|
"sts %[PC], r25" "\n\t"
|
||||||
|
"breq .+6" "\n\t"
|
||||||
|
"sts %[PS], r25" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"lds r25, %[PI]" "\n\t"
|
||||||
|
"sbrc r25, %[DO]" "\n\t"
|
||||||
|
"or %[r], %[ii]" "\n\t"
|
||||||
|
"com %[ii]" "\n\t"
|
||||||
|
"sbrs r25, %[DO]" "\n\t"
|
||||||
|
"and %[r], %[ii]" "\n\t"
|
||||||
|
"ldi r25, %[SK]" "\n\t"
|
||||||
|
|
||||||
|
"sts %[PS], r25" "\n\t"
|
||||||
|
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
"nop" "\n\t"
|
||||||
|
|
||||||
|
"sts %[PC], r25" "\n"
|
||||||
|
|
||||||
|
:[r] "+r" (r),
|
||||||
|
[c] "+r" (c)
|
||||||
|
:[ii] "r" (ii),
|
||||||
|
[PS] "n" (&BATE_PORT.OUTSET),
|
||||||
|
[PC] "n" (&BATE_PORT.OUTCLR),
|
||||||
|
[PI] "n" (&BATE_PORT.IN),
|
||||||
|
[DI] "n" (Bit(DIN_PORT)),
|
||||||
|
[DO] "n" (DOUT_PORT),
|
||||||
|
[SK] "n" (Bit(SCK_PORT))
|
||||||
|
: "r25", "memory"
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
if (c&ii)
|
||||||
|
BATE_PORT.OUTSET = Bit(DIN_PORT);
|
||||||
|
else
|
||||||
|
BATE_PORT.OUTCLR = Bit(DIN_PORT);
|
||||||
|
if (BATE_PORT.IN & Bit(DOUT_PORT))
|
||||||
|
r |= ii;
|
||||||
|
else
|
||||||
|
r &=~ ii;
|
||||||
|
BATE_PORT.OUTSET = Bit(SCK_PORT);
|
||||||
|
BATE_PORT.OUTCLR = Bit(SCK_PORT);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__ ((noinline, noclone))
|
||||||
|
static
|
||||||
|
uint16_t bate_frame(uint16_t d, uint8_t n)
|
||||||
|
{
|
||||||
|
n--;
|
||||||
|
uint8_t c0 = d;
|
||||||
|
uint8_t c1 = d >> 8;
|
||||||
|
uint8_t r0;
|
||||||
|
uint8_t r1;
|
||||||
|
// Force r0 and r1 to be cleared before the switch. Else, the
|
||||||
|
// compiler generates extra jumps to clear r0 for each target.
|
||||||
|
__asm__("clr %[r0]" "\n\t"
|
||||||
|
"clr %[r1]" "\n"
|
||||||
|
:[r0] "=r" (r0),
|
||||||
|
[r1] "=r" (r1)
|
||||||
|
);
|
||||||
|
switch (n) {
|
||||||
|
case 15: r1 = bate_bit(r1, c1, 1<<7);
|
||||||
|
case 14: r1 = bate_bit(r1, c1, 1<<6);
|
||||||
|
case 13: r1 = bate_bit(r1, c1, 1<<5);
|
||||||
|
case 12: r1 = bate_bit(r1, c1, 1<<4);
|
||||||
|
case 11: r1 = bate_bit(r1, c1, 1<<3);
|
||||||
|
case 10: r1 = bate_bit(r1, c1, 1<<2);
|
||||||
|
case 9: r1 = bate_bit(r1, c1, 1<<1);
|
||||||
|
case 8: r1 = bate_bit(r1, c1, 1<<0);
|
||||||
|
case 7: r0 = bate_bit(r0, c0, 1<<7);
|
||||||
|
case 6: r0 = bate_bit(r0, c0, 1<<6);
|
||||||
|
case 5: r0 = bate_bit(r0, c0, 1<<5);
|
||||||
|
case 4: r0 = bate_bit(r0, c0, 1<<4);
|
||||||
|
case 3: r0 = bate_bit(r0, c0, 1<<3);
|
||||||
|
case 2: r0 = bate_bit(r0, c0, 1<<2);
|
||||||
|
case 1: r0 = bate_bit(r0, c0, 1<<1);
|
||||||
|
case 0: r0 = bate_bit(r0, c0, 1<<0);
|
||||||
|
}
|
||||||
|
return (uint16_t)r1<<8 | r0;
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__ ((noinline, noclone))
|
||||||
|
static
|
||||||
|
void bate_wait()
|
||||||
|
{
|
||||||
|
uint16_t timeout = 3277; // 50ms
|
||||||
|
sei();
|
||||||
|
while (BATE_PORT.IN & Bit(DOUT_PORT)) {
|
||||||
|
if (tick) {
|
||||||
|
tick = 0;
|
||||||
|
if (!timeout)
|
||||||
|
break;
|
||||||
|
// wdt_reset();
|
||||||
|
timeout--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cli();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void read_bate()
|
||||||
|
{
|
||||||
|
cli();
|
||||||
|
bate.H1 = 0x0001;
|
||||||
|
bate_frame(0xaaaa, 16);
|
||||||
|
bate_frame(0, 5);
|
||||||
|
bate_frame(0x3aa0, 14);
|
||||||
|
bate.W1 = bate_frame(0, 16);
|
||||||
|
bate_frame(0x3ac0, 14);
|
||||||
|
bate.W2 = bate_frame(0, 16);
|
||||||
|
bate_frame(0x3b20, 14);
|
||||||
|
bate.W3 = bate_frame(0, 16);
|
||||||
|
bate_frame(0x3b40, 14);
|
||||||
|
bate.W4 = bate_frame(0, 16);
|
||||||
|
bate_frame(0x0f40, 12);
|
||||||
|
bate.H1 = 0x0002;
|
||||||
|
bate_wait();
|
||||||
|
bate_frame(0,1);
|
||||||
|
bate.D1 = bate_frame(0, 16);
|
||||||
|
bate_frame(0x0f20, 12);
|
||||||
|
bate.H1 = 0x0003;
|
||||||
|
bate_wait();
|
||||||
|
bate_frame(0,1);
|
||||||
|
bate.D2 = bate_frame(0, 16);
|
||||||
|
bate.H1 = 0xba7e;
|
||||||
|
# ifndef WDT_TRIGGERED
|
||||||
|
bate.H2 += 1;
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
BATE_PORT.DIRSET = Bit(SCK_PORT) | Bit(DIN_PORT);
|
||||||
|
init_timer(0);
|
||||||
|
|
||||||
|
// send some MCLKs before we start
|
||||||
|
uint8_t mclk_delay = 0xff;
|
||||||
|
|
||||||
|
set_sleep_mode(SLEEP_MODE_IDLE);
|
||||||
|
while (1) {
|
||||||
|
sleep_enable();
|
||||||
|
sei();
|
||||||
|
sleep_cpu();
|
||||||
|
if (!tick)
|
||||||
|
continue;
|
||||||
|
tick = 0;
|
||||||
|
wdt_reset();
|
||||||
|
// uart();
|
||||||
|
// if (uart_busy())
|
||||||
|
// continue;
|
||||||
|
if (mclk_delay) {
|
||||||
|
mclk_delay--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// if (!trigger) {
|
||||||
|
//# ifndef WDT_TRIGGERED
|
||||||
|
// // wait for PCINT on PORT_OUT
|
||||||
|
// continue;
|
||||||
|
//# else
|
||||||
|
// // power down, wait for the WDT
|
||||||
|
// MCUCR = Bit(SE) | SLEEP_MODE_PWR_DOWN;
|
||||||
|
// cli();
|
||||||
|
// sleep_cpu();
|
||||||
|
//# endif
|
||||||
|
// }
|
||||||
|
// trigger = 0;
|
||||||
|
// do a conversion and submit the result to uart()
|
||||||
|
read_bate();
|
||||||
|
mclk_delay = 0xff;
|
||||||
|
// send_bate();
|
||||||
|
}
|
||||||
|
}
|
||||||
2
src/bate_wdt.c
Normal file
2
src/bate_wdt.c
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
#define WDT_TRIGGERED 1
|
||||||
|
#include "bate.c"
|
||||||
36
src/eeprom.h
Normal file
36
src/eeprom.h
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/eeprom.h>
|
||||||
|
|
||||||
|
// Entirely unsafe EEPROM access. Just wait 5ms between calls
|
||||||
|
// int = byte
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void unsafe_eeprom_write_byte(uint8_t *addr, uint8_t data)
|
||||||
|
{
|
||||||
|
EEARL = (uint8_t)(uint16_t)addr;
|
||||||
|
EEDR = data;
|
||||||
|
EECR |= (1<<EEMPE);
|
||||||
|
EECR |= (1<<EEPE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
uint8_t unsafe_eeprom_read_byte(uint8_t *addr)
|
||||||
|
{
|
||||||
|
EEARL = (uint8_t)(uint16_t)addr;
|
||||||
|
EECR |= (1<<EERE);
|
||||||
|
return EEDR;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void unsafe_eeprom_read_block(void *dest, void *src, uint8_t size)
|
||||||
|
{
|
||||||
|
uint8_t *d = dest;
|
||||||
|
uint8_t a = (uint8_t)(uint16_t)src;
|
||||||
|
while (size--) {
|
||||||
|
EEARL = a++;
|
||||||
|
EECR |= (1<<EERE);
|
||||||
|
*(d++) = EEDR;
|
||||||
|
}
|
||||||
|
}
|
||||||
34
turbo.pcb
34
turbo.pcb
|
|
@ -1,4 +1,4 @@
|
||||||
# release: pcb v4.2.2-g125c85f1
|
# release: pcb 4.3.0
|
||||||
|
|
||||||
# To read pcb files, the pcb version (or the git source date) must be >= the file version
|
# To read pcb files, the pcb version (or the git source date) must be >= the file version
|
||||||
FileVersion[20180318]
|
FileVersion[20180318]
|
||||||
|
|
@ -792,7 +792,7 @@ Symbol['~' 12.00mil]
|
||||||
SymbolLine[15.00mil 35.00mil 20.00mil 35.00mil 8.00mil]
|
SymbolLine[15.00mil 35.00mil 20.00mil 35.00mil 8.00mil]
|
||||||
SymbolLine[20.00mil 35.00mil 25.00mil 30.00mil 8.00mil]
|
SymbolLine[20.00mil 35.00mil 25.00mil 30.00mil 8.00mil]
|
||||||
)
|
)
|
||||||
Attribute("PCB::grid::unit" "mm")
|
Attribute("PCB::grid::unit" "mil")
|
||||||
Attribute("PCB::grid::size" "0.1000mm")
|
Attribute("PCB::grid::size" "0.1000mm")
|
||||||
Via[19.4000mm 27.0000mm 0.9000mm 0.4000mm 0.6000mm 0.4000mm "" "thermal(2X,3X)"]
|
Via[19.4000mm 27.0000mm 0.9000mm 0.4000mm 0.6000mm 0.4000mm "" "thermal(2X,3X)"]
|
||||||
Via[25.8000mm 44.1000mm 0.9000mm 0.4000mm 0.6000mm 0.4000mm "" ""]
|
Via[25.8000mm 44.1000mm 0.9000mm 0.4000mm 0.6000mm 0.4000mm "" ""]
|
||||||
|
|
@ -887,21 +887,21 @@ Element["" "SIL_100_4" "U3" "WRL-10534" 7.7500mm 16.0000mm 3.2500mm -0.3000mm 0
|
||||||
|
|
||||||
Element["" "MS5534C" "U2" "MS5534C" 13.0000mm 43.7000mm -1.0000mm -1.0000mm 0 100 ""]
|
Element["" "MS5534C" "U2" "MS5534C" 13.0000mm 43.7000mm -1.0000mm -1.0000mm 0 100 ""]
|
||||||
(
|
(
|
||||||
Pad[3.6000mm 1.9100mm 5.4000mm 1.9100mm 1.0000mm 20.00mil 1.5080mm "SCLK" "2" "square,edge2"]
|
Pad[3.6000mm 1.9100mm 5.4000mm 1.9100mm 1.0000mm 20.00mil 46.00mil "SCLK" "2" "square,edge2"]
|
||||||
Pad[3.6000mm 3.1800mm 5.4000mm 3.1800mm 1.0000mm 20.00mil 1.5080mm "GND" "1" "square,edge2"]
|
Pad[3.6000mm 3.1800mm 5.4000mm 3.1800mm 1.0000mm 20.00mil 46.00mil "GND" "1" "square,edge2"]
|
||||||
Pad[3.6000mm 0.6400mm 5.4000mm 0.6400mm 1.0000mm 20.00mil 1.5080mm "DOUT" "3" "square,edge2"]
|
Pad[3.6000mm 0.6400mm 5.4000mm 0.6400mm 1.0000mm 20.00mil 46.00mil "DOUT" "3" "square,edge2"]
|
||||||
Pad[3.6000mm -1.9100mm 5.4000mm -1.9100mm 1.0000mm 20.00mil 1.5080mm "MCLK" "5" "square,edge2"]
|
Pad[3.6000mm -1.9100mm 5.4000mm -1.9100mm 1.0000mm 20.00mil 46.00mil "MCLK" "5" "square,edge2"]
|
||||||
Pad[3.6000mm -3.1800mm 5.4000mm -3.1800mm 1.0000mm 20.00mil 1.5080mm "VDD" "6" "square,edge2"]
|
Pad[3.6000mm -3.1800mm 5.4000mm -3.1800mm 1.0000mm 20.00mil 46.00mil "VDD" "6" "square,edge2"]
|
||||||
Pad[3.6000mm -0.6400mm 5.4000mm -0.6400mm 1.0000mm 20.00mil 1.5080mm "DIN" "4" "square,edge2"]
|
Pad[3.6000mm -0.6400mm 5.4000mm -0.6400mm 1.0000mm 20.00mil 46.00mil "DIN" "4" "square,edge2"]
|
||||||
Pad[-1.9000mm -4.5000mm -1.9000mm -4.2000mm 1.0000mm 20.00mil 1.5080mm "7" "7" "square"]
|
Pad[-1.9000mm -4.5000mm -1.9000mm -4.2000mm 1.0000mm 20.00mil 46.00mil "7" "7" "square"]
|
||||||
Pad[-5.1000mm 1.9100mm -4.6000mm 1.9100mm 1.0000mm 20.00mil 1.5080mm "13" "13" "square"]
|
Pad[-5.1000mm 1.9100mm -4.6000mm 1.9100mm 1.0000mm 20.00mil 46.00mil "13" "13" "square"]
|
||||||
Pad[-5.1000mm 3.1800mm -4.8000mm 3.1800mm 1.0000mm 20.00mil 1.5080mm "14" "14" "square"]
|
Pad[-5.1000mm 3.1800mm -4.8000mm 3.1800mm 1.0000mm 20.00mil 46.00mil "14" "14" "square"]
|
||||||
Pad[-5.1000mm 0.6400mm -4.6000mm 0.6400mm 1.0000mm 20.00mil 1.5080mm "12" "12" "square"]
|
Pad[-5.1000mm 0.6400mm -4.6000mm 0.6400mm 1.0000mm 20.00mil 46.00mil "12" "12" "square"]
|
||||||
Pad[-5.1000mm -1.9100mm -4.6000mm -1.9100mm 1.0000mm 20.00mil 1.5080mm "10" "10" "square"]
|
Pad[-5.1000mm -1.9100mm -4.6000mm -1.9100mm 1.0000mm 20.00mil 46.00mil "10" "10" "square"]
|
||||||
Pad[-5.1000mm -3.1800mm -4.6000mm -3.1800mm 1.0000mm 20.00mil 1.5080mm "9" "9" "square"]
|
Pad[-5.1000mm -3.1800mm -4.6000mm -3.1800mm 1.0000mm 20.00mil 46.00mil "9" "9" "square"]
|
||||||
Pad[-5.1000mm -0.6400mm -4.6000mm -0.6400mm 1.0000mm 20.00mil 1.5080mm "11" "11" "square"]
|
Pad[-5.1000mm -0.6400mm -4.6000mm -0.6400mm 1.0000mm 20.00mil 46.00mil "11" "11" "square"]
|
||||||
Pad[-3.5000mm 4.2000mm -3.5000mm 4.5000mm 1.0000mm 20.00mil 1.5080mm "8" "8" "square,edge2"]
|
Pad[-3.5000mm 4.2000mm -3.5000mm 4.5000mm 1.0000mm 20.00mil 46.00mil "8" "8" "square,edge2"]
|
||||||
Pad[-3.6500mm 3.0500mm -3.6500mm 4.6500mm 27.56mil 20.00mil 1.2080mm "8" "8" "square,edge2"]
|
Pad[-3.6500mm 3.0500mm -3.6500mm 4.6500mm 27.56mil 20.00mil 46.00mil "8" "8" "square,edge2"]
|
||||||
ElementLine [-4.0000mm -4.5000mm 4.0000mm -4.5000mm 0.2000mm]
|
ElementLine [-4.0000mm -4.5000mm 4.0000mm -4.5000mm 0.2000mm]
|
||||||
ElementLine [-4.5000mm -4.0000mm -4.5000mm 4.0000mm 0.2000mm]
|
ElementLine [-4.5000mm -4.0000mm -4.5000mm 4.0000mm 0.2000mm]
|
||||||
ElementLine [-4.0000mm 4.5000mm 4.0000mm 4.5000mm 0.2000mm]
|
ElementLine [-4.0000mm 4.5000mm 4.0000mm 4.5000mm 0.2000mm]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue