[Aide] 8051 interfacing sensirion SHT7X capteur numérique

A

aaron8390

Guest
J'ai quelques questions concernant ce,

Tout d'abord, ce capteur peut être par 89c52 interface,
en utilisant la langue de montage?

J'ai eu de concevoir un langage d'assemblage pour tenter d'interface de ce capteur numérique, mais
jusqu'à présent, i stucked lors de l'utilisation de LED pour tester la production et il
n'y a pas de résultat, les LED donnez-moi 3 "clignote" et avoir aucune réaction après.

I ci-joint mon langage d'assemblage de codage et les gars ici
s'il vous plaît donnez-moi des commentaires et un guide à ce sujet?Je suis vraiment très tensions en faisant ce projet maintenant ...

Et aussi i joint la fiche technique de ce capteur

Fondamentalement, ce capteur d'interface:
A) Envoyer à un début de transmission du signal
B) Envoyer une commande, soit à la température ou de contours humidty
C) En attente de la sonde à la fin de la mesure
D) recevoir les données en forme de série.
Désolé, mais vous avez besoin de login pour afficher cette pièce jointe

 
Désolé, je joins ma codage ici.

Je ne pouvais pas le codage de mon post ici parce que tout le dispositif d'espacement et de devenir très désordonné,
mais simplement presser toutes les choses à gauche.

Tout le monde
s'il vous plaît aidez-moi avec ce capteur TT ..
Désolé, mais vous avez besoin de login pour afficher cette pièce jointe

 
Salut,
Pour la première partie de votre question, oui, il devrait être possible de l'interface avec le capteur en utilisant 89C52 Assembly Language.Pour la deuxième partie, vous plus tard.Dans le même temps, vous pouvez également essayer.
Observe,
Laktronics

 
yah ... je cherche ... et de demander trop de cours aussi.

Merci pour la volonté de m'aider!

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />
 
Salut,
Comme un programme de test, il doit avoir travaillé, sauf pour la fin de déclaration, qui si vous le souhaitez, devrait passer à la véritable fin de vos codes.Dans le lieu de la fin, vous pouvez placer une ljump le début.
Aussi, comment avez-vous prendre soin d'enlever Check byte somme, vous avez mai à lire et à rejeter également.Aussi vous avez besoin d'une impulsion SCK pour générer la dernière NO ACK bit
Observe,
LaktronicsAjouté après 2 heures 10 minutes:Salut,
S'il vous plaît noter également les points suivants:
1.Vous avez besoin de donner un délai minimum de 11 ms.au début, avant l'envoi de toute commande de la sonde,
faites appel à votre routine de retard, une fois au début aussi.
2.Le capteur sorties MSB en premier, mais vous êtes les stocker en LSB en premier.Mov p0.6, le code C est répétée deux fois.
3.Alors que le capteur fournit les octets, le contrôleur doit générer ACK-.Après la lecture du premier octet de données, vous avez conservé le bit de donnée positive pour 9e bits, ACK est de ve et mettra fin à la commande.Changement à-ve.Vous avez conservé le ACK ve, après le deuxième octet aussi, qui est une façon de dire le capteur que vous ne voulez pas que l'octet de contrôle, qui répond à ma question dans le précédent post.
Mais je suppose, à tout moment, le capteur peut être portée à son état initial en début de générer une commande d'État, et si oui, le dernier correspondant à SCK ve ACK de maître mai ne sera pas exigée.
4.Vous pouvez faire votre code très compact si vous écrivez sous-routines pour les États suivants:
a.Générer le début de la commande.
b.Send Command (Accumulateur la tenue de la commande byte)
3.Read Byte (Accu. retour de l'octet lu)
4.Vérifiez les ACK de l'esclave
5.Terminate Command (Envoyer un ACK ve)

Observe,
Laktronics

 
HI, grâce

En ce qui concerne votre guide,
j'ai dû faire des changements pour les 1,2 et 3.

J'ai quelques questions,
a) Si je ne suis pas utiliser de contrôle CRC, est-il question?
b) Si je ne suis pas utiliser de contrôle CRC, conformément à la feuille d'information, i juste besoin de sauter le ACK.Ce droit doit être ok?Comme si
j'ai besoin d'une autre mesure, je peux juste appuyer sur le bouton de réinitialisation.Ou encore un ACK-elle nécessaire?

