Potresti programmare un microcontrollore senza un computer?


16

Supponiamo che tu abbia un microcontrollore piuttosto semplice e piccolo e che non abbia avuto interfacce, computer, debugger, compilatore o assemblatore. Potresti scrivere il codice nell'assembly, convertirlo (manualmente) in codice macchina e quindi applicare l'alimentazione ai pin appropriati utilizzando una sorgente di tensione?

Capisco che avresti davvero bisogno di I / O e memoria adeguati fare qualsiasi cosa, ma se tu fossi così incline e avessi il tempo, potresti farlo? Immagino, storicamente, come è stato fatto quando all'inizio non c'erano computer / compilatori / assemblatori? Sentiti libero di collegarmi a una risorsa esterna. Grazie! :)


3
Dai un'occhiata all'Altair 1. Gli interruttori del pannello frontale e la programmazione manuale della macchina erano l' unico modo per usarlo.
pjc50,

@ pj50 Ha chiesto di un microcontrollore, non di un microprocessore. I microcontrollori eseguono il loro codice nel nostro flash, che non è accessibile senza un'interfaccia di qualche tipo.
tcrosley,

Di quante unità programmate hai bisogno? Molti produttori forniranno i loro micro preprogrammati con il tuo codice; tuttavia, questo non è pratico se hai bisogno di meno di una bobina completa.
Oleg Mazurov,

2
Negli anni '70 avresti creato un pannello di interruttori a levetta e luci per poter accedere al programma. Non ho mai lavorato con uno dei primi microcontrollori, ma ho lavorato con diversi microprocessori, ed è così che lo hai fatto, per impostazione predefinita. E non vi era alcuna differenza fondamentale tra i primi microcontrollori e microprocessori oltre alle funzionalità I / O e alcuni dettagli su come era configurata la memoria del programma.
Hot Licks

Lascio questo come commento perché non riesco a trovare la fonte per questa storia. Ricordo un po 'di tempo fa la storia di un bambino che progettava e costruiva il proprio computer (proprio la CPU) da transistor per una fiera della scienza basata esclusivamente sulla sua comprensione della logica digitale. Non poteva permettersi un computer in quel momento e programmò la sua creazione tramite interruttori a levetta (penso di ricordare l'orologio per la cosa essendo solo un pulsante). Uno dei giudici è stato così colpito che ha comprato al bambino un computer.
slebetman,

Risposte:


37

Potresti scrivere il tuo codice nell'assembly, convertirlo (manualmente) in codice macchina,

