www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Utripanje 7-segmentnih prikazovalnikov

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> LCD, 7 segment, grafični lcd-ji
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vinko
Neznanec
Neznanec



Pridružen-a: Sre 27 Nov 2013 11:12
Prispevkov: 3
Aktiv.: 0.02
Kraj: Vransko

PrispevekObjavljeno: Pon Okt 06, 2014 12:19 pm    Naslov sporočila:  Utripanje 7-segmentnih prikazovalnikov Odgovori s citatom

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); 
  }
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 19.74

PrispevekObjavljeno: Pon Okt 06, 2014 12:48 pm    Naslov sporočila:   Odgovori s citatom

Multipleksiraje spravi v prekinitev, drugače ne bo šlo.
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Pon Okt 06, 2014 2:22 pm    Naslov sporočila:   Odgovori s citatom

@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.

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
plesec
Član
Član



Pridružen-a: Sre 16 Sep 2009 20:21
Prispevkov: 135
Aktiv.: 0.76
Kraj: Medvode

PrispevekObjavljeno: Pon Okt 06, 2014 2:43 pm    Naslov sporočila:   Odgovori s citatom

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.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
vinko
Neznanec
Neznanec



Pridružen-a: Sre 27 Nov 2013 11:12
Prispevkov: 3
Aktiv.: 0.02
Kraj: Vransko

PrispevekObjavljeno: Pon Okt 06, 2014 3:28 pm    Naslov sporočila:   Odgovori s citatom

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.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Pon Okt 06, 2014 6:28 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> LCD, 7 segment, grafični lcd-ji Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 47 dni


Powered by phpBB © 2001, 2005 phpBB Group