c) je suis un peu d'assemblage connaissance de la langue, mais je prête à essayer.En faisant mon code look compact, si i stocker l'octet à l'accumulateur,
la façon de l'envoyer en série (sous forme de bits) pour le capteur et en parallèle à la SCK pouls?

Et aussi de lire Byte, la mesure en série se forme également, mais que dire u accumulateur pourrait revenir à une forme d'octets.Comment devrait-elle marche?

 
Salut,
1.Que s'est-il passé après que vous avez fait des changements que par les points 1,2 et 3?
Je suppose que vous avez déplacé la directive de fin de la dernière ligne, après tous les codes dans votre programme.
Aussi,
j'ai oublié de mentionner hier, que
c'est une bonne pratique de mettre seulement un Sjump Main à 0x0000 et commencer le programme principal avec une étiquette principale: le vecteur d'interruption après l'espace d'adresse de quitter la zone de vecteur d'interruption zone d'adresse réservée pour toute interruption de l'utilisation future .

2.Comme je l'ai déjà dit, et comme indiqué dans la fiche de données, il devrait être possible de dire que le capteur vous ne voulez pas que CRC octet par l'envoi d'un ACK ve, après avoir lu la deuxième octet.Je ne suis pas sûr de ce qui se passera si vous
n'avez pas fin à la séquence de communication avec un ACK ve, ce système est également utilisé dans I2C.Intuitivement, je me sens si vous envoyez un début à tout moment l'état de la commande, le capteur mai obtenir redémarré avec une nouvelle séquence de commandes, que vous pouvez tester et me le faire savoir.Il est également possible que le capteur logique mai de ne pas accepter un début de commande à moins que l'ordre actuel est terminée correctement.

Mais si vous êtes de réinitialiser le système en utilisant le pouvoir, le capteur doit repartir de zéro,
même si elle
n'est pas un moyen standard de l'exécution d'une commande.

3.Vous pouvez enregistrer les 8 bits de commande à envoyer en accu., Envoyer un appel de routine, la routine va utiliser RLC instruction de 8 fois dans une boucle et à chaque fois le processus de procéder comme vous l'avez fait, et enfin de vérifier le ACK-aussi le neuvième bit et le retour.
4.Si vous recevez un octet, une sous-routine va lire les bits de données dans le transport, puis RLC instruction de passer dans l'octet de l'accumulateur, le faire huit fois, puis transmettre un ve / ve ACK et le retour avec l'ACCU.contenant de l'octet lu.
Observe,
Laktronics

 
Hey, merci encore

Désolé pour la réponse tardive, mon uni.laboratoire de ne pas ouvrir le week-end.Alors je viens de finir les essais du nouveau code de 2 jours.

Eh bien, je
n'arrive toujours pas à faire après la sortie de fixation partie 1 2 3 aussi!

<img src="http://www.edaboard.com/images/smiles/icon_sad.gif" alt="Triste" border="0" />Je télécharger le dernier code en fonction de votre guide.(Je
n'ai pas le code compact encore, comme
j'ai besoin de cette étude et je vais le faire plus tard, après avoir acquis le résultat du test)J'ai quelques questions concernant le matériel.
1) Le capteur i juste besoin de se connecter en fonction de la fiche de données de droit?Quant à la broche 1 SCK P1.0 de MicroC, broche 2 à un approvisionnement en 5v, la broche 3 à la masse et la broche 4 DONNEES à P1.1 de MicroC externe et avec une résistance de pull up 10k.

2)
J'ai mis 5 LED pour vérifier le résultat (à P0.0-P0.4).La LED sur le moment sans mettre le capteur dans le circuit.Et avec le capteur, le résultat stocké dans chaque port bit devrait déclencher les voyants i obtainied si le résultat à droite?Maintenant, les voyants ne déclenche, donc je pense que il
n'y a pas de résultat obtenir =.=...

3) Les 5 voyants partagent un même rouleau de résistance de pull up avec la ligne de données, est-il ok?Ou devrait mettre un indépendant pour la résistance de la ligne de données.

4) Tout autre moyen de vérifier si le capteur est fonction de mesure?Outre les tests de ce type, le capteur peut-être gâté @ @!

Enfin, pour la fin ACK après 2ème octet, je vais l'inclure dans le code et essayer de demain dans le laboratoire, mais sans elle, si mon LEDs devraient être également déclencher droit?

