Osciloscop Portabil Realizat CU Μc Msp430

OSCILOSCOP PORTABIL REALIZAT CU μC MSP430

Introducere

Aș vrea să încep prin a mulțumi domnului profesor Ciprian Dughir pentru sprijinul acordat de-a lungul întregii teze de diplomă.

Am ales această temă deoarece doar din titlul ei se întelege ca are legătură cu un microcontroler care se folosește pentru realizarea unui osciloscop. Microcontrolerele sunt sigur că îi interesează pe fiecare student sau profesor de la această facultate,

deoarece ele reprezintă viitorul, mai ales cele din familia MSP430 datorită cerințelor minime de curent pe care le are. Este una dintre cele mai populare familii de microcontrolere. A doua parte care m-a interesat a fost realizarea unui osciloscop, care pot sa zic sigur a fost unul dintre cele mai utilizate echipamente de mine pe perioada facultați, din anul I de la osciloscop analogic la cele digitale, mult mai avansate folosite în anul IV respectiv V. Osciloscopul este prietenul oricărui electronist. Poate cel mai bun în perioadele grele după defectarea televizorului, calculatorului personal sau stației de amplificare căci „prietenul la nevoie se cunoaște”. Tot el ne va ajuta să descoperim tainele circuitelor digitale. Când cineva ne vorbește despre osciloscop avem în minte un aparat plin de butoane și cu un ecran pe care se vede o formă de undă aidoma unui grafic. Chiar acesta este rolul osciloscopului: desenarea graficelor în timp, ale formelor de undă ale semnalelor electrice.

După stabilirea temei am conlucrat cu domnul coordonator la proiectarea schemei și cablajului, am folosit un afisaj Siemens LS020(de Siemens S65) pentru afișarea datelor dupa care am trecut la analiza programelor în C pentru funcționarea corectă a osciloscopului.

Cuprins

Capitolul 1 Osciloscopul Generalități

Osciloscopul analogic

Tubul catodic

Osciloscopul digital

Capitolul 2 Familia de μC MSP430

Scheme și diagrame funcționale

Programe de rulare

Capitolul 3 Afișaj Siemens LS020(Siemens S65

3.1 Comenzi de date

3.1.1 Comenzi de inițializare

3.1.2 Comenzi de oprire

3.1.3 Comenzi pentru scriere full-screen sau doar secțiuni

3.1.4 Codificarea culorii pixelilor

3.1.5 Scrierea parțială a ecranului

3.2 Scheme funcționale

3.3 Regiștri LS020

3.4 Program funcțional

Concluzii

Bibliografie

Capitolul 1

Osciloscopul generalități

Primul osciloscop a fost construit în 1887 la Strasbourg de către fizicianul german Karl Ferdinand Braun, cel care printre altele a descoperit în 1874 că un contact punctiform pe un semiconductor are proprietatea de a redresa curentul alternativ. Tot el inventase și tubul catodic, dar îl folosise numai pentru a studia proprietățile fasciculelor de electroni (numite atunci „raze catodice”). Braun a introdus în tubul catodic o pereche de plăci metalice între care a generat un câmp electric prin aplicarea unei tensiuni. Astfel, dacă tensiunea aplicată pe aceste plăci este alternativă, fasciculul de electroni este deflectat dintr-o parte în alta (înspre placa pozitivă), ceea ce se poate observa prin oscilarea punctului luminos de pe ecranul tubului catodic. În cinstea acestei invenții, tubul catodic este numit și astăzi, în țările unde se vorbește limba germană, „tub Braun” („Braunsche Röhre”). Osciloscopul modern a fost dezvoltat de Allen DuMont.

1.1 Osciloscopul analogic

Osciloscopul analogic clasic este realizat ca un tub catodic în care un fascicul de electroni este accelerat spre un ecran fosforeșcent și produce pe acesta un punct luminos. Poziția x-y a punctului luminos pe ecran este comandată prin circuite și dispozitive specializate. Astfel, ecranul osciloscopului devine un grafic al variației în timp a unei tensiuni electrice sau afișează două tensiuni electrice una în funcție de cealaltă, ca de exemplu în cazul figurilor Lissajous(figura 1.1).

figura 1.1 Figuri Lissajous pe ecranul unui osciloscop

Osciloscoapele moderne sânt adesea digitale și prezintă graficele fie pe un monitor încorporat, fie pe monitorul unui calculator. Aceste osciloscoape convertesc semnalele electrice într-o reprezentare digitală și au un număr suplimentar de funcții, între care: memorarea datelor, analiza matematică a semnalelor, tipărirea lor la o imprimantă și salvarea lor în format digital ca fișier pe un disc magnetic. Începând cu anii 1980 osciloscoapele digitale au devenit mai numeroase decât cele cu tub catodic, cu excepția unor aplicații specializate.

Semnalele de intrare sunt reprezentate de semnalul (semnalele) de măsurat și eventual semnalele de sincronizare. Acestea sunt introduse în osciloscop fie prin cabluri coaxiale atașate prin conectoare de tip BNC, fie prin sonde cu care se culeg din diferite puncte ale circuitului inspectat.

Osciloscoapele au în general numeroase reglaje, printre care cele mai importante sunt:

○ amplificarea semnalelor de intrare și reglarea punctului lor de zero;

○ scala de timp pentru baleierea pe orizontală;

○ modul de declanșare a baleierii (trigger);

○ tipul de grafic: t-y sau x-y;

○ intensitatea luminoasă a punctului luminos.

○ utilizare

Osciloscopul servește la măsurarea și observarea unor semnale electrice (în general de tensiune) provenite de obicei din circuite electronice, ca de exemplu televizoare, amplificatoare audio, oscilatoare electronice, diverse circuite digitale etc. Analiza formei și parametrilor acestor semnale este utilă în construcția, reglarea sau repararea unor astfel de circuite.

Pentru măsurarea semnalelor de intrare și a intervalelor de timp, pe ecran există un carioaj ale cărui diviziuni corespund unor unități de tensiune sau timp calibrate în V/diviziune, respectiv s/diviziune. Astfel, printre parametrii cei mai importanți ai semnalelor electrice care se pot măsura sunt următorii:

○ perioada sau frecvența semnalelor periodice;

○ timpul de creștere sau descreștere al unui puls de la un nivel dat la altul;

○ întârzierea relativă a două semnale;

○ durata unui puls;

○ factorul de umplere al unui semnal dreptunghiular.

1.2 Tubul catodic

Tubul catodic este elementul principal al oscilopului. În interiorul lui se generează fasciculul de electroni care deviat sub actiunea câmpurilor produse de semnalele de studiat, ciocnește ecranul, descriind pe acesta curbele dorite.

El este un tub cu vid alcătuit din:

○ o parte cilindrică formată din:

a)tun electronic care emite, focalizează și accelerează fascicolul de

