Introducere

Scopul proiectului este crearea unui dispozitiv similar unui calculator de buzunar care să poată efectua operaţiile aritmetice de bază:

  1. adunare
  2. scădere
  3. înmulţire
  4. împărţire

şi funcţiile trigonometrice:

  1. arcsin
  2. arccos.

Privind utilitatea acestuia, consider ca e o metodǎ foarte bună pentru a invǎţa şi a experimenta, din punctul de vedere al începătorului în domeniul proiectării microprocesoarelor. Utilitatea produsului final este evidentă.

Descriere generală

Schema bloc cu modulele hardware şi software ale proiectului:

module_hard.jpg

Prin intermediul modulului “Interfata tastatura”, microprocesorul preia datele introduse de utilizator prin keypad(cifre/operatori/paranteze/reset).
Microprocesorul poate avea drept input un buton. La apǎsǎri succesive, se va efectua operaţia arcsin, respectiv arccos, alternativ.

Dupa validarea operaţiei cerute şi efectuarea calculelor, microprocesorul afiseaza rezultatul pe LCD, cu ajutorul modului software “Interfata LCD”.

Hardware Design

Pe lânga plǎcuţa de bazǎ, realizatǎ în prima etapă, mai sunt necesare urmǎtoarele piese:

  1. un LCD LM016l bazat pe controllerul Hitachi 44780 (conectarea la microcontroller se face direct)
  2. o mini-tastaturǎ matricială de 4×6 (24 taste):
    • 10 taste: cifre
    • 1 tastǎ: =
    • 4 taste: +, -, *, /
    • 1 tastǎ: reset(C)
    • 2 taste: ( )
  3. un buton

Urmǎtoarea schemǎ(ISIS Proteus) prezintǎ modul in care componentele menţionate anterior se leagă la placuţa de bazǎ:

schema.jpg

Ţinând cont de faptul ca pinii:

  • PD0, PD1 - interfaţa RS232
  • PB5, PB6, PB7 - programatorul ISP
  • PD2, PD3 - programatorul USB
  • PD7 - LED2
  • PD6 - SW1

erau deja folosiţi de componentele menţionate în dreptul lor, voi ataşa noile piese, astfel:

  1. interfaţarea LCD-ului se efectueaza pin la pin cu microcontrollerul, în modul restrâns, pe 4 biţi de date.
    Este nevoie doar de 7 biţi pentru controlul complet al LCD-ului. Toţi cei 7 biti sunt mapaţi în registrul C al micontrollerului.
  2. butonul este conectat la pinul 0 din portul A şi are o rezistenţǎ de pull-up de 1K.
  3. cea mai dificila parte este interfaţarea keypad-ului. Cea mai simplǎ metodǎ pe care am gǎsit-o este conectarea pinilor de pe
    fiecare rând şi de pe fiecare coloana la acelaşi port IO. Dar, în cazul de faţǎ, keypad-ul este 4×6, aşadar sunt 10 pini de conectat.
    Ei nu vor încăpea într-un singur registru.

Soluţia aleasă este conectarea pinilor corespunzători liniilor în portul B (A:PB1, B:PB2, C:PB3, D:PB4) şi conectarea
pinilor corespunzători coloanelor în portul A (1:PA2, 2:PA3, 3:PA4, 4:PA5, 5:PA6, 6:PA7), adicǎ în porturi separate.

Acest lucru va spori puţin complexitatea modulului de interfaţare a keypadului.

Software Design

Modulul software de interfaţare a LCD-ului se va baza pe API-ul din primul laborator:

void LCD_init(); // Initializare modul LCD. 
                 // Trebuie apelata inainte de a se face orice operatie cu LCD-ul. 
                 // Initializarea este facuta considerand o interfatare pe 4 fire.
void LCD_writeInstruction(unsigned char _instruction); // Trimite o instructiune catre l.
void LCD_writeData(unsigned char _data); // Trimite date catre LCD pentru afisare.
void LCD_write(unsigned char _byte); // Trimite un byte catre LCD pe pinii D4-7 in 2 timpi.
                                     // Se trimit intai bitii mai semnificativi si apoi cei mai putin semnificativi.
void LCD_waitNotBusy(); // Functia asteapta pana cand lcd-ul devine disponibil pt o noua comanda.
void LCD_print(char* _msg); // Afiseaza imformatia pe LCD (doar 1 linie, primele 16 caractere din msg)
void LCD_print2(char* _msg1, char* _msg2); // Afisare pe 2 lini pe LCD. 
                                           // Pe prima linie afiseaza _msg1 si pe a 2-a _msg2.
void LCD_printDecimal2u(unsigned int _n);  // Afisare numar in baza 10 pe LCD
void LCD_printHexa(unsigned int _n);       // Afisare numar in baza 16 pe LCD
void LCD_waitInstructions(unsigned char _instructions); // Asteapta un numar de cicli de ceas



În ceea ce priveşte detecţia tastei apǎsate, microcontrollerul va scana continuu keypad-ul:

  • setează toţi pinii liniilor, cu excepţia unuia, pe high
  • citeşte valorile de la toţi pinii coloanelor. Întrucât coloanele sunt conectate prin rezistenţe de pull-up la microcontroller,
    acesta va detecta o valoare low pe unul din pinii de intrare, atunci când o tastǎ e apăsată.

Din intersecţia liniei şi coloanei, se obţine tasta apăsată.

Etapele efectuării calculelor numerice:

  • citirea operanzilor si a operatorilor de la keypad
  • validarea, pe parcurs, a operaţiilor(de exemplu, “1+=” e incorect)
  • parsarea expresiei, ţinând cont de prioritatea operatorilor si de parantezare
  • parcurgerea arborelui
  • realizarea operatiilor de adunare, scadere, inmultire, impartire

Bibliografie/Resurse

pm/prj2010/pgp/calculator_aritmetic.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0