Merci encore!
Désolé, mais vous avez besoin de login pour afficher cette pièce jointe

 
Salut,
Je vais revenir après un certain temps, mais dans le même temps, vous devez ajouter un «LJMP MAIN 'à la fin de votre routine, avant de l'étiquette CLR DONNEES, sinon, votre code sera par CLR DONNEES après un temps à faire MAIN .Je voudrais également lieu MAIN: étiquette après ORG 0000X directive, si elle mai pas d'importance.

En ce qui concerne vos points,

1.Oui, vous devez connecter le capteur selon la fiche technique, comme vous l'avez expliqué.

2.Oui, les LEDs devraient montrer les cinq RLSP de la lecture.

3.LEDs fera la fonction de pullup aussi, pas besoin de séparer pull up.

4.Seul moyen de tester le détecteur,
c'est comme cela, sauf si vous avez fait quelque tort d'alimentation, etc, vous pouvez vous attendre à le capteur est ok pour commencer.

5.J'ai également
s'attendrait LEDs de travailler une fois, mais sans le LJMP mentionnés ci-dessus, votre processeur ne peut passer de contrôle.Et quand vous mettez LJMP, vous mai nécessité de mettre fin à la commande avec un ACK!

6.J'espère aussi, vous avez identifié le nombre de broches correctement sur le périphérique, le type que vous avez, à plat ou de type IC type, comme je l'ai compris, la broche 1 du type plat est la broche près de la marque.

Observe,
Laktronics

 
Salut,
Les corrections suivantes sont également requises:
1.Au lieu de LJMP d'après la MAIN MAIN routine, ne LJMP au premier délai d'appel
après PRINCIPALES:.
2.Vous devez SETB DATAA ACK-après la réception de la première Byte.Toujours par défaut de données en ligne devrait être élevé et que de SCK devrait être faible.

Je joins ici votre code avec les corrections.

Observe,
Laktronics
Désolé, mais vous avez besoin de login pour afficher cette pièce jointe

 
Désolé pour la réponse tardive à nouveau,
après l'examen à mi-parcours des documents.U informe dès que possible!

 
Halo,
je vous remercie.

Je pense que
j'ai eu avec succès les tests de cette sonde.Il
m'a donné ma LEDs déclencher!
Pour le code et me guide, il répète en prenant la lecture, de sorte que mes leds sur chaque déclenchement 1sec.

Et je modifier le code de LJMP strt à SJMP $.I wan, qui ne mesure à la fois, et il ne me donner un temps de déclenchement sur les LED.

Mais je voudrais poser une question, pourquoi je ne peux pas prendre une autre lecture en appuyant sur mon bouton de réinitialisation?Je ne pouvais obtenir une nouvelle lecture avec swtiching sur et en dehors de l'alimentation.

Okie, je pense que le moment est venu pour moi de changer les bits de données à valeur physique.

a) Comme l'a dit et le stocker dans l'accumulateur?Den convertir un certain nombre deximal?
Tout un guide ou d'informations sur ce code, je veux étudier, je ne le trouve pas dans mon livre.

b) avec et sans compensation de température, quelle est la différence? Ai-je besoin d'une compensation en température?

c) Comme je l'ai vu dans la fiche technique, la formule part, comment peut-i égalit une "valeur" comme ça en 8051?Toute information peut guider ou me laisser étudier?

Merci encore pour votre aide!

 
Salut,
Bon à savoir le code fonctionne.
Il devrait être possible de prendre une lecture en appuyant sur le bouton RESET.Pourquoi le RESET ne fonctionne pas?Vous devez connecter le switch RESET RESET dans l'ensemble du condensateur à travers une résistance de la limitation actuelle, environ 1 km.
Vous pouvez désormais stocker la copie de travail de votre logiciel de sécurité et de travailler avec une copie à faire quelques améliorations mineures comme la réduction de certains PON cycles de l'horloge, retirer CLR C instructions
etc
Être en assembleur, la plus difficile partie de l'unité de génie logiciel de conversion.Comment proposez-vous pour afficher la lecture?Qu'en est-il de ces interfaces?

Observe,
Laktronics

 
Abit confondre ici.

Suppression de certains PON fera pas le cycle de 50%.Est-ce correct?
Le CLR C commande
n'est pas nécessaire?

Quelle est l'unité de génie de conversion?
Signification des bits à partir de maintenant, je suis reçu, de convertir et de l'emballage dans un registre (comme accumulateur). Et d'appliquer la formule de la fiche de données de capteur pour obtenir la valeur physique?

C'est la partie difficile?

