vyhodnocení čidel

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

vyhodnocení čidel

Príspevok od používateľa termixnator » 14 Máj 2014, 16:42

Ahoj po nějakém čase jsem se zase posunul kousek v programovaní v C (učím se více méně jen podle knihy tady z fora Programujeme AVR v jazyku C za kterou děkuji) přečetl jsem si i pár knížek o programování v C ale z toho jsem moc nepobral.

A teď k problému řešil jsem to už v sekci mikroprocesory ale každý uživatel programuje v jiném jazyce tak jsem se přesunul sem ke znalcům C.

chtěl bych Atmegou8 snímat jedno dvojité čidlo (vždy je zastíněna jen jedna polovina) a pokud by byla jedna polovina čidla zakrytá déle než 100ms objevil by se na výstupu Atmegy8 300ms pulz.

fungovalo by to tedy tak že pokud by byla kladná úroveň PB1 nebo PB2 splnila by se podmínka a
poté by se porovnal příslušný registr s TCNT1 (ješte musím zjistit jak dopsat aby se podmínka splnila po
jakékoli delší době než 100ms)
Zatím jsem se pokoušel jen o jednu polovinu pogramu, tedy jen jedno čidlo. Ale jak je vidět tak né úspěšně proto bych od vás potřeboval malou úpravičku aby alespoň to jedno pro začátek fungovalo :D to ostatní bych si už doupravil včetně toho delaye který je tam jen pro začátek na zkoušku.

Kód: Vybrať všetko

 #include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

ISR (TIMER1_COMPA_vect){ // pretečenie pri zhode registrov OCR1A a TCNT1
TCNT1 = 0; // nuluj TCNT0
}

int main(){
DDRB|=(1<<PB3);   //PB3 jako výstupní
DDRB&=~(1<<PB1);   //PB1 jako vstupní

TCCR1A|=(1<<CS11)|(1<<CS10);     //předělička 64 (8us)

OCR1A=12499; //hodnota preteceni 12500 

sei(); // povol globalne prerušenia

while(1){ // nekonečná slučka

	if((PORTB&(1<<PB1))==1){   // pokud je cidlo na pinu PB1 1urovne
		TIMSK|=(1<<OCIE1A); //porovnej registr OCR1A a TCNT1, (tady bude asi ten zadrhel schazi mi tu neco co pri schode nebo vetsi hodnote TCNT1 vytvori podminku)
			PORTB|=(1<<PB3);  //vystupni uroven 1
			_delay_ms(300);  //pockej 300ms
			PORTB&=~(1<<PB3); //vystupni uroven 0
						  }
	
		}
return 0;
		 } 
Předem díky všem co mi poradí jak na to.
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: vyhodnocení čidel

Príspevok od používateľa peterple » 14 Máj 2014, 19:26

Pôvodné umiestnenie v mikroprocesoroch bolo lepšie. Toto nemá s C veľa spoločného. To čo potrebuješ je detailné pochopenie ako pracuje ten ATMega8.

Čítať si hotové veci z webu a prípadne ich rozchodiť je jedna vec a pochopiť niečo a na základe toho urobiť niečo vlastné je vec druhá. Obávam sa že, ak ti tu niekto hodí riešenie problému čo si poslal, bude to fajn, ale do budúcna ti to veľa nepomôže. V pôvodnej otázke si dostal presnú odpoveď ako to urobiť. Predpokladali však že poznaš hw ATMega.

Dal si si celkom peknú úlohu, ktorá je dosť náročná pre začiatočníka. Preto by som na tvojom mieste rozdelil túto úlohu na rad jednoduchých. A postupným riešením sa pokúsil dopracovať k výsledku. Ako prvé by som doporučil dôkladne naštudovať toto a nasledovné štyri stránky:
http://www.atmel.com/images/atmel-2486- ... df#page=51

