Zaciatocnik u microchipu

Tak to urcite je s tym suhlasim. Mam ale dalsi problem a to je prerusenie v rezime input capture. Cely kod je tu

[code]#include <p33FJ06GS202A.h> //Typ procesora

#define FCY 40000000 //Vypocet taktovacej frekvencie na 40MIPS

//Nastavenie konfiguracnych bitov
_FICD(ICS_PGD1 & JTAGEN_ON); //Komunikacny kanal nastaveny na PGEC1/PGED1 a povolenie JTAG-u
_FWDT(FWDTEN_OFF); //Watchdog vypnuty
_FOSCSEL(FNOSC_FRC & IESO_OFF); //Vnutorny fast oscilator so zakazom startu na dvoch oscilatoroch
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT); //Povolenie prepinania oscilatora, OSC2 je vystup oscilatora, povol prerpnutie oscilatora

//Zoznam pouzitych kniznic
#include <stdio.h>
#include <stdlib.h>
#include <libpic30.h> //Pre funkciu delay

//Definovanie globalnych premennych
volatile unsigned int cas_polperiody = 0;

//Obsluha prerusenia zachytneho registra
void attribute((interrupt, no_auto_psv)) _IC1Interrupt(void)
{
LATAbits.LATA0 = 1;
__delay_us(10);
LATAbits.LATA0 = 0;
IFS0bits.IC1IF = 0; //Vymazanie priznaku prerusenia
}

//Hlavny program
int main(void)
{
//Konfiguracia PLL
PLLFBD = 63; //M = 65
CLKDIVbits.PLLPOST = 0; //N2 = 2
CLKDIVbits.PLLPRE = 1; //N1 = 3

//Inicializacia prepinaca oscilatora na vnutorny FRC s PLL
__builtin_write_OSCCONH(0x01);
__builtin_write_OSCCONL(OSCCON | 0x01);

//Podmienky prepnutia oscilatora
while(OSCCONbits.COSC !=0b001){}; //Cakaj na prepnutie oscilatora
while(OSCCONbits.LOCK !=1){}; //Cakaj na zavesenie PLL

//Mapovanie pinov
__builtin_write_OSCCONL(OSCCON & ~(1<<6)); //Odomknutie konfiguracneho registra
RPINR7bits.IC1R = 0b00000; //Input Capture 1 na pin RP0
__builtin_write_OSCCONL(OSCCON | (1<<6)); //Zamknutie konfiguracneho registra

//Konfiguracia I/O portov
TRISAbits.TRISA0 = 0; //Nastav PA0 ako vystup
TRISBbits.TRISB0 = 1; //Nastav PB0 ako vstup

//Nastavenie startovacej hodnoty I/O portov
LATAbits.LATA0 = 0; //Nastav logicku uroven na PA0
LATBbits.LATB0 = 0; //Nastav logicku uroven na PB0

//Nastavenie zachytneho registra
IC1CON = 0; //Vymazanie konfiguracneho registra Input Capture
IC1CONbits.ICM = 0b011; //Zober vzorku pri kazdej nabeznej hrane signalu
IC1CONbits.ICI = 0b00; //Prerusenie na kazdu vzorku
IC1CONbits.ICTMR = 1; //Casova zakladna zvolena ako T2

//Povolenie prerusenia zachytneho registra
IPC0bits.IC1IP = 0b001; //Nastavenie priority prerusenia
IFS0bits.IC1IF = 0; //Vymazanie priznaku prerusenia od zachytneho registra
IEC0bits.IC1IE = 1; //Povolenie prerusenia zachytneho registra

//Nastavenie casovaca T2 ako casovej zakladne zachytneho registra
T2CON = 0; //Vymazanie konfiguracneho registra casovaca T2
PR2 = 1; //Nastav periodu citania pre T2
T2CONbits.TON = 1; //Spustenie casovaca T2

while(1)    //Nekonecna slucka
{

}

}[/code]

Ide o to ze som chcel skusit odmerat cas periody a v nejakom case napriklad nastavit vystup. Samozrejme mi to neslo tak som zacal hladat problem a prisiel som na to ze mne sa ani nemeni obsah zachytneho registra, skusal som nastavit aby mi pri nenulovej hodnote registra nastavilo nejaky pin na log.1 no bez uspechu. Spravil som potom taky barbarsky cin ze v obsluhe prerusenia som chcel vytvorit delay-om 100us dlhy impulz aby som to mohol vidiet na osciloskope no prisiel som na to ze mne program ani neskoci do obsluhy prerusenia a stale mam na vystupe nulu.
Myslim ze mozu byt tri zdroje problemu:
1.) Mam zle nadefinovany vstup pre ICP1 - nastavil som ho na RP0, je to pin5 a kontroloval som asi 3x ci je vystup generatora na tomto pine
2.) Mam zle nastavene prerusenia
3.) To je to najpravdepodobnejsie a to je ze mam chyby v oboch pripadoch :slight_smile:

Pozeral som aj nejake priklady od Microchipu no vsade to maju priblizne rovnako, nikto samozrejme nerobil to ze v preruseni stopoval MCU ale principialne by to malo byt jedno, ja potrebujem az mi program skoci do prerusenia a je si to mozem takto lahko skontrolovat. Dakujem Vam