Tutoriel d’assembleur AVR 10 (5 / 10 étapes)

Étape 5: Câblage de la DHT

Nous allons mettre en œuvre la DHT un sous-programme d’interruption dans l’esclave (l’affichage à 4 chiffres) et comme une routine normale chez le maître (le dés-roller). Cette manière à chaque fois il est un coup de dés (c'est-à-dire lorsque vous appuyez sur le bouton), le rouleau dés communiquera le résultat à l’écran qui affiche le résultat dans les deux derniers chiffres de l’affichage.

Ainsi, par exemple, un rouleau de doubles sixes se traduirait par la transmission du numéro 12 à l’écran et cela serait analysé par la routine, nous avons écrit plus haut dans ce didacticiel et affiché comme un 1 et 2 sur les deux derniers affichages 7 segments. Notez que nous ne devons même le « aigu » qui nous a causé tant de peine dans le fichier binaire de code de conversion decimal. Comme vous avez sans doute compris maintenant, notre utilisation éventuelle pour l’affichage à 4 chiffres est pas simplement pour afficher les dés. Nous faisons que pour l’instant parce que c’est un moyen simple pour obtenir le code de communication va sans ajouter trop de nouvel choses à la fois.

Commençons donc par analyser le fonctionne de la DHT. Nous commencer avec notre rouleau de dés et ajouter quelques lignes de code juste pour obtenir des choses. Dans les deux l’affichage et du galet de dés, nous devons faire le SDA et les goupilles SCL à INPUT et élevé. C'est-à-dire

 cbi DDRC,4 <br>sbi PORTC,4<br>cbi DDRC,5<br>sbi PORTC,5 

Maintenant, dans la section INIT du code nous allons ajouter le texte suivant

 lds temp,PRR<br>andi temp,0b01011111<br>sts PRR,temp 

Cela définit le bit PRTWI et les bits de BRTIM0 de la réduction de puissance s’inscrire à 0. Voir page 45 de la feuille de données. Cela assure que le module de TWI et le module Timer/Counter0 sont éveillés. Nous devons la minuterie/Counter0 pour les commandes de notre « retard » que nous avons utilisé ailleurs dans le code. La DHT est celle que nous nous concentrons sur le moment.

Maintenant, nous voulons définir la fréquence SCL (ligne horloge série). Nous faisons cela à l’aide de la formule figurant à la page 213. Maintenant, pour nos besoins présents, je vais pour définir la fréquence aussi bas que je pourrai pour que nous puissions analyser le signal un peu plus facile. Je peux ensuite définir plus élevé plus tard mais pour permet désormais de faire petit. Voici la formule :

 SCL freq = CPU/[16 + 2*TWBR*Prescaler] 

Si je veux, c’est aussi bas que possible, je devrais définir TWBR et Prescalar aussi élevé que possible. Le registre de débit binaire TWI, TWBR, est un registre de 8 bits et donc la plus grande valeur, je peux faire c’est 255 (qui est tous les 1, c'est-à-dire de TWBR = 0b11111111), aussi le Prédiviseur bits sont définis dans le tableau 22-7 à la page 232. Il s’agit de bit 0 et bit 1 de la TWSR (interface bifilaire Status Register). La table nous a dit que si nous voulons que le Prédiviseur plus haut, je devrais choisir TWPS1 = 1 and TWPS0 = 1 et cela nous donnera un coefficient diviseur de 64. C’est pourquoi ma fréquence d’horloge série pour ma ligne de TWI, à l’aide de la formule ci-dessus, sera

16 MHz / (16 + 2 * 255 * 64) = 16000000Hz/32656 = 489,9 ou environ 490 Hz.

Donc, nous allons faire cela dans notre partie INIT du code avec les lignes :

 ldi temp,255<br>sts TWBR,temp<br>ldi temp,0b00000011<br>sts TWSR,temp 

Maintenant, quand nous commençons la DHT notre fréquence d’horloge SCL sera de 490 cycles par seconde (Hz 490). Nous ajoutons les lignes suivantes pour démarrer la DHT tel qu’il figure sur la page 217 (c'est-à-dire le Mode émetteur Master) :

 ldi temp, (1--TWINT)|(1--TWSTA)|(1--TWEN) <br>sts TWCR,temp 

et n’oubliez pas que les - signes ci-dessus sont censés pour être des signes « inférieur à », mais l’éditeur Instructables stupide n’est pas comme eux.

Ceci définit 3 des bits dans les deux fils contrôle Register (Confirm) et vous pouvez lire ces bits (interrupteurs à bascule) dans la description de ce registre aux pages 230 et 231. Essentiellement, le TWINT bit défini à 1 efface l’indicateur d’interruption à deux fils, le bit TWSTA est activé pour un définit le rouleau de dés comme le maître sur la ligne et envoie un signal de condition de démarrer sur toute la ligne d’interface à deux fils, enfin, le TWEN bit défini à un seul permet la DHT et active l’interface.

C’est tout pour l’instant ! Il suffit de mettre ces lignes dans la partie INIT du code, assembler et voyons ce qui se passe.

Nous voulons brancher afin que notre fils TWI allant de notre diceroller à notre écran. Nous n’avez pas besoin d’écrire quoi que ce soit pour l’affichage encore sauf que nous voulons le SDA et les broches de la DDC à être entrée et 5V sur le rouleau de dés et de l’affichage. Maintenant si nous tourner sur notre diceroller et notre affichage et brancher un oscilloscope entre notre ligne SCL et GND, nous allons voir la trace de la portée indiquée dans les deux premières images. Vous pouvez voir que c’est 490 Hz comme nous voulions qu’il soit. [voir les photos 1 et 2]

Maintenant, si vous avez lu l’article de la feuille de données sur la DHT, vous remarquerez qu’ils disent que vous devez tirer vers le haut de résistances à 5V sur chacune des lignes SDA et SCL. Pourquoi est-ce ? Nous avons juste regardé notre signal et il ressemble à une onde carrée très agréable de 490 Hz sans rien d’autre que nos résistances pullup interne sur chacune des broches ! C’est exactement le type de signal que nous voulons pour les communications (comme nous allons le voir plus dans un peu).

Que feriez-vous pullup résistances sur les lignes SDA et SCL ? Eh bien, ils font simplement le signal retour à 5V plus rapidement. Si je devais tirer vers le bas pour 0V, puis relâchez, il naîtrait à 5V beaucoup plus vite avec ces résistances pullup externe supplémentaire qu’avec uniquement les liens internes sur les broches. Toutefois, à la fréquence de 490Hz, il ne fait aucune différence. Le signal est très bien sans eux. En fait, nous allons utiliser 490Hz comme notre fréquence de TWI parce que notre demande n’a pas besoin d’aller plus vite. Je ne pense pas que quelqu'un va aux soins si vous pouvez envoyer seulement 490 bits de données par seconde. Si nous avions une application nécessitant le transfert de données haute vitesse, nous augmenterions notre vitesse d’horloge, et alors nous pourrions avoir à ajouter externe tirer vers le haut de résistances.

Permettez-moi maintenant de vous montrer pourquoi vous voudrez peut-être un jour mettre pullup résistances sur les lignes. Nous allons augmenter notre fréquence SCL. Revenir aux lignes dans la section INIT du code dé rouleau (le capitaine définit la vitesse de la ligne pas l’esclave) et modifiez-le afin que notre fréquence est la plus élevée possible cette fois-ci au lieu le plus bas. Cela signifie dans notre formule

 SCL freq = CPU/[16 + 2*TWBR*Prescaler] 

Nous voulons que le dénominateur à être aussi petit que possible. Permet donc simplement laisser le Prédiviseur seul et définir TWBR = 0. Puis notre fréquence sera 16MHz/16 qui est 1MHz (à noter que le CPU sera toujours 16 fois plus grand que la valeur SCL).

Assemblez-le maintenant, exécutez-le et examinez la trace d’oscilloscope (j’utilise un oscilloscope DSO Nano de Seeedstudio.com qui est un oscilloscope à très bon marché qui est très pratique avec ce genre de trucs). [Voir la photo 3]

Maintenant jeter un oeil à la nouvelle trace. Vous remarquez tout de suite que cette fréquence élevée, la ligne SCL n’a même pas le temps de se lever à 5 v, avant d’être envoyé à 0 encore une fois ! Si nous n’obtenons pas une belle onde carrée. Nous avons besoin d’une fréquence plus basse pour qu’au moins nous oscillons entre 0V et 5V. Si nous passons maintenant à la page 308 on voit que le tableau 29-14 donne les propriétés et les limites de la DHT. Il est dit la que fréquence d’horloge SCL doit être un maximum de 400kHz. Pas étonnant que notre trace sucé si mal. Permet donc la valeur TWBR 12 et désactivez les bits diviseur. Cela donnera SCL freq = 16000/(16+24) = 400kHz. Puis assembler, télécharger et jetez un oeil à la nouvelle trace.

Je ne joins une photo. Disons que nous obtenons encore une trace de merde qui ne le rend tout à fait vers le haut. Nous pourrions ajouter quelques résistances à la ligne, à ce stade, mais nous allons faire la fréquence juste un peu plus bas afin que vous pouvez vraiment voir ce qui se passe.

Permet d’affecter TWBR 72. Cela nous donnera une fréquence de 100kHz. Jetez un oeil à l’image de la trace. [Voir les photos 4 et 5]

Maintenant que vous voyez que le signal oscille entre 0 v et 5 v, mais il n’est pas se relever à 5V très rapidement ! En fait, il prend tellement de temps à se relever à 5V qu’au moment où qu'il y arrive il est déjà temps de revenir en arrière vers le bas à 0V. Ce n'est pas ce que nous voulons si nous voulons transmettre des données.

Jetez un œil à la Figure 22-2 à la page 207. Vous verrez comment les données sont transmises. Le CPU essentiellement compare les signaux sur les deux lignes (SDA et SCL) et il décide ce que les données sont de comment ils se comparent. C’est pourquoi l’horloge du processeur doit être une fréquence au moins 16 fois plus élevée que l’horloge SCL. Le CPU a besoin de ces cycles supplémentaires de distinguer ce qui se passe avec les signaux SCL et SDA et prendre des décisions basées sur eux. Il a besoin de deux types de régions tel qu’illustré dans le diagramme. Il a besoin régions où les données sont « stable » sens, qu'il est constant à soit 5V ou au 0V pendant une certaine période de temps. Il faut aussi des régions où le signal évolue, soit aller de 0 v à 5 v ou de 5V à 0V. Nous discuterons comment il obtient des informations hors de ceci en une seconde, mais mon point est que le signal de 100kHz que nous venons, nous n’avons pas assez longtemps une région "stable". Nous avons essentiellement rien d’autre que des transitions. Donc ça ne marchera pas. Pour résoudre ce problème, nous ajoutons pullup résistances aux deux lignes. Cela entraînera le signal pour se relever à 5V plus rapidement et de nous donner une région plue stable au sommet. Nous allons essayer. Prenez deux résistances. Je vais utiliser 4.7kOhm résistances. Puis leur fils dans ses lignes comme sur l’illustration en page 206. Je vais joindre une photo de mon travail de câblage. [Voir la photo 6]

Maintenant, regardez la trace ! Nous avons le signal saut arrière jusqu'à 5V et puis reste à plat pour un certain temps avant la chute rapidement revenir à 0V. En d’autres termes, nous avons une trace d’onde carrée qui le CPU peut utiliser pour envoyer des données. [voir image 7 et photo 8]

C’est pourquoi ils vous suggèrent de qu'ajouter pullup résistances aux lignes. En fait, si vous voulez trouver une résistance de quelle taille vous avez besoin de vous pourrait soit figurer dehors la capacité de la ligne et utiliser la formule qu’ils donnent au tableau 29-14 ou vous pourriez simplement regarder la trace d’oscilloscope et échanger des résistances jusqu'à ce que vous obtenez une belle onde carrée.

En tout cas ! Nous allons pour revenir à 490 Hz, nous mettons nos TWBR retour à 255 et notre diviseur de retour à 64, et nous peut se débarrasser complètement des résistances pullup et crochet juste un microcontrôleur à l’autre. Les tractions internes très bien car tirant vers le haut le signal Hz 490 assez rapidement pour obtenir une belle onde carrée comme nous l’avons déjà montré dans les photos. Regardez la dernière image [photo 9] liste le 490 Hz vague avec les résistances pullup et comparez-le avec les deux premières photos qui montrent la même vague de 490 Hz sans les résistances pullup. Vois pas de différence ? Moi aussi. Donc nous dispenser les résistances et juste accrocher notre rouleau dés directement à notre affichage à 4 chiffres.

Maintenant que nous savons comment fonctionnent les lignes SDA et SCL (c'est-à-dire utilisant des signaux d’onde carrée) nous allons maintenant examiner comment les données sont transmises à l’aide d’eux.

Articles Liés

Tutoriel d’assembleur AVR 11

Tutoriel d’assembleur AVR 11

Bienvenue au didacticiel 11 !Dans ce bref didacticiel, nous allons enfin construire la première partie de notre projet final.La première chose que vous devriez faire est d'aller à la toute dernière étape de ce tutoriel et voir la vidéo. Puis revenez
Tutoriel d’assembleur AVR 1

Tutoriel d’assembleur AVR 1

J'ai décidé d'écrire une série de tutoriels sur la façon d'écrire des programmes de langage d'assemblage pour le Atmega328p qui est le microcontrôleur utilisé dans l'Arduino. Si les gens restent intéressées, je vais continuer à mettre un une semaine
Tutoriel d’assembleur AVR 8

Tutoriel d’assembleur AVR 8

Bienvenue au didacticiel 8 !Dans ce bref didacticiel, nous allons prendre un peu d'une déviation de l'introduction de nouveaux aspects de la programmation en langage assembleur pour montrer comment déplacer nos composants de prototypage pour un circu
Tutoriel d’assembleur AVR 6

Tutoriel d’assembleur AVR 6

Bienvenue au didacticiel 6 !Tutoriel d'aujourd'hui sera un court où nous mettrons au point une méthode simple pour transmettre des données entre un atmega328p et un autre à l'aide de deux ports qui les relient. Nous puis prendre dés rouleau de tutori
Tutoriel d’assembleur AVR 9

Tutoriel d’assembleur AVR 9

Bienvenue au didacticiel 9.Aujourd'hui nous allons montrer comment piloter un afficheur 7 segments, mais aussi un affichage à 4 chiffres à l'aide de notre code en langage assembleur ATmega328P et AVR. Ce faisant cela que nous allons devoir prendre de
Tutoriel d’assembleur AVR 2

Tutoriel d’assembleur AVR 2

Ce tutoriel est une continuation de "tutoriel d'assembleur AVR 1"Si vous n'avez pas passé par 1 tutoriel, vous devez arrêter maintenant et faire celui-là en premier.Dans ce tutoriel, nous allons poursuivre notre étude de programmation en langage
Tutoriel d’assembleur AVR 7

Tutoriel d’assembleur AVR 7

Bienvenue au didacticiel 7 !Aujourd'hui nous allons voir la première comment faire pour nettoyer un clavier et ensuite montrer comment utiliser les ports d'entrée analogiques pour communiquer avec le clavier.Nous ferons cela en utilisant les interrup
Tutoriel d’assembleur AVR 5

Tutoriel d’assembleur AVR 5

Aujourd'hui nous allons regarder de plus près aux divers emplacements mémoire dans le microcontrôleur Atmega328p et voir si nous pouvons mieux comprendre comment les choses sont stockés, où ils sont stockés et comment les pointeurs et les tables de r
Tutoriel d’assembleur AVR 4

Tutoriel d’assembleur AVR 4

Bienvenue au didacticiel numéro 4 !Dans ce tutoriel, nous allons construire un circuit qui simulera l'enroulement des deux dés. Ensuite, nous allons tout d'abord écrire un programme de force brute qui fait le travail. Puis nous permettra de simplifie
Tutoriel d’assembleur AVR 3

Tutoriel d’assembleur AVR 3

Bienvenue au didacticiel numéro 3 !Avant que nous commencions, je tiens à faire un point philosophique. N'ayez pas peur d'expérimenter avec les circuits et le code que nous construisons dans ces tutoriels. Changer les câbles près, ajouter de nouveaux
MRETV - vidéo, stéréo Sound et beaucoup plus d’un Arduino standard !

MRETV - vidéo, stéréo Sound et beaucoup plus d’un Arduino standard !

MRETV - vidéo, stéréo Sound et beaucoup plus d'un Arduino standard !Maintenant mis à jour pour Arduino 1.6.6 novembre 2015 !Utiliser seulement deux résistances et deux diodes pour générer la vidéo plein écran. Texte 47 x 29 de 8 x 8 caractères, doubl
Comment charger des programmes à un Arduino UNO de Atmel Studio 7

Comment charger des programmes à un Arduino UNO de Atmel Studio 7

Dans ce court Instructable, nous allons apprendre à charger un programme à une carte Arduino UNO utilisant Atmel Studio au lieu de l'IDE Arduino. Cela est utile lorsque vous avez besoin élaborer un programme à l'aide de plusieurs fonctions avancées o
Star Trek sonnette Hack

Star Trek sonnette Hack

J'ai toujours été un fan de la Star Treks et comme tel, j'étais très excité lorsque mon colocataire ramené un panneau la comm série style Star Trek original. Je n'avais jamais vu l'un d'entre eux, mais une recherche rapide nous a pris sur le site de
Carte de développement pour microcontrôleurs Attiny84

Carte de développement pour microcontrôleurs Attiny84

Il s'agit d'une carte de développement pour microcontrôleur Attiny84. Tha Attiny84 puce possède 11 broches adressables avec l'IDE Arduino, 8k de mémoire flash pour le stockage de programme et 512 octets de mémoire vive disponible pour les variables d