Keď píšem dôkladne, tak myslím dôkladne. Treba to prečítať niekoľko krát a neustále sa vracať a overovať či sa všetko deje presne tak ako si to pochopil.

Potom by som začal riešiť prvé priblíženie sa k tvojej úlohe v takejto podobe

Napísať kód ktorý zmení stav PB3 na opačný, ak na PB1 zbadá nábežnú (alebo dobežnú) hranu. Teda prechod z 0 do 1
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: vyhodnocení čidel

Príspevok od používateľa termixnator » 14 Máj 2014, 21:11

Tak to se omlouvám myslel jsem že sem to zapadne lépe.
No pro mě by bylo asi nejlepší kdyby byl někdo tak hodný a napsal podle sebe program pro jedno čidlo já bych si ho postupně prostudoval a rozšířil pro dvě čidla.

to co jsi ty popisoval na konci by melo byt pravdepotobne takto:

Kód: Vybrať všetko

 #include <avr/io.h> 
#include <util/delay.h> 
 
int main(){ 
DDRB|=(1<<PB3);   //PB3 jako výstupní
DDRB&=~(1<<PB1);   //PB1 jako vstupní
 
 // nekonečná slučka 
 while(1){ 
   if((PINB & (1 << PB1)) == 1){ // pokud je PD1 jedničkový 
 
     PORTB |= (1 << PB3); // vystupni uroven 1
     _delay_ms(300); // spoždění 300ms 
     PORTB&= ~(1 << PB3); // vystupni uroven 0
     } 
   } 
 
return 0; 
} 
Pokud se nepletu tak řešení náběžných a doběžných hran není potřeba z duvodu že čidla davají buď log.1 nebo log.0
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: vyhodnocení čidel

Príspevok od používateľa peterple » 14 Máj 2014, 21:24

Tak na prvú chybu v tom if si už prišiel. PORTB bolo zle. PINB je dobre. Bohužiaľ je tam ešte jedna chyba. Ten test nebude nikdy pravdivý. Toto je už čisto C záležitosť. Doporučujem si to nasimulovať v simulátore. Miesto if ten výraz priradiť do premennej a pre lepšie pochopenie ho robiť na dva kroky. Potom sa ti dúfam rozsvieti.

Ten program čo si dal nebude pri nábežnej hrane meniť stav PB3 na opačný. Veď si to odsimuluj.

A to že nepotrebuješ nábežnú hranu? A ako potom chceš zistiť že ten tvoj signál je 100ms hore? Možmo že zase len nerozumiem zadaniu. Najlepšie by bolo keby si nakreslil časový priebeh vstupného signálu a výstupného. Samozrejme všetky možné prípady.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: vyhodnocení čidel

Príspevok od používateľa termixnator » 14 Máj 2014, 21:46

No čidlo po zakrytí má na vístupu +5V tedy log.1 druhá polovina tedy druhé čidlo je v tu chvíli mimo provoz (nereaguje na zakrytí respektivě na vístupním pinu je i po zakrytí log.0) pokud je první čidlo nezakryté jsou opět obě aktivní a na vístupech obou je 0V tedy log.0.
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: vyhodnocení čidel

Príspevok od používateľa peterple » 14 Máj 2014, 22:05

druhým vstupom by som to teraz vôbec nekomplikoval. Stačí úplne ten jeden vstup. Od akého okamihu teda budeš merať tých 100ms? Ja to stále vidím na tú nábežnú hranu. Ale ty si šéf a tak, ako si urobíš tak máš. A čo tá chyba v teste?
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: vyhodnocení čidel

Príspevok od používateľa termixnator » 14 Máj 2014, 22:19

no tech 100ms se bude merit od doby zakryti cidla tedy od chvile kdy se objevy na vstupu log.1. No urcite me chces na neco upozornit ale ja jsem jen zacatecnik takze si rad necham poradit a vysvetlit proc je nabezna hrana nutna. Chybu zatim nevidim jen tusim zitra az budu u programatoru a procesoru tak si stim pohraju a hdoim sem poznatky :) zatim diky za tu opravu chyby na kterou si me upozornil.
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: vyhodnocení čidel

