Lecții msp430 launchpad

Suntem la un pas departe de crearea unui dispozitiv de măsurare pe scară largă. Tot ce a rămas pentru noi este de a face rezultatele măsurătorilor disponibile în afara programului de depanare.





Există mai multe modalități pentru aceasta. Unul dintre ele este de a scoate rezultatul măsurătorilor pe ecranul LCD, așa cum se întâmplă în aparatele de uz casnic. În această lecție, vom învăța cum să folosim un modul LCD standard cu programul LaunchPad. De asemenea, aici vom studia conceptul de creare a unei biblioteci personalizate. La sfârșitul lecției, vom obține o bibliotecă pe care o puteți utiliza în proiectele viitoare cu un ecran LCD, ceea ce va reduce efortul depus pentru scrierea codului.







Modul LCD (LCM)


Pentru această lecție, aveți nevoie de un afișaj LCD pe care probabil că nu îl aveți. Dacă nu, recomand să cumpărați unul. Aceste afișe sunt foarte frecvente și nu sunt scumpe. Ele vin în diferite dimensiuni și tipuri, aici vom folosi un modul standard de 16x2 LCD cu interfață HD44780. Ele pot fi cumpărate oriunde, de exemplu pe eBay. puteți alege orice doriți, dar asigurați-vă că funcționează la o tensiune de 3,3 V și nu a fost reproiectat pentru a funcționa pe o interfață serială (I2C / TWI). Dacă doriți un modul mare (de exemplu 20x4), după cum doriți, acestea funcționează la fel. Puteți alege orice culoare.

Conectarea modulului de afișare


Modulul LCD standard are 16 pini (14 fără lumină de fundal). Primele câteva sunt concepute pentru alimentare (pot fi în două locuri, cu iluminare din spate) și setări de contrast. Ieșirea 1 (denumită Vss) trebuie să fie conectată la sol pe LaunchPad. Pinul 2 (Vdd) este conectat la puterea Vcc de pe LaunchPad. Dacă utilizați ieșirea luminii de fundal 15 (LED +), se conectează de asemenea la Vcc și pinul 16 (LED-) la masă. (Toate acestea sunt mai ușor de pus pe panourile de paine). Pinul 3 (V0) controlează contrastul ecranului. Dacă aveți o rezistență variabilă de 10 kΩ, atașați acest pin la contactul central al rezistorului și conectați cele două contacte de capăt la masă și la putere și puteți ajusta contrastul. Dacă nu există nici un rezistor, doar la sol această ieșire, nu va arăta la fel de bun ca ar putea, dar va funcționa.

Există 11 concluzii privind controlul și datele. Trei linii de control, acestea sunt știfturile 4 (RS), 5 (R / W) și 6 (E). Nu este nevoie să transmitem citirea / scrierea (R / W) și conectându-l la sol, vom porni modul de citire pe ecran. Nu putem presupune nimic pe ecran (cum ar fi poziția cursorului, ocuparea forței de muncă pavilion statut, etc), dar ne va da o retragere liberă pe MSP430. Pentru a controla afișajul, vom folosi ieșirile de înregistrare Select (RS) și Ready (Enable). Ultimele concluzii sunt 7-14 (D0-D7), acesta este magistrala de date. Aceste constatări pot fi considerate la fel ca P1 și opt pini port de pe MSP430, - D0 este primul bit, D1 doilea etc. Dacă vom folosi port complet I / O pe MSP430 la magistrala de date, pur și simplu conectați pinul portului corespunzător cu același număr de autobuz de date de ieșire, și scapă-te de dificultățile de a crea un port virtual cu pini de localizare non-standard în cadrul programului. Dar, din moment ce G2211 nu are suficiente porturi pentru acest lucru, folosim doar modul de intrare pe 4 biți. Pentru el sunt utilizate ieșirile D4-D7 ale modulului de afișare. Ieșirile D0-D3 vor rămâne nesoluționate.

În programul contorului de capacități, terminalele de lucru trebuie înlocuite, datorită utilizării modulului LCD. Acum vom folosi P1.1 ca TA0.0 în loc de CA1. și utilizați P1.2 / CA2 ca intrare neinversoare a comparatorului. Pinul P1.0 va monitoriza RS. Controlul P1.3 E. Ieșirile P1.4-P1.7 vor controla D4-D7, respectiv.

Rețineți că ieșirea din P1.3 din LaunchPad, conectată la buton, nu trebuie să interfereze cu funcționarea programului; El a tras în sus rezistor la sursa de alimentare, aceasta va duce la o mai mare scurgere de curent, atunci când resetată E. Din păcate, pe launchpad nu oferă un jumper pe butonul S2, ca și pe rezultatele P1.0 și P1.6 LED-uri, astfel încât să-l lăsați așa cum este . Și în timp ce vorbim despre acest lucru, asigurați-vă că ați scos jumperii de pe cele două LED-uri și TXD / RXD. (Aici ar trebui să înțelegeți de ce noul LaunchPad nu are un rezistor pull-up pe P1.3)

Controlarea modulului de afișare


După ce ne-am conectat, trimiterea de comenzi și simboluri pe ecran este o sarcină simplă. De fapt, se poate face chiar și cu mâinile, fără un microcontroler! Principiul de bază aici este să scrieți instrucțiuni către terminalele magistralei de date și să aplicați un impuls către E. Instrucțiunea este citită de marginea care se încadrează pe E. De aceea este nevoie de un impuls. Dacă RS este resetat, instrucțiunea este percepută ca o comandă a controlerului modulului LCD, dacă RS este setat, apoi ca cod caracter pentru ieșire.

Pentru un exemplu, să examinăm comenzile de care avem nevoie pentru a instala modulul de afișare în modul pe 4 biți. Instrucțiunea "Selectarea funcției" din codul binar pe 8 biți arată astfel: 0b001nnnxx. (Valorile folosite pentru a selecta configurația sunt indicate aici, iar x înseamnă biți neutilizați, indiferent de ce contează, ei nu afectează nimic). Bit 4, în acest manual, stabilește metoda de interacțiune: 1 - setează interfața pe 8 biți, interfața 0 - 4 biți. Astfel, trimiterea 0b00100000 instrucțiuni (sau 0x20), vom configura modulul de afișare pentru a primi comenzi și caractere de două 4 biți trimite, în loc de unul de 8-biți. Această comandă trebuie trimisă mai întâi, astfel încât să putem lucra cu schema noastră de conexiuni cu 6 fire. În primul rând am stabilit valoarea pe comanda P1OUT magistralei de date | = 0x20 (în timp ce în scădere RS (înseamnă că aceasta este o echipă, mai degrabă decât un simbol) și fixând E (necesar în schema noastră de cabluri)), și apoi trimite un impuls de comandă pe E.

Modulul de afișare nu răspunde imediat la comandă, există intervale precise de timp pentru funcționarea corectă. În special, RS trebuie să fie resetat într-un anumit interval de timp, înainte de începerea impulsului. E. Liniile de date trebuie să fie setate cu puțin timp înainte de declanșarea marginii de cadere a impulsului și trebuie să-și mențină starea suficient timp după impuls. Apoi, trebuie să treacă un anumit timp înainte de a putea trimite din nou un impuls către E. Din fericire pentru noi, precizia întârzierii în timp este importantă numai între impulsurile de comandă. Timpurile rămase sunt de ordinul a câteva sute de nanosecunde, iar viteza executării comenzilor MSP430 este suficient de mică pentru ca aceste întârzieri să apară în mod natural. Timpul necesar pentru a trimite o comandă înainte de a putea trimite următoarea ar trebui să fie de aproximativ 150 ms. Se poate obține prin întârziere ().

Rezumând toate cele de mai sus, aici este un set de instrucțiuni pentru instalarea modulului LCD în modul pe 4 biți:


Deși puteți seta E înainte de a instala autobuzul de date, este mai convenabil să schimbați ordinea, pentru a evita nepotrivirile temporare. În cazul în care utilizați o altă comandă de conectare a pinilor, mai ales dacă utilizați mai multe porturi, acest cod nu va funcționa. Este convenabil să folosiți știfturile portului P1.4-P1.7 pentru terminalul D4-D7 al modulului LCD, dar nu neapărat. Dacă schimbați ordinea, de exemplu, ați conectat P1.4-P1.7 la D7-D4, atunci trebuie să scrieți 0b0100. și nu 0b0010 în magistrala de date din acest cod. Aveți grijă, utilizând o configurație diferită a pinului, trebuie să configurați fiecare bit al magistralei de date în consecință. Ultima linie șterge magistrala de date pentru a facilita intrarea corectă a următoarei comenzi.