Sì!
Il codice può essere scritto "fuori di testa" in binario, se lo si desidera.
Molto (molto lungo) fa è così che ho iniziato a usare (poi) i microprocessori.
Io e i miei amici scriveremmo il codice nel linguaggio assembly, lo compileremmo manualmente nel codice macchina (cosa che si può fare "mediante ispezione" dopo un po 'di pratica), quindi inserirlo nel processore in vari modi. Su un sistema che abbiamo creato avremmo impostato l'indirizzo su interruttori binari (on off) o utilizzato una funzione di incremento automatico del processore, immettendo 8 bit di dati su interruttori binari e quindi premendo un interruttore "clock" per inserire i dati in memoria.

La funzionalità equivalente potrebbe essere raggiunta con un numero ancora inferiore di interruttori su un moderno microcontrollore mediante la programmazione seriale SPI - vedere di seguito.

... e quindi alimentare i pin appropriati usando una fonte di tensione?

Sì!
Ma sarebbe incredibilmente lento da fare!
Molti microcontrollori moderni consentono l'uso di un'interfaccia "SPI" per la programmazione.
In genere si tratta di righe di dati di input e output e di una riga "clock" e di solito di una riga di reset.

Molti processori consentono all'orologio SPI e ai dati di essere "statici", il che significa che non vi è alcun limite al tempo necessario per impostare i dati tra i bit. È possibile programmare un tale processore utilizzando una linea dati e una linea di clock gestite da switch gestiti manualmente. La linea di clock deve essere "senza rimbalzo" - è necessario essere in grado di impostarla su alta o bassa in una singola transizione per operazione - quindi potrebbe essere necessario che un'interfaccia minima includa un gate attivato da Schmitt. Puoi "cavartela" solo con un ritardo RC e un interruttore a pulsante, ma un ingresso innescato Schmitt è più sicuro. Non è necessario che la riga di dati sia libera da rimbalzi poiché il suo stato viene letto solo sul bordo dell'orologio.

Alcune interfacce sono interattive: i dati vengono emessi dal processore durante la programmazione (ad es. Dati in uscita = MISO = Master In Serial Out su processori AVR). Per leggere questo, è necessario aggiungere ad esempio un LED e un resistore (e forse solo un buffer o un transistor se la capacità del convertitore era VERAMENTE bassa).


MC6800:

Dalla memoria semi-sbiadita (quasi 40 anni!)

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
...


1
+1 per menzionare il design statico, consentendo all'orologio di arrivare fino a DC.
pericynthion,

2
Questo riporta ricordi. In realtà ho imparato a inserire il codice Z80 usando i pulsanti a scuola. Era intorno al 1990. Il mio insegnante ha insistito sul fatto che imparare la programmazione nel modo più duro è prezioso. 25 anni dopo devo essere d'accordo.
Nils Pipenbrinck,

@NilsPipenbrinck In questo momento sto scrivendo il codice C e applicando le lezioni che ho imparato per la prima volta con Fortran :-) !!! - e che sono stati poi perfezionati con sistemi embedded e linguaggio assembly. Queste lezioni riducono la possibilità di errori applicando la digitazione mentale agli accessi variabili e alle porte che altrimenti potrebbero fare cose che sono consentite ma non desiderate o utili. L'assemblatore è l'arma affilata per eccellenza: un'arma a doppio attacco senza protezioni per le mani. Dopo quel "livello superiore" le lingue sembrano meno nitide :-). La voce del pulsante Z80 agisce in modo simile sulle tue esperienze di apprendimento ;-).
Russell McMahon

@Erbureth Grazie :-). Sì, ffff per 1111 era evidente dissolvenza cerebrale. ... era solo "hai capito" ma completare la linea non fa male.
Russell McMahon,

Sì, ho avuto l'idea, ma quando ci sono stato ... :)
Erbureth dice Reinstate Monica il

10

Inizialmente, nelle macchine programmabili, i programmi venivano punzonati manualmente su nastro di carta o carte. Più tardi usarono una specie di macchina da scrivere per fare i pugni, e anche più tardi i computer (come ormai erano conosciuti) potevano perforare il loro nastro di carta.

Era, letteralmente, seduto lì con una carta e facendo manualmente buchi in essa.

inserisci qui la descrizione dell'immagine

Ogni colonna è un'istruzione o un bit di dati che viene interpretato dalla macchina a stati della CPU per eseguire attività.

Ora, se ovviamente è tutta memoria flash, e sì, ottenere i dati lì in primo luogo normalmente richiede un computer per farlo. Ma questo non è rigorosamente vero al 100%.

Dopotutto, cosa fa un programmatore di computer e hardware se non impostare lo stato dei pin IO al momento giusto? Quindi, se sei abbastanza masochista, puoi costruire un sistema che ti consenta di inviare le giuste istruzioni ai pin di programmazione del microcontrollore nel modo giusto per installare alcune istruzioni nella memoria flash per l'esecuzione.

Forse qualcosa che coinvolge molti interruttori, alcuni registri a scorrimento, un generatore di clock, ecc.

Ricordo che al college avevamo un nuovo sistema di programmazione basato su Z80: un'unità delle dimensioni di una valigia con uno Z80, una piccola quantità di RAM, un gruppo di display a LED a 7 segmenti e una grande fila di interruttori. Programmalo caricando manualmente le istruzioni nella RAM usando gli switch.


La Z80 non è un esempio valido. Ha chiesto di un microcontrollore, non di un microprocessore. I microcontrollori eseguono il loro codice nel nostro flash, che non è accessibile senza un'interfaccia di qualche tipo. Almeno hai menzionato Flash e un'interfaccia di programmazione altrove nella tua risposta.
Tcrosley,

