Zobrazují se příspěvky se štítkemElektronika. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemElektronika. Zobrazit všechny příspěvky

středa 11. dubna 2018

USB Blaster + OpenOCD a STM32





root@Jenda:/usr/local/share/openocd# openocd -f interface/altera-usb-blaster.cfg  \
> -c "transport select jtag"  \
> -f target/stm32f3x.cfg
Open On-Chip Debugger 0.10.0+dev-00362-g78a44055 (2018-03-27-17:48)
Licensed under GNU GPL v2
For bug reports, read
 http://openocd.org/doc/doxygen/bugs.html
Warn : Adapter driver 'usb_blaster' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
Warn : Transport "jtag" was already selected
jtag
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
none separate
cortex_m reset_config sysresetreq
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : usb blaster interface using libftdi
Info : This adapter doesn't support configurable speed
Info : JTAG tap: stm32f3x.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: stm32f3x.bs tap/device found: 0x06422041 (mfg: 0x020 (STMicroelectronics), part: 0x6422, ver: 0x0)
Info : stm32f3x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections
Info : accepting 'telnet' connection on tcp/4444
Error: Translation from khz to jtag_speed not implemented
in procedure 'reset' 
in procedure 'ocd_bouncer' 
in procedure 'ocd_process_reset' 
in procedure 'ocd_process_reset_inner' called at file "embedded:startup.tcl", line 248
in procedure 'stm32f3x.cpu' called at file "embedded:startup.tcl", line 286
in procedure 'ocd_bouncer'

Info : JTAG tap: stm32f3x.cpu tap/device found: 0x4ba00477 (mfg: 0x23b (ARM Ltd.), part: 0xba00, ver: 0x4)
Info : JTAG tap: stm32f3x.bs tap/device found: 0x06422041 (mfg: 0x020 (STMicroelectronics), part: 0x6422, ver: 0x0)
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x0800045c msp: 0x20000408
===== arm v7m registers
(0) r0 (/32): 0x00000000
(1) r1 (/32): 0x00000000
(2) r2 (/32): 0x00000000
(3) r3 (/32): 0x00000000
(4) r4 (/32): 0x00000000
(5) r5 (/32): 0x00000000
(6) r6 (/32): 0x00000000
(7) r7 (/32): 0x00000000
(8) r8 (/32): 0x00000000
(9) r9 (/32): 0x00000000
(10) r10 (/32): 0x00000000
(11) r11 (/32): 0x00000000
(12) r12 (/32): 0x00000000
(13) sp (/32): 0x20000408
(14) lr (/32): 0xFFFFFFFF
(15) pc (/32): 0x0800045C
(16) xPSR (/32): 0x01000000
(17) msp (/32): 0x20000408
(18) psp (/32): 0x00000000
(19) primask (/1): 0x00
(20) basepri (/8): 0x00
(21) faultmask (/1): 0x00
(22) control (/2): 0x00
(23) d0 (/64): 0x0000000000000000
(24) d1 (/64): 0x0000000000000000
(25) d2 (/64): 0x0000000000000000
(26) d3 (/64): 0x0000000000000000
(27) d4 (/64): 0x0000000000000000
(28) d5 (/64): 0x0000000000000000
(29) d6 (/64): 0x0000000000000000
(30) d7 (/64): 0x0000000000000000
(31) d8 (/64): 0x0000000000000000
(32) d9 (/64): 0x0000000000000000
(33) d10 (/64): 0x0000000000000000
(34) d11 (/64): 0x0000000000000000
(35) d12 (/64): 0x0000000000000000
(36) d13 (/64): 0x0000000000000000
(37) d14 (/64): 0x0000000000000000
(38) d15 (/64): 0x0000000000000000
(39) fpscr (/32): 0x00000000
===== Cortex-M DWT registers
(40) dwt_ctrl (/32)
(41) dwt_cyccnt (/32)
(42) dwt_0_comp (/32)
(43) dwt_0_mask (/4)
(44) dwt_0_function (/32)
(45) dwt_1_comp (/32)
(46) dwt_1_mask (/4)
(47) dwt_1_function (/32)
(48) dwt_2_comp (/32)
(49) dwt_2_mask (/4)
(50) dwt_2_function (/32)
(51) dwt_3_comp (/32)
(52) dwt_3_mask (/4)
(53) dwt_3_function (/32)
https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ug/ug_usb_blstr.pdf