Trimiterea comenzilor în modul pe 4 biți


Acum, afișajul nostru este gata să accepte comenzi în modul pe 4 biți. Acest mod funcționează prin trimiterea unei porțiuni din cei 4 biți cei mai mari prin pulsarea lui E. Apoi, trimiterea a doua porțiune a celor 4 biți inferiori, cea de-a doua pulsație. Pentru schema noastră de conectare, putem face acest lucru cu acest cod:


Aici este clar că am colectat toate comenzile responsabile pentru pulsația E, inclusiv întârzierile de timp, într-o funcție puls void (void). Desigur, este, de asemenea, potrivit pentru utilizare în modul pe 8 biți. Dacă colectăm setul de comenzi de mai sus în funcția SendByte (char) void. putem scrie următoarele comenzi de inițializare în acest fel:


După ce ați introdus aceste comenzi, afișajul nostru va fi gata să afișeze orice caractere sau text pe care le trimitem. Este important să înțelegeți că aceleași comenzi ca mai sus sunt folosite pentru a trimite caractere, dar în P1OUT. Bitul BIT0 (RS) trebuie să fie setat astfel încât afișajul să știe că este un simbol, nu o comandă. În exemplul meu, eu, în acest scop, am făcut funcția extinsă SendByte. care vă permite să trimiteți atât comenzi cât și simboluri. De asemenea, utilizează alte comenzi, cum ar fi ștergerea afișajului și deplasarea cursorului. Dacă aveți un ecran LCD, încercați singur acest program. Cu latențele selectate acolo, nu va funcționa cu DCO mai rapid decât 2 MHz. Dacă experimentați codul, țineți cont de acest lucru. Apoi, vom examina cum să încapsulați acest cod într-o bibliotecă și cum să îl folosim în contorul de capacitate.

(De asemenea, pentru a afla despre alte comenzi, se recomandă să citiți alte articole despre utilizarea acestor afișări, de exemplu aici și aici.)

Listarea programului (original lcddemoG2211.c):

Adăugarea unei noi biblioteci


Avem un cod cu care puteți trimite cu ușurință textul de pe ecranul LCD, și că ar fi frumos să aibă o bibliotecă care ar fi ea a fost suficient pentru a se conecta pur și simplu la proiect, și nu să se angajeze în fiecare kopipastingom timp. C limbajul de programare îl face foarte ușor. Deci, să vedem cum să lucrăm cu afișajul din bibliotecă și cum să configuram CCS să folosească această bibliotecă. În această bibliotecă, puteți adăuga orice cod pe care îl veți folosi în mod repetat.

Mai întâi, selectați dosarul în care va fi stocată biblioteca. Compilatorul nu contează, dar ar trebui să aveți o modalitate simplă de accesare, ceea ce ar face schimbări și îmbunătățiri. Pe de altă parte, ar trebui să fie un loc suficient de sigur încât să nu-l ștergeți în mod accidental, să nu-l schimbați, să-l mutați, etc. De exemplu, am creat dosarul "bibliotecă" din directorul meu de proiect.

În al treilea rând, copiați funcțiile rămase ale codului într-un fișier „.c“, separat, cu același nume ca și cea a antetului (în acest caz simple_LCM.c). La începutul acestui fișier, includeți #include <имя_файла.h>. unde "filename" este numele fișierului cu antet. Atenție: acest fișier NU trebuie să conțină funcția principală ()!

În al patrulea rând, în noul proiect, faceți clic dreapta pe dosarul proiectului și selectați un nou folder →. Faceți clic pe butonul [Avansat >>]. și selectați "Link to folder în sistemul de fișiere" pentru a adăuga un link către director. Apoi trebuie să găsiți catalogul bibliotecii dvs. și să-l adăugați.

Acum, toate fișierele din dosarul bibliotecii sunt disponibile pentru utilizare în program. Este adevărat că compilatorul trebuie să precizeze calea către acest folder separat, ceea ce ar fi câștigat. (Aceasta este ceea ce nu-mi place, trebuie să faceți acest lucru pentru fiecare proiect nou, și nu am găsit o modalitate de a face calea către acest dosar este construit în mod implicit la crearea unui nou proiect CCS).

Așadar, în al cincilea rând, faceți clic dreapta pe dosarul proiectului și selectați "proprietățile" proprietății. Deschideți secțiunea "C / C ++ Build" și în setările "Tool Settings", găsiți MSP430 Compiler → Include Options. precum și MSP430 Linker → Căutarea căutării fișierelor. În ambele aceste locuri, specificați calea spre directorul bibliotecii, altfel codul dvs. nu va fi compilat.

Odată ce simle_LCM bibliotecă are un șablon pentru liniile de ieșire, ceea ce se întâmplă dacă vrem să afișeze o valoare numerică, cum ar fi un temporizator de întârziere de timp (variabila de timp int;)? O metodă, standard pentru C, este de a folosi biblioteca "stdio" și funcția sprintf (); din ea. Tot ce avem nevoie este de a crea o serie de caractere, de exemplu print_time [10]. și folosiți sprintf (print_time, ".", timp); care ar pune numărul în șir print_time. apoi trimiteți-o la PrintStr () pentru ao afișa. Din păcate, această metodă are unele dezavantaje atunci când o utilizează pentru microcontrolere. În primul rând, în ciuda optimizării foarte bune a codului de către compilatorul CCS, orice program care utilizează funcția printf. se va dovedi grozav. Programul nostru poate depăși 2 KB disponibil în G2211. În al doilea rând, optimizarea face dificilă obținerea unui rezultat corect formatat. În mod ideal, ar trebui să folosim formatarea% 10d. pentru a plasa valoarea timerului exact la 10 bytes din variabila print_time. Nu putem face acest lucru cu optimizarea inclusă. Putem schimba nivelul de optimizare pentru printf în proprietățile proiectului, dar acest lucru va mări dimensiunea codului.

Din fericire, există metode pentru a face față acestei probleme. De la o variabilă de tip întreg. Putem extrage cifre individuale folosind operatorul diviziei întregi și restul operatorului diviziei. Deci x% 10; returnează ultima cifră a numărului stocat în x. Apoi x / = 10; elimină ultima cifră din număr, lăsând restul. Rularea ciclului acestor operații, pentru a realiza x == 0 (fără mai multe cifre), putem elimina toate numerele din numărul unu și le trimite la imprimantă. tabelul de coduri ASCII utilizate în modulul de afișare este proiectat astfel încât să putem obține codul pentru toate numerele prin simpla adăugare la aceeași constantă, deci 0x30 + 0 este „0“, 0x30 + 7 este „7“, etc. .

Dezavantajul acestei metode cu ciclul este acela de a obține numerele în ordine inversă, de la dreapta la stânga. Modulul LCD are un mod de operare atunci când deplasează cursorul de la dreapta la stânga după imprimarea unui caracter, astfel încât este posibilă trimiterea textului în această ordine. (De fapt, așa funcționează cele mai multe calculatoare convenționale). Uitați-vă în programul nostru pentru a afla ce comenzi sunt configurate pentru acest tip de ieșire.

Așadar, am reușit să creăm un instrument de măsurare complet utilizând MSP430. Am folosit o combinație de timer și comparator cu un generator de ceas calibrat pentru a măsura timpul de întârziere în circuitul RC. Afișajul arată timpul măsurat în microsecunde. Cunoscând valoarea rezistenței R și a timpului, putem calcula valoarea reală a capacității C.

Exercitarea: Programul funcționează bine, dar nu ar fi mai bine, având un ecran LCD, să vezi imediat capacitatea în loc de timp? Puteți efectua operațiuni de virgulă mobilă pe MSP430 (deși nu în mod eficient), dar cum să afișați numărul punctului în virgulă mobilă pe ecran? Dacă sprintul este prea mare pentru programul nostru, atunci această funcționalitate va avea, fără îndoială, prea multă memorie. Puteți aduce capacitatea pe ecran fără a depăși limita de 2KB pe G2211? Dacă eșua, una dintre metode este prezentată aici: CMeterLCMFull.c. În acest program se realizează și auto-selecția unităților de măsură. Codul său ocupă 1934 octeți, suficient pentru a se încadra în G2211.

Traducător Nota: Pentru a nu mări dimensiunea textului, nu am dat o listă completă, atașați doar arhiva la fișierele de bibliotecă, și două exemple de utilizare a acestuia.







Trimiteți-le prietenilor: