[Aiuto] 8051 interfacciamento sensirion SHT7X sensore digitale

A

aaron8390

Guest
Ho qualche domanda riguardo è,

In primo luogo, questo può essere l'interfaccia sensore da 89c52, utilizzando linguaggio assembly?

Ho dovuto progettare un linguaggio assembly per cercare di interfaccia digitale sensore, ma finora i stucked quando si utilizza LED per la produzione di prova e non vi è alcun risultato, i LED solo darmi 3 "lampeggia" e avere alcuna reazione dopo.

Ho attaccato il mio linguaggio assembly di codifica e può ragazzi qui si prega di fornire osservazioni e mi guida a riguardo?Sono davvero molto tensione nel fare questo progetto ora ...

E anche i allegata la scheda di dati di questo sensore

Fondamentalmente questo sensore interfaccia:
A) Inviare un inizio di trasmissione del segnale
B) Inviare un comando, sia per meassure temperatura o humidty
C) Attendere che il sensore per terminare la misurazione
D) Ricevere i dati in forma seriale.
Siamo spiacenti, ma è necessario il login per visualizzare questo attaccamento

 
Siamo spiacenti, i miei allegare codifica qui.

Non riuscivo a postare il mio codifica qui perché tutti gli spazi e la disposizione diventare molto disordinato,
ma solo spremere tutte le cose che a sinistra.

Qualcuno mi aiuta con questo sensore TT ..
Siamo spiacenti, ma è necessario il login per visualizzare questo attaccamento

 
Salve,
Per la prima parte della sua domanda, sì, dovrebbe essere possibile l'interfaccia con il sensore 89C52 utilizzando Assemblea Lingua.Per la seconda parte, che ti successiva.Nel frattempo si cerca anche mantenere.
Saluti,
Laktronics

 
yah ... sto chiedendo troppo ... e come docente bene.

Grazie per aver disposto ad aiutarmi!

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Molto Felice" border="0" />
 
Salve,
Come programma di test che dovrebbero avere lavorato, tranne che per la fine dichiarazione, che se si vuole, deve passare alla fine del reale i vostri codici.Al posto di Fine,
puoi inserire uno ljump per l'inizio.
Inoltre, come ha fatto si prende cura di rimuovere Check somma byte, potrebbe essere necessario leggere e respingere anche.Inoltre è necessario un SCK impulsi per generare l'ultimo NO ACK bit
Saluti,
LaktronicsAggiunto dopo 2 ore e 10 minuti:Salve,
Si prega di notare anche i seguenti punti:
1.È necessario dare un minimo di ritardo di 11 msec.all'inizio, prima di inviare qualsiasi comando per il sensore, chiamare la routine di ritardo una volta anche l'inizio.
2.Il sensore MSB prime uscite, ma vi sono la conservazione in LSB prima.Mov p0.6, codice C viene ripetuto due volte.
3.Mentre il sensore fornisce il byte, il controllore deve generare ACK-.Dopo la lettura del primo byte di dati, si sono tenuti i DATI po 'positivo per la 9a bit, quindi è ACK ve e si concluderà il comando.Modifica al-ve.Hai mantenuto la ACK ve dopo anche il secondo byte, che è un modo per raccontare il sensore che non si desidera che il byte di checksum, che risponde alla mia domanda nel post precedente.
Ma suppongo, in qualsiasi momento, il sensore può essere portato al suo stato iniziale, è necessario generare un inizio di stato e di comando in caso affermativo, l'ultimo SCK corrispondente a ve ACK dal capitano non può essere richiesto.
4.È possibile rendere il vostro codice di guardare molto compatta se scrivete subroutine per le seguenti condizioni:
a.Genera inizio del comando.
b.Send command (il comando Accumulatore azienda byte)
3.Leggi Byte (Accu. ritorno il byte letto)
4.Verificare la presenza di ACK da slave
5.Termina Comando (Invia un ve ACK)

Saluti,
Laktronics

 
HI, grazie

Per quanto riguarda la guida, ho dovuto apportare delle modifiche per il 1,2 e 3.

Ho qualche domanda,
a) se non mi utilizzano checksum CRC, è importante?
b) Se non mi CRC checksum utilizzando, secondo la scheda, ho solo bisogno di saltare la ACK.Questo dovrebbe essere ok giusto?Come se ho bisogno di
un'altra misura, posso solo premere il pulsante di reset.O ancora a ACK necessario?