pátek 19. února 2016

Vlhkoměr ST HTS221

Nejprve si zavedeme potřebné moduly (1-wire je pro porovnání teploty).

insmod w1-gpio-custom bus0=0,14,0

insmod i2c-gpio-custom bus0=0,16,17

Dále vyhledáme dostupné senzory na I2C sběrnici, HTS221 má adresu 0x5f. Následuje vyčtení registru WHO_I_AM a konfigurace senzoru (přechod ze sleep režimu a zapnutí periodického vzorkování, případně změna vzorků pro výpočet jedné hodnoty).

root@AR150:~# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- 5d -- 5f
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- --
70: -- -- -- -- -- -- -- --

root@AR150:~# i2cget -y 0 0x5f 0x0f
0xbc
root@AR150:~# i2cget -y 0 0x5f 0x10
0x3f
root@AR150:~# i2cget -y 0 0x5f 0x28
0x7d
root@AR150:~# i2cget -y 0 0x5f 0x29
0xf4
root@AR150:~# i2cget -y 0 0x5f 0x2a
0xed
root@AR150:~# i2cget -y 0 0x5f 0x2b
0x00
root@AR150:~# i2cset -y 0 0 0x5f 0x21 0x00 # disable heater
root@AR150:~# i2cget -y 0 0x5f 0x20 # Read Control Register 1
0x00
root@AR150:~# i2cget -y 0 0x5f 0x20
0x00
root@AR150:~# i2cset -y 0 0x5f 0x10 0x81 # use 2 smaple for Temperature and 4 sample for Humidity
root@AR150:~# #i2cset -y 0 0x5f 0x10 0x20 # use 32 smaples for Temperature and 4 sample for Humidity
root@AR150:~# #i2cset -y 0 0x5f 0x10 0x38 # use 256 smaples for Temperature and 4 sample for Humidity
root@AR150:~# i2cset -y 0 0x5f 0x20 0x81 # start 1 Hz measuring
root@AR150:~# #i2cset -y 0 0x5f 0x20 0x81 # start one conversion

Nebo si můžeme pomocí root@AR150:~# i2cdump -y 0 0x5f vyčíst kompletní obsah paměti čidla včetně kalibrace. 


0
1
2
3
4
5
6
7
8
9
a
b
c
d
e
f
0123456789abcdef
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
bc
...............?
10:
3f
00
97
32
98
be
de
a1
9e
b2
fb
00
08
00
80
82
?.?2???????.?.??
20:
81
00
00
00
00
00
00
03
c7
f6
12
01
dd
f7
0a
01
?......?????????
30:
40
90
a1
0d
00
c4
03
00
f6
02
29
d5
ff
ff
ed
02
@???.??.??)?..??
40:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
50:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
60:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
70:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
80:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
bc
...............?
90:
3f
00
97
32
98
be
de
a1
9e
b2
fb
00
08
00
80
82
?.?2???????.?.??
a0:
81
00
00
00
00
00
00
00
c7
f6
12
01
dd
f7
0a
01
?.......????????
b0:
40
90
a1
0d
00
c4
03
00
f6
02
29
d5
ff
ff
ed
02
@???.??.??)?..??
c0:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
d0:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
e0:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................
f0:
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
................

Kalibrace:
40
90
a1
0d
00
c4
03
00
f6
02
29
d5
ff
ff
ed
02

WHO_I_AM         0xbc
bc

HUMIDITY          0xF6C7
c7
f6

TEMP                    0x0112
12
01

