www.elektronik.si
Utripanje 7-segmentnih prikazovalnikov

www.elektronik.si -> LCD, 7 segment, grafični lcd-ji

Avtor: vinkoKraj: Vransko PrispevekObjavljeno: Pon Okt 06, 2014 12:19 pm    Naslov sporočila:  Utripanje 7-segmentnih prikazovalnikov
----------------------------------------------------------------------------
Z Arduino UNO krmilim 5 7-segmentnih prikazovalnikov (SC08-11WA). Na prikazovalnikih se izpisuje čas (v formatu: m:ss.hh), ki ga arduino prebere na serijskem portu (1200 baud - tega parametra ne morem spremeniti).

8 pinov je preko 330 ohm uporov povezanih na posamezne segmente na vseh prikazovalnikih, 5 pinov pa je do katode posameznega prikazovalnika.

Težava je v tem, da prikazovalniki utripajo.
Če izpišem samo npr 1:23.45 brez uporabe mySerial.read() funkcije prikazovalniki ne utripajo.

Kako bi lahko odpravil to težavo?
Hvala za pomoč!

Koda:
//izpis-stackmat_06
//izpiše 5 display-ov
//utripa :(

#include "SoftwareSerial.h"

SoftwareSerial mySerial(A0, A1); // RX, TX

int A = A2; //segmenti
int B = A3;
int C = 2;
int D = 3;
int E = 4;
int F = 5;
int G = 6;

int display_1 = 9;  //display-i
int display_2 = 10;
int display_3 = 11;
int display_4 = 12;
int display_5 = 13;

char serial_input;

void setup() {               
  pinMode(A, OUTPUT); //pini so izhodni
  pinMode(B, OUTPUT);   
  pinMode(C, OUTPUT);   
  pinMode(D, OUTPUT);   
  pinMode(E, OUTPUT);   
  pinMode(F, OUTPUT);   
  pinMode(G, OUTPUT);     
 
  pinMode(display_1, OUTPUT);
  pinMode(display_2, OUTPUT);
  pinMode(display_3, OUTPUT); 
  pinMode(display_4, OUTPUT);
  pinMode(display_5, OUTPUT);   
 
  mySerial.begin(1200); // set the data rate for the SoftwareSerial port   
}
  void izpis()                             //izpise stevilo
  {
      if (serial_input == '0') {       //izpis 0
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(E, HIGH);
        digitalWrite(F, HIGH);
        digitalWrite(G, LOW);
      }
      else if (serial_input == '1') {  //izpis 1
        digitalWrite(A, LOW);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, LOW);
        digitalWrite(E, LOW);
        digitalWrite(F, LOW);
        digitalWrite(G, LOW);
      }
      else if (serial_input == '2') {   //izpis 2
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, LOW);
        digitalWrite(D, HIGH);
        digitalWrite(E, HIGH);
        digitalWrite(F, LOW);
        digitalWrite(G, HIGH);
      }
      else if (serial_input == '3') {  //izpis 3 
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(E, LOW);
        digitalWrite(F, LOW);
        digitalWrite(G, HIGH);
      }   
      else if (serial_input == '4') {  //izpis 4 
        digitalWrite(A, LOW);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, LOW);
        digitalWrite(E, LOW);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH);
      }   
      else if (serial_input == '5') {  //izpis 5 
        digitalWrite(A, HIGH);
        digitalWrite(B, LOW);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(E, LOW);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH);
      }
      else if (serial_input == '6') {  //izpis 6 
        digitalWrite(A, HIGH);
        digitalWrite(B, LOW);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(E, HIGH);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH);
      }
      else if (serial_input == '7') {  //izpis 7 
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, LOW);
        digitalWrite(E, LOW);
        digitalWrite(F, LOW);
        digitalWrite(G, LOW);
      }   
      else if (serial_input == '8') {  //izpis 8 
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(E, HIGH);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH);
      }   
      else if (serial_input == '9') {  //izpis 9 
        digitalWrite(A, HIGH);
        digitalWrite(B, HIGH);
        digitalWrite(C, HIGH);
        digitalWrite(D, HIGH);
        digitalWrite(E, LOW);
        digitalWrite(F, HIGH);
        digitalWrite(G, HIGH); 
      }       
      else {                        //izpis 'praznen zaslon'
        digitalWrite(A, LOW);
        digitalWrite(B, LOW);
        digitalWrite(C, LOW);
        digitalWrite(D, LOW);
        digitalWrite(E, LOW);
        digitalWrite(F, LOW);
        digitalWrite(G, LOW);
      }
  }                              //izpise stevilo



void loop()                      //glavna zanka

  if (mySerial.available())            // izpise cas ki ga prebere na serijskem portu. !!! UTRIPA :( !!!
  {
    serial_input = mySerial.read();    //izpis 5. segment (stotinke 1)
    digitalWrite(display_1, HIGH); 
    digitalWrite(display_2, HIGH);
    digitalWrite(display_3, HIGH);   
    digitalWrite(display_4, HIGH);
    digitalWrite(display_5, LOW);     
    izpis();
    delay(1);   
   
    serial_input = mySerial.read();  //izpis 1. segment (minute)
    digitalWrite(display_1, LOW);
    digitalWrite(display_2, HIGH);
    digitalWrite(display_3, HIGH);
    digitalWrite(display_4, HIGH);
    digitalWrite(display_5, HIGH);   
    izpis();
    delay(1);     

    serial_input = mySerial.read();  //izpis 2. segment (sekunde 10)
    digitalWrite(display_1, HIGH);
    digitalWrite(display_2, LOW);   
    digitalWrite(display_3, HIGH);   
    digitalWrite(display_4, HIGH);
    digitalWrite(display_5, HIGH);   
    izpis();
    delay(1);   

    serial_input = mySerial.read();  //izpis 3. segment (sekunde 1)
    digitalWrite(display_1, HIGH);
    digitalWrite(display_2, HIGH);
    digitalWrite(display_3, LOW);   
    digitalWrite(display_4, HIGH);
    digitalWrite(display_5, HIGH);   
    izpis();
    delay(1);     

    serial_input = mySerial.read();  //izpis 4. segment (stotinke 10)
    digitalWrite(display_1, HIGH);
    digitalWrite(display_2, HIGH); 
    digitalWrite(display_3, HIGH);   
    digitalWrite(display_4, LOW);
    digitalWrite(display_5, HIGH);   
    izpis();
    delay(1); 
  }

Avtor: gumby PrispevekObjavljeno: Pon Okt 06, 2014 12:48 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Multipleksiraje spravi v prekinitev, drugače ne bo šlo.

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Pon Okt 06, 2014 2:22 pm    Naslov sporočila:  
----------------------------------------------------------------------------
@vinko:hm, dobro bi bilo, če bi si kaj prečital (si nisem mogel kaj, da nisem dodal, kajti ene in iste stvari se stalno ponavljajo!)!
Kakorkoli, hitrost se običajno nastavlja:
Koda:
mySerial.begin(hitrost)

In seveda, prihaja pri multipleksiranju do problemov oz. utripanja, saj zaradi programskega serijskega porta skače v interupt, ki ga mora seveda obdelati (in pri hitrosti 2400 nekaj časa traja)!
Ali obstaja kakšen pameten razlog, da ne uporabljaš tega serijskega porta, preko katerega nalagaš program (to se pravi hardverskega)?
Obstajajo pa tudi druge knjižnjice za programski serijski port.
Vse je napisano na Arduinovi strani.

Namesto funkcije digitalWrite(), lahko na porte pošlješ tisto kar želiš tudi na drugačen način, ki je bistveno krajši in tudi hitrejši. In tudi multipleksiranje na portih se naredi s šiftanjem neposredno v registru za tisti port!
O tem je bilo govora v temi "Arduino - začetne težave" ali nekaj podobnega.

Avtor: plesecKraj: Medvode PrispevekObjavljeno: Pon Okt 06, 2014 2:43 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Pri hitrost pošiljanja 1200 baudov dobiš največ 120 znakov na sekundo. Oziroma 24 krat cel izpis na sekundo. To pa že vidiš kot utripanje.
Reši tako da Vrednosti s serijskega porta piši v spremeljivke. Nato pa hitreje osvežuj prikaz.

Pa še nekaj - vsake toliko bo kakšna napaka v serijski komunikaciji. Na način kot imaš sedaj rešeno se ti bo izpis zamaknil.

Avtor: vinkoKraj: Vransko PrispevekObjavljeno: Pon Okt 06, 2014 3:28 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Se opravičujem za 'neumno' vprašanje, sem bolj ali manj začetnik...

@gumby: bom poskušal s prekinitvami.

@Jaka57: Nimam programatorja in če imam karkoli priključeno na porta 0 in 1, mi običajno javi napako ob nalaganju programa (not in sync resp=0x00 ...).

@plesec: Zavedam se kaj je vzrok za utripanje, kot je predlagal gumby bom poskušal to rešiti s prekinitvami.

Bom še malo pogooglal Smile
Hvala vsem za hitre odgovore.

Avtor: Jaka57Kraj: Grosuplje PrispevekObjavljeno: Pon Okt 06, 2014 6:28 pm    Naslov sporočila:  
----------------------------------------------------------------------------
vinko je napisal/a:
@Jaka57: Nimam programatorja in če imam karkoli priključeno na porta 0 in 1, mi običajno javi napako ob nalaganju programa (not in sync resp=0x00 ...).
Saj nimaš nič gor prikljopljeno razen serijskega porta preko USB.
Za testiranje uporabiš terminal, ki ga imaš v Arduino IDE.

Stran 1 od 1

Powered by phpBB © 2001,2002 phpBB Group