@tcrosley Lo Z80 era più per scopi aneddotici - illustrando come i computer erano programmati prima che Visual Studio portasse via tutte le competenze.
Majenko,

Mentre non sono a conoscenza di macchine costruite per farlo, non sarebbe difficile aggiungere alcuni circuiti a un lettore di schede per programmare un microcontrollore con codice memorizzato su una sequenza di carte. Il nastro di carta potrebbe essere più pratico, però.
supercat

2
Ero solito fare buchi manualmente in quelli. È fattibile solo in circostanze estreme (10pm, documenti a termine per domani, una corsa al mainframe a sinistra, signora del punch room lasciata per il giorno). La programmazione dello stesso mainframe dal pannello frontale (un paio d'anni dopo) è stata in realtà più veloce.
Oleg Mazurov,

1
@Majenko - Ho visto la ricostruzione della macchina di Babbage, e sicuramente non è stata realizzata con apparecchiature telefoniche. Sicuramente rumoroso, però.
Hot Licks

7

Hai detto "piccolo microcontrollore e senza interfaccia, computer, debugger, compilatore o assemblatore". Bene, puoi cavartela senza computer, debugger, compilatore o assemblatore, ma devi caricare una sorta di interfaccia per connetterti al microcontrollore per caricare il programma.

Prima di tutto, dimentica qualsiasi linguaggio di alto livello come C. Quindi il modo più semplice è scrivere il tuo programma in linguaggio assembly, ma non usare l'assemblatore per tradurlo in codice macchina. Invece, cerca ciascuna delle istruzioni di assemblaggio nel manuale di programmazione, trova la loro codifica esadecimale equivalente e scrivila.

Dovrai allocare le tue variabili, in modo da poter inserire gli indirizzi appropriati nella parte dell'operando delle istruzioni. Dimentica anche l'uso dello stack e dell'heap, troppo lavoro. Al termine, avrai un programma macchina che può essere caricato direttamente nella memoria flash del microcontrollore, senza bisogno di linker.

A causa della mancanza di indirizzo esterno e bus dati su quasi tutti i microcontrollori (poiché occuperebbero troppi pin necessari per le porte e le periferiche I / O), praticamente tutti i microcontrollori sono programmati tramite un'interfaccia speciale come questa:

inserisci qui la descrizione dell'immagine

Normalmente il "programmatore" a sinistra verrebbe collegato a un PC, che scarica un file macchina generato da un compilatore / linker.

Tuttavia, se il programmatore ha una tastiera, come quella qui sotto:

inserisci qui la descrizione dell'immagine

quindi si possono inserire i codici esadecimali per un programma generato manualmente direttamente nel programmatore e programmare il dispositivo senza bisogno di un compilatore, linker o PC che era ciò di cui si stava chiedendo. (La tastiera viene anche utilizzata per modificare file esadecimali e generare checksum.)

Concesso pochissimi programmatori hanno tastiere come questa. Questo non sarebbe adatto per un hobbista in quanto probabilmente costa un paio di migliaia di dollari.

Questo particolare programmatore programma le parti prima che vengano messe su una scheda; interfacce e socket sono disponibili per diversi PIC e anche per AVR Atmel.


5
Hai commentato varie altre risposte sulla loro invalidità, ma questa risposta è probabilmente meno valida della maggior parte delle quali hai commentato. Ha detto "... nessuna interfaccia, nessun computer, ...". Come minimo la tua soluzione è "un computer". Ciò che significa "nessuna interfaccia" è il moot. Ma usa alcuni switch debounce sull'interfaccia SPI e probabilmente hai una soluzione.
Russell McMahon,

1
@RussellMcMahon Chi dice che c'è un computer nel programmatore? Molti di loro usano solo FPGA (che potrebbero essere sostituiti da una logica discreta). Come programmerai un microcontrollore tramite un'interfaccia SPI, a meno che non abbia un bootloader? In tal caso, come si programma il bootloader?
Tcrosley

3
L'interfaccia di programmazione seriale a bassa tensione standard essenzialmente essenzialmente bootloader su molti (forse la maggior parte) microcontrollori utilizza alcune linee in un'interfaccia essenzialmente seriale. MOSI MCLK (Vdd Gnd Reset) essendo il minimo MISO in caso di interazione. 3 interruttori (solo uno dei quali) deve essere privo di rimbalzo) e un LED per MISO e "sei spento". Molto molto molto lentamente. Se un FPGA non può essere considerato un "computer", non sarebbe un problema implementare molti sistemi basati su processori. Sospetto che "nessuna logica combinatoria" avrebbe incontrato lo spirito della sua richiesta.
Russell McMahon,

