Stránka 1 z 2

at90can128 problem s CAN (vyreseno)

Napsal: 11 bře 2013, 20:35
od WLAB
Narazil jsem na podivnou vec u CAN periferie.

V CAN ISR je:

Kód: Vybrat vše

........
/*set the corresponding mobpage, reset byte index, allow autoincrement*/
        CANPAGE = CANHPMOB & 0xf0;
        #asm("nop");
        mob_status = CANSTMOB;
       
        if(mob_status & CAN_ERR_MOB_ALL) /*in case of any error*/
        {  ....
......


Kdyz kod krokuju (v AVRSTUDIU 5) a dam breakpoint na if, obsahuje mob_status divnou hodnotu (pusobi dojmem jako by byla z jineho mobu, pro ten aktualni nedava smysl). Hodnota v periferialnim prohlizeci naopak obsahuje hodnotu, ktera smysl dava. Problem s tim, co zobrazuje WATCH by byt nemel, protoze program se dale podle te divne hodnoty chova. Pokud kod krokuji od CANPAGE= je vse ok. NOP je tam jako pokus o pauzu, ale nema zadny efekt. V mizerne dokumentaci k CAN periferii nevidim, ze by po zmene CANPAGE mela nasledovat nejaka pauza... Dale se zda, ze problem se projevil po te, co jsem zacak pouzivat MOb 0 a snazim se z nej vysilat RTR zpravy... Predtim se kod driveru choval normalne, alespon to tak vypadalo....

Ma nekdo nejaky napad?

EDIT: Problem je v tom, ze po vyslani zpravy se ihned automaticky do mobu prijme nejaka zprava z CANu, ktera je v nem pri dalsim kroku videt viz nize...

Napsal: 12 bře 2013, 07:57
od divous
Zdravím.

Promiň jestli se pletu, ale mám ten dojem, že Studio5 procesory typu AT90CAN plně nepodporuje.
Já makám na Studiu4 s pluginem At90can128_plugin.

Za CANPAGE žádné zpoždění být nemusí. Změna page je okamžitá.

S mobem 0 nemám žádný problém, spíš to vidím na tu RTR zprávu.
Mám pocit (jestli si dobře vzpomínám) tak tam je poněkud zmatené nastavování. Ještě se ti na to mrknu.

Napsal: 12 bře 2013, 11:01
od WLAB
Co jsem si vsiml, tak v 5tce neni pro AT90CAN podpora v simulatoru, ale pres JTAG to jede, bez znamek potizi... pominu-li to, ze prestane fungovat watch pro lokalni promenne na zasobniku, pokud se v nejakem vnitrnim bloku se zasobnikem hne (napr. se v nem vytvori dalsi lokalni promenna), ale to s AT90CAN nijak nesouvisi.

Ja to kompiluju v prisernem CodeVisionu a v AVS to jen ladim, protoze slozitejsi veci se bez krokovani neobejdou...

Take bych rekl, ze CANPAGE by mela mit okamzity efekt....

Je to divny, jeste jsem si tam uvedomil drobnou chybku, ale ta by nemela mit na tohle vliv a spis by se mela projevit pri krokovani.... pro jistotu ji odstranim a uvidim...

Napsal: 12 bře 2013, 14:47
od WLAB
Plus mam jeste jeden dotaz, protoze AVR STUDIO jsem doposud nepouzival. Kde nastavit, aby krokovani non-ISR casti probihalo bez toho, ze dalsim korkem skoncim v nejake ISR, ktera mne v dane chvili vubec nezajima? Je sice logicke, ze program vleze hned do ISR cekajiciho intka, ale pri ladeni je to vetsinou na nic.

Napsal: 12 bře 2013, 18:21
od WLAB
Chova se to nejak podivne.....

krokuju treba:

Kód: Vybrat vše

   435:                    CAN_SET_CUR_MOB_TO_TX;
000007CC  LDS R30,0x00EF      Load direct from data space
000007CE  ANDI R30,0x3F      Logical AND with immediate
000007CF  ORI R30,0x40      Logical OR with immediate
000007D0  STS 0x00EF,R30      Store direct to data space


cele je to v ISR. z 0xEF (CANCDMOB) se spravne nacte 0x05, o ktere pheriphery viewer hlasi, ze tam ma byt, probehne or na 0x45 (tj. pridani povelu k vysilani). Ovsem po STS AVRSTUDIO hlasi, ze se zapsala hodnota 98, uplne se zmeni IDT.... proste jako bych najednou koukal na jiny mob, ale v CANPAGE zustane page 0... To bych pricetl nejake chybe AVRSTUDIA, kdybych pak v tomhle mobu (0), ktery slouzi jen k vysilani nezaznamenal prijem dat... Proste jako by se tim zapisem prepnul mob 0 na prijem cehokoliv a ten se hned provedl... Prijate ID odpovida jedne ze zprav, kterou do toho z venku posilam. A ta se ihned prijme po STS instrukci je nastaven SIT odpovidajici mobu 0...

Cele to ma jeste hloupy sideefect spocivajici v tom, ze kazdym update dat z periferie do viewru, se provedou operace spoustene ctenim, coz ma u CANu snad za nasledek jen rozhozeni INDEXu do zpravy.

Napsal: 12 bře 2013, 22:02
od Atlan
Zrovna simulacie v avr studiu nechodili spolahlivo skus sa obratit na mcontrollers.com

Napsal: 12 bře 2013, 22:15
od WLAB
Ale tohle neni simulace, to je krokovani pres JTAG.

Napsal: 13 bře 2013, 17:21
od WLAB
Hmm, kdyz pred STS v periferialnim vieweru vypnu RTR tag, tak to nedela....

Edit: pokud zadne zpravy neprichazi, je vysledny efekt podle predpokladu, zprava se odesle, nastavi se interrupt flagy a mob hlasi TXOK.....ridici registr zustava ve stavu prechoziho prikazu TX.... Jakmile ale prijde po CAN zprava, a to i aniz se mobu da RX povel, zprava se do mobu (0) ihned prijme... Skoro to vypada, ze po vyslani RTR zpravy se do prislusneho mobu vzdy prijme nejaka zprava.... 8O ale v dokumentaci o tom nic nevidim.

Napsal: 14 bře 2013, 08:07
od divous
Hoď mi sem, jak to nastavuješ.

Napsal: 14 bře 2013, 12:58
od WLAB
Ten driver ma asi 1500 radek, tady jsou ty dulezite pasaze.
Jinak komentare at uz ceske nebo anglicke jsou plne preklepu....
Nektere promenne jsou znovupouzite pro jiny ucel, nez vyplyva z jejich nazvu, vetsinou kvuli rychlosti, jsou totiz alokovany v registrech ne na stacku.

Nastavuje se to tady:

Kód: Vybrat vše


sregtmp=SREG;
        #asm("cli");
   txmob_free_list &= itmp;   /*negative mask here*/
        /*Put MSG into HW*/                     
        /*select MOb page*/
        CAN_SET_R_CANPAGE(ctmp);
       
        #warning remove the test
        if(!ctmp)  /*test only*/
        {
            ctmp++;
            ctmp--;
        }
       
        /*write data*/
        CAN_SET_R_DATAIDX_RESET_AINC;
        ctmp=msg->dlc;
        ctmp&=0x0f;
        //CANCDMOB = ctmp; /*prepare dlc to CANCDMOB register; mob temporarily set to disabled*/
        if(~itmp & rtrautomob_list) /*check if the mob has autoreply nature*/
        {
            /*prepare RPLV flag, should not matter that data aren't ready yet as mob isn't switched to rx*/
            CANCDMOB = CAN_CANCDMOB_RPLV_MASK | (CANCDMOB & ~(CAN_MOBCNF_FLAG_MODE_MASK | CAN_CANCDMOB_IDE_MASK) ); /*set to disabled, keep original dlc and ide, ext cleared*/
        }                                                                                       
        else CANCDMOB = ctmp; /*prepare dlc to CANCDMOB register; mob temporarily set to disabled, rplv and ext cleared*/
       
        #if CAN_RTR_MODE == CAN_RTR_MODE_RTR_NORMAL
        if(! (msg->flags & CAN_MSG_FLAG_RTR) ) /* this is no RTR message, data copying needed*/
        {
        #endif
            itmp = (unsigned int) (msg->data);
            while(ctmp)
            {
                CANMSG=*(char*)itmp;
                itmp++;
                ctmp--;
            }
        #if CAN_RTR_MODE == CAN_RTR_MODE_RTR_NORMAL
        }             
        else CANIDT4 = CAN_CANIDT_RTR_MASK;         
        #else
        CANIDT4=0;
        #endif
        if(!(CANCDMOB & CAN_CANCDMOB_RPLV_MASK) ) /*indicates !(autoreply mob with new data to be sent)*/
        {       
            if(msg->flags & CAN_MSG_FLAG_EID)
            {
                itmp=msg->id;
                ctmp=itmp>>8;
                itmp<<=3;
                CANIDT4|=(char)itmp;    /*low  of shifted id; RTR kept according flag; RB0, RB1 kept 0*/
                CANIDT3=itmp>>8; /*high of shifted id*/
                itmp=msg->ide;
                itmp<<=3;
                ctmp>>=5;        /*holds the carry bits between id and ide during the shift*/
                CANIDT2=(unsigned char)itmp | ctmp;
                CANIDT1= itmp>>8;
                //CAN_SET_CUR_MOB_TO_TXE;
                CAN_SET_CUR_MOB_EXT_FLAG_ONLY;
            }   
            else
            {
                itmp=msg->id;
                itmp <<=5;
                //CANIDT4=0; treaten in RTR section, see above
                CANIDT2= itmp;
                CANIDT1= itmp>>8;
                //CAN_SET_CUR_MOB_TO_TX;
                //CAN_CLEAR_CUR_MOB_EXT_FLAG_ONLY; not needed, already cleared
            }
        }




K odeslani dochazi zde (v konkretnim pripade je tahle cast v ISR):
Ve vhodny okamzik se tu do pripravenenho MOBu zapise vysilaci pokyn.

Cele je to kvuli tomu, abych mnozinu vysilacich MOBu transformoval z prioritniho odesilani (ktere je mi k nicemu) na FIFO chovani.

Kód: Vybrat vše


 if(CANCDMOB & CAN_CANCDMOB_RPLV_MASK) /*is it rtr autoreply?*/
          {     /*yes - activate RX*/
              CAN_SET_CUR_MOB_TO_RX;
          }
          else /* no*/
          {
           /* initiate transmission (if conditions are met)*/
           itmp = ~(txmob_free_list | ~txmob_list | txmob_txcmd_list); /* mask of mobs with are ready for tx command*/
           dptr = (unsigned char*)CAN_MOB_LAST_MASK; /*right moving mask, 0x4000 15mobs for at90CAN128/64/32, starting on bit 14*/
           local_canpage_backup = CANPAGE; 
           tmpc = (local_canpage_backup & 0x0f) | ((CAN_NUMBER_OF_MOBS-1)<<4); // 0xe0;
           while( (unsigned int)dptr & ~txmob_txcmd_list)
           {
               if(itmp & (unsigned int)dptr) /* ready to send mob found*/
               {     
                   CANPAGE = tmpc;  /*no R-M-W operation here*/
                   CAN_SET_CUR_MOB_TO_TX;
                   txmob_txcmd_list |= (unsigned int)dptr;
               }
               dptr  = (unsigned char*)((unsigned int)dptr>>1);
               tmpc -= 0x10;  /*doesn't affect low nibble*/
           }
           CANPAGE = local_canpage_backup;
          }
         }


