Tutoriel d’assembleur AVR 3 (5 / 9 étapes)

Étape 5: Timer/compteur 0

Jetez un oeil à la photo ci-dessus. Il s’agit de la décision des processus de prise de la « PC » quand certains en dehors de l’influence « interrompt » le flux de notre programme. La première chose elle le fait quand il reçoit un signal d’à l’extérieur qu’une interruption s’est produite est il vérifie pour voir si nous avons mis le « interrupt enable » bit pour ce type d’interruption. Si nous n’avons pas, alors il continue juste à exécuter notre ligne de code suivante. Si nous avons mis ce peu d’activer interruption particulière (afin qu’il y a un 1 dans cet endroit de bit au lieu de 0), il vérifie alors si oui ou non nous avons activé "globales interruptions", sinon il sera à nouveau aller à la ligne suivante du code et continuer. Si nous avons activé mondiale interrompt ainsi, elle va aller à l’emplacement de la mémoire programme de ce type d’interruption (tel qu’illustré dans le tableau 12-6) et exécuter toute commande nous avons placé là. Nous allons donc voir comment nous avons mis en place tout cela dans notre code.

La réinitialisation étiquetée de l’article de notre code commence par les deux lignes suivantes :

 Reset: ldi temp, 0b00000101 out TCCR0B, temp 

Comme nous le savons déjà, cette charge en temp (c.-à-d. R16) le nombre qui suit immédiatement, qui est 0b00000101. Puis il écrit ce nombre dans le registre appelé TCCR0B à l’aide de la commande « out ». Qu’est ce registre ? Eh bien, nous allons allez à la page 614 de la feuille de données. C’est au milieu d’un tableau récapitulant tous les registres. À l’adresse 0 x 25, vous y trouverez des TCCR0B. (Maintenant vous savez où la ligne "0 x 25, r16" est venu dans ma version non commentée du code). Nous voyons par le segment de code ci-dessus que nous avons défini le bit 0E et le 2ème bit et effacé tout le reste. En regardant le tableau, vous pouvez voir que cela signifie que nous avons mis CS00 et CS02. Laisse maintenant la tête sur le chapitre de la feuille de données appelé "8-bit Timer/Counter0 avec PWM". En particulier, allez à la page 107 de ce chapitre. Vous verrez la description même du Registre "Timer/compteur contrôle Register B" (TCCR0B) qui nous viens de voir dans le Sommaire du Registre tableau (donc nous pourrions sont venus tout droit ici, mais je voulais vous faire voir comment utiliser les tableaux récapitulatifs pour un usage ultérieur). La fiche technique continue à donner une description de chacun des bits dans ce registre et ce qu’ils font. Nous sauter tout ça pour l’instant et tourner la page de tableau 15-9. Ce tableau montre la « horloge sélectionnez Bit Description ». Maintenant regarder vers le bas de cette table jusqu'à ce que vous trouvez la ligne qui correspond aux bits qui nous vient de mettre dans ce registre. La ligne dit "clk/1024 du Prédiviseur)". Ce qui veut dire que nous voulons Timer/Counter0 (TCNT0) de cocher le long à un taux qui est la fréquence du processeur divisé par 1024. Puisque nous avons notre microcontrôleur alimenté par un oscillateur à quartz 16MHz cela signifie que le taux auquel notre processeur exécute les instructions est 16million instructions par seconde. Donc le taux auquel notre compteur TCNT0 cocheront est alors 16million/1024 = 15625 fois par seconde (essayez-le avec bits sélectionnez horloge différentes et voir ce qui se passe - n’oubliez pas notre philosophie?). Gardons le nombre 15625 dans le dos de notre esprit pour plus tard et passer aux prochaine de deux lignes de code :

 ldi temp, 0b00000001 sts TIMSK0, temp 

