Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   63 / 153
(#) _vl_ válasza emmzolee hozzászólására (») Okt 1, 2012 /
 
Ez nem kontroller. Ez egy programozható kombinációs hálózat, egy marék D flip-floppal kiegészítve. Leginkább ezek korai, butuska elődje.
(#) emmzolee válasza _vl_ hozzászólására (») Okt 1, 2012 /
 
Kössz.
Akkor van egy porfogóm.
(#) mateakos válasza wolf84 hozzászólására (») Okt 9, 2012 / 1
 
Idézet:
„TRISA = 0b1101111;
de muszáj volt beírni utána hogy
TRISA7_bit = 1;”

És ha egyből megadod mind a 8 bitet?
TRISA = 0b11101111
(#) adamhollos hozzászólása Okt 11, 2012 /
 
Sziasztok!

A következő kis programot írtam C18-ban:
  1. #include <p18f25k80.h>
  2. void delay (void)
  3. {
  4.   int i;
  5.  
  6.   for (i = 0; i < 10000; i++)
  7.     ;
  8. }
  9.  
  10. void main (void)
  11. {  
  12.         TRISA = 0;
  13.  
  14.         while (1)
  15.         {
  16.                 PORTAbits.RA1=1;
  17.                 delay();
  18.                 PORTAbits.RA1=0;
  19.                 delay();
  20.         }
  21. }


PIC18F25K80-at használok és most ismerkedem vele és a C18-cal. A programnak elvileg az RA1-en levő ledet kellene villogtatnia, de nem csinálja. Szerintem azért, mert nem kapcsoltam ki a WDT-t. Hogyan tudom megtenni? HI-TECH C-ben a vezérlő könyvtárban megtalálható, hogy mikor mit kell írni és hogy egyáltalán melyik registert milyen név alatt lehet elérni, de itt nem. Csak annyit tudok, hogy a #pragma config WDT = OFF kódnak elvileg működni kéne, de nem teszi (E:\Adam Hollos\Elektro thecnika\Programozás\MBLAB projektek\C18\main.c:2:Error [1224] configuration setting 'WDT' not recognized
).
A hozzászólás módosítva: Okt 11, 2012
(#) mateakos válasza adamhollos hozzászólására (») Okt 11, 2012 /
 
Hello!
10000 az még lehet, hogy kevés, lehet, hogy gyorsan villog, csak nem veszed észre, de ha egyáltalán nem világít, akkor az is lehet, hogy PORTA analógnak van beállítva.
(#) adamhollos válasza mateakos hozzászólására (») Okt 11, 2012 /
 
Szia!

Most már oszcilloszkóppal nézem és csak 1000000-rel villogtatom, de csak a hálózati szinuszjel által keltett zajt látom (igaz a - fele le van "vágva" ) Hogyan tudom állítani, hogy analóg legyen vagy sem. Mármint, hogy tok mutatni azokra a registerekre?
A hozzászólás módosítva: Okt 11, 2012
(#) adamhollos válasza adamhollos hozzászólására (») Okt 11, 2012 /
 
A fordító folyton kidobja a következő hibaüzenetet:

The Externed CPU Mode configuration bit is enabled, but the program that was loaded was not built using externed CPU instructions. Therefore, your code may not work properly.

Akkor is, ha beállítok pár konfigurációs bitet. Mit akar ezzel?
(#) mateakos válasza adamhollos hozzászólására (») Okt 11, 2012 /
 
Azt akarja, hogy a konfigurációban a kiterjesztett utasításkészlet be van kapcsolva, de a betöltött kód nem kiterjesztett utasításkészletre van lefordítva.
Ez problémát jelent, a config-ban is és a fordító beállításainál is legyen kikapcsolva a kiterjesztett utasításkészlet. A led villogtatást pedig először próbáld RB7..4 közül valamelyiken (azoknak talán alapértelmezetten nincs analóg funkciója), ha ott működik, akkor nézd meg az adatlapban az ADC-ről szóló részt. Talán valamelyik ADCON regiszterben lehet beállítani, hogy hány analóg bemenet legyen (és akkor a maradék digitális be/kimenet lehet) De ez itt egy kicsit off, mert igazából nem kapcsolódik a C nyelvhez.
(#) icserny válasza adamhollos hozzászólására (») Okt 11, 2012 /
 
  1. mcc18 --help-config -p18f25k80

ez kilistázza a konfigurációs lehetőségeket. Benne áll ez is:

Idézet:
„Extended Instruction Set:
XINST = OFF Disabled
XINST = ON Enabled”


Tehát a #pragma config XINST = OFF kellett volna. De ezt inkább a PIC kezdőknek c. topikban folytassuk!

(#) adamhollos válasza icserny hozzászólására (») Okt 11, 2012 /
 
Jó, köszönöm mindenkinek a segítséget!
(#) Wudoou hozzászólása Okt 18, 2012 /
 
Sziasztok!
Lenne egy problémám. pic16f886+lcd Hitech C fordító alatt. Az lcd használatához a hitech lcd.c illetve lcd.h fájljait használom egy apró módosítással.
Mivel kicsit másképp vannak a lábkiosztások az lcd-pic adatvonalain, ugyanis pont fentről lefelé mennek, tehát:
lcd_data4 láb -> pic rb3
lcd_data5 láb -> pic rb2
lcd_data6 láb -> pic rb1
lcd_data7 láb -> pic rb0
lcd_rs láb -> pic rb5
lcd_en láb -> pic rb4

Ezért írtam rá egy programot ami szépen felcseréli a kapott adatokat, mivel ugye ha egy az egybe kiküldenék pl.: 0b1110-át, az 0b0111 lenne felcserélés nélkül.
Nincs is ezzel semmi baj, szépen működik is addig, míg a lcd_rs láb és az lcd_en láb nem a portb-n van. De amint visszahelyezem a fent említett két lábra, egyből meghalt a dolog. Nem inicializál. Érdekes jelenség, hogy CCS alatt flex_lcd.c nevezetű gyári include fájllal hibátlanul fut. Hitech C alatt csak akkor megy, ha az lcd_rs és lcd_en nem azon a porton van, amin az lcd_data. Mit ronthatok el?
Felteszem az lcd.c include fájlomat, egyébként ugyanolyan, mint a gyári, csak benne van egy pár sor, amivel ki kellett egészítenem (bitek felcserélése).
Tudna valaki segíteni?
(#) icserny válasza Wudoou hozzászólására (») Okt 18, 2012 /
 
Idézet:
„LCD_DATA = ( x & 0x0F ); //felső 4 bit”
Az ilyen utasításokkal az a baj, hogy a port minden bitjét módosítja (itt pl. az RS jelet nullába viszi).

Próbáld így:
  1. LCD_DATA = (LCD_DATA & 0xF0) | (x & 0x0F);


Vagy így:
  1. LCD_LATA ^= ((LCD_LATA^x) & 0xF0);
(#) Hp41C válasza Wudoou hozzászólására (») Okt 18, 2012 / 1
 
Szia!
  1. LCD_DATA = ( x & 0x0F );        //felső 4 bit
  2.         LCD_STROBE();
  3.         LCD_DATA = ( y & 0x0F );        //alsó 4 bit
  4.         LCD_STROBE();

Ezek a sorok a PORTB mind a 8 bitjét állítják, amikor a RS = 1 mellett írsz ki karaktert, az adat írásával egyben törlöd is az RS -t.
Inkább így:
  1. LCD_DATA ^= ((LDC_DATA ^ x) & 0x0F );   //felső 4 bit
  2.         LCD_STROBE();
  3.         LCD_DATA ^= (( LCD_DATA ^ y) & 0x0F )//alsó 4 bit
  4.         LCD_STROBE();
(#) Wudoou válasza icserny hozzászólására (») Okt 18, 2012 /
 
Igen, teljesen igazad van. Nagyon köszönöm!
(#) Bendegúz hozzászólása Okt 29, 2012 /
 
Sziasztok!

Az xc8 fordítóval szeretnék megismerkedni, de nem sikerül bekapcsolnom az RC5-re kötött ledet.
(ASM-ben működik) Mit szúrhattam el?

  1. #include <xc.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. __CONFIG (MCLRE_OFF & CP_OFF & WDTE_OFF & FOSC_INTRCCLK & PWRTE_ON);
  6. #define SYS_FREQ        4000000
  7. #define FCY             SYS_FREQ/4
  8. /*
  9.  *
  10.  */
  11. void main(void) {
  12. //init
  13.     OSCCAL=0xfc;
  14.     PORTA=0x00;
  15.     PORTC=0x00;
  16.     TRISA=0x00;
  17.     TRISC=0x00;
  18.     PORTC=0x28;
  19.  
  20.     while(1){}
  21.    
  22.    
  23. }
(#) Ideiglenes válasza Bendegúz hozzászólására (») Okt 29, 2012 /
 
Melyik vezérlővel próbálkozol?
(#) Bendegúz válasza Ideiglenes hozzászólására (») Okt 29, 2012 /
 
16f676
(#) Ideiglenes válasza Bendegúz hozzászólására (») Okt 29, 2012 /
 
Na itt megbuktam.
Átnéztem az adatlapot.Elvileg az RC5 csak ki/bemenet. A TRIS beállításával működnie kellene.
A konfigurációs szóban sem látok turpisságot. Hacsak nem a BODEN bit. De ha az asm-ben is ugyanezzel a konfigurációs szóval megy, akkor ez is kilőve.
(#) Bendegúz válasza Ideiglenes hozzászólására (») Okt 29, 2012 /
 
Direkt ezért választottam az RC5-öt. Visszaforgattam a hex fájlt is asm-re, de igen nehéz rajta eligazodni, mert ugye a free verzió "nem optimalizál olyan jól" ami azt jelenti, hogy telerakja a kódot fölösleges ugrásokkal, utasításokkal. Én a belső OSC beállításában nem vagyok biztos.
(#) Hp41C válasza Bendegúz hozzászólására (») Okt 29, 2012 /
 
Szia!
Nekem nem ment a konfiguráció megadása csak a
  1. #pragma config MCLRE = OFF, CP = OFF ...

formában.
Az XC8 telepítési könyvtárában van egy könyvtár, benne a kontrollerek konfigurációs beállításai. Nézd meg ott a 16F676 -hoz tartozó állományt, annak alapján írd meg a beállítást.
(#) Bendegúz válasza Hp41C hozzászólására (») Okt 29, 2012 /
 
Szia!

Az mplab nekem is aláhúzza pirossal a CONFIG-ot, de az ICprog-ban látszik, hogy jól állítja be. És éppen a pic16f676.h fájlt böngészem, ebben kéne lennie?
(#) Bendegúz válasza Bendegúz hozzászólására (») Okt 29, 2012 /
 
Megtaláltam, minden vezérlőhöz van egy html fájl.
(#) Bendegúz válasza Bendegúz hozzászólására (») Nov 1, 2012 /
 
A probléma megoldódott, hibás volt a 7805. Valami oknál fogva az assemler-ben írt kód szépen futott rajta (kb 6 sor), az xc8 pedig nem.
(#) AZoli hozzászólása Nov 3, 2012 /
 
Sziasztok!

C30 -ban hogyan tudom megmondani a fordítónak hogy a következő programrészt milyen memória címtől kezdje?
Valami olyasmire gondolok mint asm -ben az org direktíva. Nézegetem ezt:
c30_users_guide
de szerény angol tudásommal nem igazán értem.. talán a 4.8 fejezet tartozik ide, de még ebben sem vagyok biztos.
(#) icserny válasza AZoli hozzászólására (») Nov 4, 2012 / 2
 
Egy függvény elhelyezése adott címtől kezdődő memóriahelyre:
  1. void __attribute__((address(0x2000))) func()


Egy változó elhelyezése adott címre:
  1. int __attribute__((address(0x900))) buf1[128];


Memória kijelölése és lefoglalása a programmemóriában:
Saját linker állományt kell készíteni (a gyári átszabásával). Az alábbi példában egy területet lefoglalunk a bootloadernek, a memória szekcióra my_boot névvel hivatkozunk:
  1. BOOT_START = 0xA200;
  2.   BOOT_LEN = 0x400;
  3.   my_boot BOOT_START :
  4.   {
  5.    *(my_boot);
  6.    . = BOOT_LEN;  /* advance dot to the maximum length */
  7.   } > program


Függvény, programrész elhelyezése a rezervált szekcióban:
  1. void __attribute__((section("my_boot"))) func1()
  2. {
  3.   /* etc. */
  4. }


Ezek a Linker Helpjében vannak leírva.
(#) AZoli válasza icserny hozzászólására (») Nov 4, 2012 /
 
Köszönöm, így már megtaláltam a helpben. És valóban bootloadert szeretnék készíteni. A saját linker állomány készítést ha lehet mellőzném, itt mintha azt írná, hogy ha a bootloadert a programom elejére teszem, akkor nem szükséges saját linker?
  1. If the bootloader is allocated at the start of program memory, a custom linker script is not be required. Instead, the function could be defined with attribute boot. For example:
  2.  
  3. void __attribute__((boot)) func1()
  4. {
  5.   /* and so on.. */
  6. }


De mit ért az alatt hogy a prog.mem. elején?
(#) icserny válasza AZoli hozzászólására (») Nov 4, 2012 /
 
A honlapomon (a PIC-kwik projektben) is használok bootloadert. A bootloader a memória elején helyezkedik el, az IVT és AIVT táblák után, de az alkalmazáshoz saját linker állományt kell használni.
Idézet:
„De mit ért az alatt hogy a prog.mem. elején?”
Nem értem a kérdést. A prog. mem eleje az a prog. mem eleje. Nem a közepe és nem a vége...
(#) AZoli válasza icserny hozzászólására (») Nov 4, 2012 /
 
Köszi, már nézem is.
Asm-ben programoztam sokat, és nem akar ráállni az agyam a C-re. C-ben is írtam már több kisebb programot, (néhány száz soros forráskód) de valahogy nem akar összeállni a kép. Képtelen vagyok komplexen kezelni az egészet, nem mindig értem mi folyik a háttérben.
Ezért kérdezek hülyeségeket.
Tehát arra gondoltam, hogy ugye a program memóriát tekintve a prog. elején az inicializáló rész van. A forráskódot tekintve még ködösebb a kép, main -on belül legyen az első? Vagy csináljak egy függvényt a main előtt neki?
(#) icserny válasza AZoli hozzászólására (») Nov 4, 2012 /
 
Idézet:
„main -on belül legyen az első? Vagy csináljak egy függvényt a main előtt neki?”
Ízlés dolga. Gyakorlatilag mindegy.
(#) AZoli válasza icserny hozzászólására (») Nov 7, 2012 /
 
Köszönöm a segítséget, a fenti részt azt hiszem megértettem, és használom.
Amit nem tudok megoldani, hogy a program az én bootloaderemmel induljon, vagyis az inicializáló részt a fordító a my_boot területre fordítsa, vagy legalább válassza el a firmware (nevezzük most így a bootloaderrel frissíthető programrészt)-től. (Vagy a reset mutasson a my_boot elejére?)

Vagy hogyan kéne azt megoldanom, hogy ha a firmware frissítés megáll (pl. tápfesz megszűnik) akkor utána újra lehessen kezdeni?

Erre most még csak azt a megoldást látom hogy nem a bootloadernek, hanem a firmware-nek foglakok le egy szekciót, és ezt tudom frissíteni..

Nekem ez a megoldás is megfelel ha működhet, de érdekel hogy van-e más lehetőség?
Következő: »»   63 / 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