Author Topic: Помош за оптимизирање на код за програма за семафор  (Read 942 times)

Offline StefanJapanac

  • Стручњак
  • ***
  • Posts: 153
Помош за оптимизирање на код за програма за семафор
« Opened on 15.02.2013, Friday, 20:08:37 (Edited 05.03.2013, Tuesday, 20:16:11) »
Здраво,

Направив проект за почетници со Arduino Uno, проектот е семафор со одбројувач, но бидејќи ми е нов и микроконтролерот и првпат работам со програмирање микроконтролери ме интересира дали и како може да се оптимизира некоја програма да врши иста функција но да зафаќа многу помала меморија. Бидејки уште не сум доволно запознаен со јазиков ако има некој кој може да ми помогне и да ме советува.

Мојот проект изгледа вака:

Semafor so brojac

Кодот јас го пишував и бидејќи ми е прв, не користев потпрограми туку се беше рачно.

Code: [Select]
//* Semafor so odbrojuvac. SS
int crveno = 10;
int zolto = 11;
int zeleno = 12;

void setup() {
pinMode(crveno, OUTPUT);
pinMode(zolto, OUTPUT);
pinMode(zeleno, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
}
void loop() { //* Beskrajna jamka
  digitalWrite(crveno, HIGH);
 digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 1);
 digitalWrite(5, 1); //* Ovie se bitovite od sedum segmentniot displej
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
  delay(1000);
  digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(1000);
  digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
 delay(1000);
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
 delay(1000);
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 0);
delay(1000);
analogWrite(zolto, 15);
digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
delay(1000);
digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
 delay(1000);
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 0);
 delay(1000);
digitalWrite(zeleno, HIGH);
digitalWrite(zolto,LOW);
digitalWrite(crveno,LOW);
digitalWrite(2, 1);
 digitalWrite(3, 0);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
  delay(1000);
  digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 1);
 digitalWrite(8, 1);
 delay(1000);
  digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
 delay(1000);
 digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
 delay(1000);
 digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
delay(1000);
digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 0);
 delay(1000);
digitalWrite(zeleno,LOW);
analogWrite(zolto,10);
digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 0);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 0);
 digitalWrite(8, 1);
delay(1000);
digitalWrite(2, 0);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 0);
 digitalWrite(6, 0);
 digitalWrite(7, 0);
 digitalWrite(8, 0);
delay(1000);
digitalWrite(2, 1);
 digitalWrite(3, 1);
 digitalWrite(4, 1);
 digitalWrite(5, 1);
 digitalWrite(6, 1);
 digitalWrite(7, 1);
 digitalWrite(8, 0);
 delay(1000);
digitalWrite(zolto,LOW);}

Дали може да се направи потпрограма за да се повика кога е потребно наместо да пишувам 1000 редови битови за дисплејот?

Offline Alek89

  • Нов член
  • *
  • Posts: 4
Одг: Помош за оптимизирање на код за програма за семафор
« Reply #1 on 05.03.2013, Tuesday, 20:12:34 (Edited 05.03.2013, Tuesday, 20:16:21) »
Наместо да пишуваш по 7 реда за секој сегмент од дисплејот, можеш да направиш "Look-Up_Table", којашто ќе зафаќа исто меморија, бидејќи се копира кодот, но не мора да се замараш со куцање, туку пред да ја пратиш вредноста на дисплејот, само ја повикуваш табелата. Доколку имаш некое прашање слободно кажи.
Поздрав.

Offline StefanJapanac

  • Стручњак
  • ***
  • Posts: 153
ufff, ja zaboraviv temata, fala ti na odgovorot ama vekje se snajdov ke go postiram kodot koj go napraviv

od tablet sum

Trolko

  • Guest
ufff, ja zaboraviv temata, fala ti na odgovorot ama vekje se snajdov ke go postiram kodot koj go napraviv

od tablet sum

Истотака организирај го кодот во функции, пример да имаш функција која ќе се вика void odbrojuvaj(int vreme), каде што vreme ќе ти е променлива за од колку секунди да почне да одбројува.

Поздрав

Offline StefanJapanac

  • Стручњак
  • ***
  • Posts: 153
Еве како јас ја преправив програмата
Тука ми е потпрограмата за испишување на дисплејот
Code: [Select]
void displejzapisi1(byte digit) {
  byte pin = 0;
  for (byte segBroj = 0; segBroj < 7; ++segBroj) {
    digitalWrite(pin, displej1[digit][segBroj]);
    ++pin;
  }}
а потоа тоа ги зема битовите за 7 сегментниот од следнава потпрограма
Code: [Select]
byte displej1[10][7] = { { 1,1,1,1,1,1,0 },
                                                           { 0,1,1,0,0,0,0 },  // 1
                                                           { 1,1,0,1,1,0,1 },  // 2
                                                           { 1,1,1,1,0,0,1 },  // 3
                                                           { 0,1,1,0,0,1,1 },  // 4
                                                           { 1,0,1,1,0,1,1 },  // 5
                                                           { 1,0,1,1,1,1,1 },  // 6
                                                           { 1,1,1,0,0,0,0 },  // 7
                                                           { 1,1,1,1,1,1,1 },  // 8
                                                           { 1,1,1,0,0,1,1 }   // 9
                                                           };
и вака се врши испишување
Code: [Select]
for(int i=5;i>=0;i--){
   displejzapisi1(i);
   delay(1000);}

И ке уплоадирам слики од целиот мој проект кога ке биде комплетиран