Je n'ai pas d'UART sur mon microcontrôleur, alors comment puis-je en ajouter un?

13

J'utilise un microcontrôleur ATMEGA32HVB qui a une fonction d'équilibrage des cellules par laquelle nous pouvons connecter 4 batteries en série et en utiliser une à la fois. C'est très utile pour la gestion de l'alimentation, donc je ne peux pas utiliser un microcontrôleur différent. Veuillez suggérer quelques méthodes pour y ajouter un UART afin que je puisse facilement m'interfacer avec des périphériques série.

user27475
la source
11
Le logiciel UART comme décrit par user26129 est appelé bit-banging .
Johan.A
4
Juste mon 0,02 $ très subjectif, mais je préfère généralement un contrôleur de batterie dédié distinct et un UART intégré à uC plutôt que l'inverse. Pourquoi avez-vous besoin de la gestion de la batterie intégrée à l'UC?
Mels
Je dois utiliser des piles rechargeables qui seront chargées à l'aide d'un panneau solaire, j'ai donc besoin de 4 batteries en série qui seront utilisées une à la fois
user27475
4
Une question est de savoir combien vous voulez utiliser l'UART et dans quelles directions. Si vous souhaitez uniquement générer un message de débogage ou d'état occasionnel, à un moment où votre processeur n'est pas soumis à une demande supplémentaire importante, la sortie série de frappe de bits peut sembler très attrayante. Il existe des mesures telles que l'utilisation d'interruptions à changement de broches qui peuvent également réduire la charge moyenne d'avoir un canal d'entrée, mais si vous prévoyez de recevoir des caractères à un débit élevé en bauds à un moment où vous avez d'autres engagements en temps réel, cela peut être un problème.
Chris Stratton

Réponses:

17

Comme d'autres l'ont noté, vous pouvez soit ajouter du matériel supplémentaire à votre système pour fournir la fonctionnalité UART, soit en émuler un dans le logiciel. Si vous contrôlez la conception globale du matériel et que l'ajout d'un autre CI est une option, je considérerais fortement l'approche basée sur le matériel. Vous pouvez certainement faire fonctionner un UART logiciel en utilisant le bit banging , mais vous ne voudrez peut-être pas consacrer les ressources du processeur à la génération du timing requis.

D'un coup d'œil à la fiche technique, il semble que votre microcontrôleur possède à la fois SPI et I2C (ce qu'Atmel appelle une interface à deux fils (TWI)). Ce seraient probablement les meilleures interfaces à utiliser pour connecter un UART externe. Ces appareils sont disponibles auprès d'un certain nombre de fabricants. Quelques exemples:

  • Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) propose une gamme de dispositifs UART SPI / I2C à 1 et 2 canaux, couvrant le ~ 1.6- Plage de fonctionnement de 3,3 V. Je n'ai utilisé aucune de ces pièces spécifiquement, mais j'ai utilisé des appareils Exar dans le passé (avec des interfaces de bus mémoire parallèles), et ils ont bien fonctionné.

  • NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ) propose une gamme de dispositifs SPI / I2C UART / IrDA / GPIO, également en 1 et 2 -des variétés de canaux sur plusieurs plages de tension. J'ai utilisé ces pièces (en particulier le SC16IS762) dans le passé avec beaucoup de succès.

  • Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ) possède les périphériques MAX3110E et MAX3111E, qui sont des UART connectés SPI. Une caractéristique unique de ces appareils est qu'ils disposent d'un pilote de ligne RS-232 intégré. Donc, si vous avez besoin que votre UART s'interface avec un périphérique qui utilise des tensions de ligne RS-232 au lieu de niveaux logiques (par exemple un PC), cela pourrait être utile, car cela vous évitera d'ajouter un autre CI de pilote de ligne à votre carte.

Jason R
la source
Wow, je ne savais pas que Maxim avait ces objets, j'aurais +2 si je le pouvais.
Tevo D
8

Vous devrez utiliser un pilote logiciel UART. Selon exactement ce que vous attendez de cet UART, vous pouvez utiliser l' AVR305 (extrêmement compact, mais aucune fonctionnalité au-delà du blocage de l'envoi / réception semi-duplex), l' AVR274 (piloté par interruption, assez complet), vous pouvez écrire votre propre pilote UART logiciel ou vous pouvez en utiliser un que vous trouvez sur Internet, par exemple en recherchant sur Google 'avr software uart'

user36129
la source
3

Une brève note sur la conception du logiciel "UART": il existe au moins des approches qualitativement différentes, selon les besoins:

  • Un pilote bit-bang "tout reprendre" désactivera toutes les interruptions et utilisera un code compté par cycle pour cadencer chaque bit. Pour recevoir des données avec un pilote "tout reprendre", lorsque le contrôleur arrive, le contrôleur ne fait rien d'autre que l'attendre.

  • Un pilote bit-bang "take over main loop" se comportera un peu comme ci-dessus, sauf qu'il utilisera une ressource de temporisation pour les synchronisations de bits plutôt que pour le comptage de cycles. Les interruptions qui ne prennent pas trop de temps à réparer peuvent être laissées activées. Pour la transmission série, la ressource de temporisateur à débit fixe peut être partagée avec d'autres objectifs; pour la réception en série, cependant, le pilote bit-bang devra être capable de recharger le temporisateur lorsque le bit de début arrive afin de le faire expirer au milieu de chaque temps de bit entrant.

  • Un pilote bit-bang entièrement déclenché par interruption utilise un minuteur à taux fixe qui s'exécute de préférence à un multiple du débit de données (3x et 5x valent mieux que 4x) et fait tout par le biais de ce minuteur. Un tel pilote peut fonctionner simultanément avec tout le reste, mais nécessitera un processeur plus rapide que les anciens types de pilotes.

Pour éviter que les deux premiers styles de contrôleur n'attendent indéfiniment des données qui pourraient ne jamais arriver, il est courant que les routines de lecture incluent une valeur de délai. Notez que si la boucle d'un contrôleur fait par exemple "obtenir un octet en attendant jusqu'à 100 ms, faites d'autres choses si aucune ne vient, puis obtenez l'octet suivant, etc." et un octet arrive entre le moment où la routine "get" expire et le contrôleur recommence à attendre, cet octet sera perdu; l'appareil avec lequel il communique devra s'attendre à cette possibilité.

Seul le troisième style de pilote pourra gérer la possibilité qu'un octet de données commence à arriver alors qu'un octet de données est en cours de transmission. Les deux premiers styles peuvent cependant être utilisés pour certains protocoles de communication full-duplex full-speed si le contrôleur ne doit parler que lorsque vous lui parlez. L'astuce consiste à avoir une routine de "lecture et d'écriture des données" qui attendra un bit de démarrage entrant, et lorsque l'un est détecté chevauche une lecture et une écriture de telle sorte que le contrôleur envoie chaque bit au moment où il s'apprête à examiner les données entrantes. Une fois que le contrôleur détecte le bit de démarrage entrant, il saura exactement quand il devra rechercher les 8 bits de données et le bit d'arrêt suivants, et saura ainsi qu'il peut utiliser en toute sécurité le temps entre pour sortir ses propres données.

Une note de séparation: un contrôleur qui utilise l'un des deux premiers styles de bit-bang uart pour recevoir des données doit traiter chaque octet de données avant le front descendant du bit de début de l'octet suivant pour éviter la perte de données. Si le contrôleur sait que le traitement prendra au moins un demi-temps, il peut maximiser le temps disponible pour le traitement en acceptant chaque octet dès qu'il a récupéré le dernier bit de données, plutôt que d'attendre le bit d'arrêt. Cependant, comme moyen supplémentaire de donner plus de temps au contrôleur, il peut être utile d'avoir l'appareil qui lui donne des données à transmettre avec deux bits d'arrêt plutôt qu'un. Si "marquer la parité" peut être configuré, cela ajoutera un autre temps de bit supplémentaire. La transmission, par exemple au 115200-8-M-2, permettra un temps de traitement plus long que le 57600-8-N-1, même si elle alimentera les données plus de 1,6 fois plus rapidement.

supercat
la source
1

Vous pouvez simplement utiliser la broche d'E / S de l'UC. Seule chose lorsque vous changez ou transférez des données sur ces broches, vous devez avoir une fréquence de broches double de la vitesse de transmission. C'est ainsi que l'UART fonctionne normalement, il échantillonnera le signal binaire au milieu.

nitine
la source