Príspevok od používateľa peterple » 14 Máj 2014, 22:25

takže potrebuješ vedieť kedy je nábežná hrana. A na pochopenie tej chyby je procesor a programátor zbytočný. Nevidíš do vnútra. Potrebuješ simuláciu.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: vyhodnocení čidel

Príspevok od používateľa termixnator » 15 Máj 2014, 11:15

Tak jsem si stim pohral a program funguje pekne kdyz jsem dal nabeznou hranu tak to bylo az moc citlive (mel jsem to zapojene jen pres dratky na nepajivem poly) proto na pocatecni vyzkouseni jsem nechal zaple pull upy a dobeznou hranu.

Kód: Vybrať všetko

 #include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

ISR(INT0_vect){
PORTD |= (1 << PD1); //vystupni uroven 1
_delay_ms(300);  //pockej 300ms
PORTD&=~(1<<PD1); //vystupni uroven 0
}
ISR(INT1_vect){
PORTD |= (1 << PD4); //vystupni uroven 1
_delay_ms(300);  //pockej 300ms
PORTD&=~(1<<PD4); //vystupni uroven 0
}
int main(){
DDRD |= (1 << PD1) | (1 << PD4); //PD1 a PD4 jako výstup

DDRD &= ~((1 << PD2) | (1 << PD3));  // PD2 a PD3 jako vstupní 

PORTD |= (1 << PD2) | (1 << PD3);  //PULL UP 

MCUCR |= (1 << ISC01); // doběžná hrana INT0
MCUCR |= (1 << ISC11); // doběžná hrana INT1


GICR |= (1 << INT1) | (1 << INT0);  // povol prerušenia od INT1 a INT0

sei(); //povol globálne prerušenia
while(1); // nekonečný cyklus
return 0;
} 
Ted co nebo jak dopsat aby se to spozdeni/ prislusne vystupni piny zaktivovaly jen kdyz bdue vstupni pul 100ms a vice dlouhy.
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: vyhodnocení čidel

Príspevok od používateľa peterple » 15 Máj 2014, 17:02

pohral ako pohral. Sa mi zdá, že miesto riešenia problémov si sa im vyhol. Namiesto toho aby si naprogramoval detekciu nábežnej hrany, tak si to presunul na hw procesora. Tak si sa vyhol aj problému s if. Ono sa ti to časom vráti.

Riešenie ktoré si zvolil je zlé. Nechať procesor trčať 300ms v obsluhe prerušenia je zle. Si si vedomí toho, že ak je v takejto obsluhe, tak sa už nemôže vykonávať nič iného? Teda stojí hlavný program (nie že by teraz niečo rozumné robil, ale časom asi bude), ale hlavne sa nemôžu aktivovať ďalšie prerušenia. A to ti už problém robiť bude. Máš zatiaľ povolené dve, a predpokladám že plánuješ povoliť ďalšie.

Takže skôr ako začneš riešiť meranie tých 100ms. tak uprav tento program tak aby sa výstupné impulzy generovali v hlavnom programe (pomocou príznakov).
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: vyhodnocení čidel

Príspevok od používateľa termixnator » 15 Máj 2014, 18:23

No udelal jsem to jak nejlepe jsem to umel. Pokud bys mel cas a nahodil sem jak bys to ty udelal lepe rad se na tom priucim + bude to asi lepsi do budoucna pokud pojedu na lepsim zakladu :) ten delay mi je jasnej ze zabrzdi celej procak ale chtel sem vyuzit ten procesor jen na snimani techto dvou cidel pricemz je aktivni vzdy jen jedno. Predelat jsem to chtel tak jako tak jeste pokud by to delalo casem neplechu tak je to dalsi duvod navic :) jinak ty vystupni pulzy teda povesim na nejaky timer pokud jsem to dobre pochopil.
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: vyhodnocení čidel