Devo dire che i fuochi d'artificio sono lo sfondo sbagliato da usare quando si lavora con apparecchiature elettroniche :)
Anonimo Penguin

6

In pratica, qualcosa come l'attivazione manuale dei pin JTAG sarebbe soggetto a errori. Inserire un programma di qualsiasi dimensione decente richiederebbe migliaia di interruttori. Ma in teoria è possibile.

Se ti è permesso preparare in anticipo il microcontrollore (o scrivere una ROM di avvio per esso), potresti facilmente implementare qualcosa come gli interruttori a levetta esterni utilizzati sui primi mainframe. Se si consente la logica esterna, è anche possibile utilizzare una tastiera esadecimale per accelerare le cose.

Infine, anche se al giorno d'oggi non è così comune, è possibile acquistare un microcontrollore basato su ROM con codice personalizzato. Dovresti offrire un po 'di soldi in anticipo e garantire un certo volume, ma ho visto i clienti farlo per risparmiare denaro sulla produzione ad alto volume. In tal caso, non sarebbero necessari segnali esterni per programmare il microcontrollore. Il codice verrebbe incorporato nel layout fisico del chip.

Ovviamente, puoi anche usare un microcontrollore che esegue il codice da un'interfaccia di memoria esterna, ma è un imbroglio. :-)


2
In effetti, ho costruito un "clone" Imsai 8800 nel 1976/77 e lo avrei programmato abitualmente in binario usando gli interruttori a levetta. Avevo una sequenza di caricamento di avvio che era di circa 40 o 60 byte dispari (era una vita fa!) Che leggeva un papertape dal mio teletipo ASR-33 e mi portava su un monitor da tastiera. Prima che il teletipo funzionasse, avrei programmato l'8085 (una delle differenze tra il mio "clone" e l'Imsai) rigorosamente in binario. Ma quello era in parallelo, con una fila di interruttori. Ho usato una chiave telegrafica per eseguire la codifica seriale ed è DAVVERO soggetto a errori, come ha affermato Adam.
user6297

3

Assolutamente. In effetti, il primo corso a microprocessore che ho seguito (circa 87) ha utilizzato una scheda Motorola 68000. Elaboravamo il codice nell'assembly, cercavamo l'esagono per l'assemblaggio e digitavamo l'esagono in un terminale per programmare la scheda. Se hai modificato, dovevi assicurarti che il codice inserito fosse più corto del codice che stavi sostituendo, quindi bufferizzare il resto con i NOP. Se il coDE fosse più lungo, dovresti digitare nuovamente tutto! Abbiamo imparato ad aggiungere molti NOP.


Il 68000 non era un microcontrollore. Ha chiesto di un microcontrollore, non di un microprocessore. I microcontrollori eseguono il loro codice nel nostro flash, che non è accessibile senza un'interfaccia di qualche tipo.
Tcrosley,

5
@tcrosley Non è strettamente vero. Esistono microcontrollori che richiedono ROM esterne poiché non dispongono di ROM o Flash propri. Ciò che li rende un microcontrollore non è incorporato nella RAM o nella ROM, ma nelle periferiche integrate (porte IO, UART, ecc.).
Majenko,

Pochissimi però - a causa delle periferiche di I / O che hai appena citato, pochissimi hanno bus di indirizzo e dati esterni perché richiedono due molti pin.
Tcrosley,

2

Assolutamente. Una volta che hai un formato binario delle istruzioni effettive (facile da fare per set di istruzioni ben specificate), tutto ciò che serve è implementare il protocollo di programmazione.

Ad esempio, prendi qualcosa di piccolo come un AVR Tiny 4 . La sezione 14 descrive in dettaglio l'interfaccia di programmazione incluso il protocollo e il livello fisico. È relativamente semplice e hai solo bisogno di alcuni pulsanti e resistori pullup / down per inviare / ricevere un 1 o uno 0. Se ti senti ambizioso, aggiungi alcuni LED per rileggere l'output.

L'ultimo problema rimanente è se riesci a farlo abbastanza velocemente, che per fortuna * per AVR Tiny 4 (sezione 16), non ha alcuna frequenza minima quando si tratta di programmarlo.

* nota: per quanto specificato nella scheda tecnica. Questo può differire nella realtà ... Dubito che qualcuno abbia provato a programmarlo a velocità di clock in mHz.

Sentiti libero di automatizzare tutto il processo / quanto desideri. Questo è ciò che fa comunque la maggior parte dei dispositivi di programmazione: automatizzare il processo.


2

Indipendentemente dal modo in cui si immette il programma nell'UC, ci si "interfaccia" con esso, perché questo è ciò che significa interfacciarsi. Anche un sacco di interruttori che lanci manualmente sono una "interfaccia".

Quindi tratterò questa domanda come "come posso interfacciarmi con un uC con hardware di interfaccia largamente meccanico (piuttosto che elettronico) e nel modo più cool possibile?"

A cui è la mia risposta, inserisci il programma come piano roll. La "barra del tracker" del piano roll di un piano del lettore fornisce fondamentalmente almeno 65 bit (a seconda del formato) che è possibile attivare e disattivare in modo indipendente in base alle perforazioni nella carta. Il resto è un lavoro impegnativo con un coltello Exacto. Ma almeno il tuo programma, una volta avviato, è (in qualche modo) memorizzato in modo permanente (a differenza di un approccio flip-the-switch-manual).


2

Non solo è possibile programmare un microcontrollore senza un computer, ma oggi è possibile acquistare un computer appositamente progettato per essere programmato con interruttori a levetta hardware. Il kit si chiama tessera associativa ed è una ricostruzione del computer elfo COSMAC degli anni '70. Il kit è stato descritto in un recente articolo sulla rivista IEEE Spectrum . È anche possibile programmare versioni più recenti della tessera associativa da un PC.


2

Va bene. Che ne dici di questo: scrivi il programma in assembler e cerchi tu stesso i codici operativi, come suggerito in precedenza. Come ottenerlo sul computer: prendi un vecchio riproduttore, rimuovi la testina di riproduzione, ma lascia il cabestano e il rullo di presa. Questo sarà il tuo trasporto. Se si dispone di un lettore bobina a bobina, è possibile lasciare la testina di riproduzione in posizione.

Quindi prendi una striscia di carta lunga e stretta o, ancora meglio, un nastro trasparente. Qui è dove codifichi il tuo programma. Usi tante tracce quante sono le spille da programmare. Su una traccia metti punti neri a intervalli regolari; questo è il tuo orologio. Sulle altre tracce metti punti o strisce neri e lasci spazi vuoti in base ai dati e ai segnali. Accendi una luce nel complesso e la rilevi con piccoli fototransistor (o illumina un LED sul nastro e rilevi la luce con altri simili) e guida l'orologio e le linee di segnale con i transistor. Ciò richiede un po 'di spazio sul lettore di cassette, motivo per cui potrebbe essere necessario rimuovere la testina di riproduzione.

Ovviamente puoi anche codificare i segnali come audio, ma è un po 'più complicato decodificare. Oppure puoi rilevare la luce riflessa invece della luce trasmessa. Oppure puoi praticare i fori nel nastro scuro o nel nastro di carta, invece di fare segni neri su nastro trasparente. Qualunque cosa. Il riproduttore a nastro guida il nastro a velocità costante, pertanto è possibile immettere un segnale con clock senza un computer.


1