Nejprve je třeba udělat výpočet kalibrační křivky, dle hodnot z registrů kalibrace.
Pro teplotu je třeba vzít desetibitové číslo z adresy 0x32 (představuje dolních 8 bitů) a ještě přidat dva bity z adresy 0x35 a vydělíme osmi. V našem případě získáme čísla T0 = 0010100001b => 161/8 = 20,125 °C a T1 = 0100001101b => 269/8 = 33,625 °C. Těmto dvěma bodům odpovídají T0_OUT a T1_OUT, což jsou dvoubajtové znaménkové hodnoty z adres 0x3C, 0x3D (-1) a 0x3E, 0x3F (749). Znaménko v čísle představuje nejvyšší bit (MSB), pokud není nastaven je číslo kladné a stačí vzít zbytek bytů. V opačném případě je číslo záporné a je třeba od maximálního rozsahu čísla (32768) odečíst zbytek bitů a přičíst jedničku a následně celé číslo vynásobit mínus jednou. Rozsah čísla je tedy -32768 až 32767.

Když máme vyčteny souřadnice dvou kalibračních bodů (-1 - 20,125 a 749 - 33,625), tak si můžeme sestrojit kalibrační přímku. Koeficienty rovnice přímky určíte dosazením do dvou rovnic o dvou neznámých (potřebujeme získat neznámé k a q).

f(x) = k*x + q

20,125 = -k + q /*(-1)
33,625 = 749k + q

-20,125 = k - q
33,625 = 749k + q

13,5 = 750k => k = 13,5/750 = 0,018
20,125 = -0,018 + q => q = 20,125 + 0,018 = 20,143



Výpočet teploty z hodnoty provedeme takto:

T = k * x + q = 0,018 * (0x0112) / 8 + 20,143 = 20,7595 °C.

A porovnání s DS1820?


Stejný výpočet provedeme i pro získání vlhkosti:

H0_rH_x2 = 0x40 / 2 = 32 %, H0_T0_OUT = 0x0003 => 3
H1_rH_x2 = 0x90 / 2 = 72 %, H1_T0_OUT = 0xD529 => 54 569

f(x) = k * x + q

32 = k * 3 + q
72 = k * 54 569 + q /*(-1)

32 = 3 * k + q
-72 = -54 569 * k - q

-40 = - 54 566 k

k = 40/54566 = 7,33 * 10-4
q = 31,9978

H = k * x + q = 7,33E-4 * (0xF6C7) / 2 + 31,9978 = 55.15%.

Vlhkoměr má také zabudované vyhřívání pro odstranění kondenzované vlhkosti, stačí ho zapnou a z grafu je patrné, že vlastní substrát čidla se ohrál na téměř 70 °C. Vyzařované teplo dokonce dokázalo ohřát pět milimetrů vzdálený DS1820, viz následující grafy (teplota čidel a vývoj vlhkosti).



#!/bin/sh

i2cset -y 0 0x5f 0x21 0x00 # disable heater
i2cset -y 0 0x5f 0x20 0x81 # start one conversion

Time=`date +"%m.%d.%Y %T"`

T_l=`i2cget -y 0 0x5f 0x2a` # read T_l
T_h=`i2cget -y 0 0x5f 0x2b` # read T_h


H_l=`i2cget -y 0 0x5f 0x28` # read H_l
H_h=`i2cget -y 0 0x5f 0x29` # read H_h

DS18B20=`cat /sys/devices/w1_bus_master1/28-000001f3830f/w1_slave | tail -1`  # read temperature from DS1820

echo -e "$Time\t$T_l\t$T_h\t$H_l\t$H_h\t$DS18B20" # echo to colsole
echo -e "$Time\t$T_l\t$T_h\t$H_l\t$H_h\t$DS18B20" >> /tmp/data.txt # write to file

chmod +x /usr/bin/measure.sh

*/5 * * * * /usr/bin/measure.sh



http://www.st.com/web/en/resource/technical/document/datasheet/DM00116291.pdf