Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   45 / 153
(#) potyo válasza nagy_david1 hozzászólására (») Aug 11, 2011 /
 
Szimulátorban nézted már? Mutass többet a kódodból.
(#) nagy_david1 válasza potyo hozzászólására (») Aug 11, 2011 /
 
Idézet:
„unsigned int n=0;
void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
while(1){

if (n==0) output_high(PIN_A1);
if (n==1) output_high(PIN_A0);
if (n==2) output_high(PIN_A7);
if (n==3) output_high(PIN_A6);
...
delay_ms(500);
n++;
}
}”

Ez előtt pedig csak a be include-olt pic van. Annyira egyszerű, hogy nem igaz és megfog. Olvastam, hogy a proteus jó szimulátor. Kezdő vagyok ezért kérdem, hogy te mit ajánlsz? Én most beleégettem egy pic-be és úgy próbáltam. Ezért biztos, hogy nem működőképes
(#) potyo válasza nagy_david1 hozzászólására (») Aug 11, 2011 /
 
Az MPLAB-ban van szimulátor is, bár a CCS kódot forrásszinten nem biztos, hogy tudja kezelni (én úgy alapból nem szeretem a CCS-t, sosem kerestem, hogy tudja-e). asm szinten biztosan tudja. Viszont azt nem látom, hogy letiltanád az analóg-digitális átalakítót. Konfigurációs biteket is jó lenne látni, nem-e az a probléma, hogy a watchdog mindig újraindítja a pic-et, mielőtt odaérhetne, hogy magasra húzza az A0 lábat.
(#) nagy_david1 válasza potyo hozzászólására (») Aug 11, 2011 /
 
Én az assembly-val nem vagyok megbékélve. Ezért is kezdtem inkább C-vel. Itt van minden. Holnap az egészet új mappába mindenestől újra megírom nehogy az legyen a baj.
Idézet:
„#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=20000000)”
(#) vilmosd válasza nagy_david1 hozzászólására (») Aug 11, 2011 / 1
 
  1. #use delay(clock=20000000)
helyett
  1. #use delay(clock=4000000)
A '628 belso oszcija 4MHz alapbol. MPLAB alatt siman tudod a szimulaciot csinalni, es a StopWath segitsegevel merheted a ciklusidoket. Lehet hogy nem megy a szimulacio az MPLAB alatt, akkor le kell tolteni a CCS oldalrol egy progikat es futtatni. Ezzel beepul a CCS szimulacio a MPLAB ala. Lehet a leforditott ASM-et is betolteni, es lepesenkent vizsgalni. Ajanlanam a forum keresomotor hasznalatat a "CCS" betukre, es az ott talalt CCS topikban fel lehet tenni a kerdeseket.
(#) nagy_david1 válasza vilmosd hozzászólására (») Aug 11, 2011 /
 
Köszönöm. Holnap kipróbálom mert egész nap kódokat bújtam. Én is kaptam egy generált hibás kódot de annál még a futtatás közbeszólt. Úgy látszik vannak hibák ebben a programban is. Mindenhol 20Mhz-et láttam én is, biztos ezért nem tűnt fel. Most nézem az adatlapot, hogy a belső csak 4-re képes. Igen, valóban 3 topikot is találtam és nem tudtam melyikbe írjak (ez, ccs, pic kezdő).
(#) nagy_david1 válasza vilmosd hozzászólására (») Aug 11, 2011 /
 
Kíváncsiság megölt ezért még azért is kijavítottam a dolgokat. Még egyszer köszönöm szépen. Lehet még lesznek majd ügyetlen kérdéseim. Előre is elnézéseteket kérem. Majd a ccs topikjába fogom írni azokat.
(#) potyo hozzászólása Aug 18, 2011 /
 
Ismer valaki olyan C forrásfájl gyűjteményt, vagy bináris fájlokat, amik betűkészletek "leírását" tartalmazzák ilyesmi formában: Link? Vagy esetleg programot, ami tud ilyet generálni? A mikroelektronika Visual TFT nevű programja tud ilyen C forrást generálni bármilyen betűkészletből és bármekkora betűmérettel, csak épp az ascii tábla 0x32-0x7F tartományából vannak csak benne a karakterek, az afelettiek nincsenek, én meg szeretnék ékezetes betűket is kiíratni. Tudom, csinálhatnék magamnak ilyen fájlt akár kézzel is, de hátha létezik már készen és nem kell újra feltalálnom
(#) vilmosd válasza potyo hozzászólására (») Aug 18, 2011 /
 
Van ott egy segedprogram ami barmilyen alakzatbol csinal binaris (C) kimenetet, de neked kell megrajzolni a kivant betut.
(#) zenetom hozzászólása Szept 2, 2011 /
 
Egy port bitét akarom 1-be állítani, ha egy váltózó 6. bite egy.
  1. LATCbits.LATC0 = 64 && (64 & v_sram_cim);

Össze lehet így fűzni két logikai operátort?

Ez is jó lenne, de lefordítva asm-re, 2 sorral több:
  1. LATCbits.LATC0 = 64 <= v_sram_cim;
(#) potyo válasza zenetom hozzászólására (») Szept 2, 2011 /
 
C-ben legrövidebb így lenne:
  1. LATCbits.LATC0=(v_sram_cim&64)?1:0;


Viszont ennek a fordításával én nem voltam megelégedve, ezért én ezt szoktam használni:
  1. if (v_sram_cim&64)
  2.         LATCbits.LATC0=1;
  3. else
  4.         LATCbits.LATC0=0;


--------------------

Idézet:
„Össze lehet így fűzni két logikai operátort?”

  1. LATCbits.LATC0 = 64 && (64 & v_sram_cim);

Ilyeneket inkább ne csinálj, ugyanis senki sem garantálja, hogy az A && B művelet eredménye csak 0 vagy 1 lehet, hanem könnyen lehet pl. a 64&&64 eredménye 64.
(#) lokátoros válasza zenetom hozzászólására (») Szept 2, 2011 /
 
A két példa nem ugyanazt csinálja, az első a jó.
Mi van ha a változó értéke 128? Az első feltétel FALSE értéket ad vissza mert a 6.bit 0, a második TRUE-t, mert nagyobb mint 64.

Feltételes kifejezéssel sokkal elegánsabb lehet a kód:

LATCbits.LATC0 = (64 & v_sram_cim) ? 1 : 0;
(#) lokátoros válasza lokátoros hozzászólására (») Szept 2, 2011 /
 
Látom megelőztek
(#) potyo válasza potyo hozzászólására (») Szept 2, 2011 /
 
Ehhez még annyit, hogy próbáld meg ezt, hátha ebből jobban fordít:
  1. v_sram_cim&64?LATCbits.LATC0=1:LATCbits.LATC0=0;
(#) Hp41C válasza potyo hozzászólására (») Szept 2, 2011 /
 
Szia!

  1. LATCbits.LATC0 = !(!(64 & v_sram_cim));
  2. LATCbits.LATC0 = ((64 & v_sram_cim)==64);
  3. LATCbits.LATC0 = ((v_sram_cim & 64) ? 1:0);
(#) Hp41C válasza potyo hozzászólására (») Szept 2, 2011 /
 
Ezt le sem fordítja...
(#) zenetom válasza potyo hozzászólására (») Szept 2, 2011 /
 
Köszi!
Ezt a kérdőjeles forma még nekem új, az if-else ág áttekinthetőbb és most hogy nézem a disassembly ablakban, hatékonyabb is.
Lokátoros, Hp41C köszi nektek is!
Egyébként reggel eszembe jutott, hogy ez a maszkolásos módszer rövidnek tűnik, gyors ki is pattantam az ágyból (igen, még feküdtem, első 4 órám lyukas ) és leírtam. Az a kisebb-egyenlős megoldás tényleg nagy badarság, de ezt ráfogom arra, hogy reggel volt
(#) zenetom válasza potyo hozzászólására (») Szept 2, 2011 /
 
Még egy kérdés: bár úgy látom helyesen lefordítja az MPLAB, de lehet egy sorba írni ezt:
  1. if (v_sram_cim&64)
  2.         LATCbits.LATC0=1;
  3. else
  4.         LATCbits.LATC0=0;

Így:
  1. if (v_sram_cim&64) LATCbits.LATC0=1; else LATCbits.LATC0=0;
?
(#) potyo válasza zenetom hozzászólására (») Szept 2, 2011 /
 
Lehet. Általában az újsor jelek lényegtelenek a fordító számára. Nem mindenhol, mert pl. a //-el kezdődő kommenteket, meg a define-okat, pragma, stb.-t is az újsor zárja, így ezeknél lényeges, de a tiszta kódban most nem jut eszembe olyan, ahol feltétlenül fontos az újsor.
(#) zenetom válasza potyo hozzászólására (») Szept 2, 2011 /
 
Köszi, így nem "rúgja" annyira szét a programot.
(#) zenetom hozzászólása Szept 4, 2011 /
 
Nézegetem kicsit a disassembly ablakot és valamit nem értek. Van az alábbi C kód:
  1. while (!(PORTD&0b00100000))
  2.                 {
  3.                         Nop();
  4.                 }

Aminek azt kéne csinálni, hogy amíg a PORTD 5. bite "0", addig "álljon" a program.
Íme a lefordított kód a disassembly ablakban:
  1. 269:                            while (!(PORTD&0b00100000))
  2.   205E    BA83     BTFSC 0xf83, 0x5, ACCESS
  3.   2060    D002     BRA 0x2066
  4.   2064    D7FC     BRA 0x205e
  5. 270:                            {
  6. 271:                                    Nop();
  7.   2062    0000     NOP
  8. 272:                            }
  9. 273:                           
  10. 274:              
  11. 275:                            v_main_i++;
  12.   2066    2ADF     INCF 0xfdf, F, ACCESS

Viszont itt ha a PORTD (f83 a cime) 5. bite "0", akkor nem a while ciklustörzsét hatja végre, hanem visszaugrik a feltételvizsgálathoz (BRA 0x205e).
Ez lehetne jó is, hisz eltelik egy utasításidő, amíg visszaugrik a BTFSC-re, de ha a ciklustörzsbe nem nopot, hanem pl. egy inkrementáló utasítást rakok, azt se hajta végre a disassembly kódot nézve.
Szerk.: ez az MPLAB fordító hibája (elég nagy hiba lenne...), vagy csak én értelmezek valamit rosszul?
(#) potyo válasza zenetom hozzászólására (») Szept 4, 2011 /
 
Én arra tippelek, hogy egyszerűen kioptimalizálta a NOP utasítást. Próbáld meg kikapcsolni az optimalizálásokat és nézd meg úgy is a listát.
(#) zenetom válasza potyo hozzászólására (») Szept 4, 2011 /
 
A program memory meg teljesen mást mutat. Na én inkább beszúrok egy asm kódot és probléma (remélhetőleg) megoldva.
(#) trudnai válasza zenetom hozzászólására (») Szept 5, 2011 /
 
Ha megnezed az assembly utasitasok cimeit, akkor kiderul, hogy a NOP utasitas a 2062-es cimen van, es az az utasitas amelyik vissza ugrik a 2064-esen. Azaz jol forditott a fordito, csak ez a listazas furcsa kicsit...
(#) trudnai válasza trudnai hozzászólására (») Szept 5, 2011 /
 
... szoval a kod valojaban igy nez ki a program memoriaban:
  1. 269:                         while (!(PORTD&0b00100000))
  2.   205E    BA83     BTFSC 0xf83, 0x5, ACCESS
  3.   2060    D002     BRA 0x2066
  4. 270:                         {
  5. 271:                              Nop();
  6.   2062    0000     NOP
  7. 272:                         }
  8.   2064    D7FC     BRA 0x205e
  9. 273:                        
  10. 274:              
  11. 275:                         v_main_i++;
  12.   2066    2ADF     INCF 0xfdf, F, ACCESS
(#) zenetom válasza trudnai hozzászólására (») Szept 5, 2011 /
 
Úgylátszik a program memory ablak használhatóbb infót ad.
(#) trudnai válasza zenetom hozzászólására (») Szept 5, 2011 /
 
Fura ez a lista, tenyleg. De amugy miert szeretted volna latni a disassembly kodot? Arra gyanakodtal hibas a fordito?
(#) zenetom válasza trudnai hozzászólására (») Szept 5, 2011 /
 
Csak kíváncsi voltam hogy mire fordítja le, de hát akkor lehet nem is azt mutatja...
(#) icserny válasza zenetom hozzászólására (») Szept 5, 2011 /
 
Azt mutatja az, csak néha nem szedi sorba memóriacím szerint. Ezért én is a Program Memory ablakot nézem kínomban, ha helyes sorrendben akarom látni az utasításokat.
(#) Wudoou hozzászólása Szept 5, 2011 /
 
Sziasztok!
Egy kis segítségre lenne szükségem.
Van egy ds1621-es IC-m és össze akarnám hozni egy PIC16F874-el+2x16-os LCD-vel.
Na már most kipróbáltam a CCS gyári forráskódját és ugyan működik csak állandóan 82,83, 84 dec. számmal tér vissza az LCD-re.
De már volt olyan, hogy lement 79-re.
Szóval ha valaki tudna segíteni abban, hogy mit rontok el, akkor azt szívesen venném.
A forrásfájl a következő:
Következő: »»   45 / 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