Externe prerusenie+Mincovník+Atmega16A-PU

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 31 Jan 2016, 17:44

Zdravím,mám taký menší problém, do rúk sa mi dostal takýto mincovník http://www.ebay.com/itm/Latest-EU1-PC-M ... SwjVVViES6 http://www.coinsolve.com/english/images ... EU-1,2.pdf a dostal som nápad že ho prepojím s AVR. Principiálne to funguje tak že každých 10 centov čo vhodíte do mincovníka tak uzemní svoj pulzní výstup na 80ms. Preto som sa rozhodol že ich jednoducho budem zaznamenávať cez externé prerušenie a v každom prerušení iba pripočítam k premennej istú čistku.Takže svoj PIN kde mám nastavené externé prerušenie som napojil cez PULL-UP rezistor(10K) na 4,5V(napajacie napetie Atmegy). Problém je ale v tom že Atmega občas akoby odignorovala vhodenú mincu a nespraví nič a pri tom som si istý že k uzemneniu došlo. :confused: Preto sa chcem spýtať či niekto náhodou neviete čím by to mohlo byť spôsobené. AVR mám nastavené na 1MHZ a prerušenie zaznamenáva iba dobežnú hranu. skúšal som to aj s nábežnou ale výsledok bol rovnaký. Pridávam aj svoj kód.
Prílohy
Kód.png
0

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa alidedko » 31 Jan 2016, 17:57

Kratka otazka, naco ti je zapis na port vnutri while?
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 31 Jan 2016, 18:09

ouha.:D to som si ani nevšimol ale nemyslím si že zrovna to by mohol byť problém v mojom prípadne ale ak sa mýlim kľudne ma oprav.:D moje znalosti AVR nie zase až také ohromujúce.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 31 Jan 2016, 18:56

V prvom rade - kód sa nevkladá ako obrázok. Ako si ho mám skúsiť preložiť? Mám najprv použiť OCR?
V druhom rade - ten kód prerušenia aj niečo robí? Nevidím nikde že by si v hlavnom programe povolil global interrupt flag
V tretom rade - čím to prekladáš? na to org voľačo mi avr studio nechápavo krúti hlavou.
Edit: treti rad už som zistil mikroC pre AVR.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 31 Jan 2016, 19:08

prepáč to ma nenapadlo,globalné prerušenie je povolené v SREG |= 1<<7; a prikladám aj celý kód teda.

volatile int cislo;
void funkcia_int1(void) org IVT_ADDR_INT0
{
cislo = cislo +10;

}
int main(void)
{
SREG |= 1<<7;
DDRA |= 1<<4;
PORTA |= 1<<4;

DDRD &= ~(1<<PORTD2);

GICR |= 1<<INT0;
MCUCR |= 1<<ISC01 | 1<<ISC00;
cislo = 0 ;
while(1)
{
PORTA |= 1<<4;
if(cislo > 100)
{
PORTA &= ~(1<<4);
Delay_ms(5000);
cislo = 0 ;
}
}
}

A áno používam práve MikroC
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 31 Jan 2016, 19:16

To nastavenie cez SREG som prehliadol. Takže nevidím v tom chybu. Kompilovať to nemám čím. Taký pro kompilátor za toľko peňazí nemám. Ako vieš že to niekedy nezapočíta? Nie je tam skôr problém že to započíta viackrát? Je ten pulz z toho mincovníka bez zákmitový? Lebo v takejto konštelácii ti to zachytí zákmit ktorý trvá rádovo mikrosekundy. Ak je to neošetrený mechanický kontakt tak to počíta zákmity jedna radosť.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 31 Jan 2016, 19:40

mal by byť bez zakmitový zapojené to mám zatial iba na kontaktnom poli. a viem to tak že som si na ten port ktorý mám v podmienke zapojil ledku ktorá blikne na 5 sekund ked hodim viac ako 1euro, a proste ked niekedy hodím viac ako euro tak nezhasne a s toho mi vyplíva že nejký pulz musel stratiť. V najbližších dnoch si to celé chcem ešte napojiť na LCD ale takýto spôsob overenia by mal byť celkom stabilný tiež.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 31 Jan 2016, 19:45

tak si daj do toho prerusenia negaciu toho bitu s ledkou a po každej vhodenej mince sa musi zmeniť stav led.

Kód: Vybrať všetko

