 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
mk0388 Član


Pridružen-a: Čet 30 Okt 2008 21:52 Prispevkov: 161 Aktiv.: 0.80 Kraj: Celje
|
Objavljeno: Sre Mar 17, 2010 6:22 pm Naslov sporočila: 2x16 LCD prikazuje samo levo polovico |
|
|
Pozdravljeni,
S Pic-em 18f4620 hočem na lcd prikazati preprost text v dveh vrsticah, vendar mi ga izpiše samo na levi polovici displeja v obeh vrsticah, desne strani pa ni prikazane. Program pišem v ccs c compilerju.
Ali ve kdo kaj je vzrok temu oz. kaj storiti?
LP
_________________ Victims - aren't we all... |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.02 Kraj: Črnuče
|
Objavljeno: Sre Mar 17, 2010 6:48 pm Naslov sporočila: |
|
|
LCD ima displej razdeljen na 4 dele. Poizkusi besedilo razporediti v več vrstic (4), pa se bo verjetno izpisal na del displeja, ki je sedaj prazen.
_________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Sre Mar 17, 2010 9:07 pm Naslov sporočila: |
|
|
Povedal si skoraj vse in nič.
1. Tip LCD-ja
2. Hitrost procesorja
3. Kratek primer kode, kjer ti to napačno dela
Potem, ti pa lahko pomagamo, seveda ne pozabit napisat verzije CCS-ja in katero knjižnico si uporabil, pa tudi kako imaš priklopljeno vse supaj ni zanemarljivo....
|
|
Nazaj na vrh |
|
 |
mk0388 Član


Pridružen-a: Čet 30 Okt 2008 21:52 Prispevkov: 161 Aktiv.: 0.80 Kraj: Celje
|
Objavljeno: Sre Mar 17, 2010 9:22 pm Naslov sporočila: |
|
|
LCD-2x16
Hitrost-20MHz
Verzija ccs-4.084
V priponko sem dal driver LCD.c katerega imam, potem kratek program za izpis 2 vrstic na lcd in fuse.
Kako on ve kateri LCD mam jaz...vrstice mu lahka [slovenščina je zame španska vas] določim (#define LCD_TYPE 2), (vsaj mislim), kaj pa koliko znakov(v mojem primeru 16)?
Priklopil sem tako kot kaže slika.
Opis: |
|
 Download |
Ime datoteke: |
Vaja_LCD.rar |
Velikost datoteke: |
3.38 KB |
Downloadano: |
22 krat |
_________________ Victims - aren't we all... |
|
Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Čet Mar 18, 2010 12:51 am Naslov sporočila: |
|
|
Načeloma je v programu videti vse OK. Kadar daš tip 2, potem je jasno da je to 2x16 na podlagi HD47xxx čipa.
Ko sem ti rekel, da napiši kakšen LCD imaš sem imel v mislih oznako samega LCD-ja.
Sem na hitro napisal kodo. Preizkusi s tem:
Koda: |
#include <18F4620.h>
#device adc=8
#FUSES NOWDT, WDT128, HS, NOPROTECT, NOIESO, NOBROWNOUT, BORV21, PUT
#FUSES NOCPD, NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOEBTR, NOCPB
#FUSES NOEBTRB, NOWRTC, NOWRTB, NOFCMEN, NOXINST, NOPBADEN, NOLPT1OSC, NOMCLR
#use delay(clock=20000000)
//Ker ne pre-definiram kateri port bi uporabil, bo LCD.C avtomatično uporabil port D
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
#include <LCD.C>
void main()
{
int16 x;
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0);
setup_psp(FALSE);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
Delay_ms(100); //Varnostni ukrep
printf(lcd_putc,"1234567890123456");
lcd_gotoxy(1,2);
printf(lcd_putc,"Testiranje 43210");
delay_ms(1000);
printf(lcd_putc,"\fStetje:");
while (1)
{
lcd_gotoxy(1,2);
printf(lcd_putc," %05LU ",x);
x++;
delay_ms(250);
}
} |
LCD.C uporabiš tvoj, vse ostalo je v tej kodi.
|
|
Nazaj na vrh |
|
 |
Peter123 Član


