Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2023:drtranca:cristina.hudisteanu [2023/05/30 08:44]
cristina.hudisteanu [Software Design]
pm:prj2023:drtranca:cristina.hudisteanu [2023/05/30 12:27] (current)
cristina.hudisteanu [Download]
Line 9: Line 9:
   * Proiectul presupune un ceas pe display format din 3 matrice de leduri.  ​   * Proiectul presupune un ceas pe display format din 3 matrice de leduri.  ​
   * Este util deoarece poate fi programat prin telecomanda de la o distanta rezonabila. ​   * Este util deoarece poate fi programat prin telecomanda de la o distanta rezonabila. ​
-  * Oricine are nevoie de un ceas in casa pentru a utiliza diferite alarme inainte de a merge la serviciu/​facultate +  * Oricine are nevoie de un ceas in casa pentru a ajunge la timp la serviciu/​facultate 
-  * Fara a ne mai deplasa pana la dispozitiv ​il putem seta. +  * Fara a ne mai deplasa pana la dispozitiv ​ii putem seta ora/​data/​anul
-  * Pentru a nu fi nevoie sa setam ora dupa fiecare oprire a device-ului am adaugat un RTC +  * Pentru a nu fi nevoie sa setam ora dupa fiecare oprire a device-ului am adaugat un RTC
 </​note>​ </​note>​
 ===== Descriere generală ===== ===== Descriere generală =====
Line 141: Line 141:
     * [0-9] : cifrele de care ne vom folosi sa cream outputul dorit     * [0-9] : cifrele de care ne vom folosi sa cream outputul dorit
  
 +Matricele de LED-uri le reprezentam in cod intr-un array 2D cu 24 coloane si 8 linii prin care iteram de la dreapta la stanga pentru a putea face edit usor. 
 +In cadrul proiectului am integrat atat intreruperi cat si SPI.
  
 +Pentru afisajul cifrelor am pregatit o serie de constante pentru a simplifica procesul:
 +
 +const uint8_t NUMBERS[][4] = {
 +  { 0b01111000, 0b10000100, 0b10000100, 0b01111000 },  //0
 +  { 0b00000100, 0b11111100, 0b01000100, 0b00000000 },  //1
 +  { 0b01100100, 0b10010100, 0b10010100, 0b01001100 },  //2
 +  { 0b01011000, 0b10100100, 0b10000100, 0b01001000 },  //3
 +  { 0b00111100, 0b10010000, 0b01010000, 0b00110000 },  //4
 +  { 0b10011000, 0b10100100, 0b10100100, 0b11101000 },  //5
 +  { 0b00011000, 0b10100100, 0b10100100, 0b01111000 },  //6
 +  { 0b11000000, 0b10100000, 0b10011100, 0b10000000 },  //7
 +  { 0b01011000, 0b10100100, 0b10100100, 0b01011000 },  //8
 +  { 0b01111000, 0b10010100, 0b10010100, 0b01100000 },  //9
 +};
 +
 +
 +#define ZERO 0x822A
 +#define ONE 0xA0AA
 +#define TWO 0xA82A
 +#define THREE 0x8022
 +#define FOUR 0xA8AA
 +#define FIVE 0xA02A
 +#define SIX 0x8822
 +#define SEVEN 0x8AA2
 +#define EIGHT 0x8A22
 +#define NINE 0x88A2
 +
 +Pentru butoane, avem functia de intrerupere care se executa cand apar modificari HIGH to LOW pe pinul D2. Cand se apasa un buton de pe telecomanda se trimite informatie care genereaza modificarile. Decodam informatia:
 +    * un bit 1 este approx 100 ticks de ceas la frecventa 2MHz (frecventa ucontrollerului/​ prescaler 8)
 +    * un bit 0 este approx 40 ticks
 +    * la inceputul transmisiei se trimite un semnal de inceput care are lungimea approx 60 ticks
 +    * finalul este marcat de un impuls cu o lungime mai mare de 130
 +
 +ISR(INT0_vect) {
 +  if (TCNT2 > 50 && TCNT2 < 70) {
 +    reading = true;
 +    code = 0;
 +  } else if (TCNT2 > 130 && reading) {
 +    handle_ir_code();​
 +    reading = false;
 +  } else if (reading) {
 +    if (TCNT2 < 50) {
 +      code <<= 1;
 +    } else if (TCNT2 >= 50) {
 +      code <<= 1;
 +      code |= 1;
 +    }
 +  }
 +  TCNT2 = 0;
 +}
 +
 +Pentru intreruperea de 1 secunda pe timer1 avem functia care se ocupa de actualizarea timpului dupa regulile bine cunoscute
 +ISR(TIMER1_COMPA_vect) {
 +  dotsOn = !dotsOn;
 +  aux_time_update = update_time(seconds,​ seconds + 1, 60);
 +
 +  if (aux_time_update)
 +    aux_time_update = update_time(minutes,​ minutes + aux_time_update,​ 60);
 +
 +  if (aux_time_update)
 +    aux_time_update = update_time(hours,​ hours + aux_time_update,​ 24);
 +
 +  if (aux_time_update)
 +    aux_time_update = update_time(day,​ day + aux_time_update,​ get_days_for_month(month)+1);​
 +
 +  if (aux_time_update) {
 +    day+=1;
 +    aux_time_update = update_time(month,​ month + aux_time_update,​ 13);
 +  }
 +
 +  if (aux_time_update) {
 +    month+=1;
 +    aux_time_update = update_time(yearL,​ yearL + aux_time_update,​ 100);
 +  }
 +  if (aux_time_update)
 +    update_time(yearH,​ yearH + aux_time_update,​ 100);
 +}
 +
 +Pentru a face update la ora si a tine cont de faptul ca o ora are maxim 60 min, un minut maxim 60s, etc. vom folosi urmatoarea functie
 +
 +uint8_t update_time(volatile int &item, int value, uint8_t max) {
 +  return value % max;
 +}
 +
 +
 +Astfel daca ajungem spre exemplu la 61 de secunde pentru un minut noi vom lua de fapt 61 % 60 = 1  ​
  
  
  
-===== Download ===== 
  
-<note warning> 
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). 
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:​pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** (dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. 
-</​note>​ 
  
 ===== Jurnal ===== ===== Jurnal =====
Line 191: Line 274:
  ​https://​ocw.cs.pub.ro/​courses/​_media/​pm/​doc8272.pdf  ​https://​ocw.cs.pub.ro/​courses/​_media/​pm/​doc8272.pdf
  ​https://​arduinogetstarted.com/​tutorials/​arduino-led-matrix  ​https://​arduinogetstarted.com/​tutorials/​arduino-led-matrix
- + ​https://​www.analog.com/​media/​en/​technical-documentation/​data-sheets/​max7219-max7221.pdf 
 + https://​arduinogetstarted.com/​tutorials/​arduino-rtc 
 + ​https://​simple-circuit.com/​arduino-nec-remote-control-decoder/​
 </​note>​ </​note>​
  
  
  
pm/prj2023/drtranca/cristina.hudisteanu.1685425498.txt.gz · Last modified: 2023/05/30 08:44 by cristina.hudisteanu
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