Napsal: 14 bře 2013, 13:27
od divous
Asi jsem slepý...
Raději se však zeptám.
Kde nastavuješ masku? Myslím tím registry CANIDM1 až CANIDM4.

Napsal: 14 bře 2013, 13:54
od WLAB
Maska se u MOBu urcenych pro TX nenastavuje, prvni cast kodu je PutMsg(...) a druha je cast ISR, kde se v konkretnim pripade ten MOB 0 s remote zpravou odesila.. Maska se nastavuje pri inicializaci MOBu urcenych pro prijem. Mam tri skupiny MOBu RX, TX a RTR autoreply (ty zatim ani neresim). MOB je clenem urcite skupiny a prave jedne doku neni "odregistrovan" a zarazen do jine. Nepocita se s tim, ze by se MOB vyhrazeny pro nejakou z vyse uvedenych cinnosti pouzil pro jinou. RX a TX MOBy by mely zpracovavat i remote zpravy podle priznaku, ketry je ve strukture, ktera popisuje zpravu.

Nulova maska vysvetli, proc se do toho mobu prijme cokoliv, ale asi ne to proc se vubec neco prijme, kdyz k tomu neni dan pokyn....

Napsal: 14 bře 2013, 15:52
od divous
Ale pro příjem RTR požadavku masku potřebuješ....

Napsal: 14 bře 2013, 16:05
od WLAB
Ale ten problem je pri vysilani remote frame, ja se jen snazim remote frame vyslat, coz se povede, ale pak se mi do toho mobu, ze ktereho jsem odesilal, prijme sama bezduvodne nahodna zprava z CANu.

Napsal: 14 bře 2013, 19:03
od Andrea
Když se zpráva vyšle a nastaví se TXOK, tak se mob zakáže, tak nemůže něco přijmout, kdo ví, na co tam koukáš.