PIC12F675: generování 333 Hz pomocí TMR1 + přerušení od INT

Prosím o radu. V PIC12F675 potřebuji generovat frekvenci 333kHz se změnou střídy toto generování je nstaveno přerusšním časovače 1

Dále ještě chci použít další přerušení na vstupu GP2 přerušení INT.

Ale tak jak to mám napsané mi funguje jen přerušení TMR1 a prostě přerušení INT vůbec nereaguje.

[code]unsigned short a, b, strida0, strida1;
void seting() {
OPTION_REG=0;
INTCON=0B11010000; //povoleno globální preruseni
PIE1=0B00000001; //povoleno preruseni TMR1
PIE1=0;
OSCCAL=0B11111100;
TRISIO=0B00001111; //GP5 je vystup
GPIO=0;
PIR1=0; // nulování priznaky preruseni
ANSEL= 0B01010001; //delicka 16, vstup AN0
ADCON0=0B00000000; //nastaveni a spusteni AD, vstup AN0
T1CON=0B00110000; //nastavení TMR1
a=0;
b=0;
strida0=163;
strida1=163;
}

void cas() {
if( a == 0) {
GPIO=GPIO | 0B00100000;
TMR1H=249;
TMR1L=strida1;
a=1;
}
else {
GPIO=GPIO & 0B11011111;
TMR1H=250;
TMR1L=strida0;
a=0;
}
}

void vstup() {
if (a ==0) {
GPIO =GPIO | 0B00010000;
a=1;
}
else {
GPIO =GPIO & 0B11101111;
a=0;
}
}

void interrupt(void) {
if(PIR1.TMR1IF) {
PIR1.TMR1IF=0;
cas();
}
else if( INTCON.INTF) {
INTCON.INTF=0;
vstup();
}
}

void main() {
seting();
T1CON.F0=1; // zapne casovac TMR1
do {
} while(1);

}[/code]

když napíšu jen:

void interrupt(void) { if( INTCON.INTF) { INTCON.INTF=0; vstup(); } }
…přerušení na INT vstup GP2 funguje

požívám překladač mikroC PRO for PIC moc děkuji vůbec to nechápu

:arrow_right: administrator: přejmenováno z "12F675 přerušení"

Chtělo by to buď zjišťovat dřív jestli nastalo přerušení od INT než od TMR. Anebo po skončení přerušení od TMR se kouknut jestli náhodou nemá být obslouženo přerušení od INT

Tomu vůbec nerozumím :frowning: . přece když přeteče časovač nebo bude náběžná hrana na GP2(INT) tak to zkočí do přerušení. V přerušení testuji oboje tak nechápu proč to na přerušení od INT nereaguje (ani když INT přerušení testuji dřív)

Cau, pro 333kHz je potreba menit log.hodnotu kazdejch 1.5us , jakou mas frekvenci uP ? nehada se ti tam nekde to “a” ? v simulatoru to funguje ?
skus testovat to preruseni kazdy zvlast

mám vnitřní oscilátor 4MHz. Každé zvlášť mi funguje dobře.

Když to dám dohromady tak nefunguje nic, nechápu to

Omlouvám se za chybu frekvence generátoru je 333Hz jen …ale to není podstatné
Důležité je aby fungovali oboje přerušení

je moznost kouknout se v tom “mikroC PRO for PIC” co to dela v ASM ?
v jednom s tech podprogramu (cas/vstup) si zmen tu promenou “a” muzou se ovlivnovat …

“a” se nejen můžou ovlivňovat, ale budou. Je to jedna a ta samá proměnná (globální).
Jesli má v cas() označovat střídu(kterou nastavíš ve “vstup()”), asi by se zde neměla měnit nýbrž pouze číst. Pro jistotu dej před datovej typ “volatile”.

To byla ale fatální moje chyba to a se ovlivňovalo

[code] unsigned short a, b, strida0, strida1;
void seting() {
OPTION_REG=0;
OSCCAL=0B11111100;
TRISIO=0B00001111; //GP5 je vystup
GPIO=0;
CMCON=0B00000111; //vypnutí comaratoru
ANSEL= 0; //
ADCON0=0B00000000; //nastaveni a spusteni AD, vstup AN0
a=0;
b=0;
strida0=163;
strida1=163;
TMR1H=254;
GPIO=GPIO | 0B00100000;
Delay_ms(1000);
GPIO=GPIO & 0B11011111;
Delay_ms(1000);
GPIO =GPIO | 0B00010000;
Delay_ms(1000);
GPIO =GPIO & 0B11101111;
Delay_ms(1000);
GPIO=GPIO | 0B00110000;
Delay_ms(2000);
GPIO =GPIO & 0B11001111;
T1CON=0B00110000; //nastavení TMR1
INTCON=0B11010000; //povoleno globální preruseni
PIE1=0B00000001; //povoleno preruseni TMR1
PIR1=0; // nulování priznaky preruseni
}

void cas() {
if( a == 0) {
GPIO=GPIO | 0B00100000;
TMR1H=254;
TMR1L=strida1;
a=1;
}
else {
GPIO=GPIO & 0B11011111;
TMR1H=254;
TMR1L=strida0;
a=0;
}
}

void vstup(void) {
if (a ==0) {
GPIO =GPIO | 0B00010000;
b=1;
}
else {
GPIO =GPIO & 0B11101111;
b=0;
}
}

void interrupt(void) {
if (PIR1.TMR1IF == 1) {
cas();
PIR1.TMR1IF=0;
// INTCON=0B11010000;
}
if(INTCON.INTF==1) {
vstup();
INTCON.INTF=0;
// INTCON=0B11010000;
}
asm {
RETFIE; //konec preruseni
}
}

void main(void) {
seting();
T1CON.F0=1; // zapne casovac TMR1
do {
} while(1);

}[/code]

teď to funguje už oboje …jen mi to nezareaguje na kadou změnu ta vstupu INT
Co myslíte podle mě je to způsobeno že to vykonává přerušení od TMR1?

co presne znamena "kazda zmena " ? int jde nastavit jen na nabeznou nebo spadovou hranu , pokud je priznak od int tak se vykona zaroven s prerusenim od tmr pokud to stihne nebo hned po navratu z preruseni

heh koukam jeste mala chybicka
void vstup(void) {
if (a ==0)

…ještě tam byla chyba a tím a na vstup()

Tak teď už je to OK …výstupní frekvenci si doladím

Děkuji všem za pomoc …stávají se jen mě takové fatální chyby?

Ještě prosím nemá někdo zkušenosti se snímáním impulzu z vysokonapěťového kabelu k zapalovací svíčce?

Vše co jsem teď díky vám rozběhl potřebuju na řízení serva a to servo bude řídit klapku karburátoru u benzínové centráli (aby to mělo konstantní otáčky)

Rozbyla se mech regulace …potvorný číňani (strašná konstrukce)

Toto by mohlo pomoci: hw.cz/constrc/auto/otackomer/index.html