Pridružen-a: Tor 13 Jan 2009 15:34 Prispevkov: 1441 Aktiv.: 7.20 Kraj: Lj.
|
Objavljeno: Čet Mar 18, 2010 8:23 am Naslov sporočila: |
|
|
Osebno imam dobre izkušnje s CCs primeri in knjižnicami,
Kako preklaplaš med tipe LCDja pa poglej v LCD.c.
Pri moji knjižnici je napisano. Res pa je da uporabljam starejšo verzijo.
Da izločiš napako v programu lahko priklopiš kak drug LCD pa izprobaš.
Lahko pa na obstoječemu naviješ kontrast tako da se pokažejo temne kocke (vsaj v celi vrsti bi se morali. To je nekako najbolj osnovni test če delujejo vsi segmenti na LCDju.
lp
p
|
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.70 Kraj: Kranj - struževo
|
Objavljeno: Čet Mar 18, 2010 7:20 pm Naslov sporočila: |
|
|
Poskusi na LCDju postaviti kurzor na začetno pozicijo, potem pa izpiši zelo dolgo besedilo - vsaj 160 znakov, lahko več. Toliko da zapolniš kompleten pomnilnik pri LCDju.
Če se še vedno nič ne pokaže na desni strani, je crknil sekundarni krmilnik LCDja - tadrugi čip zadaj na vezju. Zamenjaj LCD.
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
mk0388 Član


Pridružen-a: Čet 30 Okt 2008 21:52 Prispevkov: 161 Aktiv.: 0.80 Kraj: Celje
|
Objavljeno: Čet Mar 18, 2010 7:21 pm Naslov sporočila: |
|
|
bungee...
tvoj program dela sem dobil danes drugi LCD pa dela . Očitno pri tastarem štrajka desna polovica(edina napaka je bla da sn biu prepričan u sebe da je 100% izpravn)
Hvala Vsem
Dans ne grem nič spat...
_________________ Victims - aren't we all... |
|
Nazaj na vrh |
|
 |
rastamajks Član

Pridružen-a: Čet 23 Mar 2006 13:03 Prispevkov: 105 Aktiv.: 0.45 Kraj: zalec
|
Objavljeno: Pet Mar 19, 2010 5:14 pm Naslov sporočila: |
|
|
@bungee
Že dva dni se trudim uporabiti timer0 za enostavno štetje sekund vendar mi niakkor ne uspe, zato sem šel korak nazaj oz. štartam od začetka in kar pri tem programu ki si ga zgoraj prilepil. Uporabljam PIC16F84A z hitrostjo 4MHz in LCDjem DEM16217.
Ko program compilam v ccs-4.084 program sicer deluje, vendar neprestano skače iz while zanke(se pravi program se zažene in začne šteti od 256 naprej, prišteje 3 vrednosti in skoči na začetek izpiše tiste tesne številke, nato pa spet prišteje tri vrednosti in spet skoći na začetek in tako ves čas). Zakaj ne ostane v zanki? Naj povem še da sem moral iz programa izbrisati vse setup... ; ker drugače mi je javljalo napake pustil sem lahko le setup_timer_0(RTCC_INTERNAL); pa še tega sem moral obrisati drugače mi na LCDju ni izpisovalo nič!
še moj program
Lp
Koda: |
#include "D:\Elektro\CCS_PCW\stoparica\stoparica.h"
#include "lcd.c"
#use delay(clock=4000000)
void main()
{
int16 x;
//setup_timer_0(RTCC_INTERNAL);
lcd_init();
Delay_ms(100); //Varnostni ukrep
lcd_gotoxy(1,1);
printf(lcd_putc, "\f"); //izbris zaslona
printf(lcd_putc,"1234567890123456");
lcd_gotoxy(1,2);
printf(lcd_putc,"Testiranje 43210");
delay_ms(1000);
printf(lcd_putc,"\fStetje:");
while (1)
{
lcd_gotoxy(1,2);
printf(lcd_putc," %05LU ",x);
x++;
delay_ms(250);
}
} |
|
|
Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Pet Mar 19, 2010 6:01 pm Naslov sporočila: |
|
|
Ne pozabi spremenit FUSE nastavitev, ker potem ti ne dela tako kot je potrebno. Tule imaš primer, z interruptom....
Koda: |
#include <16F84A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#define lcd_type 2
#include <LCD.C>
int ure,minute,sekunde=0;
int16 tick;
#int_TIMER0
void TIMER0_isr(void)
{
if (tick>=999)
{
tick=0;
if (sekunde>=59)
{
sekunde=0;
if (minute>=59)
{
minute=0;
if (ure>=23)
{
ure=0;
}
else ure++;
}
else minute++;
}
else sekunde++;
}
else tick++;
}
void main()
{
int x;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
lcd_init();
delay_ms(100); // Zaradi displaya, lahko poizkusiš brez bi moralo tudi delovati.
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
printf(lcd_putc,"\f Test ure\n");
printf(lcd_putc," v 0.01");
while (1)
{
if (x==0) printf(lcd_putc,"\fVrstica kjer,");
if (x==5) printf(lcd_putc,"\flahko postavis");
if (x==10) printf(lcd_putc,"\fsporocilo kakor");
if (x==15) printf(lcd_putc,"\fti je ljubo.");
if (x==20) printf(lcd_putc,"\fwww.elektronik.si");
if (x==30) x=0;
else x++;
lcd_gotoxy(1,2);
printf(lcd_putc," %02u:%02u:%02u ",ure,minute,sekunde);
delay_ms(250);
}
} |
Ni komentarjev zanalašč, tako da potem ko analiziraš kodo lahko napišeš vprašanja
|
|
Nazaj na vrh |
|
 |
rastamajks Član

Pridružen-a: Čet 23 Mar 2006 13:03 Prispevkov: 105 Aktiv.: 0.45 Kraj: zalec
|
Objavljeno: Sob Mar 20, 2010 8:54 pm Naslov sporočila: |
|
|
Hja vidim da za začetek sploh nisem imel pravilno nastavljenih FUSE bitov ampak zdaj je ql in programček lepo teče, vendar so se pa pojavila nasljedja vprašanja in nejasnosti! bungee vprašanja sem pisal kar kot komentarje v programu pa bi te prosil če mi lahko pomagaš! Zanima me pa še ali v CCS-ju obstaja watch okno da bi preveril kako dolgo trajaja določeni del programa. Bral sem da lahko naložiš plunginse za MPLAB in tam uporablaš to okno, vendar meni ni uspelo, pa me zanima ali so potrebne kake posebne nastavitve vMPlabu da to deluje!?
Koda: |
#include "D:\Elektro\CCS_PCW\stoparica_ve1\stoparica_ve1.h"
#define use_portb_lcd TRUE
#define lcd_type 2
#include <LCD.C>
#define S1 PIN_A2 //tipka START
#define S2 PIN_A3 //tipka STOP
#define S3 PIN_A4 //tipka RESET
int32 ure,minute,sekunde,des= 0;
int16 tick;
int stop,reset=0;
#int_TIMER0
void TIMER0_isr(void)
{
if (tick>=9) //se pravi tukaj uporabimo še nek števec da dobimo željeno proženje timerja
{ // npr. en iterval timerja traja 1.024ms, ker želimo proziti timer na 10 ms
tick=0; //damo števec do 9 in dobimo proženje na (1.024*9=9.216ms)!?
if (des>=99) //tukaj sem dodal še desettisocinke zraven vendar mi ne izpisuje številke lepo po vrsti ampak
{ //preskakuje npr. 19,44,98..in poveča sekundo in nato spet!?
des=0;
if (sekunde>=59)
{
sekunde=0;
if (minute>=59)
{
minute=0;
if (ure>=23)
{
ure=0;
}
else ure++;
}
else minute++;
}
else sekunde++;
} else des++;
}
else tick++;
}
void main()
{
int x;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); //nastavitev za timer0 [ (4*256)*1us=1.024ms ] tukaj dolocimo interval timerja!?
lcd_init(); //inicializacija LCD-ja
delay_ms(100);
enable_interrupts(INT_TIMER0); //omogočena prekinitev INT_TIMER0
enable_interrupts(GLOBAL); //omočene prekinitve
printf(lcd_putc,"\f Test stoparice\n"); //izbriše zaslon in izpiše tekst
printf(lcd_putc," v 0.01");
delay_ms(1000);
while (1)
{
printf(lcd_putc,"\f Time");
lcd_gotoxy(1,2);
printf(lcd_putc," %02u:%02u:%02u.%02u ",ure,minute,sekunde,des);
delay_ms(250);
if (!input(S3)) //ali je tipka reset bila pritisjena
{
output_bit(PIN_a0,1); //želel sem dodati še tri tipke za start stop in reset in naletel na par težav
minute=0; //1. nevem kako bi prekinil timer
sekunde=0; //2. in potem ob startu spet zagnal timer
des=0; //3. ko pritisnem na tipko S3 postavim spremenljivke na 0 vendar tipka ne zagrabi
} // vedno (včasih resetira ob prvep pritisku včasih pa šele ob tretjem)!?
if (!input(S2))
{
stop=0;
reset=0;
output_bit(PIN_a0,0);
}
}
}
|
|
|
Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Sob Mar 20, 2010 9:21 pm Naslov sporočila: |
|
|
Da bi prikazoval desetinke, potem moraš LCD osveževati nekaj hitreje kot na 100ms, se pravi daj tisti delay_ms(250) na recimo delay_ms(50) to je prvo, če bo pa display vseeno preveč "bezljal" potem pa malo povečaj.
Da bi "ustavil" timer imaš nekaj variant na voljo, najlažja je ta, da v timer interruptu dodaš še preverjanje ali je štoparica aktivna ali ne preko globalne spremenljivke.
Koda: |
if (stopaj==1)
{
[koda ot timer interrupta]
}
|
Potem ti pa priporočam tipke, reset in start/stop (ena) in če boš potreboval še za vmesni čas.
Če bi želel, da ti interrupt dela točno na 1ms potem ob vsakem proženju interrupta skrajšaj timer tako, da ne bo tistih 24us .... namig (set_timer1(xy))
Pa še to, šteješ od 0..9 = 10 cifer
Pa tisti delay_ms(xy) ki ga boš dal v glavni zanki daj na koncu za preverjanjem tipk.
|
|
Nazaj na vrh |
|
 |