Sì. Il problema principale potrebbe essere l'interazione con l'interfaccia di programmazione. Se hai un indirizzo semplice e un bus dati, le cose sono un po 'più facili. Hai mai visto alcuni dei primi computer? I programmi vengono immessi un'istruzione alla volta nella RAM con interruttori nella parte anteriore.


Ha chiesto di un microcontrollore, non di un microprocessore. I microcontrollori eseguono il loro codice nel nostro flash, che non è accessibile senza un'interfaccia di qualche tipo.
Tcrosley,

4
@tcrosley - I primi UC non avevano flash. O avevano RAM o ROM per l'archivio programmi.
Hot Licks

@HotLicks Correct. E con poche eccezioni, questi erano tutti microprocessori, non microcontrollori. Questo era il mio punto, non se l'archivio programmi fosse flash, ROM, PROM, EPROM o EEPROM. Il punto era se l'archivio programmi fosse su chip (microcontrollore) o meno (microprocessore). Anche l'8048, il primo micvrocontroller di Intel introdotto nel 1977, aveva una ROM interna.
Tcrosley,

3
@Tcrosley Chi sei? E cosa hai fatto con il tcrosley di solito utile e oggettivo? :-) | La sua prima osservazione è stata che potevi interagire con l'interfaccia di programmazione, che spesso ma non sempre sarà valida. L'indirizzo "IF" e il bus dati sono IF. Si applica ad alcuni microcontrollori ibridi di grandi dimensioni e borderline, ma il suo IF originale andava abbastanza bene (anche se duro e lento).
Russell McMahon,

3
Cercare di mantenere una forte distinzione tra microprocessore e microcontrollore è più pedante che utile, specialmente quando è in un commento ad ogni singola risposta.
pjc50,

1

I mincomputer PDP-8 di Digital Equipment di oltre 40 anni fa non avevano capacità di avvio automatico. I programmi venivano solitamente caricati da nastri di carta perforata ma il caricatore per caricare i nastri di carta doveva essere inserito manualmente sugli interruttori del pannello frontale.

enter image description here

Nei siti di clienti Digital e PDP-8 come OEM che li utilizzavano come controller integrati del giorno, non era insolito che gli utenti memorizzassero i bootloader e competessero tra loro per il tempo più veloce impiegato per entrare nel boot caricatore nella macchina. Le macchine utilizzavano memorie a nucleo magnetico (infilate a mano nelle parti più lontane del mondo, da donne con dita minuscole, usando aghi e filo sottile).

enter image description here

Poiché il contenuto della memoria magnetica non è volatile, i caricatori di avvio sono sopravvissuti a uno spegnimento e l'immissione manuale è stata necessaria solo dopo l'assemblaggio iniziale, il caricatore è stato cancellato da un bug del programma o un programma necessario per utilizzare lo spazio del caricatore.


Molti anni fa, quando dovevamo arrancare a scuola a piedi nudi sulla neve in salita in entrambi i modi, il PDP-8 del nostro liceo doveva essere avviato attivando il bootloader dal pannello frontale come descritto. Nessuno degli insegnanti sapeva molto del computer, incluso quello che ne era responsabile. Pensava che fosse 0 e che 1 fosse inattivo, quindi non poteva mai attivare il bootloader. Organizzerei il crash del computer quando ero in classe inglese, quindi sarei stato chiamato per riavviare il computer. Non gli ho mai parlato del suo malinteso su e giù - era troppo utile per me.
Olin Lathrop,

Ho adorato il PDP-8. Ho avuto accesso esclusivo a uno per circa tre anni, quindi è stato come avere un personal computer molto prima dell'invenzione del termine PC. Incredibile cosa potrebbe adattarsi a 4K di memoria. Sicuramente è passato attraverso un sacco di nastro di carta (non aveva DECtape) e carta Teletype.
Tcrosley,

0

La risposta è , potresti programmare un microcontrollore senza un computer, un debugger, ecc. Ciò di cui avresti bisogno sarebbe fornire le varie tensioni, dati, clock e sequenze di programmazione specificate dal produttore degli uC (non un lavoro facile).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.