c), ho limitato il montaggio conoscenze linguistiche, ma i disposti a provare.Nel formulare il mio codice aspetto compatto, se memorizzare i byte in accumulatore, come inviare in serie (in forma bit) per il sensore e il parallelo con il polso SCK?

E anche a leggere Byte, la misura si forma anche in serie, ma, come dire u Accumulatore potrebbe tornare in una forma byte.Come si lavora?

 
Salve,
1.Che cosa è successo dopo aver apportato delle modifiche di cui al punti 1,2 e 3?
Suppongo che lei avrebbe spostato la direttiva al fine l'ultima riga, dopo tutti i codici del tuo programma.
Inoltre, ho dimenticato di dire che ieri è una buona pratica di mettere solo un Sjump principale a 0x0000 e avviare il programma principale con l'etichetta principale: dopo l'interruzione del vettore spazio degli indirizzi di lasciare la zona di interrompere vettore indirizzo area riservata per interrompere qualsiasi uso futuro .

2.Come ho già detto, e anche come mostrato nella scheda di dati, dovrebbe essere possibile a dire il sensore che non si desidera CRC byte inviando un ACK ve dopo la lettura del secondo byte.Non so che cosa accadrà se non chiudere la comunicazione con una sequenza ve ACK, questo sistema è utilizzato anche in I2C.Intuitivamente mi sento, se si invia un comando di avvio condizione in qualsiasi momento, il sensore può ottenere riavviato con una nuova sequenza di comandi, che si può sperimentare e fammi sapere.È anche possibile che il sensore logica non può accettare un inizio di comando a meno che la sequenza corrente è stato chiuso correttamente.

Ma se sono il ripristino del sistema utilizzando il potere-su, il sensore dovrebbe ripartire, se non è un modo standard di esecuzione di un comando.

3.È possibile memorizzare il comando a 8 bit per essere inviato in precisione., Chiamare un invio di routine, la routine di istruzioni per l'uso RLC 8 volte in un ciclo e ogni volta che il processo di procedere come ha fatto lei, e, infine, per verificare anche la ACK - come il nono bit e ritorno.
4.Mentre si riceve un byte, un simile subroutine che leggere i dati in bit di procedere, quindi RLC istruzioni per spostare l'accumulatore in byte, non è otto volte e poi trasmettere un ve-/ ve ACK e ritorno con ACCU.contenente i byte letti.
Saluti,
Laktronics

 
Hey,
la ringrazio nuovamente

Siamo spiacenti per il ritardo di risposta,
la mia università.laboratorio non aprire a fine settimana.Allora ho appena completato il test del nuovo codice di 2 giorni.

Bene i non riesco ancora ad ottenere il risultato dopo che fissa parte 1 2 3 anche!

<img src="http://www.edaboard.com/images/smiles/icon_sad.gif" alt="Triste" border="0" />Caricare il codice in base al più tardi la vostra guida.(Non ho ancora compatto il codice, come ho bisogno di studiare per questo e lo farò più tardi, dopo aver acquisito il risultato del test)Ho qualche domanda per quanto riguarda l'hardware.
1) Il sensore ho solo bisogno di connettersi a seconda della scheda di dati di diritto?Come il pin 1 a SCK P1.0 di microC, pin 2 a 5v fornitura, piedino 3 al suolo e il pin 4 DATI per P1.1 di microC esterni e con una resistenza di pull-up 10k.

2) Ho messo 5 LED per controllare il risultato (a P0.0-P0.4).I LED quando il sensore senza mettere in circuito.E con il sensore, il risultato memorizzato in ciascun porto po 'dovrebbe attivare i LED se i obtainied il risultato giusto?Ora i LED dont trigger, quindi credo non vi è alcun risultato ottenere =.=...

3) Il 5 LED parti di uno stesso rotolo resistenza pull-up con la linea dati, è ok?Oppure dovrebbe mettere un resistore indipendenti per la linea dati.

4) Qualsiasi altro modo per verificare se il sensore è in grado-funzione?Accanto a prove come questa, forse guastato il sensore @ @!

Infine, per la cessazione ACK dopo 2a byte, i comprenderà in codice e provare domani, in laboratorio, ma senza che se ora il mio LED dovrebbe innescare anche giusto?