rastamajks Član

Pridružen-a: Čet 23 Mar 2006 13:03 Prispevkov: 105 Aktiv.: 0.45 Kraj: zalec
|
Objavljeno: Pon Mar 22, 2010 12:00 am Naslov sporočila: |
|
|
ko si mi namignil naj uporabim set_timer1(xy) si se zmotil in mogoče mislil set_timer0(xy)!? Ker sedaj sem uporabil set_timer0(xy), vendar sem probal narediti tudi z timer1 in to uporabiti vendar mi ni uspelo, kot da PIC16f84 ne podpira timer1!?
Program sedaj deluje kot sem si zamislil in z primerjavo prave štoparice se niti ne razlikuje toliko v času, vendar to sem dosegel z poizkušanjem, jasno mi pa še zmeraj ni kako točno deluje ta timer0 in kako lahko preračunam njegove vrednosti in delilnike za željeni čas? Naprimer z set_timer0(xy) določimo čas proženja interrupta in ga izračunamo npr. za 20us=> 256-(0.00002/(4/4000000))=236 (kaj pomeni ta 4 tukaj?) KAko pa potem preračunamo tisto vrednost za tick da dobimo timer0 ki se bo izvajal na 1ms?
Zanima pa me še zakaj ko se program zažene na LCD izpiše 255:255:255.00, in ne same nule? To sem sicer rešil tako da ob vklopu resetiram vse spremeljivke, vendar bi moralo biti že na začetku na 0 ker jih že v inicializaciji postavim na 0?
Glede tipk pa moram imeti za start in stop posebaj, ker štoparico bom prekinil nekje stran od tam, kjer jo bom startal, vmesni čas pa ne potrebujem.
Še koda...
Koda: |
#include "D:\Elektro\CCS_PCW\stoparica_ve1\stoparica_ve1.h"
#define use_portb_lcd TRUE
#define lcd_type 2
#include <LCD.C>
#define S1 PIN_A2 //tipka START
#define S2 PIN_A3 //tipka STOP
#define S3 PIN_A4 //tipka RESET
int32 ure,minute,sekunde,des= 0;
int16 tick;
int reset,stop=0;
int nula=1;
#int_TIMER0
void TIMER0_isr(void)
{
set_timer0(15);
if (stop==1)
{
if (tick>=9)
{
tick=0;
if (des>=99)
{
des=0;
if (sekunde>=59)
{
sekunde=0;
if (minute>=59)
{
minute=0;
if (ure>=23)
{
ure=0;
}
else ure++;
}
else minute++;
}
else sekunde++;
} else des++;
}
else tick++;
}
}
void main()
{
int x;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4); //nastavitev za timer0
lcd_init(); //inicializacija LCD-ja
delay_ms(100);
enable_interrupts(INT_TIMER0); //omogočena prekinitev INT_TIMER0
enable_interrupts(GLOBAL); //omočene prekinitve
printf(lcd_putc,"\f Test stoparice\n"); //izbriše zaslon in izpiše tekst
printf(lcd_putc," v 0.01");
delay_ms(1000);
while (1)
{
printf(lcd_putc,"\f Time:");
lcd_gotoxy(1,2);
printf(lcd_putc," %02u:%02u:%02u.%02u ",ure,minute,sekunde,des);
if ((!input(S3)&& stop==0) || nula==1 ) //ali je tipka reset bila pritisjena
{
reset=1;
nula=0;
ure=0;
minute=0;
sekunde=0;
des=0;
}
if (!input(S1)) //ali je tipka START bila pritisjena
{
output_low(PIN_A0);
stop=0;
reset=0;
}
if (!input(S2)) //ali je tipka STOP bila pritisjena
{
stop=1;
output_high(PIN_A0);
}
delay_ms(40); //osveževanj LCD-ja
}
}
|
|
|
Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Pon Mar 22, 2010 1:28 am Naslov sporočila: |
|
|
Mislil sem timer0, napisal sem pa 1 .... se opravičujem typo.
Timer je HW modul v mikroprocesorju (uC), ki šteje tako hitro kot ga nastavimo s preddelilnikom in je neodvisen od ostalega izvajanja kode razen če ne pišemo ravno vanj.
Medmisel, ni potrebno branje
Izračunati na koliko časa se izvede prekinitev, kadar imamo timer interrupt. Torej kadar ima timer preddelilnik 1 --> šteje vsak cikel potem se bo prekinitev zgodila ko se vrednost "prelije" iz 255 v 0 (pri 8 bitnih timerjih) ali pa iz 65535 v 0 (pri 16 bitnih timerjih) ..... in tako naprej za višje vrednosti.
Če pa imamo vključen preddelilnik pa se to zgodi x krat počasneje, se pravi timer šteje vsak x-ti cikel.
Zaradi specifičnosti PIC-ov dolžina enega strojnega cikla ni 1/f, temveč je (1/f)*4 ......
Torej če vzamemo 4MHz kristal potem je dolžina enega strojnega cikla (1/4MHz)*4 = 250ns * 4 = 1us
Torej ko smo obdelali kakšen je strojni takt, lahko preidemo na timerje. Timer s predelilnikom 1 bo imel ločljivost 1us (izhajam iz prejšnjega primera) in bo sprožil interrupt vsakih 256us oziroma 65536us v odvisnosti od "širine" timerja. PIC16F84A ima Timer0 8 biten. Če preddelilnik povečamo na 4, potem pride izračun takole .... timer se poveča na vsake 4 cikle torej ima ločljivost 4us .... torej 4us*256=1024us .... če pa tu želimo dobiti 1000us, potem moramo timerju namesto 0 "podtakniti" vrednost, ki bo kompenzirala 24us. Torej bi po izračunih moral nastaviti set_timer0(7)
Tu moraš upošteveti še to dejstvo, da imaš v najslabšem primeru, ko stisneš tipko start in tipko stop še dodatnih 80ms zamika zaradi zanke za osveževanje. To bi lahko rešil tako, da bi osveževanje displaja vtaknil v svojo interrupt rutino in bi v glavni rutini preverjal le še tipke, ki bi zdaj postale mnogo bolj odzivne. Vendar na PIC16F84A tega ne moreš storit, ker nimaš še enega timerja. Oziroma spravit tipke v interrupt rutino, tako bi imel zamik med pritiskom in akcijo nekaj us, oziroma v najslabšem primeru toliko, da se izvede timer prekinitev do konca.
|
|
Nazaj na vrh |
|
 |
rastamajks Član

Pridružen-a: Čet 23 Mar 2006 13:03 Prispevkov: 105 Aktiv.: 0.45 Kraj: zalec
|
Objavljeno: Pon Mar 22, 2010 12:29 pm Naslov sporočila: |
|
|
@bungee
Hvala za obrazložitev in pomoč in misli da so mi sedaj ti timerji dokaj jasni kako delujejo! Vprašal bi pa še samo to, ker po izračunih bi za 1ms potreboval set_timer0(6) -> (256-6)*4us=1000us in v tem primeru mi čas prehitro teče, če dam pa set_timer0(15) -> (256-15)*4us=964us pa čas teče tako kot mora! Ali to pomeni da je potrebno upoštevati še ukaze v timerju in jih prišteti, ker za vsak ukaz porabi PIC 1us!?
lp
|
|
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: 495 dni
Powered by phpBB © 2001, 2005 phpBB Group
|