Príspevok od používateľa peterple » 15 Máj 2014, 18:45

výstupné impulzy zatiaľ na časovač netreba. Urob to čo som napísal. Pomocou príznakov presuň ich generovanie do hlavného programu.
Postup:
1. Deklaruj globálnu premennú napr flags (typ char a musí byť aj volatile)
2. Deklaruj dva príznakové bity
3. V prerušení príznak nastav do 1 (dve prerušenia, v každom iný príznak)
4. V hlavnom programe kontroluj príznaky. Ak je niektorý jednotkový tak vynuluj príznak a vytvor výstupný impulz (delay zatial stačí)

Kód písať nebudem. Takých sa povaľuje aj na tomto webe plno. Len to musíš zbadať. V podstate všetko samostatne ovládaš teraz to len dať dokopy.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: vyhodnocení čidel

Príspevok od používateľa jaromir » 15 Máj 2014, 20:12

0

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: vyhodnocení čidel

Príspevok od používateľa termixnator » 15 Máj 2014, 22:10

Reseni je dost :D ale porad mi vazne realizace v C zitra zas nahodim co vyprodukuju :) no cim dal vic se snad posouvam k vysledku.
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: vyhodnocení čidel

Príspevok od používateľa peterple » 15 Máj 2014, 22:23

napísal som ti 4 kroky ktoré treba urobiť. Máš s niektorým problém?. Znova opakujem. Reálny procesor momentálne vôbec nepotrebuješ. Vyprodukuj kód. Odsimuluj si ho. Potrebuješ zbadať ako to tam vo vnútri fičí. Už si to mohol mať za večer celé pochopené.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: vyhodnocení čidel

Príspevok od používateľa termixnator » 17 Máj 2014, 12:30

Snazil jsem se to udelat presne tak jak jsem pochopil tvoje jednotlive body :) snad tedy dobre. Koukal jsem i na Timery a uz jsou mi pomerne jasne jak nastavit predelicku porovnavani atd. Akorat porad nevim jak napriklad pri zmene priznaku z jednicky na nulu zahajit pocitani. Jedine si zase nastavit priznak napirklad ms++ a pri 100 a vice ms udelat podminku ? Zase znovu dekuji za rady :)

Kód: Vybrať všetko

 #include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile char cidloA = 1;
volatile char cidloB = 1;

ISR(INT0_vect){
cidloA = 0;
}
ISR(INT1_vect){
cidloB = 0;
}
int main(){
DDRD |= (1 << PD1) | (1 << PD4); //PD1 a PD4 jako výstup

DDRD &= ~((1 << PD2) | (1 << PD3));  // PD2 a PD3 jako vstupní 

PORTD |= (1 << PD2) | (1 << PD3);  //PULL UP 

MCUCR |= (1 << ISC01); // doběžná hrana INT0
MCUCR |= (1 << ISC11); // doběžná hrana INT1


GICR |= (1 << INT1) | (1 << INT0);  // povol prerušenia od INT1 a INT0

sei(); //povol globálne prerušenia
while(1){ // nekonečný cyklus

if(cidloA == 0){

				PORTD |= (1 << PD1); //vystupni uroven 1
				_delay_ms(300);  //pockej 300ms
				PORTD&=~(1<<PD1); //vystupni uroven 0
				cidloA = 1;

               }

if(cidloB == 0){
 
				PORTD |= (1 << PD4); //vystupni uroven 1
				_delay_ms(300);  //pockej 300ms
				PORTD&=~(1<<PD4); //vystupni uroven 0
				cidloB = 1;
 			   }
	    }
return 0;
} 
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: vyhodnocení čidel

Príspevok od používateľa peterple » 17 Máj 2014, 17:46

