programovanie - kodovy zamok

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#16 Příspěvek od mtajovsky »

majsi << dík za opravu.

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#17 Příspěvek od AB1 »


Uživatelský avatar
ferooo
Příspěvky: 7
Registrován: 01 pro 2010, 01:00

#18 Příspěvek od ferooo »

dakujem za materialy, idem na to pozriet.
Pouzivam AVR-GCC ;)

Uživatelský avatar
jano80
Příspěvky: 73
Registrován: 16 lis 2008, 01:00
Bydliště: Michalovce

#19 Příspěvek od jano80 »

alebo stačí pozrieť datasheet daného obvodu je tam celkom dobrý príklad použitia EEPROM (zápis , čítanie)

Kód: Vybrat vše

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}

Kód: Vybrat vše

unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE))
;
/* Set up address register */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;
}

Uživatelský avatar
67kapa
Příspěvky: 73
Registrován: 31 říj 2010, 02:00

Co třeba ...

#20 Příspěvek od 67kapa »

... takto,pokud chceš čekat na stisk nějakého tlačítka a jinak zařízení nemá dělat nic jiného,nebo jenom to,co vložíš do nekonečné smyčky,viz soubor.?
Nebo můžeš testovat rovnou celou bránu,stav uložíš do příznakového bytu,ten můžeš testovat a pokud bude nulový/nebo naopak nenulový(to si zvolíš),může se zavolat rutina obsluhy kláves.Nebo můžeš cyklicky v obsluze přerušení testovat stav vstupů.Obecně klávesnice nevyžaduje extrémní rychlost čtení,navíc mnohdy musíš ošetřit softwarově zákmity tlačítek,takže bych v přerušení obsluhoval raději displej,no je to na tobě:-)
Přílohy
klav.txt
(269 bajtů) Staženo 125 x

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#21 Příspěvek od mtajovsky »

S těmi tlačítky to není složité, ale ani ne úplně triviální. Po změně úrovně napětí z tlačítka byste měl otestovat, že tato nová úroveň je stabilní po nějakou dobu - například 5 ms. Každé mechanické tlačítko má při přepnutí zákmity, které by se jinak mohly programem v důsledku rychlosti procesoru vyhodnotit chybně jako série sepnutí. Takže po detekci změny počkat třeba 3 ms, otestovat - přečíst podruhé, že úroveň je stejná, počkat další 3 ms a do třetice všeho dobrého i zlého to znovu načíst, jestli úrověň drží. Pak teprve považovat tlačítko za přepnuté.

Pozn. k C# a čekání na tlačítko a podobně: program ve Windowsích se nikde nezastavuje, nota bene nečeká v nějaké smyčce na stisk tlačítka. On po skončení toho, co měl udělat nakonec volá funkci GetMessage() v okenní funkci hlavního okna, a pokud není žádná zpráva ve frontě, tak se řízení odevzdá do systému. Variantně volá čekání na signalizaci objektu jádra WaitForSingle(Multiple)Object(s) (), kde se také předá řízení systému, pokud tento objekt už nebyl signalizován nebo může volat čekání na socket. Ale nikdy se nehaltuje nebo necyklí na místě. Pokud se to udělá v kódu násilně, tak při nejbližším přerušení od časovače stejně systém řízení sebere.

Nakonec, pokud je potřeba snímat stav tlačítek a přitom také současně potřeba obsluhovat ještě jiné události z okolí - kontakt čipové karty, vypršení časovače (softwarového), příjem pro RS232 a tak dále, je nejlépe výše nastíněné paradigma napodobit. Udělat si hlavní smyčku, která je v roli "systému" a detekuje všechny možné události. Jestliže se daná událost vyskytne, předá se řízení příslušnému obslužnému podprogramu.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#22 Příspěvek od Andrea »

Jo, nejlepší bude dát na ten 8bitovej jednočip windousy. :roll:
Stačí tu klávesnici skenovat jednou za x desítek ms v přerušení od časovače a zákmity jsou odstraněné automaticky, pokud se přidá testování 2x stejného stavu po sobě, tak se odstraní i případné rušení.

Uživatelský avatar
67kapa
Příspěvky: 73
Registrován: 31 říj 2010, 02:00

No...

#23 Příspěvek od 67kapa »