PORTA ~= 1<<4;
Samozrejme v hlavnom programe odstráň oba príkazy čo s ňou manipulujú. Uvidíš či to chodí dobre
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 31 Jan 2016, 19:51

Vďaka skúsim a dám vedieť. dnes to už ale asi nestihnem.takže očakávam že zajtra by som tu mohol dať vedieť či to ide dobre.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 31 Jan 2016, 19:56

a na hw počítanie tých impulzov si vyrob čítač z nejakého klopného obvodu alebo nejakého čítača aby si vedel či tam tie impulzy naozaj na vstupe sú alebo nie a koľko. Napr z 7474 alebo 7490 a pod. Logickú sondu s počítaním impulzov asi nemáš?
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 01 Feb 2016, 14:01

Tak a už som si naozaj istý že je to tým ,že ATmega proste akoby odignoruje niektoré impulzy a chyba nie je nikde inde...................rozmýšlal som si to nemôže byť príliš silním PULL UP rezistorom alebo nízkou frekvenciu ale ani jedna s týchto možností sa mi nezdá byť zrovna pravdepodobná.........a preto som vlastne tam kde som bol a vôbec si s tým neviem rady.
0

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 753
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa stefanSK » 01 Feb 2016, 14:19

V MicroC nerobím ale nie je náhodou chyba v definícii funkcii prerušenia?
Ako vie prekladač že je to interrupt funkcia?
Nemá to byť nejako takto?

void interrupt_ISR () org IVT_ADDR_INT0 { // Interrupt rutine
.......
}
0
S.K.

Používateľov profilový obrázok
budvar10
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1029
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa budvar10 » 01 Feb 2016, 14:51

Nevieš vložiť takto pekne ten kód?

Kód: Vybrať všetko

volatile int cislo;
void funkcia_int1(void) org IVT_ADDR_INT0
{
	cislo = cislo +10;
}

int main(void)
{
	SREG |= 1<<7;
	DDRA |= 1<<4;
	PORTA |= 1<<4;

	DDRD &= ~(1<<PORTD2);

	GICR  |= 1<<INT0;
	MCUCR |= 1<<ISC01 | 1<<ISC00;
	cislo = 0 ;

	while(1)
	{
		PORTA |= 1<<4;
		if(cislo > 100)
		{
			PORTA &= ~(1<<4);
			Delay_ms(5000);
			cislo = 0 ;
		}
	}
}
V prvom rade logika programu. Milión krát za sekundu nastavíš bit 4 na porte A na 1, ok. Prerušenie inkrementuje po 10 a test je na viac ako sto, takže teoreticky až po desiatom prerušení vynuluješ bit a 5 sekúnd čakáš, ak za ten čas nastane prerušenie proste sa to tam napočíta a nijako netestuje, aj tak sa to vynuluje. Ak bude 100, 110, a viac, furt je to jedno. Ako rýchlo hádžeš mince? Ak niekto hodí rýchlejšie 14 mincí má mu to zobrať ako 10? Vtedy sa ti to stráca?
0

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 01 Feb 2016, 14:56

Nie stráca sa mi to absolutne v nepravidelných intervaloch napríklad ked mám v premennej iba 50 a zrazu hodím mincu a nič sa nestane k premenej sa neprípočíta nič. Práve preto som z toho tak trochu zmetený lebo fyzicky k tomu prerušeniu určite príde.
0

Používateľov profilový obrázok
budvar10
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1029
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa budvar10 » 01 Feb 2016, 15:04

Ako vieš, či sa nepripočíta? Z toho programu to nijako nezistíš.
Ukáž nejakú schému. Už tu boli spomenuté zákmity na porte. Ako to riešiš? Tiež ti peterple navrhuje aby si dal rozsvietenie LED do prerušenia. Skús to. Delay je čas, kedy funguje z tvojho programu len prerušenie. Na to nezabúdaj.

@stefanSK
Tiež nepoznám MicroC ale z helpu na webe som zistil, že táto kúzelna formulka 'org IVT_ADDR_INT0' to rieši. Je jedno ako sa volá funkcia.
0

stefanSK
Pokročilý člen
Pokročilý člen
Príspevky: 753
Dátum registrácie: 24 Jún 2010, 00:00
Bydlisko: Trnava
Vek: 68

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa stefanSK » 01 Feb 2016, 15:53

Podľa mňa je tam dôležité toto:

interrupt_ISR ()


