|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vinko Neznanec
Pridružen-a: Sre 27 Nov 2013 11:12 Prispevkov: 3 Aktiv.: 0.02 Kraj: Vransko
|
Objavljeno: 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);
}
} |
|
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Pon Okt 06, 2014 12:48 pm Naslov sporočila: |
|
|
Multipleksiraje spravi v prekinitev, drugače ne bo šlo. _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.92 Kraj: Grosuplje
|
Objavljeno: 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. _________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
plesec Član
Pridružen-a: Sre 16 Sep 2009 20:21 Prispevkov: 135 Aktiv.: 0.76 Kraj: Medvode
|
Objavljeno: 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. |
|
Nazaj na vrh |
|
|
vinko Neznanec
Pridružen-a: Sre 27 Nov 2013 11:12 Prispevkov: 3 Aktiv.: 0.02 Kraj: Vransko
|
Objavljeno: 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
Hvala vsem za hitre odgovore. |
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.92 Kraj: Grosuplje
|
Objavljeno: 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. _________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
|
|
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: 69 dni
Powered by phpBB © 2001, 2005 phpBB Group
|