Grazie ancora!
Siamo spiacenti, ma è necessario il login per visualizzare questo attaccamento

 
Salve,
Vorrei tornare, dopo un po 'di tempo, ma nel frattempo, si dovrebbe aggiungere un' LJMP PRINCIPALE 'alla fine del tuo principale di routine, prima etichetta CLR DATI:, altro che il codice verrà eseguito tramite CLR DATI dopo una sola volta facendo PRINCIPALI .Inoltre vorrei luogo PRINCIPALI: etichetta dopo ORG 0000X direttiva, ma non può questione.

Per quanto riguarda i punti,

1.Sì, è necessario collegare il sensore della scheda di dati di cui, come lei ha spiegato.

2.Sì, il LED dovrebbe mostrare i cinque LSBs della lettura.

3.LEDs farà la funzione di pullup inoltre, alcun bisogno di tirare fino separata.

4.Unico modo per testare il sensore è in questo modo solo,
a meno che non abbiano fatto alcuni sbagliato fornitura di connessione, ecc, ci si può aspettare il sensore è ok per iniziare.

5.I LED si aspetta anche al lavoro una volta, ma senza la LJMP di cui sopra, la CPU può andare fuori controllo.E quando si mette LJMP, potrebbe essere necessario per terminare il comando con un ACK!

6.Spero inoltre, è stato identificato il numero di pin correttamente il dispositivo, il tipo che hai, tipo appartamento o IC tipo, in quanto ho capito, il pin 1 del piatto e 'il tipo pin vicino al segno .

Saluti,
Laktronics

 
Salve,
Le seguenti correzioni sono necessarie anche:
1.Invece di LJMP a dopo la PRINCIPALE CAUSA PRINCIPALE routine, fare LJMP al primo ritardo di chiamata
dopo PRINCIPALI:.
2.Devi SETB DATAA dopo ACK-di ricevimento della prima Byte.Sempre stato predefinito di dati linea dovrebbe essere elevato e che dovrebbero essere di SCK basso.

Ho allegato il codice qui con quelle correzioni.

Saluti,
Laktronics
Siamo spiacenti, ma è necessario il login per visualizzare questo attaccamento

 
Siamo spiacenti per il ritardo di risposta di nuovo,
dopo l'esame a medio termine documenti.E ne informa il più presto possibile!

 
Halo,
la ringrazio.

Penso che ho avuto con successo questa prova sensore.Essa mi ha dato il mio limite di LED!
Per il codice e mi guida, è mantenere la ripetizione di lettura, quindi il mio limite di led su ogni 1sec.

E modificare il codice di LJMP strt a SJMP $.Quali solo i wan di misura, una volta, e mi ha dato uno volte sul grilletto LED.

Ma vorrei porre una domanda, perché non riesco a prendere la lettura da parte di un altro pulsante di reset spingendo il mio?Ho potuto solo ottenere una nuova lettura con swtiching e disattivare l'alimentazione.

Okie, penso che ora è il momento per me di cambiare il bit di dati a valore fisico.

a) Per quanto detto e memorizzarlo nella Accumulatore?Den solo la conversione a deximal numero?
Ogni guida o di informazioni su questo codice come voglio studiare, non riesco a trovarlo nel mio libro di testo.

b) con e senza compensazione della temperatura, qual è il diverso? temperation Ho bisogno di un risarcimento?

c) Come ho visto nella scheda tecnica, la formula parte, come può i equat un "valore" che, come nel 8051?Ogni guida o di informazioni possono vorrei studiare?

Grazie per il vostro aiuto di nuovo!

 
Salve,
Nizza di conoscere il tuo codice funziona.
Dovrebbe essere possibile adottare una lettura premendo il pulsante RESET.Perché è il RESET non funziona?È necessario collegare il RESET RESET passare tutta la corrente attraverso un condensatore limitting resistenza, circa 1K.
È ora possibile memorizzare la copia di lavoro del vostro software di sicurezza e di lavorare con una copia per fare alcuni piccoli miglioramenti, come, riducendo NOPs da alcuni cicli di clock, rimuovere CLR C istruzioni
ecc
Essere in Assembler, la parte più difficile del software è Ingegneria Unit Conversion.Come si propone la lettura di visualizzazione?Che su queste interfacce?

Saluti,
Laktronics

 
Abit confondere qui.

Rimozione di alcune nops farà il ciclo non del 50%.E 'questo va bene?
Il CLR C comando non è necessario?

Qual è Engineering Unit Conversion?
Significato da ora il risultato i bit ricevuti, e la confezione di convertire in un registro (come accumulatore). E la formula da applicare al sensore della scheda di dati per ottenere il valore fisico?

Questa è la parte dura?

Okie avevo abit ricerca su internet, 8051 linguaggio assembly non può funzionare con galleggiante numero rappresentanza?Quindi, come mi devo effettuare la formula ....

Non ho idea di come iniziare, ma ho dovuto chiedere al mio professore, egli ha detto ogni matematica valore può essere "EQU" a partire del mio codice.10 Come potenza di 5, qualcosa di simile.E lui mi chiede di ricerca su internet di come dovrebbe essere in corso.

Hmm Hmm ...

 
Salve,
1.Non credo che il 50% duty cycle è necessaria, è come quella di cui da qualche parte?Per quanto ne so, solo il minimo di 0 e 1 orologio livello periodi sono indicati, si prega di controllare.Anche se si desidera simmetria, ho pensato di poter ancora da rimuovere alcuni NOPs da 0 e 1 due stati di orologio.In ogni caso ogni volta che si tenta di tali cose che fanno solo un tipo di cambiamento in un periodo di prova e dopo che.mantenere sempre una copia di ciascun gruppo di lavoro
nell'ambito di un codice separato numero di versione.

2.Quando si è in movimento un po 'di C non è necessario che chiaro.

3.Ingegneria significa unità di conversione per ottenere il fisico effettivo valore delle letture del sensore con il dato eqations nel catalogo.Potete provare il seguente logica per superare le calcolo in virgola mobile di assemblaggio:

A. Calcolo della temperatura a 14 bit:
La temperatura in centigradi T = -40 0,01 (RST), dove è RST temp.reading dal sensore.

Quindi, T = 0,01 [- 4000D RST], dove D sta per Decimale e RST binay è in formato.

Con una prima approssimazione, 4000D può essere considerato come un po 'alto in 13 bit di posizione.Quindi uno sottrarre 1 dal 13 ° po 'di lettura ..Questa approssimazione introduce un errore di circa 1degree centigradi che può essere aggiunto alla lettura finale come segue:- 1 in 13 th bit) 100D]

Così ora la temperatura in BCD T = 0,01 [di BCD (RDT
- 1 ° in 13 bit)
100 D]
la 100 D è aggiunto a correggere l'errore per causa di ravvicinamento e la moltiplicazione 0,01 può essere preso in cura la collocazione del punto decimale nel display.

B. Umidità relativa a 12 bit di calcolo:
L'equazione per Rh = - 4
0,04 (Rdh) - 2,8 * 10 ^ -6 (Rdh) ^ 2, è il Rdh
lettura dal sensore.
Calcolo procedura:
a) In caso contrario il termine al quadrato per il momento,
Rh = 0,01 [4 (-100 D Rdh)]; D sta per Decimale.
Ora fare prima un binario aritmetica dei termini
all'interno della parentesi quadra e convertirla in BCD.
Moltiplicazione con 0,01 può essere effettuata mediante l'impostazione del punto decimale nel display.

b) Per quanto riguarda la bilancia termine, gli Stati membri adottano solo morso di Rdh mantenere bit inferiore a zero e calcolare il valore di espressione
b0 = 2,8 * 10 ^ -6 (Rdh) ^ 2 e memorizzare in un 16 byte cercare tavolo contro la SM sgranocchiare, dopo la conversione in BCD.Mentre il calcolo del valore finale, aggiungere un fattore di correzione di bc = 0,01 (2.n1 * n2) alla tabella dei valori, dove è il n1 e n2 MS morso è la metà di Rdh sgranocchiare.Quindi, b = b0 bc

c) Detrarre b) da a) considerare il fattore di scala di 0,01 per uno).Visualizzare il risultato come nel Rh%Saluti,
LaktronicsUltimo a cura di laktronics il 22 marzo 2008 5:32, edited 1 volta in totale

 
Salve,
Penso che per risultati più accurati, si dovrebbe anche provare a 16 bit per i vostri calcoli aritmetici, lasciando decimale esponenti di essere finalmente adeguato per localizzare il punto decimale per la visualizzazione.In questo caso i calcoli per l'umidità, è possibile lasciare il LSB e prendere solo 11 bit di precisione in modo che quando si moltiplica per 28 il valore continua a essere un numero a 16 bit.

Saluti,
Laktronics

 
Van uno qualsiasi di inviarmi 7 segmento visualizzare i codici?Aggiunto dopo 34 minuti:ciao a tutti

 
Siamo spiacenti,
la maggior parte di esso, tranne i comprendere questo