interrupt_ISR je kľúčové slovo prekladača - aby prekladač tam vložil kód na odloženie registrov a pred návratom obnovenie registrov, pre povolenie prerušenia splávny kód z prerušovacej rutiny - niečo ako RETI.

Čo popisuje autor tejto témy ako sa chová program, predpokladám, že program blúdi po celej pamäti, náhodne niektoré premenné zmenia svoju hodnotu, ....
0
S.K.

AjSnahaSaCeni
Okoloidúci
Okoloidúci
Príspevky: 34
Dátum registrácie: 29 Dec 2015, 12:14

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa AjSnahaSaCeni » 01 Feb 2016, 16:31

Myslím že stefanSK má pravdu lebo teraz ked som pozmenil kód zaznamenáva všetky impulzy ale aj 2x :o čiže tu predpokladám zase narážam na problém s tými zákmitmy na porte,toto som zatiaľ vôbec neriešil lebo som myslel že keď ten výstup z mincovníka iba uzemnuje ked sa vhodí minca stači port pripojiť cez pullup rezistor na 5v a ten výstup z mincovníka pripojiť k portu. Neviete mi náhodou poradiť ako by sa dali tie zákmity odstrániť?
0

dan21
Ultimate člen
Ultimate člen
Príspevky: 3016
Dátum registrácie: 11 Apr 2007, 00:00
Bydlisko: ZA

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa dan21 » 01 Feb 2016, 16:44

0

kako
Stály člen
Stály člen
Príspevky: 307
Dátum registrácie: 07 Mar 2014, 06:38
Bydlisko: Trnava

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa kako » 01 Feb 2016, 17:20

0
ho

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Externe prerusenie+Mincovník+Atmega16A-PU

Príspevok od používateľa peterple » 01 Feb 2016, 18:08

AjSnahaSaCeni napísal:Myslím že stefanSK má pravdu lebo teraz ked som pozmenil kód zaznamenáva všetky impulzy ale aj 2x :o čiže tu predpokladám zase narážam na problém s tými zákmitmy na porte,toto som zatiaľ vôbec neriešil lebo som myslel že keď ten výstup z mincovníka iba uzemnuje ked sa vhodí minca stači port pripojiť cez pullup rezistor na 5v a ten výstup z mincovníka pripojiť k portu. Neviete mi náhodou poradiť ako by sa dali tie zákmity odstrániť?
Myslím znamená .... vedieť. Často tu opakovaná veta. Hoď sem hexa súbor pre jednu variantu a pre druhú a ja ti hneď poviem či to je naozaj pravda alebo len domienka. Toto je dosť zásadná vec a treba v nej mať jasno. Pri práci s prerušením sa nedá stavať na domienkach. Ani keď ide o jediné prerušenie. 1000x to môže zbehnúť ale 1001 zlyhať ak to nie je urobené poriadne.
Osobne si myslím (a teda ... viem) že to nie je pravda, lebo ak by sa použila klasická inštrukcia RET miesto IRET tak už sa nepovolí pri návrate global interrupt flag a ďalšie prerušenia by sa ignorovali.

Predpoklad že odpor odstráni zákmity je chybný. Tam je dôležité vedieť aký signál ide z mincovníka. Buď dokumentácia alebo meranie. Predpokladám že ten čítač si si nepostavil. Ja mám logickú sondu s počítaním impulzov pomocou 24 bitového čítača s hradlovaním vstupu a v mojich začiatkoch mi úspešne nahrádzala dvojkanálový osciloskop a logický analyzátor.

Ako vieš že tie impuzy boli dva a nie 12? Efekt v tvojom programe by bol rovnaký? Ak sa ti nechce vyrábať hw počítadlo tak si ho sprav v prerušení. Ak nemáš displej tak si posielaj hodnotu počítadla na nejaký 8 bitový port a tam si pripoj LED alebo dve sedemsegmentovky cez dekodér. Ešte som nezažil aby sa mi tratili hrany na externom prerušení. To by prichádzalo do úvahy iba ak by hlavný program zakazoval prerušenie, alebo by obsluha prerušení trvala dlhú dobu. Ani jedno v tvojom programe by nemalo nastávať.

HW odstraňovanie zákmitov by som nepoužil, ale o tom sa môžeme baviť až sa potvrdí že sú tam a zmeriaš koľko ich je a koľko trvajú.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok