Problem so zachytenim dobeznej hrany signalu na ATmega8

Zdravim, potreboval by som pomoc s jednou vecickou. Mam MCU ATmega8 s internou frekvenciou 1MHz. Potrebujem zaznamenavat kazdu dobeznu hranu signalu. Ide o jednosmerný motor so strbinovym optoclenom LTH301-07. Pokusal som sa cez Timer0.

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include "lcd.h"
ISR(SIG_OVERFLOW0)
{
  	TCNT0=255;
        opto+=1;  
	lcd_gotoxy(7,0); 				
	sprintf(ret,"%d",opto);
	lcd_puts(ret);	
}
int main(void)
{
       TCCR0 = 0b00000110;  
       temp=255;
       TCNT0=temp;
       TIMSK = 0b00000001;
       sei();  //povolení přerušení 
}

No sprava sa to, akoby mi tam ziadne pulzy s LTH301-07 nesli.
dakujem za trpezlivost…este len zacinam s programovanim MCU

Nikde ti nevidím deklarace proměnných.
Jakým mechanizmem se snažíš ty pulzy zachytávat a co s nima potřebuješ dělat? Změřit mezi nimi čas, nebo je jen detekovat?
Na detekci by bylo vhodnější externí přerušení, které je konfigurovatelné úroveň.

Jednoducho potrebujem len detekovat dobeznu hranu externeho signalu. Ako nato?

Teraz som sa snazil nastavit ten externy signal ako hodinovy pre timer0, kde by na prvu dobeznu hranu TCNT0 pretiekol, vyniklo by prerusenie a ja by som inkrementoval opto.

máš snad vstup externího přerušení ne ? INT. ten si můžeš nastavit, aby reagoval na sestupnou, nástupnou nebo obě dvě hrany. A nebo ho lze ještě nastavit na úrovně. Přes ten časovač je to podle mě dost na hov…

Takze, mam to zapnou na vstup INT? Je to o dost jednoduchsie?
Ako by som to mal potom naprogramovat?

vstup z toho motoru připojíš na vstup INT0 ten programově nasatvíš jako citlivý na sestupnou hranu a povolíš od něho přerušení a pokaždé když bude sestupná hrana na vstupu INT0 tak ti to vyvolá přeruení a v přerušení si inkrementuješ to nějaké počítadlo či co. Podívej se do datasheetu a uvidíš sám :wink:

Velka vdaka za trpezlivost…idem nato

A preco nemoze vnutorne pocitadlo pocitat vstupne impulzy?
Preto to komplikovat cez prerusenia cez INT?
A ked impulzy pridu castejsie ako vykonanie programu v preruseni?
Predsa na to je pocitadlo nastavene v mode pocitania externych implulzov.

Ibaze by potreboval vediet o kazdej hrane zvlast.
Treba si spravne nastavit bitiky definujuce mod pocitadla. Na to je najlepsie pozriet do datasheetu.

On požaduje sestupnou hranu, tu čítačem nezjistí. Ale když nám neřekne na co to potřebuje, tak je to těžký. Beztak po třech stranách zjistíme, že tak jak si to představuje, to stejně nemá smysl nebo to jde mnohem jednodušeji a bude. Stejně jako nedávno. Panáček myslel, že když něco umí napsat pro PC, že to přeci na procesoru nemůže bejt problém. A ejhle, chyba lávky :slight_smile:
Kdyby chtěl zjišťovat otáčky motoru, tak je ona sestupná hrana zbytečnost. Na to by se hodilo měření periody nebo počtu impulzů za jednotku času. Ale když se s námi o své myšlenkové pochody nepodělí, tak je to těžký :slight_smile:

Prepacte, ide o to, aby som zaznamenal pocet zostupnych hran na jednotku casu…napr, na sekundu

jasný, ale k čemu ti to konkrétně sloužit ?

S tím není problém - pomocí toho externího přerušení. Pokud budeš ten počet potom chtít využít i jinde než v té obsluze, vytvoř si jako počítadlo globální proměnnou a dej před ní klíčové slovo “volatile”. Kdyby tě to zajímalo jen v té obsluze, tak stačí mít proměnnou lokální ovšem s klíčovým slovem “static” - udržuje hodnou i po opuštění funkce (stejně tak i přerušení).

Pokud to ale chceš třeba na měření otáček, tak by bylo jedno, zda počítáš sestupné nebo náběžné hrany - pak by bylo jednodušší použít na to externí vstup čítače. Opravdu to musí být sestupná hrana? Že by nějaký úkol do školy? :slight_smile:

Ako ste prisli na to, ze dobeznu hranu pomocou CNT nezisti?

Skute pozriet do datasheetu (konecne).

Ako zdroj hodin moze byt nieco z oscilatora vhodne vydelene, alebo externy signal - dobezna hrana alebo externy signal - nabezna hrana .

Tak co mi uchadza?
Nech si necha do jedneho cnt zapisovat pocet impulzov zo vstupu a dalsim casovacom nech si spravi casovu zakladnu 1s.

Ak na pocitanie externych impulzov pouzije citac 1, potom moze takto fungovat az do 65535Hz.

1x za sekundu moze pocet impulzov z citaca externych hran odpamatat a potom hodnotu v citaci vynulovat (trochu blby postup pri ktorom moze teoreticky ujst hrana (co je pri 65kHz chyba merania 0.0015%), ale ak sa mu podari toto, doladit to uz bude hracka :slight_smile: ).

Najlepsie by bolo,keby napisal co presne potrebuje. Aspon ze do akej frekvencie a aka je strieda meraneho signalu.

Ak si kazdu 1sekundu skontroluje aj fyzicky stav vstupu, je vcelku jedno, zi pocita nabezne, alebo dobezne hrany.

Ak by aj pocital nabezne hrany (keby hw teoreticky neumoznoval pocitat dobezne hrany) a:

pri odpamatani by stav vstupu bol log. 1 vie ze
pocet dobeznych hran = pocet_nabeznych_hran - 1

pri odpamatani by stav vstupu bol log. 0 vie ze
pocet dobeznych hran = pocet_nabeznych_hran

Dost tazko totizto moze byt system, v ktorom by sa pocet nabeznych a dobeznych hran jedneho vstupu lisil o viac ako o jednu
:slight_smile: :slight_smile: :slight_smile:

Dobrá tedy, tak jsem se podíval do DS :blush:
Str. 100:
Clock Select Bit Description:
CS12 CS11 CS10 Description
1 1 0 External clock source on T1 pin. Clock on falling edge.
1 1 1 External clock source on T1 pin. Clock on rising edge.

Njn… :slight_smile:

Prepacte ze tak neskoro…pracujem na regulátori otacok jednosmerneho motorceka, pouzival som strbinovy optoclen. Tento problem som uz vyriesil cez vstup atmega8 INT1.

No druha metoda merania je…odozva napatia na kotve motorceka…riesim to cez prevodnik, no potrebujem vyvolat znova prerusenie na dobeznu hranu. A tu nastava PROBLEM, mam obsadene vsetky piny na ktorych to je mozne…ostal mi akurat ICP1, no cez te to neviem zrealizovat. Vedel by mi niekto poradit?

T1, T0, AIN1, AIN0, INT1, INT0 su obsadene…som z toho uz zufaly…

TIMSK: TICIE1: Timer/Counter1, Input Capture Interrupt Enable bit. - procesor má přerušení od Input Capture jednotky(napojené na ICP1), ta tedy může generovat přerušení, které můžeš použít.

TCCR1B
• Bit 7 – ICNC1: Input Capture Noise Canceler
Setting this bit (to one) activates the Input Capture Noise Canceler. When the noise canceler is
activated, the input from the Input Capture Pin (ICP1) is filtered. The filter function requires four
successive equal valued samples of the ICP1 pin for changing its output. The Input Capture is
therefore delayed by four Oscillator cycles when the noise canceler is enabled.
• Bit 6 – ICES1: Input Capture Edge Select
This bit selects which edge on the Input Capture Pin (ICP1) that is used to trigger a capture
event. When the ICES1 bit is written to zero, a falling (negative) edge is used as trigger, and
when the ICES1 bit is written to one, a rising (positive) edge will trigger the capture.

Proč jsi tvořil další téma, když jde stále o stejnou věc?

Ked uz jetu ta tema. meriam uhol natocenia klapky pristrednictvom impulzov z otacajuceho sa kolesa z vyrezmi. na detekciu dosiahnutej hodnoty tj posun o x impulzov som pouzival Vstup T0 PD4 na AT mega8. Vsetko bolo fajn ale po zvyseni napatia na moterceku mi to nestiha a preleti nastatvenu hodnotu. povodne sa vyhodnocovala podmienka v slucke TCNT0!=0. Tak ze to chcem dat do prerusenia.

Ide o to ci prerusenie nastane aj ked pojde z 0 na ff a opacne tj z ff na 0.

ISR (TIMER0_OVF_vect)
{
klapkaoff;
stop=0;
}

To len zastavi otacanie a v povodnej slucke sa zisti ci uz je klapka natocena tam kde ma byt…len to nejako nejde.
P.S. aku frekvenciu to zvladne na tom vstupe T0

DAkujem za rady…

“it is recommended that maximum frequency of an external clock source is less than fclk_I/O/2.5.” To pladí pro 50/50% duty cycle. Pokud bude jiný, musí jedna úroveň trvat více než 1clk procesoru.

Ide o to ci prerusenie nastane aj ked pojde z 0 na ff a opacne tj z ff na 0. ???