problema: smartec uti, pt100 o arduino?

ciao a tutti.

ho un problema che è da due giorni che cerco di risolvere ma non he cavato fuori nulla:

ho tre pt100 da cui voglio leggere i loro valori di resistenza. ho comprato questo integrato http://www.smartec.nl/pdf/DSUTI.pdf che sembra proprio fare al caso mio: è progettato appositamente per la lettura di pt100 più altro ancora.

come circuitino e codice ho presto spunto da questo topic http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1269857588 utilizzando il codice di quell'utente (quello verso il fondo della pagina).

riporto anche qui il codice:

#include <stdio.h>
#include "pins_arduino.h"

#define UTI_PIN 5
#define UTI_RESISTANCE_REF 1000

void setup()
{
  Serial.begin(9600);
  pinMode(UTI_PIN, INPUT);
}

void loop()
{
  double res1,res2,res3;

   if(ReadUTI(UTI_PIN,&res1,&res2,&res3,UTI_RESISTANCE_REF)) {
	Serial.print("Resistance 1: ");
	Serial.print(res1);
	Serial.print("\t");
	Serial.print("Resistance 2: ");
	Serial.print(res2);
	Serial.print("\t");
	Serial.print("Resistance 3: ");
	Serial.print(res3);
	Serial.print("\t");
    }
    else {
	Serial.print("Not Found");
    }
    Serial.print("\n");
   delay(2000);
}

