Hi,
I found the c code for smt160-30 temp sensor, but main area is written
to the PIC asm code. I need change the asm-code to regular c code for
lpc2148.
Can somebode who knows something about PIC assemly code and trasnslate
it to the regular c code for lpc2148?
#define PORT PORTB
#define PIN 2 // pin number where is sensor
#define CIDLO PORT,PIN
#define SMT160_INPUT TRISB,PIN
#define MAX 80
/* MAX [0-135]
Tmax = (MAX/2 + 60); ex. MAX=130 => Tmax=130/2 + 60=125 C
Tmin = [(MAX+1)-136]/2 when MAX=130 then Tmin=-2,5C
=> deltaT=127.5C, resolution 0.5C
MAX 0 10 50 80 100 120 130 135
Tmax [C] 60 65 85 100 110 120 125
127.5
Tmin [C] -67.5* -62.5* -42.5 -27.5 -17.5 -7.5 -2 0
* - out of sensor range (-45C - +130C)
*/
char countL ; // counter lower byte
char countH ; // counter higher byte
char stridaL ; // log1 lower counter (if stridaL=256 => 0.5C)
char stridaH ; // log1 higher counter
char TEMP_J; // measured tempearture - tenths [C]
char TEMP_D; // measured tempearture - tens (hundreds) [C]
char minus ; // this is negative values flag, if is 1 we are
under zero
void temperature() // main rutine
{
TEMP_D=0;
TEMP_J=0;
asm
{
MOVLW d'32' ; 2 cycles
MOVWF _countL
MOVLW d'54' ; 2
MOVWF _countH
CLRF _stridaL ; 1
CLRF _stridaH ; 1
BCF STATUS,Z ; 1
repeatA nop ; 1 measuring loop (sampling time) - 13600x
repeatB
BTFSC CIDLO ;1/2
INCF _stridaL,1 ;1
BTFSC STATUS,Z ;1/2
INCF _stridaH,1 ;1
DECFSZ _countL,1 ;3/2
GOTO repeatA
DECFSZ _countH,1 ;3/2
GOTO repeatB
; 3x rotate meassured DC
BCF STATUS,C
RLF _stridaL,1
RLF _stridaH,1
RLF _stridaL,1
RLF _stridaH,1
RLF _stridaL,1
RLF _stridaH,1
; RETURN
}
// and now convert temperature from DC to degrees (linear
dependence)
if (stridaH < MAX) //60C - Tmax
{
minus=0;
TEMP_D=stridaH>>1;
TEMP_J=stridaH;
TEMP_D=TEMP_D+60;
if (TEMP_J % 2) TEMP_J=5; // 0,5 C or 0.0C
else TEMP_J=0;
}
else
{
if(stridaH>135) //(Tmin - 60C)
{
minus=0;
TEMP_D=(stridaH - 136); // ex.TEMP_J=185-136 = 49C
TEMP_J=TEMP_D;
TEMP_D>>=1; // temp_d/2
if (TEMP_J % 2) TEMP_J=5; // 0,5 C
else TEMP_J=0;
}
else // (Tmin - 0C) ex. stridaH=130 =>
t=(136-130)/2=-3C
{
minus=1;
TEMP_D=(136-stridaH);
TEMP_J=TEMP_D;
TEMP_D>>=1;
if (TEMP_J % 2) TEMP_J=5;
else TEMP_J=0;
}
}
}
Thanx Timo
Timo Kuisma wrote: > Hi, > > I found the c code for smt160-30 temp sensor, but main area is written > to the PIC asm code. I need change the asm-code to regular c code for > lpc2148. > Can somebode who knows something about PIC assemly code and trasnslate > it to the regular c code for lpc2148? The SMT160 outputs the temperature in as "PWM"-signal where the duty-cylce depends on the temperature. I don't know PIC assembler but the code looks like it counts high/low but uses "well know" instruction cyle times. For the LPC2000 you could calibrate some kind of "delay-loop" for the sampling but it might be a better idea to use the timer/capture-function of the LPC's timers. Another approach is to simply poll the state of the data-pin in a timer-ISR which has a "predeterminde" frequency and count "low" and "high" states of the pin for a given time-intervall (ISR hits). Martin Thomas
Hi, the asm code samples signal from SMT160-30 for a while and counts number of samles when there is 0 and when there is 1, these two counters make the DC. It's not very acurate but PIC ain't very fast... On ARM You can use some IRQ input and using timer measure the DC more precisly... Have a nice day. Mirek
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.