elctroni și conține:

–catod;

–electrod de comandă;

–anod de focalizare;

–anod de accelerare.

b)un sistem de plăci de deflexie pentru devierea fasciculului de

electroni pe cele două direcții X și Y.

○ o parte frontală ce are un ecran, acoperit spre interior cu substanțe luminofere, care devine luminos în punctul care este lovit de fascicolul de electroni.

○ o parte tronconică care are depus în interior un strat bun conducător de electricitate cu rolul de ecranare și colectare a electronilor după ce au lovit ecranul.

figura 1.2 Tub Catodic

Osciloscopul digital

Pentru scopul lucrării folosim un osciloscop digital deoarece poate comunica cu calculatorul pe un port RS232 și poate comunica cu afișajul Simemens LS020(afișaj de Siemens S65) pe care îl vom folosi pentru afișarea datelor. La baza oricărui osciloscop digital stă un chip, în cazul nostru un μC din familia MSP430 care convertă semnalul analogic într-un semnal digital(CAN). Microcontrolerele din familia MSP430 funcționează la o viteză foarte mare și sunt echipamente de putere mică.

Osciloscopul digital spre deosebire de cel analogic lucrează cu semnalul

eșantionat. Acest mod de lucru permite adăugarea de funcții specifice unui sistem

digital: memorare, prelucrări numerice asupra eșantioanelor achiziționate. Pe lângă

aceste avantaje pot să apară și probleme legate de eșantionarea semnalului, care

trebuie făcută respectând teorema eșantionării. Nerespectarea ei duce la fenomenul de

aliere în frecvență/ subeșantionare în domeniul timp, obținându-se măsurători eronate

pentru anumiți parametri în acest caz.

Moduri de achiziție pentru osciloscopul digital

a) SAMPLE –sunt afișate direct eșantioanele achiziționate la sursa curentă. Din

cele 2500 de eșantioane achiziționate, în zona gradată a ecranului sunt afișate doar

250. Imaginea vizualizată este reâmprospătată după fiecare ciclu de achiziție.

b) PEAK DETECT – Detecție de vârf – memorează, pentru fiecare interval de

eșantionare, valoarea maximă și respectiv cea minimă a semnalului și folosește aceste

valori pentru afișarea formei de undă. Deoarece osciloscopul achiziționează 2500 de

eșantioane, iar pe ecran afișează doar 250, rezultă că pentru fiecare „punct de pe

ecran” are la dispoziție 10 valori ale eșantioanelor din care să aleagă valoarea minimă

si maximă. Acest mod poate fi folosit pentru afișarea impulsurilor de durată foarte

scurtă, care se pot pierde în modul SAMPLE. Imaginea vizualizată este

reâmprospătată după fiecare ciclu de achiziție

c) AVERAGE – mediere; se efectuează medierea, după procedeul „în ferestre

fixe”, pe un număr M de cicluri de achiziție, pentru fiecare din cele 2500 eșantioane

ce compun imaginea, evident, în cazul respectării condiției Cx < Cxmin . În acest caz,

numărul M poate lua valorile: M = 4, 16, 64, 128

La sfârșitul fiecărei operații de mediere (după M cicluri de achiziție) se

reactualizează memoria video. Numărul de cicluri pe care se face medierea, este

selectat din butonul AQUIRE->Averages.

RUN/STOP – așa cum s-a precizat mai sus osciloscopul reia operația de

achiziție a eșantioanelor la fiecare declanșare (când sunt îndeplinite condițiile de

trigger). Acest mod de lucru îl vom denumi modul RUN. Operația de achiziție poate

fi oprită prin apăsarea butonului RUN/STOP. În acest caz osciloscopul păstrează în

memorie setul de 2500 eșantioane pe care le-a achiziționat înaintea apăsării butonului

RUN/STOP, la fiecare noi curse vor fi afișate eșantioanele memorate. Acest mod

de lucru îl vom numi modul STOP. Comutarea între cele două moduri se face prin

apăsarea succesivă a butonului RUN/STOP. Modul de lucru selectat este afișat în

partea de sus a ecranului (Trig’d sau STOP).

Moduri de afișare pentru osciloscopul digital

Un mod de afișare foarte util, specific unui osciloscop digital, îl reprezintă afișarea cu persistență a imaginii. În acest mod, pentru un interval de timp selectat,

pe ecran sunt păstrate toate imaginile afișate în acest interval. Acest mod este util

deoarece permite vizualizarea tuturor punctelor prin care trece semnalul în intervalul

respectiv. Acest mod permite vizualizarea anvelopei semnalului, sau vizualizarea

unor impulsuri de durată foarte scurtă. Aceasta pentru că, păstrând eșantioanele obținute pe parcursul mai multor cicluri de achiziție, crește foarte mult probabilitatea

de a detecta și evenimente care apar mai rar sau care au o durată foarte mică.

Efectul alierii în domeniul timp și respectiv în domeniul frecvență

• Efectul alierii în domeniul timp

Alierea apare atunci când semnalul nu este eșantionat cu o frecvență suficient

de mare, care să permită refacerea corectă a semnalului din eșantioanele obținute. În

acest caz semnalul reconstituit va fi diferit de semnalul original. Pe osciloscop

aceasta se manifestă prin afișarea unui semnal de frecvență mai mică decât cea a

semnalului de la intrarea sa, sau prin afișarea unei imagini instabile.

figura 1.3 Fenomenul de aliere in domeniul timp

Efectul alierii în domeniul frecvență

Spectrul semnalului eșantionat este reprarte mică.

Efectul alierii în domeniul timp și respectiv în domeniul frecvență

• Efectul alierii în domeniul timp

Alierea apare atunci când semnalul nu este eșantionat cu o frecvență suficient

de mare, care să permită refacerea corectă a semnalului din eșantioanele obținute. În

acest caz semnalul reconstituit va fi diferit de semnalul original. Pe osciloscop

aceasta se manifestă prin afișarea unui semnal de frecvență mai mică decât cea a

semnalului de la intrarea sa, sau prin afișarea unei imagini instabile.

figura 1.3 Fenomenul de aliere in domeniul timp

Efectul alierii în domeniul frecvență

Spectrul semnalului eșantionat este reprezentat de periodizarea în frecvență, cu

perioada Fs, a spectrului semnalului analogic. Dacă nu este respectată teorema de

eșantionare, frecvența de eșantionare să fie mai mare sau egală decât dublul

frecvenței maxime din spectrul semnalului analogic, atunci va apărea fenomenul de

aliere (suprapunere) a spectrelor pentru semnalul eșantionat, nemaiputându-se realiza

reconstituirea semnalului original:

figura 1.4 Efectul alierii în frecventă

Deoarece spectrul semnalului eșantionat este periodic cu perioada Fs, iar

spectrul semnalelor reale este simetric față de zero, aparatele de măsură afișează

spectrul semnalului în intervalul [0-Fs/2].

Moduri de lucru cu baza dublă de timp

Baza dublă de timp (denumire preluata de la osciloscoapele analogice) permite

selectarea unei zone din imaginea vizualizată cu baza de timp principală și

vizualizarea separată doar a zonei selectate. Se obține astfel un efect de „lupă de

timp” cu poziția reglabilă oriunde în interiorul bazei principale.

Pentru folosirea modului de lucru cu bază dublă se selectează din meniul

HORIZ MENU câmpul Window Zone. Din butonul SEC/DIV se poate regla

coeficientul de deflexie pe orizontală pentru baza de timp secundară. Valoarea sa

apare pe ecran în câmpul W. Prin modificarea valorii coeficientului de deflexie se

stabilește dimensiunea dorită pentru fereastra corespunzătoare bazei secundare. Prin

selectarea câmpului Window se trece în modul de vizualizare folosind baza de timp

secundară.

figura 1.5 Osciloscop digital TDS2000B

figura 1.6 Osciloscop realizat cu μC MSP430 realizat de Texas Instruments

Capitolul 2

Familia de μC MSP430

Familia de μC MSP430 de la Texas Iinstruments (TI) este o familie de putere foarte mică, 16-bit RISC microcontrolere cu o arhitectură avansată și o periferică bogată. MSP430x1xx funcționează consumând mai puțin de 350 μA în mod activ când funcționează la o frecvență de 1MHz într-un sistem tipic 3V și se trezește dintr-o stare standby în care funcționează doar cu 2μA și se sincronizează complet în mai puțin de 6μs. Aceste cerințe minimale de curent combinate cu perioada mică de revenire din standby fac din această familie de μC un mare ajutor în crearea unui sistem lowpower cu viață foarte mare bazată pe baterie. Aceste μC se găsesc de memorii diferite, au convertoare analog-numerice,timere,timere cu captură,registre de comparare,capabilitatea de o scoate semnal PWM, ceas interior, multiplicatoare, amplificatoare, Watchdog Timer, unitate de aritmetica și logică USART si driver LCD de care avem nevoie să afișăm datele pe afișajul Siemens LS020.

Un design de putere mică necesită un cristal de frecvență mică deoarece un oscilator de frecvență mai mare ar crește și consumul de curent considerabil. Cristale în forma de diapazon au o frecvență între 10-200KHz consumând într-un mod fundamental un level de 1μW. Acești parametri îi fac prima alegere pentru cristalele oscilatoare de 32768Hz în μC MSP430.

Scheme și diagrame funcționale

figura 2.1 Arhitectura MSP430

figura 2.2 Diagrama block a controlerului LCD

figura 2.3 Diagrama block a controlerului LCD_A

figura 2.4 Diagram block de alimentare

Blocul de alimentare detectează dacă linia AVcc scade sub un anumit nivel și setează un flag pentru cererea de întrerupere, pentru a se reseta datorită nivelului scăzut de tensiune de alimentare.

figura 2.5 Interfața de comunicare serială pentru modul I2C

Modul I2C suportă conectarea și cu dispozitiv master, dar și cu unul slave, poate să fie transmițător sau receptor și comunică prin liniile SDA(System Data) și SCL(System Clock) care sunt inițializate de master.

figura 2.6 Schema bloc a comparatorului

Modulul comparatorului este configurat software. Comparatorul compară intrările analogice care intră la bornele “+” respectiv “-”,iar dacă la intrarea “+” valoarea este mai pozitivă decât cea de la “+” ieșirea CAOUT este pe nivel “1”. Comparatorul se poate opri sau porni după preferință, datorită bitului de control CAON si se lasă de preferință oprit dacă nu se folosește.

figura 2.7 Placa experimentală MSP430FG4618/F2013

Placa experimentală MSP430FG4618/F2013 suportă o varietate de aplicații: interfață la un 4-mux LCD, conexiune UART, microfon, ieșire audio, buzzer chiar și comunicare wireless. Se alimentează datorită celor două baterii AAA ce se află on-board sau datorită unei conexiuni independente Flash emulation tool (FET). Două butoane S1 și S2 sunt conectate prin portul digital I/O P1. Comunicarea se poate face wireless cu toate plăcile CCxxxxEMK de la Texas Instruments, poate cumunica cu calculatorul prin intrefața RS232 de 9 linii și chiar prin I2C sau SPI.

figura 2.8 Locațiile și numele jumperelor

Programe de rulare

; You may not use the Program in non–TI devices.

;**********************************************************************

; RTC USING THE WATCHDOG TIMER

;

; Acest program a fost făcut pentru funcționarea unui ceas normal: oră, minute, secunde ;pentru care se folosesc trei regiștri.

; Watchdog timer întrerupe la exact 1 secundă ciclurile mașină.

; Programul a fost scris pentru MSP430F1121 dar se poate cu ușurință adapta la orice

; dispozitiv MSP430

;**********************************************************************

#include ” msp430x11x1.h” ; include std defs

; RTC variables

#define SEC R13

#define MIN R14

#define HR R15

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

; Program RESET

RSEG CODE

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

RESET MOV #02FEh,SP ; Initialize stackpointer

CALL #Setup ; Prepare LCD and basic timmer

; Mainloop

Mainloop BIS #LPM3,SR ; Set SR bits for LPM3

CALL #Clock ; Update Clock

JMP Mainloop ; Endless

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

; Clock: Update clock SEC and MIN and HR

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

Clock SETC ; Set Carry bit.

DADC.b SEC ; Increment seconds decimally

CMP.b #060h,SEC ; One minute elapsed?

JLO Clockend ; No, return

CLR.b SEC ; Yes, clear seconds

DADC.b MIN ; Increment minutes decimally

CMP.b #060h,MIN ; Sixty minutes elapsed?

JLO Clockend ; No, return

CLR.b MIN ; yes, clear minutes

DADC.b HR ; Increment Hours decimally

CMP.b #024h,HR ; 24 hours elapsed?

JLO Clockend ; No, return

CLR.b HR ; yes, clear hours

Clockend RET ;

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

; Setup: Configure Modules and Control Registers

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

Setup BIS.b #BIT0,&IE1 ; Enable Watchdog Int.

MOV #WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL,&WDTCTL

; Stop Watchdog Timer

; Set in interval

; timer mode and set

ClearRTC MOV.b #00h,SEC ; Clear SEC

MOV.b #00h,MIN ; Clear MIN

MOV.b #00h,HR ; Clear HR

EINT ; Enable interrupts

RET ; Done with setup. ; interrupt interval

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

; Watchdog ISR:

; CPU este returnat pentru a active starea RETI manipulînd SR

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

WDINT BIC #LPM3,0(SP) ; Clear SR LPM3 Bits, on top of stack

RETI ;

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

RSEG INTVEC ; Interrupt vectors

;––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

DW RESET ;

DW RESET ;

DW RESET ;

DW RESET ;

DW RESET ;

DW RESET ;

DW RESET ;

DW RESET ;

DW RESET ;

DW RESET ; Timer_A (CCIFG0)

DW WDINT ; Watchdog Timer

DW RESET ;

DW RESET ;

DW RESET ;

DW RESET ; NMI, Osc. fault

DW RESET ; POR, ext. Reset, Watchdog

END

//**********************************************************************

// MSP430xG46x Demo

// Program pentru rularea plăcii pentru funcționarea corectă a LCD-ului

// ACLK = 32.768kHz, MCLK = SMCLK = default DCO

// MSP430xG461x

// ––––––––

// /|\| |

// | | P2.2|–>LED1

// –|RST P2.1|–>LED2

// | P5.1|–>LED4

// | |

// SW1–>|P1.0 | SoftBaugh SBLCDA4 4-mux LCD

// SW2–>|P1.1 P10.5/S4|–>S0–>PIN14 (1A_1B_1C_1D)

// | P10.4/S5|–>S1–>PIN13 (1F_1G_1E_DP1)

// | P10.3/S6|–>S2–>PIN12 (2A_2B_2C_2D)

// | P10.2/S7|–>S3–>PIN11 (2F_2G_2E_DP2)

// | P10.1/S8|–>S4–>PIN10 (3A_3B_3C_3D)

// | P10.0/S9|–>S5–>PIN9 (3F_3G_3E_COL3)

// | P9.7/S10|–>S6–>PIN8 (4A_4B_4C_4D)

// | P9.6/S11|–>S7–>PIN7 (4F_4G_4E_DP4)

// | P9.5/S12|–>S8–>PIN6 (5A_5B_5C_5D)

// | P9.4/S13|–>S9–>PIN5 (5F_5G_5E_COL5)

// | P9.3/S14|–>S10->PIN4 (6A_6B_6C_6D)

// | P9.2/S15|–>S11->PIN3 (6F_6G_6E_DP6)

// | P9.1/S16|–>S12->PIN2 (7A_7B_7C_7D)

// | P9.0/S17|–>S13->PIN1 (7F_7G_7E_DP7)

// | P8.7/S18|–>S14->PIN19 (F5_PR_P4_P3)

// | P8.6/S19|–>S15->PIN20 (F1_F2_F3_F4)

// | P8.5/S20|–>S16->PIN21 (PL_P0_P1_P2)

// | P8.4/S21|–>S17->PIN22 (AU_AR_AD_AL)

// | P8.3/S22|–>S18->PIN23 (BT_B1_B0_BB)

// | P8.2/S23|–>S19->PIN24 (ANT_A2_A1_A0)

// | P8.1/S24|–>S20->PIN25 (ENV_TX_RX_8BC)

// | P8.0/S25|–>S21->PIN26 (DOL_ERR_MINUS_MEM)

// | COM3|–>COM3 (COM3)

// | COM2|–>COM2 (COM2)

// | COM1|–>COM1 (COM1)

// | COM0|–>COM0 (COM0)

// | |

//

//

// G. Morton

// Texas Instruments Inc.

// February 2007

// Built with IAR Embedded Workbench Version: 3.42A

//**********************************************************************

#include <Board.h>

#include <LCD.h>

// Function Declarations

void initBasicTimer(void);

void initPortPins(void);

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

FLL_CTL0 |= XCAP18PF; // Set load cap for 32k xtal

initPortPins(); // Initialize port pins

initBasicTimer(); // Initialize basic timer

initLCD_A(); // Initialize LCD_A

testAll();

for(;;)

{

_BIS_SR(LPM3_bits + GIE); // LPM3, enable interrupts

testChar();

testSpecialChar();

testSigLvl();

testBatt();

testPwrLvl();

testFunc();

testArrow();

testSymbol();

}

}

// Basic Timer Interrupt Service Routine

#pragma vector=BASICTIMER_VECTOR

__interrupt void basic_timer_ISR(void)

{

P2OUT ^= PIN2+PIN1; // Toggle P2.2,1

P5OUT ^= PIN1; // Toggle P5.1

LPM3_EXIT;

}

// Initialize port pins

void initPortPins(void)

{

P2DIR = PIN2+PIN1; // Set P2.2,1 as outputs

P5DIR = PIN1; // Set P5.1 as output

P2OUT = PIN1; // Set P2.1 to 1

}

// Initialize basic timer

void initBasicTimer(void)

{

// Basic timer setup

// Set ticker to 32768/(256*128)

// Enable BT interrupt

BTCTL = BT_fCLK2_DIV128 | BT_fCLK2_ACLK_DIV256;

IE2 |= BTIE;

}

Capitolul 3

Afișaj Siemens LS020(Siemens S65)

Siemens a folosit acest tip de afișaj la tipurile de telefoane: S65, M65, CX65, și SK65 ,un tip de afișaj TFT de 16-bit cu 132×176 pixeli. Acest afișaj folosește LED-uri alb iluminate și o dimensiune atractivă. Acest afișaj este de găsit la magazinele unde se repară telefoane și se pot cumpăra doar anumite părți de telefoane și este la un preț de sub 20 de euro. În următoarea poză avem două afișaje, unul de Nokia 6100 și cel de Siemens S65.

figura 3.1 Afișaj Nokia6100 și afișaj Siemens S65

figura 3.2 Dimensiunea afișajului S65

figura 3.3 Descrierea pimilor

Schemele următoare descriu folosința afișajului în aplicații, care este concentrată asupra procesorului ATMEL® AVR dar descrierea este posibilă pentru orice alt μC. Cele două afișaje sunt alimentate cu 2.9V de la LDO-ul care transforma cei 5V de la μC-ul ATMEL® AVR. Am folosit LDO-ul IRU1205CLTR pentru că mai târziu folosim trăsătura sa power ON/OFF. μC-ul ATMEL® AVR rulează pe 16MHz. Cele cinci linii de la afișaj la μC sunt mutate de la 5V la 2.9V. Pentru că interfața funcționează la 8MHz impedanța trebuie sa fie mică pentru a obține semnale stabile. Este o idee bună a se activa shifterul de nivel pentru a salva putere, în special pentru linia RESET care trebuie să fie pe nivel ridicat atâta timp cât folosim afișajul. Pe altă parte putem folosi shifter de nivel cu impedanță mare dacă nu avem nevoie de viteză mare.

figura 3.4 Afisajul Siemens S65 folosit cu μC-ul ATMEL® AVR

Tensiunea măsurată pe afișaj este de 10,4V la un curent 20mA, ceea ce înseamnă că folosește o tensiune relativ mare. Această tensiune se genereză ușor cu un generator PWM al μC-ului. În următoarea schema menționăm nevoia de un puls de lățime de 54% din perioada frecvenței de 200KHz necesare pentru generarea curentului de 20mA necesar activării unui LED.

figura 3.5 Generarea curentului necesar unui LED cu un generator PWM

3.1 Comenzi de date

3.1.1 Comenzi de inițializare

Afișajul comunică cu μC-ul prin linia RS; dacă este pe nivel înalt afișajul așteaptă comenzi și dacă este pe nivel scăzut așteaptă date. Un display LCD TFT este programat la început, aceasta pentru că al porni este necesar de o succesiune de date sau program de inițializare care pornește chipul de pe display. Cele două secvențe care alcătuiesc programul de inițializare sunt:

INIT1

0xFDFD, 0xFDFD

0xEF00

0xEE04, 0x1B04

0xFEFE, 0xFEFE

0xEF90, 0x4A04, 0x7F3F, 0xEE04, 0x4306

După această secvență trebuie să așteptăm soluționarea internă de tensiune, o perioadă de timp foarte sensibilă, care dacă este prea mică sau prea mare displayul nu o să meargă. Această perioadă a fost măsurată la 7ms, valoare care trebuie să aibe și introducerea celei de-a doua secvențe:

INIT2

0xEF90, 0x0983, 0x0800, 0x0BAF, 0x0A00, 0x0500, 0x0600, 0x0700

0xEF00

0xEE0C

0xEF90, 0x0080

0xEFB0, 0x4902

0xEF00

0x7F01, 0xE181

0xE202

0xE276

0xE183

0x8001

După ce și cea de-a doua secvență a fost introdusă, diplayul este gata de utilizare. Se recomandă un clear screen deoarece displayul după ce este pornit arată pixeli de culori random.

3.1.2 Comenzi de oprire

Comenzile pentru oprirea afișajului nu sunt cunoscute, dar el trebuie oprit deoarece lasându-l pornit îi scade viața lui de funcționare. El se oprește cu întregul sistemul, odată cu oprirea sistemului de alimentare.

3.1.3 Comenzi pentru scriere full-screen sau doar secțiuni

Comanda pentru scrierea în memorie este:

MEMWR: 0xEF90, 0x05OR, 0x06YS, 0x07XS

După această comandă displayul este gata de folosire pixel cu pixel, fiecare având 16-biți. Parametri YS și XS definesc subsecțiuni ale întregii memorii de afișaj. Acestea se folosesc dacă nu este nevoie de întrega memorie de afișare. Aceasta se realizează la următoarea comandă MEMWR unde se resetează pointerul la coordonatele introduse. Ecranul complet se scrie cu parametrii YS=0 și XS=0. Pentru această scriere nu este nevoie de o declarare a parametrilor, este suficient scrierea datelor și ulterior suprascrierea lor. Numărul total de biți este 132x176x2=46464 care în memorie hexa este 0xB580h pe toți pixeli. Memoria este scrisă la început în direcția X și după în direcția Y, iar parametrul OR definește orientarea.

OR=0x04 setează orientarea la 0° exact ca în figura 3.6, memoria este scrisă pe linia x de la stânga la dreapta.

OR=0x00 setează orientarea la 90°, memoria este scrisă pe linie, pe coloane începând din stânga de sus în jos

Figura 3.6 Descrierea afisajului pe linile X și Y

3.1.4 Codificarea culorii pixelilor

Memoria este scrisă după codul -5-6-5- adică –R-G-B- , primii cinci biți codează intensitatea lui roșu, următorii șase biți cea a lui verde și ultimii cinci biți cea a lui albastru. Exemplu : 0xFFFF este alb și 0x0000 este negru.

3.1.5 Scrierea parțială a ecranului

Memoria este organizată într-o matrice cu coordonate X și Y unde în fiecare pixel este salvată o informație asupra culorii lui.

figura 3.7 Scierea parțială a memoriei

Pentru scrierea parțială se începe din colțul (X1,Y1) și se sfârșește la (X2,Y2).

PMEMWRX direcția X

0xEF90, 0x0504, 0x08X1, 0x09X2, 0x0AY1, 0x0BY2

PMEMWRY direcția Y

0xEF90, 0x0500, 0x08X1, 0x09X2, 0x0AY1, 0x0BY2

figura 3.8 Defilarea imaginii scrisă prin scriere parțială

Secvența de pornire:

Secvența 1 (timp 0ms)

0xFDFD, 0xFDFD

Secvența 2 (timp 68ms după pornire)

0xEF00, 0xEE04, 0x1B04, 0xFEFE, 0xFEFE

0xEF90, 0x4A04, 0x7F3F, 0xEE04, 0x4306

Secvența 3 (timp 75ms după pornire)

0xEF90, 0x0983, 0x0800, 0x0BAF, 0x0A00, 0x0500, 0x0600, 0x0700

0xEF00

0xEE0C

0xEF90, 0x0080,

0xEFB0, 0x4902

0xEF00

0x7F01, 0xE181

Secvența 4 (timp 182ms după start)

0xE202

Secvența 5 (timp 297ms după start)

0xE276

Secvența 6 (timp 401ms după start)

0xE183

Secvența 7 (timp 460ms după start)

0x8001

Este de precizat că Siemens tot timpul actualizează tot ecranul, chiar dacă doar o parte din el se modifică. Motivul pentru aceasta este controlerul grafic s1d13732 care reține memoria actuală și o scrie pe cea nouă print-un mod hardware. Doar comenzile sunt generate de μC. Secvența folosită de Siemens pentru a scrie memoria completă este:

0xEF90, 0x0500, 0x0600, 0x0700,

după aceasta urmează datele și normal dezactivarea liniei RS care acum trebuie să fie pe nivel scăzut. Întreaga procedură de scriere a memoriei durează 28,59ms care corespunde la 132*176*16=371712 biți la o frecvență de clock de 13MHz.

3.2 Scheme funcționale

figura 3.9 Diagrama schematică a plăcii de test

figura 3.10 Placă de test S65 LCD

figura 3.11 Placă de test S65 LCD

3.3 Regiștri LS020

figura 3.12 Paletă LS020 în 8 biți

3.4 Program funcțional

// LCDutils.c – functions for on SBLCDA4 on TI Experimenter's Board

//–––––––––––––––––––––––-

#include <io430xG46x.h> // Specific device

#include <stdint.h> // Integers of defined sizes

#include "LCDutils. // SBLCDA4 utility functions

#define LCDDIGITS 7 // Number of digits in display

#define LCDMEMS 11 // LCD memories used (3-13)

// Pointer to LCD memory used: allows use of array LCDMem[]

uint8_t * const LCDMem = (uint8_t *) &LCDM3;

// LCD segment definitions (SoftBaugh SBLCDA4)

#define SEG_A BIT0 // AAAA

#define SEG_B BIT1 // F B

#define SEG_C BIT2 // F B

#define SEG_D BIT3 // GGGG

#define SEG_E BIT6 // E C

#define SEG_F BIT4 // E C

#define SEG_G BIT5 // DDDD

#define SEG_H BIT7 // colon, point etc

// Patterns for hexadecimal characters

const uint8_t LCDHexChar[] = {

SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // "0"

SEG_B | SEG_C, // "1"

SEG_A | SEG_B | SEG_D | SEG_E | SEG_G, // "2"

SEG_A | SEG_B | SEG_C | SEG_D | SEG_G, // "3"

SEG_B | SEG_C | SEG_F | SEG_G, // "4"

SEG_A | SEG_C | SEG_D | SEG_F | SEG_G, // "5"

SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // "6"

SEG_A | SEG_B | SEG_C, // "7"

SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // "8"

SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G, // "9"

SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // "A"

SEG_C | SEG_D | SEG_E | SEG_F | SEG_G, // "b"

SEG_A | SEG_D | SEG_E | SEG_F, // "C"

SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // "d"

SEG_A | SEG_D | SEG_E | SEG_F | SEG_G, // "E"

SEG_A | SEG_E | SEG_F | SEG_G, // "F"

};

// More useful patterns

const uint8_t LCDhexChar = SEG_C | SEG_E | SEG_F | SEG_G;

const uint8_t LCDAMChar = SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G;

const uint8_t LCDPMChar = SEG_A | SEG_B | SEG_E | SEG_F | SEG_G;

const uint8_t LCDMinusChar = SEG_G;

const uint8_t LCDEChar = SEG_A | SEG_D | SEG_E | SEG_F | SEG_G;

const uint8_t LCDHChar = SEG_B | SEG_C | SEG_E | SEG_F | SEG_G;

const uint8_t LCDhChar = SEG_C | SEG_E | SEG_F | SEG_G;

const uint8_t LCDLChar = SEG_D | SEG_E | SEG_F;

const uint8_t LCDOChar = SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F;

const uint8_t LCDoChar = SEG_C | SEG_D | SEG_E | SEG_G;

const uint8_t LCDrChar = SEG_E | SEG_G;

const uint8_t LCDBlankChar = 0;

// Segments of "digit 10", half-digit on right plus special symbols

#define ONESEG BIT3 // '1' (only one logical segment)

#define DOLLARSEG BIT4 // '$'

#define ERRORSEG BIT5 // 'E' marker

#define MINUSSEG BIT6 // '-' marker

#define MEMSEG BIT7 // 'M' marker

// Inițializarea SBLCDA4

//–––––––––––––––––––––––-

void LCDInit (void)

{

int i;

for(i = 0; i < LCDMEMS; ++i) { // Clear LCD memory used

LCDMem[i] = 0;

}

P5SEL = BIT4|BIT3|BIT2; // Select COM[3:1] function

LCDAPCTL0 = LCDS4|LCDS8|LCDS12|LCDS16|LCDS20|LCDS24;

// Enable LCD segs 4-27 (4-25 used)

LCDAVCTL0 = 0; // No charge pump, everything internal

LCDACTL = LCDFREQ_128 | LCD4MUX | LCDSON | LCDON;

// ACLK/128, 4mux, segments on, LCD_A on

}

//–––––––––––––––––––––––-

// Cuvânt în hexazecimal, 4 digits urmați de litera 'h' ('H')

//–––––––––––––––––––––––-

#define LCDDIGITS 7 // Number of digits in display

void DisplayHex (uint16_t HexValue)

{

uint8_t i; // Index for LCD array

LCDMem[0] = LCDhChar; // 'h' for hexadecimal on right

for (i = 1; i <= 4; ++i) { // Display 4 hex digits

LCDMem[i] = LCDHexChar[HexValue & 0x000F];

HexValue >>= 4; // Move next nibble into position

}

while (i < LCDDIGITS) { // Clear more significant digits

LCDMem[i++] = LCDBlankChar; // of numerical display

}

}

//–––––––––––––––––––––––-

// Display unsigned, 16-bit integer (uint16_t)

// Convert to BCD and display

// Leading zeros suppressed; BCD value does not exceed 5 digits

//–––––––––––––––––––––––-

void DisplayUint (uint16_t UintValue)

{

uint8_t i; // Index for LCD array

uint32_t BCDValue; // Value converted bin to BCD

BCDValue = UintToBCD (UintValue); // Convert binary to BCD

i = 0; // Index for LCD memories

do { // Store pattern for next digit

LCDMem[i++] = LCDHexChar[BCDValue & 0x000F];

BCDValue >>= 4; // Move next nibble down

} while (BCDValue > 0); // (Always display first digit)

while (i < LCDDIGITS) { // Clear more significant digits

LCDMem[i++] = LCDBlankChar; // of numerical display

}

}

//–––––––––––––––––––––––-

// Display unsigned, 32-bit integer (uint32_t) up to 19,999,999

// Convert to BCD if it fits and display with leading zeros suppressed

//–––––––––––––––––––––––-

void DisplayUlint (uint32_t UlintValue)

