Microchip'i C keel
#1
Hei!
Tegin säärase lolluse et hakkasin C-keelt katsetama. Vaja oli koodi, mis tomiks SD-kaardile logerina ja et ka USB oleks küljes. MC-l on säärane koodinäide kenasti olemas.
Tõmmata saab terve projekti, seega võiks nagu toimida aga....muidugi mitte. Vähemasti mina ei suutnud oma tervelt 2-päevase kogemusega Smile seda käima ajada: SD-kaart ei vasta üldse. Peale pikka uurimist sai ossiga välja selgitatud, et kaardile saadetakse valed käsud. Kirjutasin jäigalt koodi õiged käsud ja vastus tuligi !
Aga koodi ma parandada ei oska. SD-SPI.c failis on käskude tabel, kus ka CRC'd ette arvutatud. SEalt indekseerides peaks õiged baidid kätte saama. Debugger n'äitab, et igal katsel loetakse erinev (vale) bait !!! Miks?
Kood:
MMC_RESPONSE SendMMCCmdManual(BYTE cmd, DWORD address)
{
    BYTE index;
    MMC_RESPONSE    response;
    CMD_PACKET  CmdPacket;
    WORD timeout;
    
    SD_CS = 0;                           //Select card
    
    // Copy over data
    CmdPacket.cmd        = sdmmc_cmdtable[cmd].CmdCode;
    CmdPacket.address    = address;
    CmdPacket.crc        = sdmmc_cmdtable[cmd].CRC;       // Calc CRC here
    
    CmdPacket.TRANSMIT_BIT = 1;             //Set Tranmission bit
    
    WriteSPIManual(CmdPacket.cmd);                //Send Command
.... jne...
Funktsioonile saadetav indeksibait muutujas "cmd" on õige (esmalt = 0 ehk kaardi CMD0).
Aga CmdPacket.cmd mis loetakse tabelist sdmmc_cmdtable[cmd] on vale.
Mina siit edasi minna ei oska - milles kamm?

Kompilaator on Microchipi C18. Vajalikud võtmed võiksid ju olla projektis juba õigesti paigas? Kood kompileerub ja liigutab (sain isegi ossi jaoks sünkrosignaale genereerida) aga see on ka kõik.
Ah jaa, USB muidugi ka ei käi (device not recognized) aga see on järgmine samm...
Vasta
#2
Tavaliselt vihjavad sellised sümptomid konfiguratsiooniveale: vale chip, vähe mälu vms.

Kiikasin projekti sisse, seal objektifailid olid PIC18F47J53, kuid MCP failis oli seadme tüübiks märgitud PIC18F46J50?
Vasta
#3

Kuidas ma C puhul teen kindlaks, palju mälu vaja läheb? Asmis on selge aga...
Unustasin jah mainida, et ma kasutan 18F47J53 proset. Sellenimeline *.mcp peaks olemas olema.
Vasta
#4
Tuleb välja, et kompilaator tahtis "large memory model'it". Ilma selleta ei uuendatud TBLPTRU-d kunagi ja loetigi valest kohast. Nüüd tuleb kaart läbi USBi külge küll.
Valmis demo.... häh!
Vasta
#5
(11-05-2012, 04:35 PM)felch Kirjutas: Nüüd tuleb kaart läbi USBi külge küll.
Kas oled proovinud ka üle boodi ja USB uut exet laadida?
Tundus täitsa mõnus lahendus.

Milleks on vaja teada seda hõivatud mälu pikkust?
Kui mahub, siis töötab ja kui EI MAHU, ütleb palju puudu on.
Kui lokaalsete muutujatega mängida, saab mälu juurde ja siis mahub ära.
Mõnikord Smile


Vasta
#6
Ma arvasin samuti, et mälu puudumisel antakse viga aga ei öeldud midagi.
TEgelikult on vist asi selles, et kood üritas saada läbi kuni 64k-ga (seatud oli väike mälumudel) aga reaalselt kirjutas palju kaugemale ja siis lugedes pani muidugi pange. Vahest selle peale ei saagi veateadet genereerida?
Bootloaderit pole veel proovinud. Kood ise pole ka veel eriti stabiilne. Äkki tuleb veel mälumudeleid muuta? Senine kehtis koodimälu kohta kuid ka RAMi kasutuse kohta on valikud. Millised on õiged, ei tea.
Vasta
#7
(12-05-2012, 01:11 PM)felch Kirjutas: Ma arvasin samuti, et mälu puudumisel antakse viga aga ei öeldud midagi.

Ma saan selle Sinu kuuga sellise vea.
MPLINK 4.33, Linker
Copyright © 2009 Microchip Technology Inc.
Error - section '.udata_main.o' can not fit the section. Section '.udata_main.o' length=0x0000012b
Errors : 1

Kui muudan globalist lokali muutujaid siis see pikkus muutub.

Tolles males ei mahtunud ka tabelid ära. Kui panin nad alamprogrammi
lokaalseks siis mahtus. Tal ( C ) on selline veider loogika. Või loogikapuudus.

Siin mul kasutusel MPLAB IDE v8.36
C18 v3.36,MPLINK v4.33
See Sinu kivi ei tundnud aga see-eest minu PIC18F4550
kohta mälu mudelit kohta pole midagi küsinud.
Alustasin ühest valmis näidisest ja kirjutasin sinna juurde.

Boodiga on nii et seal oli mitu versiooni.
Kirjutasid korra üle PicKit 3 kivisse boodi ja
siis edaspidi laadis PDFSUSB *.exe üle USB PICi. Täitsa mugav.

Muuseas, sinna C sisse saab ka otse ASM käske kirjutada.
Vast isegi MASMi. Siis ei pea enam seda arctan kiruma.
_____
On üks idee kus oleks vaja PIC panna traadita PC-ga rääkima.
Ilus oleks kui ühendus ei oleks suunatundlik.
Vasta
#8
(12-05-2012, 04:26 PM)A.R. Kirjutas: On üks idee kus oleks vaja PIC panna traadita PC-ga rääkima.
Ilus oleks kui ühendus ei oleks suunatundlik.

Kas sinihammas ei sobiks? Siin räägitakse ühest mida olen ise PICiga koos kasutanud.

Mälumahtude asi on mulle veel üsna segane aga ega C keel ise ka selge ole. Eks peab katsetama.
Vasta
#9
Ma Microchipi prosede peal kõrgkeeli kasutanud pole, nii et oskan vaid üldist nõu anda. Ehk on abi.

Lokaalsed muutujad ja funktsioonide parameetrid asuvad nn. pinumälus. Igal funktsiooni väljakutsel võetakse pinumälust kasutusele järjekordne jupp, nn. frame, milles on funktsioooni lokaalsed muutujad ja parameetrid; funktsioonist tagasi tulekult lõpetatakse selle frame'i kasutamine ja jupp pinumälu on jälle vaba.

Programmi tööks vajaliku pinumälu maht on määratud väljakutsutavates funktsioonides kasutusel olevate lokaalsete muutujate ja parameetritega. Seda mälumahtu kompilaatorid tavaliselt arvutada ei oska ja seega ei saa nad ka hoiatada pinumälu ületäitumise eest. Mõnikord oskab kompilaatori genereerida pinumälu kasutamist kontrollivat koodi; sellisel juhul pinumälu ületäitumisel kirjutatakse silumisporti ntx. "Stack overflow". Tavaliselt ületäitumist ei kontrollita, sel juhul pinumälu ületäitumine avaldub näiliselt ebaloogilise veana - muutujate ootamatu väärtuse nullimine, mikrokontrolleri ootamatu reset vms.

Keel "C" oli algselt mõeldud arvutile PDP-11 (alguses oli PDP-7, aga sellest kasvati ruttu välja), mida iseloomustasid:
* 16-bitine aadressruum, ühine käskudele ja andmetele (von Neumann).
* I/O portide käsitlemiseks eraldi käsku ei olnud, nendele oli eraldatud osa aadressiruumist.
* Trobikond (täpne arv pole oluline) 16-bitiseid üldotstarbelisi registreid.
* Kõik käsud lubasid kõiki adresseerimisrežiime - ortogonaalsus.
* Pinumäluna võis kasutada suvalist mäluala (mitte raualine pinumälu nagu 8-bitisel PIC-il).

Sellest arhitektuurist erinemine kipub C kompilaatoritele raskusi valmistama, tekib vajadus erinevate mälumudelite järele, mikrokontrollerite puhul tavalise Harvardi arhitektuuri kasutamisel on tarvis püsimällu minevate konstantide jaoks spetsiaalset süntaksit jms. PIC24 on üldvaates üsna lähedane keele "C" arusaamisele arvutist ja probleeme oleks arvatavasti vähem.
Vasta
#10
(12-05-2012, 08:29 PM)andrei Kirjutas: Programmi tööks vajaliku pinumälu maht on määratud väljakutsutavates funktsioonides kasutusel olevate lokaalsete muutujate ja parameetritega. Seda mälumahtu kompilaatorid tavaliselt arvutada ei oska ja seega ei saa nad ka hoiatada pinumälu ületäitumise eest.

PC peal reserveeritakse protseduuri algul stacki muutujad,
kasutatakse ja siis lastakse vabaks. Vast oleks optimaalne kui saaks globaalsete ja pikima lokaalse summa viia võimalikult väikseks.
Kui natuke käske vaadata siis muutuja väärtuse laadimine PICis on raskepärane. Vast ta hoiab neid arve kuskil mujal natuke paremini.
Siiani on mind rahuldanud see et ta hakkama saab. Kui on tahtmist siis
see väljund exe võib saada ka asm versioonis. Sealt peaks olema näha mis on mis ja kus on mis.
Tsitaat:Keel "C" oli algselt mõeldud arvutile PDP-11 (alguses oli PDP-7, aga sellest kasvati ruttu välja)
80. paiku oli venelastel olemas Elektroonika 60, mis oli LSI-11 sugulane.
Neid protsessoreid, mälusid (32k) ja toiteid oli saada. Aga muud polnud.
Ehitasime siis herkonitest ja magnetitest klaviatuurid, makist ja 8051 (?) välismälu ning värviteleviisorist ning ca 100 TTL kivist display.
ASMis sai kirjutatud Basic keele laadne kõrgkeel. Lõpus tulid sinna sisse ka C elemendid. Tegime ühel UNIX masinal LõunaEesti ralli programmvara ja sealt sai "maitse suhu". Neid Elektroonikaid sai kuskil 20 tk ehitatud ja kasutatud. Oli ilus, kahe aadressiga masin.

85. tuli esimene PC, jõle võimas (8 MHz, 512 kB RAM, 10MB HD)
ja ASM ja MASM ja C.
C oli nii ilus ja selge et katsusime exe kujust C source tekst tagasi tekitada.
Peaaegu õnnestus aga kirjutaja koolipoiss "aeti ära".
Need naised, naised Sad

Nüüd seda kõike meenutades ja PICi kasutades on tunne et
SEE EI OLE VÕIMALIK.
See kivi mitte lihtsalt ei ole olemas, vaid töötab kah.
Vasta


Alamfoorumi hüpe:


Kasutaja, kes vaatavad seda teemat: 4 külali(st)ne