int ReadUTI(uint8_t pin, double * res1,double * res2,double * res3,int refRes)
{
    int state = HIGH;
    int i,startindex=-1;
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    uint8_t stateMask = (state ? bit : 0);
    unsigned long width[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    double nOff=0,nAB=0,nCD=0,nBC=0,nDF=0;

    while ( (*portInputRegister(port) & bit) != stateMask)
	  ;

    for(i=0;i<12;i++) {
	while ( (*portInputRegister(port) & bit) == stateMask)
	    width[i]++;
	while ( (*portInputRegister(port) & bit) != stateMask)
	    width[i]++;
    }
    for(i=1;i<12;i++) {
	if(i<7) {
	  if(width[i]<width[i+2]&&width[i]<width[i+3]&&width[i]<width[i+4]&&width[i]<width[i+5]&&width[i+1]<width[i+2]&&width[i+1]<width[i+3]&&width[i+1]<width[i+4]&&width[i+1]<width[i+5]) {
	    startindex=i;
	    i=12;
	  }
	}
    }
    if(startindex!=-1) {
	nOff=width[startindex]+width[startindex+1];
	nAB=width[startindex+2];
	nCD=width[startindex+3];
	nBC=width[startindex+4];
	nDF=width[startindex+5];

	*res1=((nBC-nOff)/(nAB-nOff))*refRes;
	*res2=((nCD-nOff)/(nAB-nOff))*refRes;
	*res3=((nDF-nOff)/(nAB-nOff))*refRes;

	return 1;
    }
    else {
	return 0;
    }
}

premetto che fino a un mese fa ha sempre funzionato egregiamente. ieri ritiro fuori il tutto, collego le pt100 al circuito, attacco arduino e non mi legge più niente.

facenco un po di debug software, ho notato che mi si blocca all'interno di questo ciclo while (sulla seriale mi viene stampato solamente '2' ma non '3').

    Serial.println("2");
    for(i=0;i<12;i++) {
	while ( (*portInputRegister(port) & bit) == stateMask) 
	    width[i]++;
    Serial.println("3");

io avevo preso questo codice già fatto che funzionava egregiamente: in realtà non conosco bene il significato delle istruzioni all'interno della funzione int ReadUTI (moltre istruzioni sono prese dalla libreria pins_arduino.h), quindi non capisco bene perchè si blocca. ripeto: ha sempre funzionato bene, quantomento mi ha sempre stampato a video il valore delle resistenze (anche se sballate). non riesco a capire se sono partite le pt100 (ma non credo), se è partito l'integrato (possibile?) o arduino(dubito, perchè con altri programmi che ho funziona bene).

qualcuno mi può dare una mano?

EDIT: ho fatto una prova con un multimetro a misurare le resistenze delle pt100 (con tutto il circuito collegato allo smartec uti e alimentato): tutte e le tre sonde mi danno un valore di circa 106.5ohm, che corrisponde a circa 16.7 gradi celsius (compatibile con la temperatura attuale in camera mia).

quindi sembra che l'integrato funzioni. a questo punto c'è qualcosa di sbagliato nel codice: ora che ci penso un mesetto fa avevo ancora una versione vecchia dell'ide di arduino: ho provato a installare quelle vecchie ma ho sempre lo stesso problema. devo trovare un codice alternativo da far girare, ma non ho idea di come modificarlo.

sollazzo:

    Serial.println("2");

for(i=0;i<12;i++) {
while ( (*portInputRegister(port) & bit) == stateMask)
   width[i]++;
   Serial.println("3");

Uhm, dove si chiude il ciclo? inizi con una graffa ma non si vede quella di chiusura...

questo è il codice:

Serial.println("2");
for(i=0;i<12;i++) {
	while ( (*portInputRegister(port) & bit) == stateMask)
	    width[i]++;
Serial.println("3");
	while ( (*portInputRegister(port) & bit) != stateMask)
	    width[i]++;
Serial.println("4");
    }

prima di tutto prova a ricopiare di nuovo il codice da dove l'hai preso, magari inavvertitamente hai modificato qualcosa.

*portInputRegister(port) è una chiamata a funzione che non conosco()credo che legga a basso livello il valore di un pin), se ancora non funziona prova a fare:

for(i=0;i<12;i++) {
	while ( (*portInputRegister(port) & bit) == stateMask){
            Serial.print("i: ");
            Serial.print(i);
            Serial.print(" pir: ");
            Serial.print( *portInputRegister(port), BIN );
            Serial.print(" bit: ");
            Serial.print(bit, BIN);
            Serial.print(" mask: ");
            Serial.println(stateMask, BIN);
	    width[i]++;
        }
Serial.println("3");
	while ( (*portInputRegister(port) & bit) != stateMask)
	    width[i]++;
Serial.println("4");
    }

e posta il risultato, che vediamo di indagare un pò

dunque: il codice è quello originale (e sicuro al 100% che funzionava quando lo provai la prima volta). il circuito ho ricontrollato tutto ed è pari a pari come nello schema del topic che ho postato (con la differenza che ho pt100 invece che pt1000 e che le resistenze del circuito cambiano, secondo il datasheet dell'uti smartec).

ho fatto come mi hai detto (ho aggiunto anche la stampata al video dell'istruzione

uint8_t port = digitalPinToPort(pin);

si blocca subito alla prima iterazione. ti posto la stampa su seriale (continua cosi, non va avanti):

port:100
i: 0 pir: 100001 bit: 100000 mask: 100000
i: 0 pir: 100001 bit: 100000 mask: 100000
i: 0 pir: 100001 bit: 100000 mask: 100000
i: 0 pir: 100001 bit: 100000 mask: 100000
i: 0 pir: 100001 bit: 100000 mask: 100000
...
...
...

ho provato anche a stampare su seriale in continuazione il valore del pin digitale 5, e con il circuito alimentato è sempre impostato a 1.

sul datasheet dell'uti, spiega come calcolare il valore in uscita da quel pin, ma non so come tramutarlo in codice classico (spiega solo la teoria):

dice:

The output of the UTI is a period modulated signal. As an example, Figure 2 shows two complete cycles of
the output signal from the UTI, each consisting of three phases

link immagine: ImageShack - Best place for all of your image hosting and image sharing needs

per la lettura di 3 pt100 (con il circuito del topic postato sopra), mette questa tabella per calcolare i valori i voltaggi:

link tabella: ImageShack - Best place for all of your image hosting and image sharing needs

questa tabella, nel mio codice credo si riferisca a queste istruzioni:

nOff=width[startindex]+width[startindex+1];
	nAB=width[startindex+2];
	nCD=width[startindex+3];
	nBC=width[startindex+4];
	nDF=width[startindex+5];

	*res1=((nBC-nOff)/(nAB-nOff))*refRes;
	*res2=((nCD-nOff)/(nAB-nOff))*refRes;
	*res3=((nDF-nOff)/(nAB-nOff))*refRes;

purtroppo di questa cose tecniche ci capisco pressochè zero :frowning:

dopo un altro giorno di tentativi, sono giunto alla conclusione che o qualcosa dell'integrato è partito, o qualcosa di arduino è partito. ho ordinato un nuovo uti che dovrebbe arrivarmi sett prossima: se con lo stesso codice funzionerà, problema risolto. altrimenti...boh :smiley:

posso chiederti dove ordini l'uti? io pure vorrei utilizzare delle PT100 su arduini!! Grazie mille!!

ti ho scritto in privato che non so se si possono dire nomi di siti per forum