...ono to až tak jednoduché není.Pokud budu skenovat stavy a dva stavy budou po sobě stejný,navíc po 5ms a kabel od klávesnice bude delší(třeba kódový zámek,klávesnice bude oddělená od řídící jednotky),můžou nastat dva stejný stavy vlivem kapacity vodiče a stejně to bude chybný stav a procesor to nepozná.Osobně to testuji tak,že uložím první sken portu do registru a pak po určitou dobu a počtu skenování porovnávám s prvním vstupem.Tak ošetřím i případnou kapacitu kabelu.Osvědčila se mně doba 20ms.Jinou věcí je,zda má zařízení rozpoznat puštění klávesy,či zda má po určité době spustit repetici znaku.

Uživatelský avatar
67kapa
Příspěvky: 73
Registrován: 31 říj 2010, 02:00

Systém při přerušení...

#24 Příspěvek od 67kapa »

....cyklení neopustí,protože si pamatuje návratovou adresu(následující instrukce) a tam po návratu z přerušení skočí.Pokud nepotřebuji obsluhovat od procesoru nic jiného,bohatě čekání ve smyčce stačí.U kódového zámku naprosto dostačující.Samozřejmě při složitém programu,kdy se obsluhují i jiné periférie,jako I2C,displej....je test kláves v nekonečné smyčce kravina.Ve složitějším systému budou navíc použity jak příznaky,tak i priority přerušení jednotlivých požadavků...

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#25 Příspěvek od Andrea »

Akorát že při obsluze přes přerušení může procesor 99,8% času spát.

Uživatelský avatar
67kapa
Příspěvky: 73
Registrován: 31 říj 2010, 02:00

No pokud bude spát...

#26 Příspěvek od 67kapa »

tak není nic jednoduššího,než ho změnou stavu na portu vzbudit,stačí nastavit příslušné registry(vzbuzení může rovněž iniciovat i AD převodník,watchdog,přetečení timeru...např.)Takhle jsem dělal konstrukci na bateriové napájení,po uplynutí času se vypnulo podsvícení,následovalo vypnutí displeje a skok do SLEEP módu.Stiskem kterékoliv klávesy se procesor vzbudil(klávesnice 4 x 4 ).Při uspání je rovněž uložena návratová adresa programového čítače ve stacku.Dokonce ho můžeš vzbudit a zakázat obsluhu přerušení vyvolanou touto akcí.Možností je několik:-)

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#27 Příspěvek od Andrea »

Nevím co to bylo za procesor, ale AVR může vzbudit jen reset nebo přerušení, takže pokud vynecháme ten reset, tak obsluha klávesnice s uspáváním procesoru není bez použití přerušení u AVR možná. ;)

Uživatelský avatar
67kapa
Příspěvky: 73
Registrován: 31 říj 2010, 02:00

PIC16F876A...

#28 Příspěvek od 67kapa »

...je s tím radost dělat:-)Ano,zapomněl jsem na RESET,ten samozřejmě rovněž procesor vzbudí.Mimochodem,to vzbuzení od portu má téměř každý PIC:-)
Mimochodem,tady je ta "kravinka":-)
http://files.kpelektro.webnode.cz/20000 ... A1tor2.jpg

A ještě,jak se to dělá,když se chci vyhnout tomu přerušení,jednoduše zakážu globální přerušení (bit GIE).Sice to procesor vzbudí,ale neprovede se skok do rutiny přerušení(vektor 0004h)

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#29 Příspěvek od Andrea »

Takže (pominu-li ten reset) PIC 16F876 se dokáže vzbudit ze sleepu i se zakázaným přerušením?

Uživatelský avatar
67kapa
Příspěvky: 73
Registrován: 31 říj 2010, 02:00

Ano,přesně tak...

#30 Příspěvek od 67kapa »

...dokonce i AD převodník ho vzbudí.Jediné,na co je si dávat pozor,je spotřeba ve SLEEP modu,AD převodník trochu žere.A musí se samozřejmě ošetřit porty tak,aby nemohly sloužit jako zdroj proudu...Např. teď mám na stole PIC16F630 a ten má to samé.Oni ty obvody PIC mají totiž ještě další bity,které povolují jednotlivá přerušení od periferií a instrukce sleep je tak trochu vyjímkou.Samozřejmě za běhu programu,pokud bude globální přerušení zakázáno,k přerušení nedojde.Takže mně stačí v programu před isntrukcí SLEEP toto globální přerušení zakázat a jako první instrukci po vzbuzení ho zase povolit:-)

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“