Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

at90can128 problem s CAN (vyreseno)
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: po březen 11 2013, 20:35    Předmět: at90can128 problem s CAN (vyreseno) Citovat

Narazil jsem na podivnou vec u CAN periferie.

V CAN ISR je:
kód:

........
/*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...

_________________
de omnibus dubitandum est


Naposledy upravil WLAB dne po březen 25 2013, 15:22, celkově upraveno 2 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
divous



Založen: Oct 08, 2010
Příspěvky: 162
Bydliště: ValMez

PříspěvekZaslal: út březen 12 2013, 7:57    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: út březen 12 2013, 11:01    Předmět: Citovat

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...

_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: út březen 12 2013, 14:47    Předmět: Citovat

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.
_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: út březen 12 2013, 18:21    Předmět: Citovat

Chova se to nejak podivne.....

krokuju treba:
kód:

   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.

_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Atlan



Založen: May 10, 2004
Příspěvky: 4511
Bydliště: Košice

PříspěvekZaslal: út březen 12 2013, 22:02    Předmět: Citovat

Zrovna simulacie v avr studiu nechodili spolahlivo skus sa obratit na mcontrollers.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: út březen 12 2013, 22:15    Předmět: Citovat

Ale tohle neni simulace, to je krokovani pres JTAG.
_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: st březen 13 2013, 17:21    Předmět: Citovat

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.... Shocked ale v dokumentaci o tom nic nevidim.

_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
divous



Založen: Oct 08, 2010
Příspěvky: 162
Bydliště: ValMez

PříspěvekZaslal: čt březen 14 2013, 8:07    Předmět: Citovat

Hoď mi sem, jak to nastavuješ.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: čt březen 14 2013, 12:58    Předmět: Citovat

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:


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:


 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;
          }
         }


_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
divous



Založen: Oct 08, 2010
Příspěvky: 162
Bydliště: ValMez

PříspěvekZaslal: čt březen 14 2013, 13:27    Předmět: Citovat

Asi jsem slepý...
Raději se však zeptám.
Kde nastavuješ masku? Myslím tím registry CANIDM1 až CANIDM4.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: čt březen 14 2013, 13:54    Předmět: Citovat

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....

_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
divous



Založen: Oct 08, 2010
Příspěvky: 162
Bydliště: ValMez

PříspěvekZaslal: čt březen 14 2013, 15:52    Předmět: Citovat

Ale pro příjem RTR požadavku masku potřebuješ....
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
WLAB



Založen: Sep 13, 2005
Příspěvky: 867
Bydliště: Praha

PříspěvekZaslal: čt březen 14 2013, 16:05    Předmět: Citovat

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.
_________________
de omnibus dubitandum est
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: čt březen 14 2013, 19:03    Předmět: Citovat

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áš.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.45 sekund