ATTiny USI I2C Introduction - une interface de communication puissant, rapide et pratique pour vos projets ATTiny ! (7 / 8 étapes)

Étape 7: Implémentation du Code ATTiny USI I2C - USI I2C esclave

à la différence du code maître, le code de l’USI I2C esclave (usi_i2c_slave.c/h) est mis en œuvre presque entièrement en utilisant les interruptions de l’USI.  Comme mentionné précédemment, le module de l’USI a deux interruptions, celui généré lors de la détection d’une condition de départ et l’autre sur le dépassement de capacité du compteur 4 bits.  Le compteur est crucial pour le code de l’esclave fonctionne correctement et n’était pas très bien expliqué dans le code que j’ai lu et tutoriels.  À l’image de l’organigramme, j’ai noté des numéros pour chaque État de la logique.  Ces numéros (8, 1 et 0) sont comte compteur valeurs indiquant combien les tiques le compteur doivent compter avant de passer à l’état suivant.  Comme le compteur est cadencé à l’aide d’horloges SCL, ces valeurs indiquent combien SCL impulsions d’horloge doivent apparaître devant l’état suivant.  En général, quelque chose qui attend 8 impulsions d’horloge est en attente sur l’émission/réception d’un octet de données tandis que quelque chose qui attend 1 impulsion d’horloge attend d’émission/réception d’un ACK/NACK.  Quelques petites choses attendent 0 horloges, ce qui signifie que les symptômes persistent à l’état suivant instantanément ou font partie élargie de l’état précédent (dans le cas de l’écriture ou de lecture?).

Alors, comme un utilisateur final, vous êtes probablement plus intéressés à la façon d’interfacer la bibliothèque à votre propre code !  C’est facile, et Voici pourquoi.  J’ai fait disparaître les tampons de réception/émission qui ont été utilisés dans d’autres implémentations de USI I2C (principalement ceux basés sur AVR312 app-note) et au lieu de cela mis en place le Registre protocole bancaire décrit au début de ce tutoriel.  La Banque est stockée sous forme de tableau de pointeurs, pas les valeurs de données, donc vous devez joindre des variables locales dans votre code à des adresses de mémoire dans l’I2C registre banque en définissant les pointeurs pour pointer vers votre variables.  Cela signifie que votre code de la canalisation principale ne doit jamais un sondage I2C tampons ou gérer des arrivées de données, les valeurs sont mises à jour instantanément chaque fois qu’ils arrivent.  Il permet également aux variables de programme à être interrogé à tout moment par l’interface I2C sans affecter le code de la canalisation principale (autre que le retard en raison de l’interruption).  Il s’agit d’un système assez soigné.  Prenons encore un exemple bref.

Par exemple, disons que nous avons un générateur PWM logiciel très basique qui est le moteur une LED.  Nous voulons être en mesure de changer la valeur PWM (d’une valeur de 16 bits, juste pour le plaisir de connaître de pointeurs) sans faire la boucle principale compliquée.  Grâce à la magie du asynchrone I2C esclave, nous pouvons faire exactement cela !

#include « usi_i2c_slave.h »

Définir une référence à la matrice de pointeur I2C esclave registre banque
extern char * USI_Slave_register_buffer [] ;

int main()
{
Créer de la valeur PWM 16 bits
unsigned int pwm_val = 0 ;

Assigner l’octet de poids faible valeur pwm à I2C interne adresse 0 x 00
Assigner l’octet haut de valeur pwm à I2C interne adresse 0 x 01
USI_Slave_register_buffer [0] = (unsigned char *) & pwm_val ;
USI_Slave_register_buffer [1] = (unsigned char *)(&pwm_val) + 1 ;

Initialiser l’I2C esclave avec l’adresse du périphérique esclave 0 x 40
USI_I2C_Init(0x40) ;

Mis en place des broches A0 en sortie pour LED (nous supposerons que quelque puce nous sommes a broches A0 disponible)
DDRA | = 0 X 01 ;

while(1)
{
PORTA | = 0 X 01 ; Allumer la LED
pour (unsigned int i = 0; i < pwm_val; i ++)
{
PORTA & = ~ (0 x 01) ; Éteindre la LED
}
}
}

Et là vous l’avez !  La boucle principale ne fait aucune référence à I2C du tout, mais sur l’envoi d’une valeur PWM à l’emplacement de 16 bits I2C interne adresse 0 x 00/0 x 01, nous pouvons contrôler totalement le PWM de la LED !  Pour plus de stabilité (pour s’assurer que seules les valeurs de pointeur que vous utilisez sont disponibles et pour empêcher les pointeurs errants) je vous suggère de changer le #define USI_SLAVE_REGISTER_COUNT comme le nombre de pointeurs de registre dont vous avez besoin, ni plus, ni moins.  Lorsqu’un accès (lecture ou écriture) est tenté sur un index de registre en dehors de la plage 0 x 00 à USI_SLAVE_REGISTER_COUNT - 1, rien n’est écrit et zéro est retournée.

Articles Liés

Arduino Solar Shield - une source solaire DIY pour vos projets sans attendre pour les PCB

Arduino Solar Shield - une source solaire DIY pour vos projets sans attendre pour les PCB

cette instructable est une version basique de Bley Joel ("il est 09:00 le samedi, la foule ordinaire doit lire aléatoirement dans") Bouclier solaireet cela devrait fonctionner pour la plupart arduinos.  Je l'ai testé avec Arduino Pro de SparkFun
Comment faire une Cascade à peu de frais 80 poissons filtrent pour vos amis louche

Comment faire une Cascade à peu de frais 80 poissons filtrent pour vos amis louche

je suis fatigué de payer un ensemble-lotta-comptant pour mes filtres poissons Cascade 80 que j'avais pour remplacer toutes les deux semaines. Alors j'ai décidé de faire mon propre, utilisation de four à vent couvre, charbon actif et et un filtre usag
Arduino contrôlée stores automatisés avec une interface utilisateur Web

Arduino contrôlée stores automatisés avec une interface utilisateur Web

cette instructable est un guide détaillé sur la façon de construire un contrôleur automatisé pour exécuter un moteur pouvant fonctionner à l'ouverture et la fermeture des stores. Le contrôleur permet les blinds ouvrir et fermer basé sur un calendrier
PC sous contrôle Robot Bluetooth (avec une interface graphique utilisateur!)

PC sous contrôle Robot Bluetooth (avec une interface graphique utilisateur!)

Dans ce Instructable je vais vous montrer comment construire un robot qui est contrôlé par l'intermédiaire de Bluetooth à l'aide d'un clavier, dispose d'une interface utilisateur graphique construite avec traitement qui affiche l'entrée au clavier et
AVRSH : Une interface d’interprète de commande pour Arduino/AVR.

AVRSH : Une interface d’interprète de commande pour Arduino/AVR.

Jamais voulu être « connecté » à votre Microcontrôleur AVR ? Jamais pensé que ce serait cool de « chat » un registre pour voir son contenu ? Avez-vous toujours voulu un moyen d'allumer et éteindre les différents sous-systèmes périphériques de votre A
DIDI : Une Interface MIDI portable pour une utilisation DJ

DIDI : Une Interface MIDI portable pour une utilisation DJ

Arrière-planDIDI a été mon projet de dernière année de mon baccalauréat en technologie musicale et électronique appliquée à l'Université de York. Mon défi était de créer une pièce de musique portable technologie. Ayant eu quelque expérience avec DJ d
Interface de communication 1-wire

Interface de communication 1-wire

ce qui est de la technologie 1-Wire ?La base de la technologie 1-Wire est un protocole série en utilisant une référence de ligne plus au sol de données unique pour la communication. Master 1-Wire lance et contrôle la communication avec un ou plusieur
TapTunes - une Interface Tap à iTunes

TapTunes - une Interface Tap à iTunes

dans le cadre de mon projet à terme Human-Computer Interaction, je fouette un petit programme qui permettrait aux utilisateurs de contrôler iTunes en cliquant sur les différents modèles sur un capteur piézoélectrique.  La base de ce projet était le K
Début microcontrôleurs partie 2: Création d’une Interface SPI du programmateur au microcontrôleur

Début microcontrôleurs partie 2: Création d’une Interface SPI du programmateur au microcontrôleur

Bonjour, nous espérons que vous avez apprécié la partie 1 de début de microcontrôleurs. Nous allons avancer dans la partie 2 et de commencer à parler sur les interfaces et comment obtenir votre microcontrôleur pour communiquer avec un ordinateur.Donc
Cubecube : Une Interface Tangible CAD.

Cubecube : Une Interface Tangible CAD.

Cubecube - un projet open source hardware - est une interface tactile tangible pour la CAO (conception assistée par ordinateur.) Design open source plateformes continuent d'émerger, il est l'occasion d'explorer de nouvelles possibilités dans la façon
Introduction à une tension de la courroie numérique jauge.

Introduction à une tension de la courroie numérique jauge.

Car j'ai plus ou moins fait entretien complet sur le mien, j'ai toujours voulu une tension de la courroie numérique jauge pour vous assurer que mes ceintures accessoires ont été installés correctement. Arrive alors le btt2880 de landtek que j'ai vu s
Comment faire une boîte commune

Comment faire une boîte commune

qui lit mon profil peut vous l'aviez remarqué que pour travailler le bois est le premier sur ma liste d'intérêts. Alors, où sont tous les articles de menuiserie ? Toujours est-il que je ne document souvent ces projets. Faire des joints à emboîtement
Chauffage avec VSCP et une interface web de la maison

Chauffage avec VSCP et une interface web de la maison

Mes parents sont retraités et vivent dans le sud de la France. Chauffer pendant l'été, mais il peut aussi être froid en hiver.Ils utilisent pour voyager pendant plusieurs semaines au cours de l'hiver pour visiter des amis et famille, et qu'ils chauff
Interface d’ordinateur de mains-libres bricolage pour moins de 200 $: oculomètre + EMG + Arduino

Interface d’ordinateur de mains-libres bricolage pour moins de 200 $: oculomètre + EMG + Arduino

Dans l'ensemble, il s'agit d'un projet génial, cool et en fait sorte de pratique ! (Tri-force de pouvoir!!!) Mais pour de vrai, à la fin de la journée, vous apprendrez comment faire tant de choses et d'avoir quelques technologie de fine pointe sur vo