Okie i abit a la recherche sur Internet, 8051 langage d'assemblage ne peut pas travailler avec float représentation?Alors comment dois-je procéder à la formule ....

Je
n'ai aucune idée comment commencer, mais
j'ai dû demander à mon professeur, il a dit tous les mathématiques valeur peut être "EQU" à partir de mon code.À l'instar de 10 puissance de 5, quelque chose comme ça.Et il me demande de recherche sur internet de la façon dont il doit être en cours.

Hmm Hmm ...

 
Salut,
1.Je ne pense pas que 50% duty cycle est nécessaire, est-il mentionné quelque part comme ça?Pour autant que je sache, seule l'horloge minimum le niveau 1 et 0, les périodes sont mentionnées,
s'il vous plaît vérifier.Même si vous voulez que la symétrie, je pensais que vous pouvez toujours supprimer certaines PON à partir de deux états 0 et 1 de l'horloge.En tout cas chaque fois que vous essayez de faire des choses telles
qu'un changement de type à un moment et après cette épreuve.toujours garder une copie de chaque code de travail dans le cadre d'un numéro de version distinct.

2.Lorsque vous déplacez un peu de C, vous avez besoin de ne pas l'effacer.

3.Engineering conversion d'unité pour obtenir les valeurs physiques de la sonde à l'aide de la eqations dans le catalogue.Vous pouvez essayer la suite logique pour surmonter les calculs en virgule flottante en assembleur:

A. Calcul de la température de 14 bits:
La température de -40 degrés centigrades T = 0,01 (Rdt), où est Rdt temp.reading du capteur.

Ainsi, T = 0,01 [- 4000D Rdt], où D correspond à Décimales et Rdt binay est en format.

En première approximation, 4000D peut être considéré comme un grand coup à la 13e position peu.Alors soustraire 1 de la 13 ème bit de la lecture ..Cette approximation introduit une erreur d'environ 1degree centigrades qui peut être ajouté à la lecture finale comme suit:- 1 in 13 th bit) 100D]

Alors maintenant, la température dans BCD T = 0,01 [BCD de (Rdt
- 1 en 13 ème bit) 100 D]
le 100D est ajoutée pour corriger l'erreur en raison de rapprochement et de la multiplication 0,01 peuvent être prises en charge dans le placement de la virgule à l'écran.

B. 12 bit Calcul Humidité relative:
L'équation pour Rh = - 4 0,04 (RDH) - 2,8 * 10 ^ -6 (RDH) ^ 2, est le RDH
lecture du capteur.
Étapes de calcul:
a) Le fait de ne pas le terme quadratique pour le moment,
Rh = 0,01 [4 (-100D RDH)]; D pour décimal.
Maintenant, faites d'abord un binaire arithmétique des termes dans le crochet et le convertir à la BCD.
Multiplication de 0,01 peut être fait en mettant le point décimal à l'écran.

b) Pour le reste terme, ne prennent que les États membres de maintien de grignoter des RDH bits inférieur à zéro et le calcul de la valeur de l'expression
b0 = 2.8 * 10 ^ -6 (RDH) ^ 2, et stocker dans un byte 16 rechercher table contre la MS grignoter, après conversion en BCD.Alors que le calcul de la valeur finale, ajouter un facteur de correction de bc = 0,01 (2.n1 * n2) à la table de valeurs, où est la n1 et n2 grignoter MS est le milieu de grignoter RDH.Donc, b = b0 bc

c) soustraction b) de a) d'examiner le facteur d'échelle de 0,01 pour un).Afficher le résultat en Rh en%Observe,
LaktronicsDernière édition par laktronics le 22 mars 2008 5:32, édité 1 fois au total

 
Salut,
Je pense que pour des résultats plus précis, vous devriez essayer entier de 16 bits pour les calculs arithmétiques,
ce qui laisse la décimale exposants d'être enfin ajusté pour localiser le point décimal à des fins d'affichage.Dans ce cas, l'humidité pour les calculs, vous pouvez laisser le LSB et ne prendre que 11 bits de précision de sorte que quand on multiplie par 28 la valeur sera toujours un nombre de 16 bits.

Observe,
Laktronics

 
Van envoyez-moi un seul afficheur 7 segments codes?Ajouté après 34 minutes:salut à tous

 
Désolé, plus d'elle, sauf i comprendre ce