Dobre mám z teba radosť. Konečne niekto čo si nechá poradiť.
To čo si vytvoril je celkom fajn. Mám k tomu jedinú pripomienku. Je to máličko neefektívne. Bolo by dobré sa naučiť efektívne postupy. Konkrétne na celú šarádu s príznakmi ti stačí jediná premenná typu char. Takáto premenná má celkovo 8 bitov a tebe zatiaľ stačia dva. Takže moja predstava bola že zadeklaruješ jednu premennú typu char na všetky príznaky (bude ich treba ešte viac).
Potom zadefinuješ dve konštanty CIDLO_A a CIDLO_B s hodnotami napríklad 0 a 1. Hodnota toho čísla bude poradové číslo bitu v tej premennej s príznakmi. Potom v prerušení dáš do 1 (do 0 ak chceš) ten jediný bit premennej (teda buď nultý, alebo prvý) A v hlavnom programe testuješ a nuluješ tiež len príslušný bit tej premennej.
Všetky operácie (nastavenie bitu, vynulovanie bitu) by si mal vedieť lebo ich používaš. Jediné s čím si mal problém je ten if. Takže si sa tomu možno opäť zámerne vyhol. Neviem či je múdra takáto pštrosia politika. Je mi jasné že momentálne ťa nejaká jedna premenná vôbec netrápi. Ale tu ide o to či sa chceš niečo naučiť poriadne a posúvať sa ďalej alebo nie.

To že si naštudoval ten časovač je tiež dobre. To že nastala hrana na tom vstupnom signále už máš vyriešené. To je v tedy keď vbehneš do niektorého z tých dvoch if. Vtedy treba spustiť časovač a nejako zbadať že už ubehlo 100ms. Úplne najjednoduchšie je to tak že nastavíš do čítača také číslo aby pretiekol za 100ms. Potom keď sa nastaví príznak pretečenia tak vieš že uplynulo tých 100ms. V bodoch asi takto (iba pre jeden if):
1. v niektorom if. vyhodiť to generovanie delay
2. vypočítať preddelič tak aby sa z tvojich hodín procesora dalo namerať 100ms
3. vypočítať koľko impulzov pri tom preddeliči je 100ms (konštanta DELAY100)
4. nastaviť časovač na -DELAY100
5. nastaviť preddelič.
6 v hlavnom programe pridať ďalší if ktorý testuje príznak pretečenia toho časovača. V tomto if zastaviť časovač, vymazať príznak pretečenia, zavolať delay na generovanie výstupného impulzu.

Viem že toto ešte nerieši tvoj problém. Ale je to zase o krok bližšie riešeniu. Výstupný signál bude o 100ms oneskorený za vstupným. Samozrejme aby si to otestoval si možeš dať aj oneskorenie 500ms aby si pekne videl či to funguje. Stačí potom len meniť tú konštantu.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
petersno
Ultimate člen
Ultimate člen
Príspevky: 2774
Dátum registrácie: 06 Aug 2011, 00:00
Bydlisko: ba
Vek: 63

Re: vyhodnocení čidel

Príspevok od používateľa petersno » 17 Máj 2014, 18:31

peterple napísal:Je to máličko neefektívne
v jeho kode si v tomto pripade vystaci s dvoma premennymi, v tom co navrhujes potrebuje tri :wink:
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: vyhodnocení čidel

Príspevok od používateľa peterple » 17 Máj 2014, 18:48

Myslíš flags, CIDLO_A, CIDLO_B?
Tak to si to nepochopil správne. flags je premenná. CIDLO_A, CIDLO_B sú len symbolické konštanty aby sa ľahšie manipulovalo s jednotlivými bitmi.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
petersno
Ultimate člen
Ultimate člen
Príspevky: 2774
Dátum registrácie: 06 Aug 2011, 00:00
Bydlisko: ba
Vek: 63

Re: vyhodnocení čidel

Príspevok od používateľa petersno » 17 Máj 2014, 18:52

aha, jasne. tie si kompiler iba dosadi
0

Napísať odpoveď