Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   70 / 153
(#) benjami válasza nagzso hozzászólására (») Feb 4, 2013 /
 
Ha belső órajelre kapcsolom akkor a szimulátorban működik:
  1. T1CONbits.TMR1CS = 0; // forrás órajel = systemclock

Megvan az órakvarcon az órajel?
(#) nagzso válasza benjami hozzászólására (») Feb 4, 2013 /
 
Sajnos nem tudom megnézni, hogy meg van-e rajta. De megyek holnap veszek új kvarcot bele. Amúgy nekem a módosítással, sem megy a szimulátoromban. Jól kötöttem-e be egyáltalán? PIC 11-es és 12-es lábára raktam rá a kvarcot, mindkét lábhoz egy-egy 22pF-os kondit, amik a VSS-re mennek.
(#) nagzso válasza nagzso hozzászólására (») Feb 4, 2013 /
 
Működik. Átállítottam szinkron módba és változtattam a végrehajtási sorrenden. Ha esetleg valakit érdekel:
  1. RCON = 0x1F;
  2. INTCONbits.PEIE = 1;
  3. T1CON = 0b00001010;
  4. INTCON2 = 0x80;      // erre nincs szükség
  5. TMR1H = 0x80;
  6. TMR1L = 0x00;
  7. IPR1 = 0x00;
  8. IPR2 = 0x00;
  9. PIR1 = 0x00;
  10. PIR2 = 0x00;
  11. PIE1 = 0x01;
  12. PIE2 = 0x00;
  13.  
  14. sec = 0;
  15. min = 0;
  16. hour = 12;
  17. lcd_init();                 // Az LCD inicializálása
  18. lcd_init_cgram();           // Az LCD saját karaktereinek inicializálása
  19. T1CONbits.TMR1ON = 1;
  20. INTCONbits.GIE = 1;         // Globális megszakítások engedélyezése
Csak ezen a részen változtattam.
Köszönöm annak, aki segített.
A hozzászólás módosítva: Feb 4, 2013
(#) mateakos válasza nagzso hozzászólására (») Feb 5, 2013 /
 
Szia.
A szinkron móddal vigyázz, mert sleep-ben nem fog működni, azaz szinkron módban a Timer1 nem számol, ha nincs főórajel.
(#) nagzso válasza mateakos hozzászólására (») Feb 5, 2013 /
 
Szia!
Köszi szépen, ez új volt. Megnézem akkor, hogy megy-e aszinkronban, gondolom igen, csak a módosításokat nem egyesével szoktam csinálni, hanem ömlesztve, amiről gondolom, hogy meg kell változtatni, megteszem. Aztán sokszor van, olyan hogy megy, de megváltoztattam olyan dolgot is, amit nem lett volna szükséges.
(#) Skandar Graun hozzászólása Feb 9, 2013 /
 
Sziasztok.
Próbálom kihüvelyezni, mit is jelent a __weak__ attribútum a C30-nál, de valahogy nem tudom értelmezni.
Segítenétek?
(#) Topika hozzászólása Feb 10, 2013 /
 
Sziasztok!
Még mindig a bootloaderrel szenvedek.(PIC18F4550) Microchip Applikations Library linker állományát használom.
Eltéríti a vektorokat de mégsem indul el a program. A program kezdő értéke 0x102A de a reset vektor 0x1000. Hogyan lehet c-ben az interrupt vektorokat átugrani?
Előre is köszi a segítséget!
(#) benjami válasza Topika hozzászólására (») Feb 10, 2013 /
 
A mellékelt headert és linker scriptet szoktam használni a HID bootloaderhez, a main kód pedig a következő:
  1. #include <p18cxxx.h>
  2. #include "bootloaders.h"
  3.  
  4. void main(void)
  5. {
  6.   // ide jöhet a main kódja
  7. }
  8.  
  9. #pragma interrupt YourHighPriorityISRCode
  10. void YourHighPriorityISRCode()
  11. {
  12.   // ide jöhet a HIGH interrupt kódja
  13. }
  14.  
  15. #pragma interruptlow YourLowPriorityISRCode
  16. void YourLowPriorityISRCode()
  17. {
  18.   // ide jöhet a LOW interrupt kódja
  19. }

MCHP bootloaderhez csak a komment jelet kell egy sorral lejjebb tolni a bootloaders.h-ban, ha nem kell a bottloader akkor meg mindkét definíciót ki kell kommentezni.
(#) Topika válasza benjami hozzászólására (») Feb 10, 2013 /
 
Nagyon köszönöm a segítséget! Elsőre elindult a fordítás után. Az interrupt függvényeknél
ugye csak azt állapítom meg, hogy mi okozta a megszakítást és a tényleges végrehajtást külön függvény hívásával érem el?
(#) benjami válasza Topika hozzászólására (») Feb 10, 2013 /
 
Úgy is lehet, de ha rövid a tényleges kiszolgáló program, lokális változókat sem használ, akkor teheted feltételes utasításblokkba (if) is. Ekkor gyorsabb és rövidebb lesz a programod, viszont kicsit nehezebb átlátni.
A hozzászólás módosítva: Feb 10, 2013
(#) Topika válasza benjami hozzászólására (») Feb 10, 2013 /
 
Ha nem használom a kétszintű megszakítást akkor is működőképes a függvény?
(#) benjami válasza Topika hozzászólására (») Feb 10, 2013 /
 
Úgy is működik, ekkor minden megszakítás a HIGH interruptra kerül, a LOW interrupt üresen hagyható.
(#) Topika válasza benjami hozzászólására (») Feb 10, 2013 /
 
Köszönöm a segítséget!
(#) Topika hozzászólása Feb 16, 2013 /
 
Sziasztok!
Az miért van, hogy beállítom az RB megszakítást és amikor a jel megváltozik a porton, a kimeneten kapok egy 2ms órajelet?
(#) Topika hozzászólása Feb 17, 2013 /
 
Sziasztok!
Az miért van, hogy beállítom az RB megszakítást és amikor a jel megváltozik a porton, a kimeneten kapok egy 2ms órajelet?
(#) Hp41C válasza Topika hozzászólására (») Feb 18, 2013 /
 
Szia!
A válasz megadásához ismerni kellene a programot...
(#) icserny válasza Hp41C hozzászólására (») Feb 18, 2013 /
 
A kérdést már megválaszoltuk a PIC kezdőknek c. topikban. Bővebben: Link

Ja, ott megtalálható a forráskód is, ebben a beírásban.
(#) fakóló hozzászólása Feb 26, 2013 1 /
 
Üdv! Tudtok abban segíteni, hogy az atmel atmega 162 mely lábait kell a programozóra kötni?
(#) kissi válasza fakóló hozzászólására (») Feb 26, 2013 1 /
 
Szia!
Keress neki másik topic-ot, van olyan, amit kidob a kereső az "atmel" kulcsszóra !
Steve
(#) Topika hozzászólása Feb 28, 2013 /
 
Sziasztok!
Szeretnék segítséget kérni! I2C kommunikációt próbálok hardveresen megoldani két PIC18F4550
között. A "master" rész jól működik. A "slave" eszköznek két bájt küldése lenne a feladata, az elsőt át is küldi de a másodikat nem. Ráadásul az első bájt kétszeresét küldi mindig másodiknak. Felteszem a programot, megköszönöm ha valaki ránézne! Hátha találkoztatok már ilyen hibával.

I2Cslave.c
    
(#) potyo hozzászólása Márc 3, 2013 /
 
Csináltunk pár vezérlőpanelt, az első példányt a fiókban levő 16F877A, a másodikat 16F887 típusokkal, míg a következőket, amik már sorozatterméknek tekinthetők, 16F887-el csináljuk. Ezen kívül van még néhány lábkiosztásbeli eltérés is az áramkörök között (összesen háromféle verzió). Hogyan szokás azt megoldani, hogy legyen pl. négy projekt fájlom - mivel panel+kontroller típust összesítve négyféle verzió van (1.mcp, 2.mcp, 3.mcp, 4.mcp), amik egy-egy header fáljra (main1.h, main2.h, main3.h és main4.h) mutatnak, amik tartalmazzák az áramkörök közötti különbségeket (lábkiosztás, konfig bitek, stb.), de a kód többi része azonos legyen? Arra gondoltam, hogy a mainx.h fájlokba teszek egy-egy #define MAINx_H sort, és a main.c-ben pedig ez alapján már meg tudom oldani a különbségeket az áramkörök között. Igenám, de ezt a fájlt be kellene includolni a main.c fájlba, nem elég csak az 1.mcp projektben megadni mint header állományt. Ez viszont nekem nem jó, hiszen pont az lenne a célom, hogy a projekt fájltól függően különféle mainx.h fájlok legyenek beincludolva? A kérdés, hogyan tovább? Nem hiszem, hogy ne lehetne megoldani, csak nem jövök rá, hogy hogyan kellene... Le lehet kérdezni valahogy a projektfájl nevét? Ha azt le lehetne, akkor azt felhasználhatnám fordítási direktívaként, akár még a mainx.h fájlok sem kellenének.
A hozzászólás módosítva: Márc 3, 2013
(#) potyo válasza potyo hozzászólására (») Márc 3, 2013 /
 
Közben rájöttem, hogy a Project->Build options->Project beállításokban a Compiler fülön lehet megadni makrókat. Ha minden igaz, ez nekem most jó is lesz. De azért ha van jobb módszer, szívesen hallom.
(#) _vl_ válasza potyo hozzászólására (») Márc 3, 2013 /
 
Nem tudom, hogy melyik környezetet használod, de mindegyikben lehet valamilyen módon az adott projekthez tartozóan a fordító számára átadandó extra paramétereket megadni (az MPLAB X-ben pl. ez a Project Properties-ben a fordító fül alatt adható meg).
A fordítónak pedig command line paraméterből lehet makrót definiálni, nem néztem meg a 8-bites PIC fordítót, de tipikusnak mondható a -Dmacro=value ill. -Dmacro szintaktika. Ezzel lehet ilyet csinálni, hogy -DCONFIG_XYZ, amit utána a
  1. #ifdef CONFIG_XYZ
  2. ...
  3. #endif

kóddal tudsz felhasználni (ha csak a makró létezését nézed, fölösleges értéket megadni hozzá).
A hozzászólás módosítva: Márc 3, 2013
(#) icserny válasza potyo hozzászólására (») Márc 3, 2013 /
 
A megoldás a feltételes fordítási direktívák használata. Makrók definiálásán nem kell különösebben erőlködni, hiszen a Select Device révén az MPLAB automatikusan definiálja a mikrovezérlő típusazonosító makrót, amely a Microchip mintapéldáit követve használható fel:
  1. #if defined(__PIC24FJ64GB004__)
  2.  ...
  3. #elif defined(__PIC24FJ256GB210__)
  4.   ...
  5. #elif defined(__PIC24FJ64GB004__)
  6.   ...
  7. #else
  8.     #error No hardware board defined, see "HardwareProfile.h" and __FILE__
  9. #endif
(#) kissi válasza icserny hozzászólására (») Márc 3, 2013 /
 
Ez nem teljesen jó neki, mert egy processzor típus mellett használ több verziót!
Steve
A hozzászólás módosítva: Márc 3, 2013
(#) potyo válasza icserny hozzászólására (») Márc 3, 2013 /
 
Ahogy kissi írja, az a gond, hogy egy kontrollertípus alatt is van kétféle hardver, önmagában a kontroller típus alapján nem lehet dönteni. De egyelőre jónak tűnik az előző hozzászólásomban írt megoldás a makró létrehozására.

Közben kaptam olyan tippet, hogy fordítsam meg a logikát és a közös kódrészt includoljam be, ne a közös részbe includoljam az eltérő részeket. Ez is kivitelezhető megoldásnak tűnik.
A hozzászólás módosítva: Márc 3, 2013
(#) mps hozzászólása Márc 4, 2013 /
 
Sziasztok!
Próbálkozom az spi-vel. De sehogy nem akar sikerülni. Egyenlőre odáig szerettem volna eljutni, hogy a küldés működjön, az órajelet és az adat kimenetet PicKit2 -vel nézem. De nem történik semmi.
(A piccolo-ból csak a bootloader miatt van hivatkozás, így könnyebb volt, én meg lusta.)
Ez a kód, a kérdés pedig természetesen, hogy hol hibázok:
  1. #include "/source/piccolo_all.h"
  2. #include "spi.h"
  3.  
  4. #include <delays.h>
  5. #include <stdio.h>
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13. void main(void) {
  14.         TRISA = 0xFF;
  15.         TRISBbits.TRISB1=0;
  16.         TRISCbits.TRISC7=0;
  17.         TRISBbits.TRISB0=1;
  18.        
  19.        
  20.        
  21.        
  22.         //OpenSPI(SPI_FOSC_64,MODE_00,SMPEND);
  23.        
  24.        
  25.         SSPSTATbits.SMP=0;
  26.         SSPSTATbits.CKE=1;
  27.        
  28.         SSPCON1bits.CKP=0;
  29.        
  30.         SSPCON1bits.SSPM3=0;
  31.         SSPCON1bits.SSPM2=0;
  32.         SSPCON1bits.SSPM1=1;
  33.         SSPCON1bits.SSPM0=0;
  34.         SSPCON1bits.SSPEN=1;
  35.        
  36.  
  37.        
  38.                 //ad config
  39.                 //megszakítás be, tárolás jobbra, aut mintavétel
  40.         ADCON1 = 0x01;
  41.                 ADCON2 = 0b00111110;
  42.                
  43.  
  44.                
  45.  
  46.     TRISD=0;               //D port kimenet
  47.     while (1) {
  48.        
  49.         ADCON0=0b00000001;      //0-1
  50.         ADCON0bits.GO=1; while( ADCON0bits.GO );
  51.        
  52.         LATD = ADRESH;
  53.         WriteSPI(0xFF);
  54.        
  55.         Delay10KTCYx(250);     //2 560 000 TCY késleltetés
  56.         Delay10KTCYx(250);     //2 560 000 TCY késleltetés
  57.         Delay10KTCYx(250);     //2 560 000 TCY késleltetés
  58.        
  59.     }
  60. }
A hozzászólás módosítva: Márc 4, 2013
(#) potyo válasza mps hozzászólására (») Márc 5, 2013 /
 
Nem biztos, hogy emiatt nem megy, de előfordulhat. Nem tiltod le az analóg bemeneteket az RB portról. Valamelyik ADCON vagy ANSEL regisztert kell megnézned, attól függ, milyen típusú a PIC.

Tegyél ki az SPI használata nélkül simán digitális kimenetként egyest és nullát az SDO és SCK lábakra, és nézd meg, hogy megjelenik-e. Ha igen, akkor az ellentétes szintet is nézd meg. Ha mindkettő rendben, akkor lehet tovább lépni.

Ha azt írod, hogy SSPBUF=0x5A; a WriteSPI helyett, akkor se történik semmi? 0xFF az épp nem jó tesztelésre, mert az adatlábon folyamatosan egyest adna ki, nehezebb észrevenni.

Az ADCON0-t felesleges minden while ciklusban írogatni. Azt nyugodtan teheted oda az ADCON2-t beállító sor alá. Elég csak a GO bitet egyesre tenni a konverzió indításához.
(#) mps válasza potyo hozzászólására (») Márc 5, 2013 /
 
Köszi szépen a választ!
Hajnalban meg lett a nem létező hiba: át kellett tenni az órajelet a timer2-re, alaposan lelassítva, mert a pk2 nem volt elég gyors. A gyanús az lett, hogy néha jött 1 db pici impulzus. Aztán elosztottam a 48-at a 64-el...
A 255 már csak kínomban került oda amúgy az ad-t küldözgeti, az egész egy már létező fájlból való kitörölgetések eredménye (és persze az spi-s bővítés), ami 8 csatornát olvasott be, no ezért van a ciklusban, ezekkel most nem igazán foglalkoztam, mert a cél csak az spi beröffentése különösebb felhasználás nélkül, pusztán a kipróbálás miatt.
Persze most jön az, hogy egy másik pickel venni is kéne, szóval várható a következő kérdés
Köszi még egyszer!
(#) miklosch hozzászólása Márc 5, 2013 /
 
MCC18-ban szeretnék definiálni egy többdimenziós integer tömböt, mely 5 sorból, soronként 128 elemből állna. Lényegében 1280 byte-nyi területet szeretnék lefoglalni, de a fordító a következő hibát adja:
Idézet:
„MPLINK 4.46, Linker
Device Database Version 1.11
Copyright (c) 1998-2011 Microchip Technology Inc.
Error - section '.udata_main.o' can not fit the section. Section '.udata_main.o' length=0x00000660
Errors : 1”

PIC18F26K22 memóriájába beleférne, úgyhogy nem tudom mi a gond. Valakinek ötlete?
Következő: »»   70 / 153
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem