Disons que vous aviez un microcontrôleur assez simple et petit et que vous n'aviez ni interface, ni ordinateur, ni débogueur, compilateur ou assembleur. Pourriez-vous écrire votre code en assembleur, le convertir (manuellement) en code machine, puis appliquer l'alimentation aux broches appropriées à l'aide d'une source de tension?
Je comprends que vous auriez besoin d'E / S et de mémoire appropriées pour vraiment faire quoi que ce soit, mais si vous étiez si enclin et si vous aviez le temps, pourriez-vous faire cela? Je suppose que, historiquement, comment cela a-t-il été fait alors qu'il n'y avait pas d'ordinateur / compilateur / assembleur pour commencer? N'hésitez pas à me lier à une ressource extérieure. Merci! :)
Réponses:
Oui!
Le code peut être écrit "hors de votre tête" en binaire, si vous le souhaitez.
Il y a longtemps (très longtemps), c'est ainsi que j'ai commencé à utiliser (à l'époque) des microprocesseurs.
Mes amis et moi écrivions du code en langage assembleur, le compilions manuellement en code machine (quelque chose que vous pouvez faire "par inspection" après une certaine pratique), puis le saisissiez dans le processeur par divers moyens. Sur un système que nous avons construit, nous configurerions l'adresse sur les commutateurs binaires (on off) ou utiliserions une fonction d'incrémentation automatique du processeur, entrer 8 bits de données sur les commutateurs binaires, puis appuyer sur un commutateur "horloge" pour entrer les données en mémoire.
La fonctionnalité équivalente pourrait être obtenue avec encore moins de commutateurs sur un microcontrôleur moderne utilisant la programmation série SPI - voir ci-dessous.
Oui!
Mais ce serait incroyablement lent à faire!
De nombreux microcontrôleurs modernes permettent d'utiliser une interface "SPI" pour la programmation.
Il s'agit généralement de lignes de données d'entrée et de sortie et d'une ligne "d'horloge", et généralement d'une ligne de réinitialisation.
De nombreux processeurs permettent à l'horloge SPI et aux données d'être "statiques", ce qui signifie qu'il n'y a pas de limite sur le temps que vous pouvez prendre pour configurer les données entre les bits. Vous pouvez programmer un tel processeur en utilisant une ligne de données et une ligne d'horloge qui étaient pilotées par des commutateurs manuels. La ligne d'horloge doit être "sans rebond" - vous devez pouvoir la régler à un niveau élevé ou faible en une seule transition par opération - une interface minimale peut donc nécessiter une porte déclenchée par Schmitt. Vous pouvez "vous en tirer" avec juste un retard RC et un bouton-poussoir, mais une entrée déclenchée par Schmitt est plus sûre. La ligne de données n'a pas besoin d'être sans rebond car son état n'est lu qu'au bord de l'horloge.
Certaines interfaces sont interactives - les données sont émises par le processeur pendant la programmation (par exemple, sortie des données = MISO = entrée maître en sortie série sur les processeurs AVR). Pour lire ceci, vous devez ajouter, par exemple, une LED et une résistance (et peut-être juste un tampon ou un transistor si la capacité du lecteur était VRAIMENT faible).
MC6800:
De mémoire semi-évanouissante (près de 40 ans!)
LDI A, 7F $ ...... 86 7F ...... 1000 0110 0111 1111
STA, 1234 $ ...... B7 12 34 ... 1011 0111 0001 0010 0011 0100
LDI X, 2734 $ .. CE 27 34 ... 1100 1110 0010 0111 0011 0100
...
la source
À l'origine, dans les machines programmables, les programmes étaient perforés manuellement sur du papier ou des cartes. Plus tard, ils ont utilisé une sorte de machine à écrire pour faire le poinçonnage, et même plus tard, les ordinateurs (comme ils étaient connus à l'époque) pouvaient perforer leur propre bande de papier.
Il était, littéralement, assis là avec une carte et y faisait des trous manuellement.
Chaque colonne est une instruction ou un bit de données qui est interprété par la machine d'état du CPU pour effectuer des tâches.
Maintenant, bien sûr, c'est toute la mémoire flash, et oui, obtenir les données là-dedans en premier lieu nécessite normalement un ordinateur pour le faire. Mais ce n'est pas strictement vrai à 100%.
Après tout, que fait un programmeur informatique et matériel, sinon définir l'état des broches d'E / S au bon moment? Donc, si vous êtes vraiment assez masochiste, vous pouvez construire un système qui vous permet d'envoyer les bonnes instructions aux broches de programmation du microcontrôleur de la bonne manière pour installer certaines instructions dans la mémoire flash pour exécution.
Peut-être quelque chose impliquant beaucoup de commutateurs, des registres à décalage, un générateur d'horloge, etc.
Je me souviens qu'au collège, nous avions un nouveau système de programmation basé sur Z80 - une unité de la taille d'une valise avec un Z80, une petite quantité de RAM, un tas d'écrans LED à 7 segments et une grande rangée de commutateurs. Programmez-le en chargeant manuellement les instructions dans la RAM à l'aide des commutateurs.
la source
Vous avez dit "petit microcontrôleur et sans interface, sans ordinateur, sans débogueur, compilateur ou assembleur". Eh bien, vous pouvez vous passer de l'ordinateur, du débogueur, du compilateur ou de l'assembleur, mais vous devez avoir une sorte d'interface pour vous connecter au microcontrôleur afin de charger le programme.
Tout d'abord, oubliez les langages de haut niveau comme C. Ensuite, le moyen le plus simple est d'écrire votre programme en langage assembleur, mais n'utilisez pas l'assembleur pour le traduire en code machine. Recherchez plutôt chacune des instructions d'assemblage dans le manuel de programmation, trouvez leur codage hex équivalent et notez-le.
Vous devrez allouer vos propres variables, afin de pouvoir remplir les adresses appropriées dans la partie opérande des instructions. Oubliez également l'utilisation de la pile et du tas, trop de travail. Une fois terminé, vous aurez un programme machine qui peut être chargé directement dans la mémoire flash du microcontrôleur - aucun éditeur de liens n'est nécessaire non plus.
En raison du manque d'adresses externes et de bus de données sur presque tous les microcontrôleurs (car ils occuperaient trop de broches nécessaires aux ports d'E / S et aux périphériques), pratiquement tous les microcontrôleurs sont programmés via une interface spéciale comme celle-ci:
Normalement, le "programmeur" à gauche serait connecté à un PC, qui téléchargerait un fichier machine généré par un compilateur / éditeur de liens.
Cependant, si le programmeur a un clavier, comme celui ci-dessous:
alors on peut entrer les codes hexadécimaux d'un programme généré manuellement directement dans le programmeur, et programmer l'appareil sans avoir besoin d'un compilateur, d'un éditeur de liens ou d'un PC, ce qui était ce que vous demandiez. (Le clavier est également utilisé pour éditer des fichiers hexadécimaux et générer des sommes de contrôle.)
Certes, très peu de programmeurs ont des claviers comme celui-ci. Celui-ci ne conviendrait pas à un amateur car il coûte probablement quelques milliers de dollars.
Ce programmeur particulier programme des pièces avant de les placer sur une carte; des interfaces et des sockets sont disponibles pour plusieurs PIC et également pour les AVR Atmel.
la source
En pratique, quelque chose comme basculer manuellement les broches JTAG serait très sujet aux erreurs. Pour entrer un programme de n'importe quelle taille décente, il faudrait des milliers de basculements. Mais théoriquement, c'est possible.
Si vous êtes autorisé à préparer le microcontrôleur à l'avance (ou à y écrire une ROM de démarrage), vous pouvez facilement implémenter quelque chose comme les commutateurs à bascule externes utilisés sur les premiers mainframes. Si vous autorisez la logique externe, vous pouvez même utiliser un clavier hexadécimal pour accélérer les choses.
Enfin, bien que ce ne soit pas aussi courant de nos jours, vous pouvez acheter un microcontrôleur basé sur ROM avec du code personnalisé. Il faudrait offrir un peu d'argent à l'avance et garantir un certain volume, mais j'ai vu des clients le faire pour économiser de l'argent sur une production à volume élevé. Dans ce cas, aucun signal externe ne serait nécessaire pour programmer le microcontrôleur. Le code serait intégré à la disposition physique de la puce.
Bien sûr, vous pouvez également utiliser un microcontrôleur qui exécute du code à partir d'une interface de mémoire externe, mais c'est de la triche. :-)
la source
Absolument. En fait, le premier cours de microprocesseur que j'ai suivi (vers 87) a utilisé une carte Motorola 68000. Nous élaborerions le code dans l'assembly, rechercherions l'hexagone de l'assembly et saisirions l'hexagone dans un terminal pour programmer la carte. Si vous avez modifié, vous devez vous assurer que le code que vous avez entré est plus court que le code que vous remplacez, puis tamponner le reste avec des NOP. Si le coDE était plus long, il faudrait tout retaper! Nous avons appris à ajouter de nombreux NOP.
la source
Absolument. Une fois que vous avez un format binaire des instructions réelles (facile à faire pour des jeux d'instructions bien spécifiés), il vous suffit d'implémenter le protocole de programmation.
Par exemple, prenez quelque chose de petit comme un AVR Tiny 4 . La section 14 détaille l'interface de programmation, y compris le protocole et la couche physique. C'est relativement simple et vous avez juste besoin de quelques boutons et de résistances pull-up / down pour envoyer / recevoir un 1 ou un 0. Si vous vous sentez ambitieux, ajoutez des LED pour relire la sortie.
Le dernier problème restant est de savoir si vous pouvez le faire assez rapidement, ce qui heureusement * pour l'AVR Tiny 4 (section 16), il n'a pas de fréquence minimale quand il s'agit de le programmer.
* remarque: pour autant que la fiche technique le précise. Cela peut différer dans la réalité ... Je doute que quelqu'un ait essayé de le programmer à des vitesses d'horloge mHz.
N'hésitez pas à l'automatiser autant / peu de processus que vous le souhaitez. C'est ce que la plupart des appareils de programmation font de toute façon: automatiser le processus.
la source
Par quelque moyen que ce soit que vous entrez le programme dans l'UC, vous "interfacer" avec lui, parce que c'est ce que signifie l'interfaçage. Même un tas de commutateurs que vous actionnez manuellement sont une "interface".
Je traiterai donc cette question comme "comment puis-je m'interfacer avec une uC avec un matériel d'interfaçage largement -mécanique- (par opposition à électronique), et d'une manière aussi cool que possible?"
À laquelle ma réponse est, entrez le programme sous forme de rouleau de piano. La «barre de suivi» du piano roll d'un piano de joueur vous donne essentiellement au moins 65 bits (selon le format) que vous pouvez activer et désactiver indépendamment en fonction des perforations du papier. Le reste est un travail exigeant avec un couteau exacto. Mais au moins, votre programme, une fois exécuté, est (quelque peu) stocké en permanence (contrairement à une approche à bascule manuelle).
la source
Non seulement il est possible de programmer un microcontrôleur sans ordinateur, mais vous pouvez actuellement acheter un ordinateur spécialement conçu pour être programmé avec des interrupteurs à bascule matériels. Le kit s'appelle une carte de membre et il s'agit d'une recréation de l'ordinateur COSMAC Elf des années 1970. Le kit a été décrit dans un article récent du magazine IEEE Spectrum . Il est également possible de programmer des versions plus récentes de la carte de membre à partir d'un PC.
la source
D'accord. Que diriez-vous de cela: vous écrivez le programme dans l'assembleur et recherchez les opcodes vous-même, comme suggéré précédemment. Comment l'obtenir dans l'ordinateur: prenez un vieux lecteur de cassette, retirez la tête de lecture, mais laissez le cabestan et le galet presseur. Ce sera votre transport. Si vous avez un lecteur bobine à bobine, vous pouvez laisser la tête de lecture en place.
Prenez ensuite une bande de papier longue et étroite, ou mieux encore, du ruban transparent. C'est là que vous encodez votre programme. Vous utilisez autant de pistes que vous avez de broches à programmer. Sur une piste, vous mettez des points noirs à intervalles réguliers; c'est ton horloge. Sur les autres pistes, vous mettez des points ou des bandes noires et laissez des blancs en fonction des données et des signaux. Vous éclairez le tout et le détectez avec de petits phototransistors (ou vous allumez une LED sur la bande et détectez la lumière avec d'autres similaires) et pilotez les lignes d'horloge et de signal avec des transistors. Cela prend un peu d'espace sur le lecteur de bande, c'est pourquoi vous devrez peut-être retirer la tête de lecture.
Bien sûr, vous pouvez également encoder les signaux en audio, mais c'est un peu plus compliqué à décoder. Ou vous pouvez détecter la lumière réfléchie au lieu de la lumière transmise. Ou vous pouvez percer des trous dans du ruban noir ou du papier, au lieu de faire des marques noires sur du ruban transparent. Peu importe. Le lecteur de bande entraîne la bande à une vitesse constante, vous pouvez donc entrer un signal cadencé sans ordinateur.
la source
Oui. Le problème principal peut interagir avec l'interface de programmation. Si vous avez une adresse simple et un bus de données, les choses sont un peu plus faciles. Avez-vous déjà vu certains des premiers ordinateurs? Les programmes sont entrés une instruction à la fois dans la RAM avec des commutateurs à l'avant.
la source
Les mini-ordinateurs PDP-8 de Digital Equipment d'il y a 40 ans et plus n'avaient aucune capacité de démarrage automatique. Les programmes étaient généralement chargés à partir de bandes de papier perforées, mais le chargeur pour charger les bandes de papier devait être entré manuellement sur les commutateurs du panneau avant.
Sur les sites des clients Digital et PDP-8 tels que les OEM qui les utilisaient comme contrôleurs intégrés de la journée, il n'était pas rare que les utilisateurs mémorisent les chargeurs de démarrage et se concurrencent pour le temps le plus rapide pour entrer dans le démarrage chargeur dans la machine. Les machines utilisaient des mémoires à noyau magnétique (enfilées à la main dans des régions éloignées du monde, par des femmes aux doigts minuscules, utilisant des aiguilles et des fils fins).
Étant donné que le contenu de la mémoire magnétique est non volatile, les chargeurs de démarrage ont survécu à une mise hors tension et une entrée manuelle n'a été nécessaire qu'après l'assemblage initial, le chargeur a été effacé par un bug de programme ou un programme nécessaire pour utiliser l'espace du chargeur.
la source
La réponse est oui , vous pouvez programmer un microcontrôleur sans ordinateur, débogueur, etc. Ce dont vous auriez besoin serait de fournir les différentes tensions, données, horloge et séquences de programmation spécifiées par le fabricant uC (ce n'est pas une tâche facile).
la source