b) Pour le reste terme, ne prennent que les États membres de maintien de grignoter des RDH bits inférieur à zéro et le calcul de la valeur de l'expression
b0 = 2.8 * 10 ^ -6 (RDH) ^ 2, et stocker dans un byte 16 rechercher table contre la MS grignoter, après conversion en BCD.Alors que le calcul de la valeur finale, ajouter un facteur de correction de bc = 0,01 (2.n1 * n2) à la table de valeurs, où est la n1 et n2 grignoter MS est le milieu de grignoter RDH.Donc, b = b0 bc

Pourquoi ne prennent MS grignoter et de la négligence et le Moyen-LS grignoter grignoter?

A 16byte (bit?) Look up table?Qu'est-ce que c'est?

Not so u got comprendre comment le facteur de correction pour cette partie b?

 
Salut,
Vous
n'avez pas à suivre le rapprochement donnée, vous pouvez faire 16 bit integer arthmetic et que le processeur de 8 bits permet de multiplier l'instruction, vous pouvez calculer plus précisément le terme avec l'aide de raccourcis.
Toute la manière dont je vais vous expliquer ce que
j'avais à l'esprit:
Le terme est calculé à 2,8 * 10 ^ -6 (RDH) ^ 2, où RDH est un nombre à 12 bits.
Disons que vous faites la moindre 8bits tous à zéro et prendre des valeurs de la seule MS grignoter n1, qui a une plage d'adresse de 0 à F, 16 valeurs.Vous créez un look up table correspondant à ces 16 valeurs de MS grignoter.Par exemple, de calculer l'utilisation de votre calculatrice, la valeur de 2,8 (0X F00) ^ 2 * 10 ^ -6 = 41.28D et de stocker cette valeur dans le tableau correspondant à l'adresse 0xF.Vous faire le même calcul de changer 0xF à 0xe .... 0X0 et d'obtenir le look up table.
Maintenant, laissez-nous pour corriger les dommages fait par le bas 8bits négliger dans une certaine mesure.
Si l'on considère le nombre à 12 bits pour les RDH en tant que somme de la MS grignoter n1 et un octet de 8 bits LS b1, vous obtenez la valeur de RDH en tant que:
Valeur du RDH = (n1 * 1024 / 4 b1)
Alors, (RDH) ^ 2 = (n1 * 1024 / 4 b1) ^ 2
= [(N1 * 1024 / 4) ^ 2 2 (n1 * 1024 / 4) b1 b1 ^ 2]
Et le terme de calcul de l'humidité sera 2,8 * 10 ^ -6 [(n1 * 1024 / 4) ^ 2 2 (n1 * 1024 / 4) b1 b1 ^ 2]

Vous avez déjà calculé 2,8 * 10 ^ -6 (n1 * 1024 / 4) ^ 2 et conservé à votre table.
Donc le reste tearm erreur est de 2,8 * 10 ^ -6 [2 (n1 * 1024 / 4) b1 b1 ^ 2]
Sur le terme d'erreur, la valeur max de b1 étant 256D, la durée maximum de 2,8 * 10 ^ -6 * b1 ^ 2 équivaut à
2.8 * 10 ^ -6 (256) ^ 2 = 0,18 et il est froidement négligé depuis une erreur de 0,18 dans l'humidité
n'est pas important.
Maintenant, nous sommes à gauche avec le seul terme d'erreur Er = 2,8 * 2 * 256 n1b1 * 10 ^ -6
Si nous avons encore divisé b1 comme n2 * 16 n3, où n2 et n3 sont respectivement le milieu et la LS nibbles de RDH,
nous Er = 2,8 * 2 * 256 n1 (n2 * 16 n3) * 10 ^ -6
Maintenant, si l'on considère la valeur max de n3 comme 0X 0F max et la valeur de N1 0xF, la contribution due à n3 sera
2,8 * 2 * 256 * 0FH * 0FH * 10 ^ -6 = 0,32 qui est également négligée.
Ainsi, vous obtenez Er = 2.8 * 2 * 256 * 16 n1n2 * 10 ^ -6
= 2.29 * n1n2 * 10 ^ -2 pour être précis, que vous pouvez calculer l'aide de MPY instruction de CPU.
Cette valeur de Er être ajouté à l'octet de la table de 16 octets, choisis sur la base de la valeur de n1, la lecture de chaque prise, et, enfin, soustrait de la première période déjà calculé, pour arriver à la valeur de% d'humidité.
Observe,
Laktronics

 

Welcome to EDABoard.com

Sponsor

Back
Top