b) Per quanto riguarda la bilancia termine, gli Stati membri adottano solo morso di Rdh mantenere bit inferiore a zero e calcolare il valore di espressione
b0 = 2,8 * 10 ^ -6 (Rdh) ^ 2 e memorizzare in un 16 byte cercare tavolo contro la SM sgranocchiare, dopo la conversione in BCD.Mentre il calcolo del valore finale, aggiungere un fattore di correzione di bc = 0,01 (2.n1 * n2) alla tabella dei valori, dove è il n1 e n2 MS morso è la metà di Rdh sgranocchiare.Quindi, b = b0 bc

Perché solo MS morso e l'abbandono del Medio e LS morso morso?

Un 16byte (bit?) Cercare tavolo?Di cosa si tratta?

Non è così e si capisce come il fattore di correzione per questa parte b?

 
Salve,
Non è necessario seguire il ravvicinamento dato, si può fare a 16 bit integer arthmetic e poiché la CPU a 8 bit moltiplicare dà istruzioni, è possibile calcolare con maggiore precisione il termine con l'utilizzo di collegamenti.
Qualsiasi come vi spiegherò quello che avevo in mente:
Il termine è calcolato a 2,8 * 10 ^ -6 (Rdh) ^ 2, dove Rdh è un numero a 12 bit.
Diciamo di effettuare la 8bits inferiore a zero e tutti i valori di prendere solo il MS sgranocchiare n1, che ha un indirizzo compreso tra 0 e F, 16 valori.È possibile creare uno sguardo fino tabella corrispondenti a tali valori di SM 16 sgranocchiare.Ad esempio, si calcola usando la calcolatrice, il valore di 2,8 (0X F00) ^ 2 * 10 ^ -6 = 41.28D e conservare questo valore nella tabella corrispondente ad affrontare 0XF.È lo stesso calcolo 0XF a cambiare 0XE .... 0x0 e ottenere l'aspetto di tabella pronto.
Ora ci corretto per i danni da trascurare il fatto inferiore 8bits in una certa misura.
Se si considera il numero a 12 bit per Rdh come una somma di MS sgranocchiare n1 e uno 8bit LS byte b1, si ottiene il valore di Rdh come:
Rapporto di Rdh = (n1 * 1024 / 4 b1)
Quindi, (Rdh) ^ 2 = (n1 * 1024 / 4 b1) ^ 2
= [(N1 * 1024 / 4) ^ 2 2 (n1 * 1024 / 4) b1 b1 ^ 2]
E la durata nel calcolo umidità sarà 2,8 * 10 ^ -6 [(n1 * 1024 / 4) ^ 2 2 (n1 * 1024 / 4) b1 b1 ^ 2]

Hai già calcolato 2,8 * 10 ^ -6 (n1 * 1024 / 4) ^ 2 e conservati in una tabella.
Quindi, il restante tearm errore è 2,8 * 10 ^ -6 [2 (n1 * 1024 / 4) b1 b1 ^ 2]
Il termine di errore, il valore massimo di b1 essere 256D, il termine massimo di 2,8 * 10 ^ -6 * b1 ^ 2 opere per
2,8 * 10 ^ -6 (256) ^ 2 = 0,18 ed è freddamente trascurate in quanto un errore di 0,18 nel umidità non è importante.
Ora siamo a sinistra con l'unico errore termine Er = 2,8 * 2 * 256 n1b1 * 10 ^ -6
Se ulteriormente suddiviso b1 come n2 * 16 n3, N2 e N3 in cui sono, rispettivamente, al centro e LS stuzzichini di Rdh,
ci Er = 2,8 * 2 * 256 n1 (n2 * 16 n3) * 10 ^ -6
Ora, se si considera il valore massimo di n3 come 0X 0F e il valore massimo di n1 come 0XF, il contributo dovuto al n3 sarà
2,8 * 2 * 256 * 0Fh * 0Fh * 10 ^ -6 = 0,32 che è anche trascurato.
Così si ottiene Er = 2,8 * 2 * 256 * 16 n1n2 * 10 ^ -6
= 2,29 * n1n2 * 10 ^ -2 per essere precisi, che si può calcolare utilizzando MPY di istruzioni della CPU.
Questo valore di Er da aggiungere al byte 16 byte dalla tabella di ricerca, selezionato sulla base del valore della categoria N1, per ogni lettura adottate e, infine sottratto dal primo termine già calcolato, per arrivare al valore%
di umidità.
Saluti,
Laktronics

 

Welcome to EDABoard.com

Sponsor

Back
Top