{

uint8_t i; // Index for LCD array

uint32_t BCDValue; // Value converted bin to BCD

if (UlintValue <= 9999999) {

BCDValue = UlintToBCD (UlintValue); // Convert binary to BCD

i = 0; // Index for LCD memories

do { // Store pattern for next digit

LCDMem[i++] = LCDHexChar[BCDValue & 0x000F];

BCDValue >>= 4; // Move next nibble down

} while (BCDValue > 0); // (Always display first digit)

while (i < LCDDIGITS) { // Clear more significant digits

LCDMem[i++] = LCDBlankChar; // of numerical display

}

LCDMem[10] = LCDBlankChar; // Special segment for "1"

} else if (UlintValue <= 19999999) { // Needs special treatment

BCDValue = UlintToBCD (UlintValue); // Convert binary to BCD

for (i = 0; i < LCDDIGITS; ++i) {

LCDMem[i] = LCDHexChar[BCDValue & 0x000F];

BCDValue >>= 4; // Move next nibble down

}

LCDMem[10] = ONESEG; // Special segment for "1"

} else {

DisplayErr(); // Indicate overflow

LCDMem[10] = LCDBlankChar; // Special segment for "1"

}

}

//–––––––––––––––––––––––-

// Display signed, 16-bit integer (int16_t)

// Strip sign, convert unsigned value to BCD and display

// Leading zeros suppressed; BCD value does not exceed 5 digits

//–––––––––––––––––––––––-

void DisplayInt (int16_t IntValue)

{

uint8_t i; // Index for LCD array

uint32_t BCDValue; // Value converted bin to BCD

enum {plus, minus} sign;

if (IntValue >= 0) { // Keep track of sign

sign = plus;

} else {

sign = minus;

IntValue = -IntValue; // Conversion needs IntValue>=0

}

BCDValue = UintToBCD (IntValue); // Convert binary to BCD

i = 0; // Index for LCD memories

do { // Store pattern for next digit

LCDMem[i++] = LCDHexChar[BCDValue & 0x000F];

BCDValue >>= 4; // Move next nibble down

} while (BCDValue > 0); // (Always display first digit)

if (sign == minus) {

LCDMem[i++] = LCDMinusChar; // Prepend minus sign

}

while (i < LCDDIGITS) { // Clear more significant digits

LCDMem[i++] = LCDBlankChar; // of numerical display

}

}

//–––––––––––––––––––––––-

// Display line of hyphens –– across LCD to show that it is alive

//–––––––––––––––––––––––-

void DisplayLine (void)

{

uint8_t i; // Index for LCD array

for (i = 0; i < LCDDIGITS; ++i) { // Step through digits

LCDMem[i] = LCDMinusChar; // of numerical display

}

}

//–––––––––––––––––––––––-

// Display "Error" on LCD

//–––––––––––––––––––––––-

void DisplayErr (void)

{

uint8_t i; // Index for LCD array

LCDMem[0] = LCDrChar;

LCDMem[1] = LCDoChar;

LCDMem[2] = LCDrChar;

LCDMem[3] = LCDrChar;

LCDMem[4] = LCDEChar;

for (i = 5; i < LCDDIGITS; ++i) { // Step through digits

LCDMem[i] = LCDBlankChar; // of numerical display

}

}

//–––––––––––––––––––––––-

// Display "HELLO" on LCD (need a less clumsy routine?)

//–––––––––––––––––––––––-

void DisplayHello (void)

{

uint8_t i; // Index for LCD array

LCDMem[0] = LCDOChar;

LCDMem[1] = LCDLChar;

LCDMem[2] = LCDLChar;

LCDMem[3] = LCDEChar;

LCDMem[4] = LCDHChar;

for (i = 5; i < LCDDIGITS; ++i) { // Step through digits

LCDMem[i] = LCDBlankChar; // of numerical display

}

}

Concluzii

În lucrarea de față s-a realizat studiul microcontrolerului MSP430x4xx și a afișajului Siemens S65(LS020). Studiul include în primul rând interfața serială sincronă SPI, modulul PWM, porturile paralele ale microcontrolerului în vederea conectării afișajului LCD, precum și funcționarea integratului AD7858L.

Pentru o prezentare concretă a convertorului AD7858L la microcontrolerul MSP430x4xx s-au dezvoltat aplicații funcționale. Lucrarea de fața prin partea ei teoretică și practică poate fi folosită în procesul didactic în cadrul univesității, dar poate sta și la baza dezvoltării unor noi aplicații sau în cazul convertorului AD7858L studiul amănunțit asupra calibrării, modurile power down etc.

Pe parcursul dezvoltării acestui proiect s-a studiat și sistemul de dezvoltare SK-S12-A, mediul de programare Code Warrior, mediul de programare C, și s-au dobândit cunoștințe de programare în limbajul de asamblare specific pentru micontrolerele MSP430 de Texas Instruments(TI).

Bibliografie

http://ro.wikipedia.org/wiki/Osciloscop

Ebook MSP430 Microcontroller Basics by John Davies

Ebook MSP430x4xx Famili User’s Guide by Instruments(TI)

Ebook Implementing a Real-Time Clock on the MSP430 by (TI)

Ebook Using The Siemens S65-Display by Cristian Kranz

http://www.juras-projects.org/eng/lcd.php Using Siemens S65 LCD

Bibliografie

http://ro.wikipedia.org/wiki/Osciloscop

Ebook MSP430 Microcontroller Basics by John Davies

Ebook MSP430x4xx Famili User’s Guide by Instruments(TI)

Ebook Implementing a Real-Time Clock on the MSP430 by (TI)

Ebook Using The Siemens S65-Display by Cristian Kranz

http://www.juras-projects.org/eng/lcd.php Using Siemens S65 LCD

Similar Posts