MCU è l'acronimo di Microcontroller Unit, ovvero unità microcontroller. In cinese, questo termine indica un microcomputer a chip singolo che riduce opportunamente la frequenza e le specifiche della CPU, integrando interfacce periferiche come memoria, contatore, USB, conversione A/D, UART, PLC, DMA e persino circuiti driver per display LCD su un singolo chip. Può eseguire diverse combinazioni di controllo per svariate applicazioni, come telefoni cellulari, periferiche per PC, telecomandi, elettronica automobilistica, motori passo-passo industriali e controllo di bracci robotici. Un esempio di MCU è illustrato nella figura.
prima
A brief history of the development of microcontrollers
La storia dei microcontrollori non è lunga, ma si è sviluppata molto rapidamente. La loro produzione e il loro sviluppo sono generalmente sincronizzati con la produzione e lo sviluppo dei microprocessori (CPU). Da quando Intel Corporation, azienda statunitense, ha lanciato il suo primo microprocessore a 4 bit nel 1971, il suo sviluppo fino ad oggi può essere suddiviso approssimativamente in cinque fasi. Di seguito, una breve introduzione allo sviluppo dei microcontrollori di Intel Corporation.
1971 ~ 1976
La fase iniziale dello sviluppo dei microcontrollori. Nel novembre del 1971, Intel progettò per la prima volta l'Intel 4004, un microprocessore a 4 bit con un'integrazione di 2,000 transistor per chip, dotato di RAM, ROM e registro a scorrimento, dando vita al primo microprocessore MCS-4. Successivamente lanciò il microprocessore a 8 bit Intel 8008, e altri microprocessori a 8 bit furono lanciati da altre aziende.
1976 ~ 1980
Stadio di microcontrollore a basse prestazioni. Rappresentato dalla serie MCS-48 lanciata da Intel nel 1976, utilizza una struttura monolitica che integra una CPU a 8 bit, un'interfaccia I/O parallela a 8 bit, un timer/contatore a 8 bit, RAM e ROM su un chip semiconduttore. Sebbene il suo intervallo di indirizzamento sia limitato (non più di 4 KB), non disponga di I/O seriale, la capacità di RAM e ROM sia ridotta e il sistema di interrupt sia relativamente semplice, le sue funzioni possono soddisfare le esigenze del controllo industriale generale e degli strumenti e misuratori intelligenti.
1980 ~ 1983
Fase dei microcontrollori ad alte prestazioni. I microcontrollori a 8 bit ad alte prestazioni lanciati in questa fase dispongono generalmente di porte seriali, sistemi di elaborazione degli interrupt multilivello e molteplici timer/contatori a 16 bit. La capacità della RAM e della ROM on-chip è aumentata e l'intervallo di indirizzamento può raggiungere i 64 KB. Alcuni chip dispongono anche di un'interfaccia di conversione A/D.
1983 - fine anni '1980
Stadio del microcontrollore a 16 bit. Nel 1983, Intel ha lanciato la serie di microcontrollori ad alte prestazioni a 16 bit MCS-96. Grazie all'adozione delle più recenti tecnologie di produzione, il livello di integrazione del chip raggiunge i 120,000 transistor per chip.
1990 secondi
I microcontrollori si stanno evolvendo a un livello superiore in tutti gli aspetti di integrazione, funzionalità, velocità, affidabilità e campi di applicazione.
due
Classificazione e applicazione dei microcomputer a chip singolo
I microcontrollori (MCU) possono essere suddivisi in due tipologie in base al tipo di memoria: quelli senza ROM integrata e quelli con ROM integrata. Per i chip senza ROM integrata, è necessario collegare una EPROM esterna prima di poterli utilizzare (tipicamente un 8031); i chip con ROM integrata si suddividono in tipo EPROM integrata (il chip tipico è l'87C51), tipo MASK ROM integrata (il chip tipico è l'8051), tipo Flash integrata (il chip tipico è l'89C51) e altre tipologie.
In base allo scopo, si possono distinguere microcontrollori generici e microcontrollori speciali; in base alla larghezza del bus dati e alla lunghezza dei byte di dati elaborabili simultaneamente, si possono suddividere in microcontrollori a 8, 16 e 32 bit.
Attualmente, il mercato nazionale più esteso per le applicazioni dei microcontrollori (MCU) è quello dell'elettronica di consumo, seguito dal settore industriale e da quello dell'elettronica automobilistica. L'elettronica di consumo comprende elettrodomestici, televisori, console per videogiochi, sistemi audio e video, ecc. Il settore industriale include domotica, automazione, applicazioni mediche e generazione e distribuzione di energia da fonti rinnovabili. Il settore automobilistico comprende i sistemi di propulsione e di controllo della sicurezza dei veicoli.
tre
Funzioni di base del microcontrollore
Per la maggior parte dei microcontrollori, le seguenti funzioni sono le più comuni e basilari. Per microcontrollori diversi, la descrizione potrebbe variare, ma in sostanza sono le stesse:
1. Timer: Sebbene esistano molti tipi di timer, possono essere riassunti in due categorie: un tipo è il timer con intervalli di tempo fissi, ovvero il tempo di temporizzazione è impostato dal sistema e non può essere controllato dal programma utente. Il sistema fornisce solo diversi intervalli di tempo fissi tra cui il programma utente può scegliere, come 32 Hz, 16 Hz, 8 Hz, ecc. Questo tipo di timer è più comune nei microcontrollori a 4 bit, quindi può essere utilizzato per implementare funzioni di clock, temporizzazione e altre funzioni correlate.
L'altro tipo è il Timer Programmabile. Come suggerisce il nome, il tempo di temporizzazione di questo tipo di Timer può essere controllato dal programma dell'utente. I metodi di controllo includono: selezione della sorgente di clock, selezione della divisione di frequenza (Prescaler) e impostazione del numero di preset. Alcuni microcontrollori (MCU) dispongono di tutte e tre le opzioni contemporaneamente, mentre altri ne hanno solo una o due. Questo tipo di Timer è molto flessibile e il suo utilizzo effettivo è in continua evoluzione. Una delle applicazioni più comuni è il suo utilizzo per implementare un'uscita PWM.
Poiché la sorgente di clock può essere scelta liberamente, questo tipo di timer viene generalmente combinato con il contatore di eventi.
2. Porte I/O: Ogni MCU possiede un certo numero di porte I/O. Senza porte I/O, la MCU perde il canale di comunicazione con il mondo esterno. In base alla configurabilità delle porte I/O, queste possono essere suddivise nelle seguenti tipologie:
Porta di input o output pura: questo tipo di porta I/O è determinato dalla progettazione hardware del microcontrollore. Può essere solo di input o di output e non può essere utilizzata tramite software per le impostazioni in tempo reale.
Porte I/O di lettura e scrittura dirette: ad esempio, la porta I/O dell'MCS-51 appartiene a questa tipologia. Quando viene eseguita l'istruzione di lettura, la porta I/O si comporta come una porta di input; quando viene eseguita l'istruzione di scrittura, si comporta automaticamente come una porta di output.
Programmazione per impostare la direzione di ingresso e uscita: l'ingresso o l'uscita di questo tipo di porta I/O viene impostata tramite programma in base alle esigenze effettive. L'applicazione è relativamente flessibile e può realizzare alcune applicazioni a livello di bus, come il bus I2C, vari bus di controllo per LCD, driver LED, ecc.
Per l'utilizzo delle porte I/O, è importante tenere presente quanto segue: per la porta di ingresso, deve essere presente un segnale di livello chiaro per garantire che non sia flottante (questo può essere ottenuto aggiungendo una resistenza di pull-up o pull-down); per la porta di uscita, il livello di stato di uscita deve tenere conto delle condizioni della connessione esterna e deve essere garantito che non vi siano assorbimenti o perdite di corrente nello stato di standby o statico.
3. External interrupt: External interrupt is also a basic function of most MCUs. It is generally used for real-time triggering of signals, data sampling and status detection. The interrupt methods include rising edge trigger, falling edge trigger and level trigger. External interrupts are generally implemented through input ports. If it is an IO port, its interrupt function will be turned on only when it is set to input; if it is an output port, the external interrupt function will be automatically turned off (there are some exceptions in ATMEL's ATiny series, which can also trigger the interrupt function when it is an output port). The applications of external interrupts are as follows:
Rilevamento di segnali di trigger esterni: uno si basa su requisiti in tempo reale, come il controllo dei tiristori, il rilevamento di segnali improvvisi, ecc., mentre l'altro è la necessità di risparmiare energia.
Misurazione della frequenza del segnale: per garantire che il segnale non venga perso, l'interrupt esterno è la scelta ideale.
Decodifica dei dati: Nel campo delle applicazioni di controllo remoto, al fine di ridurre i costi di progettazione, è spesso necessario utilizzare software per decodificare vari dati codificati, come la decodifica della codifica Manchester e PWM.
Rilevamento dei tasti e riattivazione del sistema: per le MCU che entrano in stato di sospensione, in genere è necessario riattivarle tramite interrupt esterni. La forma più semplice è la pressione di un tasto, che produce cambiamenti di livello in base all'azione del tasto stesso.
4. Interfaccia di comunicazione: L'interfaccia di comunicazione fornita dalla MCU generalmente include l'interfaccia SPI, l'interfaccia UART, l'interfaccia I2C, ecc., che sono descritte come segue:
Interfaccia SPI: questo tipo di interfaccia è il metodo di comunicazione più semplice fornito dalla maggior parte dei microcontrollori. La trasmissione dei dati è controllata da un clock sincrono. I segnali includono: SDI (ingresso dati seriali), SDO (uscita dati seriali), SCLK (clock seriale) e segnale Ready; in alcuni casi, potrebbe non essere presente alcun segnale Ready; questo tipo di interfaccia può funzionare in modalità master o slave. In termini più comuni, dipende da chi fornisce il segnale di clock. La parte che fornisce il clock è il master, mentre la parte opposta è lo slave.
UART (Universal Asynchronous Receive Transmit): è l'interfaccia di trasmissione asincrona più semplice. Ha solo due linee di segnale, Rx e Tx. Il formato dati di base è: Bit di inizio + Bit di dati (7 bit/8 bit) + Bit di parità (pari, dispari o nessuno) + Bit di stop (1~2 bit). Il tempo occupato da un bit di dati è chiamato Baud Rate.
Nella maggior parte dei microcontrollori, la lunghezza dei bit di dati, la modalità di controllo dei dati (controllo dispari, controllo pari o nessun controllo), la lunghezza del bit di stop e la velocità di trasmissione (baud rate) possono essere impostate in modo flessibile tramite programmazione. Il metodo più comunemente utilizzato per questo tipo di interfaccia è la comunicazione con la porta seriale di un PC.
Interfaccia I2C: I2C è un protocollo di trasmissione dati sviluppato da Philips. Viene implementato utilizzando due segnali: SDAT (Serial Data Input/Output) e SCLK (Serial Clock). Il suo principale vantaggio è la possibilità di collegare più dispositivi a questo bus, identificandoli e accedendovi tramite indirizzi; inoltre, uno dei maggiori benefici del bus I2C è la sua facilità d'uso, che consente di implementarlo tramite software attraverso le porte I/O. La velocità di trasmissione dei dati è completamente controllata da SCLK, che può essere elevata o bassa, a differenza dell'interfaccia UART, che impone requisiti di velocità rigidi.
5. Watchdog (timer watchdog): Il watchdog è una configurazione di base della maggior parte dei microcontrollori (alcuni microcontrollori a 4 bit potrebbero non avere questa funzione). Il watchdog della maggior parte dei microcontrollori consente solo al programma di resettarlo, ma non di disattivarlo (in alcuni casi viene impostato durante la fase di programmazione, come nei microcontrollori della serie PIC di Microchip), mentre in altri casi viene utilizzato un metodo specifico per decidere se attivarlo, come nella serie KS57 di Samsung. Finché il programma accede al registro watchdog, questo viene automaticamente attivato e non può più essere disattivato. In generale, il tempo di reset del watchdog può essere impostato tramite programmazione. L'applicazione più semplice del watchdog è quella di fornire una capacità di autoripristino per i microcontrollori che si bloccano a causa di guasti imprevisti.
Quattro
Produttore globale di microcontrollori di primaria importanza
(L'elenco non segue un ordine particolare, ma è organizzato in base ai principali produttori. Se manca qualcosa, si prega di aggiungerlo nella sezione commenti).
Europa e America
1. Freescale+NXP (Freescale+NXP): Paesi Bassi, fornisce principalmente MCU a 16 e 32 bit. Applicazioni: elettronica automobilistica, LED e illuminazione generale, sanità, convergenza multimediale, elettrodomestici e utensili elettrici, tecnologia di automazione degli edifici, controllo motori, alimentatori e convertitori di potenza, energia e reti intelligenti, automazione, infrastrutture informatiche e di comunicazione.
2. Microchip+Atmel (Microchip Technology + Atmel): The United States, mainly provides 16-bit and 32-bit MCUs. Applications: automotive electronics, industrial use, motor control, automobiles, building automation, home appliances, home entertainment, industrial automation, lighting, Internet of Things, smart energy, mobile electronic equipment, computer peripherals.
3. Cypress+Spansion (Cypress + Spansion Semiconductor): con sede negli Stati Uniti, fornisce principalmente MCU a 8, 16 e 32 bit. Applicazioni: elettronica automobilistica, elettrodomestici, settore medicale, elettronica di consumo, comunicazioni e telecomunicazioni, industria, wireless.
4. ADI (Analog Devices): Stati Uniti, fornisce principalmente MCU a 8, 16 e 32 bit. Applicazioni: aerospaziale e difesa, applicazioni automobilistiche, tecnologia edile, comunicazioni, elettronica di consumo, energia, sanità, strumentazione e misurazione, motori, automazione industriale, sicurezza.
5. Infineon: Germania, fornisce principalmente MCU a 16 e 32 bit. Applicazioni: elettronica automobilistica, elettronica di consumo, ingegneria, veicoli commerciali e agricoli, elaborazione dati, trasporto elettrico, applicazioni industriali, apparecchiature mediche, dispositivi mobili, controllo e azionamento motori, alimentazione elettrica, per motociclette, biciclette elettriche e piccoli veicoli elettrici, reti intelligenti, illuminazione, soluzioni per sistemi solari, soluzioni per sistemi di energia eolica.
6. ST Microelectronics: Italia/Francia, fornisce principalmente MCU a 32 bit. Applicazioni: LED e illuminazione generale, trasporti, sanità, convergenza multimediale, elettrodomestici e utensili elettrici, tecnologia di automazione degli edifici, controllo motori, alimentatori e convertitori di potenza, energia e reti intelligenti, automazione, infrastrutture informatiche e di comunicazione.
7. Qualcomm: azienda statunitense, fornisce principalmente microcontrollori a 16 e 32 bit. Applicazioni: smartphone, tablet, modem wireless.
8. Texas Instruments: Stati Uniti, fornisce principalmente MCU a 16 e 32 bit. Ambito di applicazione: elettronica automobilistica, elettronica di consumo, apparecchiature mediche, dispositivi mobili, comunicazioni.
9. Maxim (Maxim): Stati Uniti, fornisce principalmente MCU a 32 bit. Ambito di applicazione: elettronica automobilistica, elettronica di consumo, applicazioni industriali, sicurezza.
Giappone e Corea del Sud
1. Renesas: Giappone, fornisce principalmente MCU a 16 e 32 bit. Ambito di applicazione: computer e periferiche, elettronica di consumo, elettronica medica e sanitaria, elettronica automobilistica, industria e telecomunicazioni.
2. Toshiba: Giappone, fornisce principalmente MCU a 16 e 32 bit. Ambito di applicazione: elettronica automobilistica, uso industriale, controllo motori, comunicazioni wireless, telefoni cellulari, computer e periferiche, imaging, audio e video, elettronica di consumo (elettrodomestici), illuminazione a LED, sicurezza, gestione dell'energia, apparecchiature di intrattenimento.
3. Fujitsu: Japan, mainly provides 32-bit MCU. Application scope: automobile, medical, machinery, home appliances.
4. Samsung Electronics: Corea del Sud, fornisce principalmente MCU a 16 e 32 bit. Applicazioni: elettronica automobilistica, uso industriale, controllo motori, automobili, automazione degli edifici, elettrodomestici, intrattenimento domestico, automazione industriale, illuminazione, Internet delle cose, energia intelligente, dispositivi elettronici mobili, periferiche per computer.
regione della Cina
La Cina continentale
1. Sigma Microelectronics: Fornisce principalmente MCU a 32 bit, con ambiti di applicazione in: telecomunicazioni, produzione, energia, trasporti, elettricità, ecc.
2. Zhuhai Orbit: Mainly provides 32-bit MCU, application scope: aerospace: satellite station ships, aircraft; high-end industrial control: embedded computers; ship control, industrial control, power equipment, environmental monitoring.
3. GigaDevice Innovation: Fornisce principalmente MCU a 32 bit, ambito di applicazione: automazione industriale, interfaccia uomo-macchina, controllo motori, videosorveglianza, domotica, Internet delle cose.
4. Shengsi Microelectronics: Fornisce principalmente MCU a 8 e 32 bit. Ambito di applicazione: piccoli elettrodomestici, elettronica di consumo, telecomandi, mouse, batterie al litio, prodotti digitali, elettronica automobilistica, strumenti e misurazioni medicali, giocattoli, controllo industriale, domotica e sicurezza e altri settori.
5. Chipsea Technology: Fornisce principalmente MCU a 16 e 32 bit. Ambito di applicazione: strumentazione, Internet delle cose, elettronica di consumo, elettrodomestici ed elettronica automobilistica.
6. Lianhua Integrated Circuit: Fornisce principalmente MCU a 8 e 16 bit. Ambito di applicazione: elettronica di consumo, elettrodomestici, controllo industriale, apparecchiature di comunicazione, elettronica automobilistica e computer.
7. Zhuhai Jianrong: Fornisce principalmente MCU a 8 bit, ambito di applicazione: elettrodomestici, alimentatori mobili.
8. Actions Technology: Fornisce principalmente MCU da 8 a 32 bit, con applicazioni in tablet, domotica, multimedia, Bluetooth e audio Wi-Fi.
9. Aisco Microelectronics: Fornisce principalmente MCU a 8 e 16 bit. Ambito di applicazione: chip per il settore consumer, chip per le comunicazioni, chip per l'elaborazione dati ed elettrodomestici.
10. Huaxin Microelectronics: Mainly provides 8-bit and 4-bit MCUs. Applications: satellite receivers, mobile phone chargers, perpetual calendars, and all-in-one remote controls.
11. Shanghai Belling (Huada Semiconductor Holdings): Fornisce principalmente MCU a 8, 16 e 32 bit. Applicazioni: periferiche per computer, HDTV, gestione dell'alimentazione, piccoli elettrodomestici e dispositivi digitali.
12. Haier Integrated Circuits: Mainly provides 14-bit, 15-bit, and 16-bit MCUs. Application scope: consumer electronics, automotive electronics, industry, and smart instruments.
13. Beijing Ingenic: Fornisce principalmente MCU a 32 bit, ambito di applicazione: dispositivi indossabili, Internet delle cose, elettrodomestici intelligenti, automobili, elettronica di consumo, tablet.
14. China Microelectronics: Fornisce principalmente microcontrollori a 8 bit. Applicazioni: elettrodomestici intelligenti, elettronica automobilistica, videosorveglianza, illuminazione a LED per esterni, giocattoli intelligenti, domotica ed elettronica di consumo.
15. Shenzhou Loongson Integrated Circuit: Fornisce principalmente MCU a 32 bit, ambito di applicazione: monitoraggio dell'energia, reti intelligenti, controllo digitale industriale, Internet delle cose, domotica, monitoraggio dei dati.
16. Ziguang Microelectronics: Fornisce principalmente MCU a 8 e 16 bit. Ambito di applicazione: elettrodomestici intelligenti.
17. Times Minxin: Fornisce principalmente MCU a 32 bit, ambito di applicazione: navigazione automobilistica, monitoraggio del traffico, supervisione di pescherecci, reti di telecomunicazioni energetiche.
18. China Resources Silicon Microelectronics (a subsidiary of China Resources Microelectronics): mainly provides 8-bit and 16-bit MCUs. Application scope: consumer electronics, industrial control, and home appliances.
19. Tecnologia di base nazionale: fornisce principalmente MCU a 32 bit, ambito di applicazione: settore della sicurezza informatica, settore dell'automazione d'ufficio, settore delle reti di comunicazione, settore della sicurezza informatica.
20. Zhongtian Micro: Fornisce principalmente MCU a 32 bit. Applicazioni: smartphone, TV digitali, decoder, elettronica automobilistica, GPS, e-reader e stampanti.
21. China Resources Microelectronics: Fornisce principalmente MCU a 8 e 16 bit. Ambito di applicazione: circuiti di controllo generici per elettrodomestici, elettronica di consumo e controllo dell'automazione industriale.
22. Zhongying Electronics: Mainly provides 4-bit, 8-bit, 16-bit, and 32-bit MCUs. Application scope: home appliances and motors.
23. Lingdong Microelectronics: Fornisce principalmente microcontrollori a 32 bit, con ambito di applicazione in: controllo motori, controllo Bluetooth, display ad alta definizione, ricarica wireless, droni, microstampanti, etichette intelligenti, sigarette elettroniche, schermi a matrice di punti LED, ecc.
24. Nuvoton Technology: Fornisce principalmente MCU a 8 bit, ambito di applicazione: illuminazione, Internet delle cose, ecc.
25. Neusoft Carrier: Fornisce principalmente MCU a 8 e 32 bit. Applicazioni: elettrodomestici, domotica, strumentazione, controller per pannelli LCD, controllo industriale, ecc.
26. Betley: Mainly provides 32-bit MCU, application scope: smart home, industrial control and consumer products.
27. Shengquan Technology: Fornisce principalmente MCU a 8 bit, ambito di applicazione: pannelli di visualizzazione di piccole e medie dimensioni per il settore automobilistico, didattico, del controllo industriale, medicale, ecc.
28. Hangshun Chip: Fornisce principalmente MCU a 8 e 32 bit. Ambito di applicazione: automobili, Internet delle cose, ecc.
29. Fudan Microelectronics: Fornisce principalmente MCU a 16 e 32 bit. Applicazioni: contatori intelligenti, serrature intelligenti, ecc.
30. Huada Semiconductor: Mainly provides 8-bit, 16-bit, and 32-bit MCUs. Applications: industrial control, intelligent manufacturing, smart life, and the Internet of Things.
Taiwan, Cina
1. Hongjing Technology: mainly provides 32-bit MCU. Application scope: communications, industrial control, information appliances, and voice.
2. Holtek Semiconductor: fornisce principalmente MCU a 8 e 32 bit. Ambito di applicazione: elettronica di consumo, illuminazione a LED, ecc.
3. Lingyang Technology: fornisce principalmente MCU a 8 e 16 bit. Ambito di applicazione: audio e video domestici.
4. Zhongying Electronics: fornisce principalmente MCU a 4 e 8 bit. Ambito di applicazione: caricabatterie, alimentatori per dispositivi mobili, elettrodomestici, controllo industriale.
5. Songhan Technology: fornisce principalmente MCU a 8 e 32 bit. Ambito di applicazione: telecomandi, caricabatterie intelligenti, sistemi di grandi e piccole dimensioni, bilance elettroniche, termometri auricolari, misuratori di pressione sanguigna, manometri per pneumatici, varie apparecchiature di misurazione e sanitarie.
6. Winbond Electronics: fornisce principalmente MCU a 8 e 16 bit. Ambito di applicazione: elettronica automobilistica, elettronica industriale, reti, computer, elettronica di consumo, Internet delle cose.
7. Tecnologia a dieci velocità: fornisce principalmente MCU a 4 bit, 8 bit e 51 bit. Ambito di applicazione: telecomandi, piccoli elettrodomestici.
8. Youhua Microelectronics: fornisce principalmente MCU a 4 e 8 bit. Ambito di applicazione: circuiti integrati per la registrazione, elettronica di consumo, prodotti per la casa.
9. Microcontrollori Yingguang Technology: fornisce principalmente MCU a 4 e 8 bit. Ambito di applicazione: macchinari, automazione, elettrodomestici, robot.
10. Elan Electronics: fornisce principalmente microcontrollori a 8 e 16 bit. Ambito di applicazione: elettronica di consumo, computer, smartphone.
cinque
Tips for learning microcontrollers
The basic principles and functions of any MCU are similar. The only difference is the configuration and number of peripheral function modules, instruction systems, etc.
Nei sistemi di istruzioni, sebbene appaiano molto diversi nella forma, in realtà si tratta semplicemente di simboli differenti. I significati che rappresentano, le funzioni da svolgere e i metodi di indirizzamento sono sostanzialmente simili.
Per comprendere un microcontrollore (MCU), è necessario innanzitutto conoscerne lo spazio ROM, lo spazio RAM, il numero di porte I/O, il numero di timer e i metodi di temporizzazione, i moduli funzionali periferici (circuiti periferici) forniti, le sorgenti di interrupt, la tensione di funzionamento e il consumo energetico, ecc.
Dopo aver compreso queste caratteristiche del microcontrollore, il passo successivo consiste nel confrontare le funzioni del microcontrollore selezionato con quelle richieste per lo sviluppo effettivo del progetto e chiarire quali risorse sono attualmente necessarie e quali non vengono utilizzate in questo progetto.
Per le funzioni necessarie al progetto ma non fornite dal microcontrollore selezionato, è fondamentale comprendere attentamente le informazioni relative al microcontrollore stesso per poterle implementare tramite metodi indiretti. Ad esempio, se il progetto in fase di sviluppo richiede la comunicazione con la porta COM del PC e il microcontrollore selezionato non dispone di una porta UART, è possibile valutare l'utilizzo di interrupt esterni.
Per le risorse necessarie allo sviluppo del progetto, è fondamentale comprendere e leggere attentamente il Manuale*, mentre i moduli funzionali non necessari possono essere ignorati o consultati superficialmente. Nell'apprendimento dei microcontrollori, l'applicazione pratica è la chiave e lo scopo principale.
Dopo aver chiarito le funzioni rilevanti del microcontrollore, è possibile iniziare a programmare.
Per i principianti o i progettisti che utilizzano questo microcontrollore per la prima volta, potrebbero sorgere molte descrizioni poco chiare delle sue funzioni. Per risolvere questi problemi, esistono due metodi. Il primo consiste nello scrivere un programma di verifica specifico per comprendere le funzioni descritte nella documentazione; il secondo, invece, consiste nell'ignorare temporaneamente la documentazione e scrivere il programma per il microcontrollore in base alla propria comprensione attuale, per poi modificarlo e migliorarlo durante la fase di debug. Il primo metodo è adatto a progetti con tempi limitati e ai principianti, mentre il secondo è indicato per chi ha una certa esperienza nello sviluppo di microcontrollori o quando le tempistiche del progetto sono ristrette.
Non è necessario dedicare particolare tempo alla comprensione del sistema di comandi. Il sistema di istruzioni è solo una rappresentazione grafica della logica. Durante la programmazione, potrai visualizzare le istruzioni pertinenti solo in base alla tua logica e ai requisiti logici del programma. Man mano che la programmazione progredisce, acquisirai sempre più dimestichezza con il sistema di istruzioni e potrai persino memorizzarlo inconsciamente.
sei
Programmazione del microcontrollore
Esiste una grande differenza tra la programmazione per microcontrollori (MCU) e quella per PC. Sebbene gli strumenti di sviluppo per MCU basati sul linguaggio C stiano diventando sempre più popolari, per i progettisti che desiderano un codice efficiente e preferiscono utilizzare l'assembly, quest'ultimo rimane il linguaggio di programmazione più conciso ed efficace.
For MCU programming, the basic framework can be said to be roughly the same. It is generally divided into three parts: the initialization part (this is the biggest difference between MCU programming and PC), the main program loop body and the interrupt handler. Their respective descriptions are as follows:
1. Inizializzazione: Per la progettazione di tutti i programmi per microcontrollori, l'inizializzazione è il passaggio più basilare e importante, che generalmente include quanto segue:
Mask all interrupts and initialize the stack pointer: The initialization part generally does not want any interrupts to occur.
Liberare l'area RAM del sistema e visualizzare la memoria: sebbene a volte possa non essere del tutto necessario, dal punto di vista dell'affidabilità e della coerenza, soprattutto per prevenire errori imprevisti, si raccomanda di sviluppare buone abitudini di programmazione.
Inizializzazione della porta I/O: In base ai requisiti applicativi del progetto, impostare la modalità di ingresso e di uscita della porta I/O corrispondente. Per la porta di ingresso, è necessario impostare la resistenza di pull-up o pull-down; per la porta di uscita, è necessario impostare il livello di uscita iniziale per evitare errori indesiderati.
Impostazioni degli interrupt: tutte le sorgenti di interrupt che devono essere utilizzate nel progetto devono essere attivate e le condizioni di attivazione degli interrupt devono essere impostate. Gli interrupt ridondanti che non vengono utilizzati devono essere disattivati.
Inizializzazione degli altri moduli funzionali: Per tutti i moduli funzionali periferici della MCU che devono essere utilizzati, è necessario effettuare le impostazioni corrispondenti in base ai requisiti dell'applicazione del progetto. Ad esempio, per la comunicazione UART, è necessario impostare la velocità di trasmissione (Baud Rate), la lunghezza dei dati, il metodo di verifica e la lunghezza del bit di stop. Per il timer del programmatore, è necessario impostare la sorgente di clock, il numero di divisione di frequenza e i dati di ricarica.
Inizializzazione dei parametri: Dopo aver completato l'inizializzazione dell'hardware e delle risorse del microcontrollore, il passo successivo consiste nell'inizializzare alcune variabili e dati utilizzati nel programma. L'inizializzazione di questa parte deve essere progettata in base al progetto specifico e alla struttura generale del programma. Per alcune applicazioni che utilizzano la EEPROM per salvare dati predefiniti del progetto, si consiglia di copiare i dati rilevanti nella RAM del microcontrollore durante l'inizializzazione per migliorare la velocità di accesso ai dati da parte del programma e ridurre il consumo energetico del sistema (in linea di principio, l'accesso alla EEPROM esterna aumenterà il consumo energetico dell'alimentatore).
2. Corpo del ciclo principale del programma: La maggior parte dei microcontrollori funziona ininterrottamente per lunghi periodi, quindi i loro corpi di programma principali sono generalmente progettati in un ciclo. Per le applicazioni con più modalità operative, possono esserci più corpi di ciclo, che vengono convertiti tramite flag di stato. Il corpo del programma principale è generalmente organizzato nei seguenti moduli:
Programmi di calcolo: I programmi di calcolo sono generalmente dispendiosi in termini di tempo, pertanto ci opponiamo fermamente alla loro elaborazione tramite interrupt, in particolare per le operazioni di moltiplicazione e divisione.
Elaborazione di programmi con requisiti di tempo reale minimi o nulli;
Programma di trasmissione del display: principalmente per applicazioni con driver LED e LCD esterni.
3. Gestore degli interrupt: Il programma di interrupt viene utilizzato principalmente per gestire attività ed eventi con elevati requisiti in tempo reale, come il rilevamento di segnali esterni improvvisi, il rilevamento e l'elaborazione dei pulsanti, il conteggio del tempo, la scansione del display a LED, ecc.
In generale, il programma di gestione degli interrupt dovrebbe essere il più conciso e breve possibile. Per le funzioni che non necessitano di essere elaborate in tempo reale, è possibile impostare un flag di trigger nell'interrupt, consentendo al programma principale di eseguire le transazioni specifiche. Questo è particolarmente importante per i microcontrollori a basso consumo e bassa velocità, che devono garantire una risposta tempestiva a tutti gli interrupt.
4. Per la disposizione dei diversi corpi di lavoro, i diversi MCU utilizzano metodi di elaborazione differenti:
Ad esempio, per applicazioni con MCU a bassa velocità e basso consumo (Fosc=32768Hz), considerando che tali progetti sono dispositivi portatili e utilizzano normali display LCD, la risposta alla pressione dei tasti e la risposta del display richiedono elevate prestazioni in tempo reale, quindi si utilizzano generalmente interrupt temporizzati per elaborare le azioni di pressione dei tasti e la visualizzazione dei dati; per MCU ad alta velocità, come le applicazioni Fosc>1MHz, poiché la MCU ha tempo sufficiente per eseguire il corpo del ciclo principale del programma, può solo impostare vari flag di trigger negli interrupt corrispondenti e inserire tutte le attività nel corpo del programma principale per l'esecuzione.
5. Nella programmazione dei microcontrollori, un aspetto che richiede particolare attenzione è:
È necessario impedire che la stessa variabile o gli stessi dati vengano acceduti o impostati contemporaneamente nel corpo del programma di interrupt e nel programma principale. Un metodo di prevenzione efficace consiste nell'organizzare l'elaborazione di tali dati in un modulo e nel determinare se eseguire le relative operazioni sui dati valutando il flag di trigger; negli altri corpi del programma (principalmente negli interrupt), impostare i flag di trigger solo dove i dati devono essere elaborati. Ciò garantisce che l'esecuzione dei dati sia prevedibile e univoca.
Sette Riepilogo tecnico sulla programmazione dei microcontrollori
1. Develop a good habit of summarizing. Summarizing is not only a summary of your own learning, but also a review and deepening of the learning process. It can also avoid making mistakes the second time.
2. Prima di scrivere un programma, è necessario innanzitutto avere una conoscenza approfondita del progetto, esserne consapevoli e delinearne una struttura generale. È fondamentale valutare attentamente come strutturarlo e quale sia la disposizione più razionale. È necessario analizzare quale modulo realizzare per primo, i passaggi specifici di tale modulo, come denominare ogni funzione, il collegamento con gli altri moduli, ecc. È consigliabile prendere un foglio di carta e annotare i processi importanti.
3. For modular programming in C language, you must first divide each module, program module by module, determine a sequence, follow the sequence, and then write the next module after the module is successful. For header files, write the module's header file after the module is written.
4. Non ignorare gli avvisi quando compaiono. Significano che c'è qualcosa di anomalo nel programma. Devi individuarne la causa e trovare una soluzione. Sii preciso nella ricerca delle cause. Puoi cercare informazioni su Internet o chiedere consiglio ad altri. Ad esempio, la funzione principale di un altro progetto potrebbe essere stata aggiunta a questo. Potrebbero esserci nomi di funzioni duplicati. È inoltre opportuno analizzare i fenomeni sperimentali e procedere passo dopo passo. Potrebbe anche essere stata selezionata l'interfaccia sbagliata durante la definizione della porta. A volte, se proprio non riesci a risolvere il problema, è bene fare una pausa e rifletterci su. Non importa quanto semplice sia, dovresti prestare attenzione, perché potrebbero esserci degli errori.
Nello sviluppo di applicazioni per microcontrollori, permangono problematiche quali l'efficienza nell'utilizzo del codice, le prestazioni anti-interferenza e l'affidabilità dei microcontrollori stessi. Di seguito, riassumiamo alcune competenze fondamentali che è necessario padroneggiare nello sviluppo di microcontrollori.
otto
Competenze nello sviluppo di microcontrollori
1. Come ridurre i bug nei programmi
Per quanto riguarda la riduzione dei bug del programma, è opportuno considerare innanzitutto i seguenti parametri di gestione fuori intervallo che devono essere presi in considerazione durante il funzionamento del sistema.
- Parametri fisici: Questi parametri sono principalmente parametri di input del sistema, che includono parametri di eccitazione, parametri operativi durante l'elaborazione di acquisizione e parametri di risultato al termine dell'elaborazione.
- Parametri delle risorse: questi parametri riguardano principalmente le risorse di circuiti, dispositivi e unità funzionali del sistema, come la capacità di memoria, la lunghezza dell'unità di memorizzazione e la profondità di impilamento.
- Parametri applicativi: questi parametri applicativi compaiono spesso come condizioni di utilizzo di alcuni microcontrollori e unità funzionali. Parametri di processo: si riferiscono ai parametri che cambiano in modo ordinato durante il funzionamento del sistema.
2 Come migliorare l'efficienza del codice di programmazione in linguaggio C
L'utilizzo del linguaggio C per la programmazione di microcontrollori è una tendenza inevitabile nello sviluppo e nell'applicazione di questi dispositivi. Per ottenere la massima efficienza nella programmazione in C, è fondamentale familiarizzare con il compilatore C utilizzato. Innanzitutto, è consigliabile testare il numero di righe di codice assembly corrispondenti a ciascuna compilazione in C, in modo da poter valutare con precisione l'efficienza. In futuro, si potrà utilizzare l'istruzione con la maggiore efficienza di compilazione. Ogni compilatore C presenta delle differenze, pertanto anche l'efficienza di compilazione varierà. La lunghezza del codice e il tempo di esecuzione di un ottimo compilatore C per sistemi embedded sono superiori solo del 5-20% rispetto alla stessa funzione scritta in linguaggio assembly.
Per progetti complessi con tempi di sviluppo ristretti, è possibile utilizzare il linguaggio C, ma è fondamentale avere un'ottima conoscenza del linguaggio C e del compilatore C del sistema MCU. È necessario prestare particolare attenzione ai tipi di dati e agli algoritmi supportati dal sistema di compilazione C. Sebbene il linguaggio C sia il linguaggio di alto livello più diffuso, i diversi produttori di MCU utilizzano sistemi di compilazione C differenti, soprattutto per quanto riguarda alcuni moduli funzionali specifici. Pertanto, la mancata comprensione di queste caratteristiche può causare problemi durante il debug, con conseguente riduzione dell'efficienza di esecuzione rispetto al linguaggio assembly.
3 Come risolvere il problema anti-interferenza del microcontrollore
Il modo più efficace per prevenire le interferenze è rimuovere la fonte di interferenza e bloccare il percorso di propagazione, ma spesso è difficile farlo, quindi possiamo solo verificare se la capacità anti-interferenza del microcontrollore è sufficientemente elevata. Mentre si migliora la capacità anti-interferenza dei sistemi hardware, l'anti-interferenza software sta ricevendo sempre più attenzione grazie alla sua flessibilità di progettazione, al risparmio di risorse hardware e all'elevata affidabilità.
Il fenomeno più comune di interferenza nei microcontrollori è il reset. Nel caso in cui il programma vada fuori controllo, è possibile utilizzare trap software e watchdog per riportarlo allo stato di reset. Pertanto, la cosa più importante per il software del microcontrollore, al fine di resistere alle interferenze, è gestire lo stato di reset.
In genere, i microcontrollori dispongono di registri di flag che possono essere utilizzati per determinare la causa del reset; inoltre, è possibile memorizzare manualmente dei flag nella RAM. Ogni volta che un programma viene resettato, è possibile determinare diverse cause di reset analizzando questi flag; è anche possibile saltare direttamente al programma corrispondente in base ai diversi flag. Ciò consente al programma di essere eseguito ininterrottamente, senza che l'utente si accorga del reset durante l'utilizzo.
4 Come testare l'affidabilità del sistema a microcontrollore
Una volta completata la progettazione di un sistema a microcontrollore, saranno necessari diversi elementi e metodi di test per i vari prodotti del sistema a microcontrollore, ma alcuni devono essere testati:
- Verificare la completezza delle funzioni software del microcontrollore.
- Test di accensione e spegnimento
- Test di invecchiamento
- Test come ESD ed EFT
Sometimes, we can also simulate the damage that may occur during human use. For example, deliberately rub the contact port of the microcontroller system with the human body or clothing fabric to test the anti-static ability. Use a high-power electric drill to work close to the microcontroller system to test the ability to resist electromagnetic interference.
To sum up, the single-chip microcomputer has become an important aspect of computer development and application. The important significance of the application of single-chip microcomputer is that it fundamentally changes the traditional control system design ideas and design methods.
La maggior parte delle funzioni che in passato dovevano essere implementate tramite circuiti analogici o digitali possono ora essere realizzate tramite software utilizzando microcontrollori. Questo tipo di tecnologia di controllo, in cui il software sostituisce l'hardware, è anche chiamata tecnologia di microcontrollo e rappresenta una rivoluzione rispetto alla tecnologia di controllo tradizionale.
Inoltre, durante il processo di sviluppo e applicazione, dobbiamo acquisire competenze e migliorare l'efficienza affinché la tecnologia possa essere utilizzata per una gamma più ampia di scopi.
Nove
Riepilogo del funzionamento del chip The operations on the chip are mainly operations on the registers in the chip. The registers in the chip have their own unique addresses mapped on the memory, which is the operation on the corresponding address. When looking at the chip, first look at the timing diagram, then understand the corresponding registers, understand how they operate, define the required ports (which can be identified by the program), and write write operation procedures and read operation procedures.
Come scrivere i dati nel chip, come leggerli e quale porta utilizzare per l'ingresso o la lettura (la cosa più importante).
Quando si collegano i chip tramite un bus, è fondamentale comprenderne il protocollo. Il chip collegato al bus I2C controlla principalmente le altre unità tramite questo bus.
1. One 74hc595 in the dot matrix is used for column selection, and the other two are used for color selection. The dot matrix is equivalent to a collection of diodes.
Il diodo si accende solo quando a un'estremità viene applicato un livello alto e all'altra un livello basso. Semplicemente, selezionando un'estremità in modo diverso, si accenderanno colori diversi.
Selezione della modalità di funzionamento del timer: i quattro bit più significativi impostano il timer T1, mentre i quattro bit meno significativi impostano T0. Le ultime due cifre di ciascuna modalità impostano quindi la modalità di funzionamento. Quando si impostano due timer, prestare attenzione all'uso dell'operatore OR (|). Quando si utilizzano gli interrupt, prestare attenzione a cancellare quelli che devono essere cancellati dopo l'attivazione dell'interrupt.
2. Transceiver della porta seriale: la modalità 2 (ricarica automatica del valore iniziale) viene generalmente utilizzata per impostare la velocità di trasmissione. Poiché dispositivi diversi hanno diverse capacità di elaborazione dati, l'impostazione della velocità di trasmissione serve principalmente a gestire dispositivi a bassa velocità e a facilitare la comunicazione tra di loro. Il bit del flag di interrupt deve essere azzerato tramite software. Quando si imposta l'interrupt della porta seriale, indipendentemente dal fatto che venga generato in fase di invio o ricezione, può attivare la funzione di interrupt, quindi prestare attenzione all'impostazione della funzione di interrupt. (In genere, l'impostazione della funzione è a discrezione del sistema, ad esempio per un computer host o uno slave).
Se si utilizza un interrupt per inviare dati, è necessario capire come attivare l'interrupt la prima volta, quindi bisogna prima inviare i dati una volta e poi attivare l'interrupt. È possibile inviare un solo byte alla volta e il bit successivo può essere inviato solo dopo che TI è stato impostato.
3. Pcf8591ad conversion has four channels of input. When reading pcf8591, which channel is selected, the voltage input by that channel is read. The converted data is stored in the chip and then read out. When reading, first write the address of the chip, then write the sub-address of the device (0x40|channel number), and then the read data.
4. La conversione DA consiste nello scrivere prima l'indirizzo del dispositivo nel chip, poi il sottoindirizzo (0x40) e infine la quantità digitale da convertire. Vengono presentate le informazioni sull'indirizzo del dispositivo nel chip.
5. Per il display LCD, una volta che i dati sono stati scritti e visualizzati, rimarranno sempre visualizzati senza aggiornamento continuo. Se si desidera modificarli, è necessario reinserirli.
6. Per il chip di clock ds1302, durante la lettura dei dati, il primo dato viene letto sul fronte di discesa dell'ottavo ciclo di clock; durante la scrittura dei dati, il segnale viene preparato per l'uscita successiva. Prestare attenzione al metodo di scrittura del programma e alla posizione del valore di ritorno.
7. First specify the register in Ds1302, and then write data to it. The register on the chip data indicates the address. (I still don’t quite understand the write protection program. Isn’t there always writing? Why is the write protection still turned on?)
(Secondo quanto detto dall'utente precedente, è possibile impostare un flag dopo il tempo di inizializzazione. Se questo flag è presente, non è necessario inizializzare il tempo. Tuttavia, se l'alimentazione viene interrotta, la RAM del microcontrollore non può salvare questo flag, quindi è possibile utilizzare la RAM del DS1302 per salvare il flag e leggerlo dopo l'accensione. Anch'io sono un principiante e intendo utilizzare il DS1302 a breve. Non so se questo sia corretto e non l'ho ancora implementato. Vi prego di condividere ulteriori informazioni.)
8. È consigliabile annotare l'inizializzazione nel caso in cui la si dimentichi in seguito. A volte è utile prestare attenzione a quale bit, se quello meno significativo o quello più significativo, viene elaborato per primo durante la lettura o la scrittura, cosa che si può dedurre dal diagramma temporale.
9. Per un ricetrasmettitore a infrarossi, durante la ricezione, determina se il livello è alto o basso in base al tempo intercorso tra due fronti di discesa. Quando si scrive un programma, si utilizza prima un timer per determinare il tempo, lo si salva e poi lo si converte in binario (per saperne di più su come scrivere questo programma, è molto utile).
10. Motore passo-passo: Viene utilizzato principalmente per la commutazione. La coppia del motore passo-passo diminuisce all'aumentare della velocità. Viene utilizzato principalmente per l'alimentazione automatica dei pezzi lavorati su macchine utensili. Può essere utilizzato anche in posizioni di controllo che richiedono una precisione maggiore.
Il motore passo-passo è un dispositivo a controllo ad anello aperto che converte i segnali elettrici a impulsi in spostamenti angolari o lineari. In condizioni di assenza di sovraccarico, la velocità e la posizione di arresto del motore dipendono unicamente dalla frequenza e dal numero di impulsi del segnale, e non sono influenzate dalle variazioni di carico. Quando il driver del motore passo-passo riceve un segnale a impulsi, aziona il motore passo-passo facendolo ruotare nella direzione impostata con un angolo fisso, chiamato "angolo di passo". La rotazione avviene passo dopo passo con un angolo fisso. Lo spostamento angolare può essere controllato regolando il numero di impulsi per ottenere un posizionamento preciso; allo stesso tempo, la velocità e l'accelerazione di rotazione del motore possono essere controllate regolando la frequenza degli impulsi per ottenere la regolazione della velocità.
11. Servomotore: (servomotore) si riferisce al motore che controlla il funzionamento dei componenti meccanici nel sistema servo. È un dispositivo di trasmissione indiretta che assiste il motore. I servomotori possono controllare la velocità e la precisione di posizione con grande precisione e possono convertire i segnali di tensione in coppia e velocità di rotazione per azionare gli oggetti controllati. La velocità del rotore del servomotore è controllata dal segnale di ingresso e può rispondere rapidamente. Nei sistemi di controllo automatico, viene utilizzato come attuatore e presenta caratteristiche quali una piccola costante di tempo elettromeccanica, elevata linearità, tensione di avviamento, ecc. Può convertire il segnale elettrico ricevuto in uno spostamento angolare o una velocità angolare in uscita sull'albero motore. Si dividono in due categorie: servomotori CC e CA. La loro caratteristica principale è che non c'è rotazione quando la tensione del segnale è zero e la velocità di rotazione diminuisce a velocità costante all'aumentare della coppia. Motore CC: ampia gamma, tutto su auto di piccole dimensioni.
12. Panoramica dei caratteri cinesi:
Per visualizzare i caratteri cinesi su un monitor o una stampante, questi vengono rappresentati in una matrice di punti secondo simboli grafici, ottenendo così il corrispondente codice a matrice di punti (codice glifo).
Il metodo di codifica unificato utilizzato per rappresentare i caratteri cinesi nel computer forma una codifica del carattere cinese chiamata codice interno (come un codice standard nazionale), e il codice interno è univoco (equivalente al numero identificativo del carattere). La codifica del carattere cinese creata per facilitare l'inserimento dei caratteri cinesi è un codice di input, che è un codice esterno dei caratteri cinesi. Il codice di input è diverso a seconda del metodo di codifica utilizzato ed è quindi eterogeneo. Il codice del carattere cinese utilizzato per visualizzare e stampare i caratteri cinesi è un codice glifo. Il computer trova il codice glifo del carattere cinese nella libreria dei modelli di font tramite il codice interno del carattere cinese e ne effettua la conversione.
Codice interno della fotocamera
Secondo le disposizioni dello standard nazionale per i codici, ogni carattere cinese ha un determinato codice binario, ma questo codice entra in conflitto con il codice ASCII quando viene elaborato internamente dal computer. Per risolvere questo problema, si aggiunge 1 alla prima cifra di ogni byte dello standard nazionale. Poiché il codice ASCII utilizza solo 7 bit, l'"1" all'inizio può essere utilizzato come marcatore per identificare i codici dei caratteri cinesi. Quando il computer elabora un codice con "1" all'inizio, lo interpreta come un carattere cinese, mentre quando elabora un codice con "0" all'inizio, lo interpreta come un codice ASCII. Lo standard nazionale (codice interno) elaborato in questo modo è il codice interno.
Se sostituiamo il punto e virgola (".") di questo grafico "口" con "0", possiamo ottenere il codice glifo di "口" in modo molto chiaro: 0000H 0004H 3FFAH 2004H 2004H 2004H 2004H 2004H 2004H 2004H 2004H 3FFAH 2004H 0000H 0000H. Quando il computer vuole visualizzare "口", trova prima il primo indirizzo della libreria dei font di visualizzazione, calcola in base al codice interno di "口", quindi trova il codice glifo di "口" e infine scansiona lo schermo sequenzialmente in base al codice glifo (in binario) tramite il controllo del generatore di caratteri. Dove il codice binario è "0", viene scansionata la posizione in cui è "0", e viene scansionata la posizione in cui è "1" per evidenziarla, in modo da ottenere il modello di caratteri "口".
I font di caratteri cinesi sono disposti secondo l'ordine del codice standard nazionale e memorizzati in memoria sotto forma di file binari, formando una libreria di font di caratteri cinesi, detta anche libreria di glifi di caratteri cinesi o libreria di caratteri cinesi.
Due metodi di codifica, vedere il file di intestazione
GB1616.h//------------------ Definizione della struttura dati del font di caratteri cinesi ------------------------//structtypFNT_GB16 // Struttura dati del font di caratteri cinesi {unsignedcharIndex[3]; // Indice del codice interno del carattere cinese unsignedchar Msk[32]; // Dati del codice della matrice di punti }; ///////////////////////////////////////////////////////////////////////////////////////// Tabella dei caratteri cinesi//// Libreria di caratteri cinesi: Dinastia Song 16.dot, modulo orizzontale bit più alto a sinistra, disposizione dei dati: da sinistra a destra, dall'alto verso il basso/////////////////////////////////////////////////////////////////////////////////////conststructtypFNT_GB16 codeGB_16[]= //tabella dati{/*---------------------------------------------------------------------------------;file sorgente/testo :Xu;larghezza×altezza (pixel):16×16--------------------------------------------------------------------------------*/"Xu",0x10,0x80,0x10,0x80,0x21 ,0x40,0x42,0x20,0x94,0x10,0x1B,0xEC,0x20,0x80,0x60,0x80,0xAF,0xF8,0x 20,0x80,0x22,0xA0,0x24,0x90,0x2A,0x88,0x21,0x00,0x00,0x00,0x00,0x00, Questa struttura è molto semplice: una è il codice interno e l'altra è la sequenza della matrice di punti. La precedente libreria della matrice di punti era posizionata nell'ordine del codice interno e non era necessario alcun indice del codice interno. Se fossero stati inseriti solo alcuni caratteri cinesi, sarebbe stato necessario l'indice del codice interno. (Il carattere cinese "Xu" all'inizio serve per trovare la sequenza della matrice di punti della parola quando si visualizza "Xu". Questa sequenza della matrice di punti è stata scritta da me. Quando viene visualizzata con 1602, poiché il chip ha una sequenza della matrice di punti inglese in memoria, non è necessario scriverla.) In genere, due byte sono sufficienti per il codice interno. Se si utilizza un byte in più, è sufficiente aggiungere uno 0 finale. In questo modo, la stringa di caratteri cinesi può essere inserita direttamente nel codice interno dei caratteri cinesi;
codeGB_16[k].Index[0] codeGB_16[k] indica che esiste un array di struttura typFNT_GB16 chiamato codeGB_16 codeGB_16[k] è il membro k+1 dell'array index è un membro della struttura typFNT_GB16, quindi può essere referenziato con codeGB_16[k].Index. Allo stesso tempo, index è un array, quindi può essere indicizzato[0] If((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1])) && è un operatore AND logico, il che significa che i valori su entrambi i lati del simbolo && sono veri. Solo il valore di && è vero, cioè vero && vero = vero. Questa frase significa: codeGB_16[k].Index[0]==c[0] e codeGB_16[k].Index[1]==c[1] vengono stabiliti contemporaneamente. Se viene eseguita l'istruzione seguente, codeGB_16[] è un array di strutture, codeGB_16[k].Index[0] indica il valore dell'elemento 0 dell'elemento indice della K-esima struttura dell'array di strutture.
13. LCD 12864: Ogni punto di visualizzazione corrisponde a un numero binario: 1 significa acceso, 0 significa spento. La RAM che memorizza queste informazioni a matrice di punti è chiamata memoria dati di visualizzazione. Per visualizzare un determinato elemento grafico o carattere cinese, è necessario scrivere le corrispondenti informazioni a matrice di punti nell'unità di memoria corrispondente.
Il contatore degli indirizzi (AC) della RAM grafica incrementa automaticamente di uno solo l'indirizzo orizzontale (asse X). Quando l'indirizzo orizzontale raggiunge 0FH, viene azzerato a 00H. Tuttavia, non incrementa automaticamente l'indirizzo verticale con un riporto. Pertanto, quando vengono scritti più dati consecutivamente, il programma deve determinare se è necessario azzerare l'indirizzo verticale.
14. Disegno della RAM (GDRAM) La RAM di visualizzazione del disegno fornisce uno spazio di memoria di 128×8 byte. Quando si modifica la RAM di disegno, scrivere prima i valori delle coordinate orizzontali e verticali in modo continuo, quindi scrivere due byte di dati nella RAM di disegno. Il contatore degli indirizzi (AC) incrementerà automaticamente di uno l'indirizzo orizzontale (indirizzo X). Quando l'indirizzo orizzontale è 0XFH, verrà reimpostato a 00H; l'indirizzo verticale non verrà incrementato automaticamente di 1. La visualizzazione del disegno deve essere spenta durante la scrittura nella RAM di disegno.
[cpp] view plain copy//Display Chinese characters voiddispString (uchar X, Y,uchar *msg)//Which row is X and which column is Y. msg is Chinese characters {if(X==0) write_data(*msg++); //Display Chinese characters }}////////////////////////////////// //////////////// ////////////////// Display image voiddisppicture(uchar code *adder){ uint i,j;//*******Display the upper half screen content settings for(i=0;i<32;i++)//32 column addresses in the upper half of the screen { write_com(0x80 + i);//SET vertical address VERTICALADD write_com(0x80);//SET horizontal address HORIZONTAL ADDfor(j=0;j<16;j++) { write_data(*adder); adder++; }}//************Display content settings in the lower half of the screen for(i=0;i<32;i++) //{ write_com(0x80 + i); //SET vertical address VERTICALADD write_com(0x88); //SET horizontal address HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;} }} Nel linguaggio C, lo spazio di memoria viene allocato automaticamente per una variabile definita e il suo indirizzo corrisponde al nome della variabile stessa. Tramite questo nome, è possibile recuperare i dati dalla memoria e ottenere nuovi dati tramite calcoli. In linguaggio assembly, invece, il programmatore deve definire lo spazio di memoria e inviare i dati all'accumulatore per l'elaborazione. Ogni passaggio richiede l'intervento del programmatore. Nel linguaggio C, questi processi vengono completati automaticamente dal compilatore.
15. Alcune domande e risposte utili ①. Come avviene l'allocazione della memoria per le variabili nel linguaggio C per microcontrollori? È possibile che il compilatore aggiunga in modo intelligente il codice di allocazione e riciclo durante il processo di compilazione? Il punto chiave è: come posso garantire che il programma che ho scritto non presenti errori di overflow della memoria? Se eseguo un'operazione ricorsiva, i requisiti di memoria sono difficili da calcolare autonomamente.
②. Il linguaggio C del microcontrollore sarà limitato nella definizione delle variabili? Ad esempio, le operazioni di moltiplicazione e divisione di dati in virgola mobile sono scritte in linguaggio assembly e il codice è piuttosto complesso. Se fossero scritte direttamente in linguaggio C, non sarebbero troppo semplici?
③. In the hex file generated by the C language of the microcontroller, is the address distribution of the instruction and data ROM automatically assigned by the compiler? Can users assign it?
Risposta 1: Un programma per microcontrollore scritto in linguaggio C viene prima compilato da un programma (sembra essere c51.exe). Dopo la compilazione, viene definita la dimensione dello spazio di memoria per le variabili, ma l'indirizzo specifico non è ancora stato assegnato (l'indirizzo è flottante). Successivamente, viene collegato un altro programma (sembra essere a51.exe). Dopo la connessione, viene determinato l'indirizzo specifico.
Se ci sono troppe variabili, il compilatore segnalerà che il segmento di dati è troppo grande. Per evitare errori di overflow della memoria, la considerazione principale è se si verifica un overflow dello stack, e questo dipende dall'esperienza.
Il linguaggio C dei microcontrollori generalmente vieta la ricorsione, e le operazioni ricorsive sono solitamente evitate. Dopotutto, i microcontrollori non sono PC, e questo influirà sulla velocità. Se si desidera utilizzare la ricorsione, è più opportuno impiegare un chip DSP. In breve, è necessario saper scegliere il chip appropriato.
Risposta 2: La dimensione della variabile (numero di cifre) è generalmente uguale al numero di cifre dell'accumulatore del chip. Ad esempio, il numero 51 utilizza comunemente 8 bit perché è un microcontrollore a 8 bit.
Il microcontrollore può definire variabili di bit, ma non array di bit. Scrivere in linguaggio C sembra semplice, ma in realtà genera la maggior quantità di codice. Il microcontrollore utilizzato per il controllo fa raramente uso di operazioni in virgola mobile, che non solo sono lente, ma anche problematiche e occupano spazio. Se si tratta di un chip DSP, sarebbe molto meglio se avesse una struttura hardware adeguata.
Risposta 3: Generalmente, l'allocazione avviene automaticamente. Può essere programmato con una combinazione di linguaggio C e linguaggio assembly, oppure può essere assemblato online utilizzando Keil C. Lo scambio di dati tra il chip e l'esterno avviene tramite la porta.
Numero di telefono dell'azienda: +86-0755-83044319
Fax: +86-0755-83975897
E-mail: 1615456225@qq.com
QQ: 3518641314 Responsabile Li
QQ: 332496225 Responsabile Qiu
Indirizzo: Stanza 809, Edificio C, Edificio Tecnologico Zhantao, Viale Minzhi n. 1079, Nuovo Distretto di Longhua, Shenzhen