Cela définit le 0E bit d’un registre appelé TIMSK0 et efface tout le reste. Si vous jetez un oeil à la page 109 dans la feuille de données, vous verrez que TIMSK0 est synonyme de "Timer/compteur Interrupt Mask Register 0" et notre code a définir le bit 0E qui porte le nom TOIE0 qui signifie « Timer/Counter0 déborder Interrupt Enable »... Là ! Maintenant que vous voyez de quoi il s’agit. Nous avons maintenant le « interrupt enable bit défini » comme nous le souhaitions dans notre photo en haut de la première décision. Alors maintenant que nous avons à faire c’est permettre « interruptions globales » et notre programme sera en mesure de répondre à ces types d’interruptions. Nous permettra aux interruptions mondiales peu de temps, mais avant que nous fassions que vous pouvez avoir été confondu par quelque chose... Pourquoi diable utiliser la commande « sts » pour copier dans le registre de TIMSK0 au lieu de l’habituel "out" ?

Chaque fois que vous me voyez, utilisez une instruction que vous n’avez pas vu avant la première chose à que faire est à la page 616 dans la feuille de données. Il s’agit de le « Instruction Set Sommaire ». Maintenant trouver l’instruction « STS », qui est celui que j’ai utilisé. Il avoue qu’il faut un nombre compris entre un registre R (nous avons utilisé R16) et « Stocker directement au SRAM » emplacement k (dans notre cas, donnée par TIMSK0). Alors pourquoi avons-nous d’utiliser « sts », qui prend 2 cycles d’horloge (voir la dernière colonne dans le tableau) pour stocker en TIMSK0 et nous avons seulement besoin « out », qui prend le cycle d’horloge qu’un seul, pour stocker en TCCR0B avant ? Pour répondre à cette question, nous devons revenir à notre tableau récapitulatif Registre page 614. Vous voyez que le registre de TCCR0B est à l’adresse 0 x 25, mais aussi à droite (0 x 45) ? Cela signifie que c’est un registre de SRAM, mais c’est aussi un certain type de Registre appelé « port » (ou registre d’e/s). Si vous regardez le tableau récapitulatif de l’instruction à côté de la commande « out », que vous verrez qu’il peut prendre les valeurs des registres « travail » comme la R16 et les envoie à un PORT. Nous pouvons utiliser « out » en écrivant à TCCR0B et nous sauver un cycle d’horloge. Mais maintenant chercher le TIMSK0 dans la table de registre. Vous voyez qu’il a adresse 0x6e. C’est en dehors de la plage de ports (qui sont uniquement la première 0x3F emplacements de SRAM) et si vous avez à se replier à l’aide de la commande m et en tenant les deux cycles d’horloge du CPU pour le faire. Lisez la Note 4 à la fin de la tableau récapitulatif de l’instruction sur la page 615 dès maintenant. Avis que tous nos ports d’entrée et de sortie, comme PORTD sont également situés au bas de la table. Par exemple, est de type bit PD4 4 adresse 0x0b (maintenant que vous voyez où tous les trucs de 0x0b est venu dans mon code non commenté!)... bon, petite question : avez-vous changé les « m » pour « sortir » et voir ce qui se passe ? N’oubliez pas notre philosophie ! le casser ! Il suffit de ne prendre ma parole pour des choses.

Bon, avant de passer, passez à la page 19 dans la fiche technique pendant une minute. Vous voyez une image de la mémoire (SRAM). Les 32 premiers registres en SRAM (à partir de 0 x 0000 à 0x001F) sont les « registres de travail polyvalent » R0 par R31 que nous utilisons tout le temps en tant que variables dans notre code. Les prochain 64 registres sont l’i/o ports jusqu'à 0x005f (c'est-à-dire ceux nous parlions qui ont ces adresses non entre crochets à côté d’eux dans le registre de table qui nous pouvons utiliser la commande "out" au lieu de « m ») Enfin, la section suivante du SRAM contient tous les autres registres dans le tableau récapitulatif à l’adresse 0x00FF, et enfin le reste est SRAM interne. Maintenant rapidement, tournons-nous vers page 12 pour une seconde. On y voir un tableau des « usage général travail registres » que nous utilisons toujours comme nos variables. Vous voyez la ligne épaisse entre numéros de R0 à R15 et R16 à R31 ? Cette ligne est la raison pour laquelle nous utilisons toujours R16 que celui plus petit et je vais obtenir dedans un peu plus dans le prochain tutoriel où nous devrons également les trois registres de 16 bits adresse indirecte, X, Y et Z. Je n’obtiendrai dans cela tout de suite mais étant donné que nous n’avez pas besoin maintenant et nous sommes s’enliser assez ici.

