Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   55 / 118
(#) p_istvan válasza tomat5 hozzászólására (») Márc 20, 2011 /
 
A fordító valamit "kioptimalizál" valószínűleg hasonló okokból nem támogatott a ROM-ra mutató pointer sem. De nem is igazán elvárható egy C fordítótól az ANSI C-nek nem eleme, eléggé hardver függő dolog, főleg a PIC-ek esetében.
A ROM-ba talán inkább két dimenziós tömbbel lenne érdemes kísérletezni!
(#) tomat5 válasza p_istvan hozzászólására (») Márc 20, 2011 /
 
Megpróbáltam a 2dimenziós tömböt. Olyan kis huncut a ccs, hogy amikor akkora lesz a tömb amivel gondja lenne akkor a következőt dobja fordításkor:
Idézet:
„*** Error 87 "D:\PIC\project\matrixc2\characters2.h" Line 7(24,25): Data item too big”

Kipróbáltam, 25x10 byte lefordul, ha hozzáteszem a 26.- at(>256) akkor már nem. Ravasz.

Most vagy csinálok több 2 dimenziós tömböt, vagy maradok a 200 soros kezdetleges kódnál.
(Vagy kell egy újabb ccs verzió?)
(#) p_istvan válasza tomat5 hozzászólására (») Márc 20, 2011 /
 
Lehet, tényleg érdemes megnézni egy újabb verziót:
4.082 Some problems with ROM pointers have been fixed
4.082 If you use pointers to ROM see the readme.txt file for possible syntax changes
4.056 A problem with rom pointers is fixed
4.044 PCH was not allowing large constant arrays in 4.043, this is fixed
(#) szkrep válasza p_istvan hozzászólására (») Márc 21, 2011 /
 
Hát ezt mondom! Jelenleg is használok 504 tagú tömböt. Az újabb verzió kezeli. A régi nem.
Vagy a frissítés nem jön szóba (céges licensz dolgok stb)?
(#) p_istvan válasza szkrep hozzászólására (») Márc 21, 2011 /
 
Kösz!
A tomat5 kollégánál lett ez most akutt probléma, de jó tudni hátha nekem is szükségem lesz egyszer rá.
(#) tomat5 válasza p_istvan hozzászólására (») Márc 21, 2011 /
 
Itt lehet a kutya elásva. Az enyém 4.013-as. Sajnos frissítéshez nem igen tudok hozzájutni.......

Üdv.
(#) p_istvan válasza tomat5 hozzászólására (») Márc 21, 2011 /
 
Ha csak tanulás/hobbi célra kell: Bővebben: Link
mindjárt az első találat a 4.106
(#) tomat5 válasza p_istvan hozzászólására (») Márc 21, 2011 /
 
Köszi
Valamilyen számomra is érthetetlen módon nem az upgrade-re kerestem rá, hanem a komplett programra.
(#) hadnagyakos hozzászólása Márc 25, 2011 /
 
Sziasztok!

Egy egyszerű töltő áramkörön dolgozok, amit egy 12F675 típusú PIC-el szeretnék kivitelezni.

A program egyszerű, az indításnál rákapcsol az aksira egy ellenállást és leméri a feszültségét. Ha kisebb, mint 1,41V, akkor folytatja a töltést és tölti újabb 30 másodpercig. Ha többet mér, mint 1,41V, akkor kikapcsolja a töltést és vár 120 másodpercig és újra ellenőrzi, hogy kész van-e. Ezeken kívül a töltés megkezdésénél ellenőrzi, hogy mekkora a feszültség a cella kapcain, ha nagy, akkor hibát jelez.
A problémám az vele, hogy valamiért nem jól mér az A/D konverter vagy nem is mér, ugyanis nem reagál semmilyen feszültségértékre a bemenetén. A feszültség az A/D konverter bemenetére egy feszültségosztón keresztül érkezik, hogy ne kerülhessen rá nagy fesz. Tulajdonképpen ez lenne a konstrukció.

A program:
main.c:
  1. float battery_voltage;
  2. void main()
  3. {
  4.  
  5.    setup_adc_ports(sAN0|VSS_VDD);
  6.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //setup_wdt(WDT_2304MS);
  7.    setup_timer_1(T1_DISABLED);
  8.    setup_comparator(NC_NC);
  9.    setup_vref(FALSE);
  10.    while(TRUE){
  11.    output_high (PIN_A4); //Töltés ki
  12.    output_high (PIN_A5); //Merítés be
  13.    delay_ms(5000);
  14.    setup_adc(ADC_CLOCK_INTERNAL);
  15.    delay_us(10);
  16.    battery_voltage = (float)read_adc()*RES;
  17.    delay_us(100);
  18.    Output_low(PIN_A5); //Merítés ki
  19.    if (battery_voltage < CELL_COMPLETED_V) {
  20.       Output_low (PIN_A4); //Töltés be
  21.        delay_ms (500);
  22.        setup_adc(ADC_CLOCK_INTERNAL);
  23.        delay_us(10);
  24.        battery_voltage = (float)read_adc()*RES;
  25.        if (battery_voltage > CELL_ERROR_V){
  26.        Output_high (PIN_A3); //Hiba!
  27.        delay_ms (30000);
  28.        Output_high (PIN_A4); //Töltés ki
  29.        Output_low (PIN_A3); //Hiba LED ki
  30.        Output_low (PIN_A2);
  31.       }
  32.       else {
  33.          if (battery_voltage >= CELL_COMPLETED_V) {
  34.          Output_high (PIN_A2); //Kész LED
  35.          delay_ms (120000);
  36.          Output_low (PIN_A2); //Kész LED ki
  37.          }
  38.       }
  39.    }
  40.    }
  41. }

main.h:
  1. #include <12F675.h>
  2. #device adc=10
  3.  
  4. #FUSES NOWDT                      //Watch Dog Timer
  5. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  6. #FUSES NOCPD                    //No EE protection
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOMCLR                   //Master Clear pin used for I/O
  9. #FUSES NOPUT                    //No Power Up Timer
  10. #FUSES NOBROWNOUT               //No brownout reset
  11. #FUSES BANDGAP_HIGH          
  12. #use delay(clock=4000000)
  13. #define RES 5/1024
  14. #define CELL_NUM 1
  15. #define CELL_COMPLETED_V CELL_NUM*1,41/2
  16. #define CELL_ERROR_V CELL_NUM*1,47


Mi lehet vele a gond?
(#) vicsys válasza hadnagyakos hozzászólására (») Márc 25, 2011 /
 
Hiányzik a csatorna kiválasztása.
  1. set_adc_channel(0);
  2. delay_us(100);

Ezután jöhet a mérés.
Nálad a mintavétel ideje van írva:
  1. setup_adc(ADC_CLOCK_INTERNAL); //ITT van***
  2. delay_us(10);
  3. battery_voltage = (float)read_adc()*RES;
(#) p_istvan válasza hadnagyakos hozzászólására (») Márc 25, 2011 /
 
Szervusz!
  1. setup_adc_ports(sAN0|VSS_VDD);
  2. setup_adc(ADC_CLOCK_INTERNAL);ennek itt kell lennie, nem később a konverzió előtt!
  3. set_adc_channel(0);  be kell állítani a csatornát


A battery_voltage miért float? 16 bites integer megfelelne erre a célra, a floattal végzet műveletek igen nagy méretű kódot eredményeznek.
(#) hadnagyakos válasza vicsys hozzászólására (») Márc 25, 2011 /
 
Most próbáltam, sajnos valamiért így sem jó. Ezek szerint a hardverben kell keresnem a hibát.
(#) sysy válasza hadnagyakos hozzászólására (») Márc 26, 2011 /
 
Nem pontosan a problémáról írnék, de felesleges az AD eredményét floatban tárolni. Ha feszültségosztón keresztül méred az 1.4 Voltot, akkor elég lesz az int változó hossz is. De ha nincs feszültségosztó (mert felesleges), akkor is elég az int. Sokkal kényelmesebben tudod kezelni, meg kissebb is a kód. Nem kopik a PIC belseje
(#) hadnagyakos válasza sysy hozzászólására (») Márc 26, 2011 /
 
Azért van feszültségosztó, mert napelemes eszközben lesz és ha az akku nem érintkezik, akár 6,5V is kerülhet a bemenetére, aminek szerintem nem örülne.
(#) hadnagyakos válasza hadnagyakos hozzászólására (») Márc 26, 2011 /
 
Sziasztok!

Sajnos a hardver átnézésével sem sikerült semmit elérnem, így a programot és a hardvert is leegyszerűsítettem a végtelenségig. A hardver most csak az akkuból és a PIC-ből áll. Az akku a PIC RB0-ás lábára van kötve.
A program most így néz ki:
  1. float battery_voltage_adc;
  2. void main()
  3. {
  4.  
  5.    setup_adc_ports(sAN0|VSS_VDD);
  6.    setup_adc(ADC_CLOCK_INTERNAL);
  7.    set_adc_channel(0);
  8.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //setup_wdt(WDT_2304MS);
  9.    setup_timer_1(T1_DISABLED);
  10.    setup_comparator(NC_NC);
  11.    setup_vref(FALSE);
  12.    while(TRUE){
  13.    output_high (PIN_A4); //Töltés ki
  14.    output_high (PIN_A5); //Merítés be
  15.    delay_ms(5000);
  16.    delay_us(10);
  17.    battery_voltage_adc = (float)read_adc();
  18.    delay_us(100);
  19.    Output_low(PIN_A5); //Merítés ki
  20.    if (battery_voltage_adc<CELL_COMPLETED_ADC) {
  21.       Output_low (PIN_A4); //Töltés be
  22.        delay_ms (30000);
  23.        Output_high (PIN_A4); //Töltés ki
  24.        Output_low (PIN_A3); //Hiba LED ki
  25.        Output_low (PIN_A2);
  26.    }
  27.       else  {
  28.          Output_high (PIN_A2); //Kész LED
  29.          delay_ms (120000);
  30.          Output_low (PIN_A2); //Kész LED ki
  31.          
  32.       }
  33.    }
  34.    }


  1. #include <12F675.h>
  2. #device adc=10
  3.  
  4. #FUSES NOWDT                      //Watch Dog Timer
  5. #FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
  6. #FUSES NOCPD                    //No EE protection
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOMCLR                   //Master Clear pin used for I/O
  9. #FUSES NOPUT                    //No Power Up Timer
  10. #FUSES NOBROWNOUT               //No brownout reset
  11. #FUSES BANDGAP_HIGH          
  12. #use delay(clock=4000000)
  13. #define RES 1024/5
  14. #define CELL_NUM 1
  15. #define CELL_COMPLETED_V CELL_NUM*1,41
  16. #define CELL_COMPLETED_ADC 1024*CELL_COMPLETED_V/5/2
  17. #define CELL_ERROR_V CELL_NUM*1,47
(#) p_istvan válasza hadnagyakos hozzászólására (») Márc 26, 2011 /
 
Ebben nem vagyok biztos, hogy azt csinálja amit Te szeretnél:
  1. #define RES 1024/5
  2. #define CELL_NUM 1  
  3. #define CELL_COMPLETED_V CELL_NUM*1,41
  4. #define CELL_COMPLETED_ADC 1024*CELL_COMPLETED_V/5/2
  5. #define CELL_ERROR_V CELL_NUM*1,47

A CELL_COMPLETED_V = 1 * 1,41 = 1; a C típuskonverziója miatt!
Ugyanigy a CELL_ERROR_V is egy lesz.
A CELL_COMPLETED_ADC pedig 102 lesz szerintem.
A C-ben nem túl szerencsés így használni a makrókat.
Esetleg a #define CELL_NUM 1,0 jobb lenne.
A floathoz látom ragaszkodsz de majd ha nő a programod akkor leszoksz róla, ha nem fogsz elférni a ROM-ban... Ha mV-ban számolnál nem lenne rá szükséged és az életed is egyszerűbb lenne. Nézd majd meg, hogy ez a pár sor mekkora kódot eredményezett!
(#) hadnagyakos válasza p_istvan hozzászólására (») Márc 26, 2011 /
 
Ezek szerint érdemes lenne előre kiszámolt értékkel dolgozni?
(#) p_istvan válasza hadnagyakos hozzászólására (») Márc 26, 2011 /
 
Mindenesetre, kevesebb lesz a hibalehetőség.
(#) hadnagyakos válasza p_istvan hozzászólására (») Márc 27, 2011 /
 
Így sikerült működésre bírnom.
Hálásan köszönöm mindenkinek a segítséget!
(#) G-Lex hozzászólása Márc 28, 2011 /
 
sziasztok I2C kommunikációval kapcsolatban lenne kérdésem.

CCS varázslójával bekonfigoltam a PIC16F677-en az I2C hardveres portot.
  1. #use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3,force_hw)


Amikor írok az I2C-re akkor megáll a programom.
Az írás a következőképpen néz ki:
  1. void PT2323_Write( int8 Data ) {
  2.    i2c_start();
  3.    i2c_write( 0x94 );
  4.    i2c_write(Data);
  5.    i2c_stop();
  6. }
  7.  
  8. void PT2323_Mute_All( int1 status ) {
  9.    PT2323_Write( 0xFE | status );
  10. }


Mivel még nem csináltam semmi I2C dolgot ezért elég tanácstalan vagyok, hogy itt most a PIC és a PT2323 IC közötti kapcsolat a probléma (talán az ACK miatt) vagy valamit elrontottam amitől így viselkedik.

Van valakinek tapasztalata ezzel kapcsolatban?
(#) pppsss válasza G-Lex hozzászólására (») Márc 28, 2011 /
 
Szia !
A PT2323 adatlapját mellékelhetnéd mert én csak egy 4 oldalas kis doksit találok, az pedig kevés mert az I2C kommunikációjáról semmi nincs írva !
(#) G-Lex válasza pppsss hozzászólására (») Márc 28, 2011 /
 
Csatoltam a két IC adatlapját amivel kommunikálni akarok.
Egyébként ez egy Genius SW 5.1 5000-ben van aminek meghalt a vezérlője és azt akarom kiváltani.
A gyári mikrokontrollert kiforrasztottam és annak a lábainak a helyére kötöttem be a PIC-et.

Raktam bele debugot, ami RS232-n küldi a debug információkat és ott a PT2323 inicializálásánál leáll a program. Az inicializálás alatt azt értem hogy egyenként az összes csatornát elnémítom.

A gyári vezérlő is 5V-ról megy, tehát feszültség illesztés szerintem nem kell.

A PT2323 IC SCL és SDA lábán nincs fel/le húzó ellenállás.
A mikrovezérlős panelon is az SCL/SDA lábak közvetlenül mennek a csatlakozóra.
(#) whalaky válasza G-Lex hozzászólására (») Márc 28, 2011 /
 
Azért csak tegyél mind a kettőre felhúzó ellenállást, ha nincs az okozhatja.....
(#) G-Lex válasza whalaky hozzászólására (») Márc 28, 2011 /
 
Tehát ha jól sejtem, akkor az I2C kommunikációban elengedhetetlen az oda vissza kommunikáció az ACK miatt, mert addig nem megy tovább...

Van egy buspirate nevű eszközöm. remélem a héten megérkeznek hozzá a mérőfejek és akkor meg tudom azzal is nézni a kommunikációt és megpróbálom fel/le húzó ellenállásokkal is.
(#) MPi-c válasza G-Lex hozzászólására (») Márc 28, 2011 /
 
Kellenek azok a felhúzó ellenállások!
A PT2323 adatlapja írja is!
Idézet:
„Bus Interface
...It should be noted that the pull-up resistors must be connected to the positive supply voltage.”

Itt egy elég régi magyar leírás az I2C-ről. A 10.1 fejezet foglalkozik az ellenállásokkal.
(#) G-Lex hozzászólása Márc 28, 2011 /
 
köszönöm szépen. Ez életem első i2c projektje. remélem összejön
(#) dkorneel hozzászólása Márc 31, 2011 /
 
sziasztok

A kovetkezoben szeretnem a segitsegeteket kerni:
Szeretnem merni egy pwm jel impulzus szelesseget egy pic 16f1827es rb0-s laban, ha int_ext-et hasznalok akkor nem mer semmit, ha int_rb-t (tobb labon is ugyanezt csinalta) hasznalok akkor akar egy levegoben logo madzag hatasara is megorul az egesz program, beleertve a soros konzolt(int_rda) es a ccp modulokat is. Ugyanez a kodreszlet, azonos tesztpanelon, bedrotozva, azonos forrasra kotve tokeletesen mukodik 16f882-vel, csak annak kisebb a program memoriaja.

Van valakinek otlete, mi okozhatja ezt? A fordito amit hasznalok: 4.114.

Es ime a kodreszlet:

  1. #FUSES INTRC_IO,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,PUT
  2. #use delay(clock=4000000)
  3. #use fast_io (A)
  4. #use fast_io (B)
  5.  
  6. #INT_RB
  7. void rb_isr()
  8. {
  9.    int i;
  10.    i=get_timer0();
  11.    
  12.    if (input(PIN_B0)) set_timer0(0);
  13.    else
  14.    {
  15.       if (ismeasure)
  16.       {
  17.          measured_pwm=i;
  18.          ismeasure=0;
  19.       }
  20.       if (i==switch_up) close();
  21.       if (i==switch_down) open();
  22.    }
  23. }
  24.  
  25. main:
  26.  
  27.    clear_interrupt(INT_RB0);
  28.    enable_interrupts(INT_RB0); //enable remote control
  29.    enable_interrupts(GLOBAL);
  30.    
  31.    while (TRUE)
  32.    {
  33.       if (measured_pwm>0)
  34.       {
  35.          printf("\r\n %u",measured_pwm);
  36.          measured_pwm=0;
  37.       }
  38.       GetNextCharFromRxRingBuff();
  39.    }


open es close fuggvenyek tokeletesen futnak.
(#) icserny válasza dkorneel hozzászólására (») Márc 31, 2011 /
 
Én nem láttam még ilyen mikrovezérlőket, de az adatlapok összehasonlításából úgy tűnik, hogy nem "csak" a memória méretében van különbség, hanem a bemeneti változást detektáló áramkör kialakítása és kezelése is alapvetően eltér:

1. Míg a 16f882 esetén a B port olvasása törli az RBIF jelzőbitet, addig a 16f1827 esetén külön törölni kell az IOCBF regiszter megfelelő bitjét az interrupt kérelem megszüntetéséhez. Az interrupt kiszolgáló eljárásba ezt is írd bele!

2. Míg a 16f882 esetén minden bemeneti változás megszakítást okoz, addig a 16f1827 esetén külön engedélyezni kell a fel- és lefutó élre történő megszakítást. Ezt a fordító által generált kód talán megcsinálja... Ha nem, akkor neked kell beállítani.
(#) dkorneel válasza icserny hozzászólására (») Márc 31, 2011 /
 
Szia

koszi a gyors valaszt

1. kiprobalom, hatha segit.

2.
external interruphoz valo elvileg az ext_int_edge() fgv.
device h fileban ezek vannak definialva, de delutan atolvasom a microchipes dokumentaciot, lehet csak RTFM hiba.

#define INT_RB0 0x30010B08
#define INT_RB0_L2H 0x10010B08
#define INT_RB0_H2L 0x20010B08
(#) edison14 hozzászólása Ápr 4, 2011 /
 
Hali. Most kezdtem el foglalkozni egy kicsit a CCS-el de volna egy kis gond méghozzá az hogy valamiért a program szimulációban működik de a próbapanelemen nem akar. A program a következő:
  1. #include        <16F877A.h>
  2. #zero_ram
  3. #fuses  XT,NOWDT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NOPROTECT
  4. #use    delay(clock=4000000)
  5.  
  6. #byte   PORTD = 8
  7.  
  8. void main(void)
  9. {
  10.         set_tris_d(0x00);
  11.        
  12.                 for(;;)
  13.                 {
  14.                         output_d(1);
  15.                         delay_ms(1000);
  16.                         output_d(0xFF);
  17.                 }
  18. }


A segítségeteket előre is köszönöm.
Következő: »»   55 / 118
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