Flip arrière une page à la page 11 de la feuille de données. Vous pourrez voir un diagramme du Registre SREG en haut à droite ? Vous voyez que le bit 7 de ce registre est appelé « I ». Maintenant, allez vers le bas de la page et lisez la description de Bit 7... Yay ! C’est le peu de permettre à interrompre Global. C’est ce que nous devons définir afin de passer à travers la deuxième décision sur notre schéma ci-dessus et interruptions de débordement timer/compteur dans notre programme. Si la ligne suivante de notre programme est la suivante :

 sbi SREG, I 

qui définit le bit appelé « I » dans le registre SREG. Cependant, au lieu de cela, nous avons utilisé l’instruction

 sei 

au lieu de cela. Ce bit est positionné si souvent dans les programmes qu’ils ont juste fait un moyen plus simple de le faire.

Très bien ! Maintenant, nous avons obtenu les interruptions de trop-plein prêt à aller pour que notre « overflow_handler de jmp » sera exécuté à chaqu’un se produit.

Avant de nous déplacer, prendre un coup d’oeil au registre SREG (Status Register) car il est très important. Lire ce que chacun des drapeaux représente. En particulier, de nombreux des instructions que nous utilisons seront mis et vérifier ces drapeaux de tous les temps. Par exemple, par la suite, nous allons en utilisant la commande « IPC » qui signifie « comparer immédiatement ». Jetez un oeil sur le tableau récapitulatif de l’instruction pour cette instruction et notez combien de drapeaux il définit dans la colonne « flags ». Ce sont tous les drapeaux dans SREG et notre code sera leur définition et leur contrôle constamment. Vous verrez des exemples peu de temps. Enfin, le dernier morceau de cette section de code est :

 clr temp out TCNT0, temp sbi DDRD,4 

La dernière ligne ici est assez évidente. Il définit simplement le bit 4 du registre de Direction des données pour PortD causant PD4 à la sortie.

Le premier définit la variable temp sur zéro et puis qui copie le registre de TCNT0. TCNT0 est notre Timer/Counter0. Il définit sur zéro. Dès que le PC exécute cette ligne le timer0 va commencer à zéro et compter à un taux de 15625 fois par seconde. Le problème est le suivant : TCNT0 est un enregistreur de « 8 bits » droite ? Donc, ce qui est le plus grand nombre un registre 8 bits pouvant contenir ? 0b11111111 bien est-il. C’est le nombre de 0xFF. Qui est 255. Si vous voyez ce qui se passe ? La minuterie est passer comme un éclair le long augmentant 15625 fois par seconde et chaque fois qu’il atteint 255 il « déborde » et revient à 0. En même temps qu’il va revenir à zéro, il envoie un signal de déborder interrompre la minuterie. Le PC se présente et vous savez ce qu’il fait par la droite maintenant ? Ouais. Il va à l’emplacement de la mémoire de programme 0 x 0020 et exécute l’instruction qu'il y trouve.

Formidable ! Si tu es toujours avec moi, alors vous êtes un super-héros infatigable ! Nous allons continuer à aller...

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 10

Tutoriel d’assembleur AVR 10

Bienvenue au didacticiel 10 !Désolé, qu'il a fallu si longtemps pour sortir cette nouvelle tranche mais c'est un moment assez intense de l'année. En tout cas, ici c'est !Nous avons parcouru un long chemin et vous êtes probablement déjà assez compéten
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
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