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   87 / 118
(#) whalaky válasza Gyimate hozzászólására (») Jún 9, 2013 /
 
Ugyan ezen a gépemen nincs CCS, de szerintem elég egyértelmű a hiba...
Idézet:
„hiba van a 16F1454.h 2. sorában”

esetleg ha megtenéd hogy megnéznéd..... netán elárulnád hogy melyik CCS verzió.... lehet hogy sokat lendítene a dolgon.
(#) Gyimate válasza whalaky hozzászólására (») Jún 9, 2013 /
 
Üdv,
A verzió 4.130. A hibaüzenetet értem, viszont azt nem értem ahova mutat, a header-ben a második sor ez: "#device PIC16F1454" és ebben találta a hibát, bármely más 16f145x-el is ugyan ezt csinálja, eddig nem találkoztam a hibával, pedig már több mint másfél éve használom a fordítót, sőt a google sem segített a hiba felderítésében. Most még azt fogom megpróbálni, hogy beszedem a legfrissebb stabil verziót, hátha segít, viszont ez van meg nekem teljes verzióban...
(#) Gyimate válasza Gyimate hozzászólására (») Jún 10, 2013 /
 
Üdv,
Leírom azoknak akik esetleg hasonló problémával szembesültek volna, hogy a CCS V5-ös verziója valamelyest kezeli a PIC16F1454-est, de az USB-t nem lehet ezzel sem beizzítani, csak akkor ha megírjuk hozzá a saját könyvtárunkat. Alapból az 5-ös verzió is csak a 18F-ekhez kínál USB támogatást, meg még a 16C765-höz, ami már eléggé elavult, szóval ha így szeretnétek készíteni egy USB-UART átalakítót akkor ne CCS-el írjátok hozzá a programot, én is most kezdtem el az XC8 tanulását, bár vannak még hatalmas megválaszolatlan kérdések...
Üdv Gyimate
(#) sysy válasza Gyimate hozzászólására (») Jún 10, 2013 /
 
A #device PIC16F1454 error-ra mi volt a megoldás? Honnan lehet a V5 verziót letőlteni?
(#) Gyimate válasza sysy hozzászólására (») Jún 10, 2013 /
 
A CCS oldaláról letöltöttem a demó verziót, ha kell akkor berakom rá a linket, de ahogy említettem nem ad teljes körű megoldást.
(#) sysy válasza Gyimate hozzászólására (») Jún 10, 2013 /
 
Azt hittem van fullos verziód.
Egyébként senki nem ad igazi megoldást semmire. Neked sokat kell dolgozni rajta. Sem a fájlkezelés, sem a TCP/IP, sem az USB kezelés, sem semelyik komolyabb funkció nincs beépítve a fordítókba. Sehol. Adnak tippeket, demo progikat, de igazából mindegyik izzadság szagú. Legözelebbi a JAVA, ami ilyen szempontból DeLux, de az nem nagyon futkorászik PIC procikon.
(#) potyo válasza sysy hozzászólására (») Jún 10, 2013 / 1
 
Idézet:
„Legözelebbi a JAVA, ami ilyen szempontból DeLux, de az nem nagyon futkorászik PIC procikon.”
Az máson sem futkorászik, inkább csak vánszorog...
(#) Gyimate válasza sysy hozzászólására (») Jún 10, 2013 /
 
Igen, ezt tapasztaltam én is, a fájlkezelést/FAT32 kezelést is megírtam, a "gyárival" nem voltam teljesen megelégedve, igaz, hogy sokat tudott, viszont pont ezt láttam a hátrányának, lassan futott, sok ramot megevett stb, pont ahogy mondtad. Az igazság az, hogy már korábban is gondolkoztam rajta, hogy megtanulok egy másik fordítót is kezelni, így esett a választásom az XC8-ra, nem olyan nehéz, bár rá kell érezni és akkor az is adja magát, persze nem lesz ilyen kényelmes, viszont több lehetőséget is kínál.
(#) b0077 hozzászólása Jún 14, 2013 /
 
Sziasztok!

Már egy jó ideje megépítettem az oldalon található leírás alapján a PIC vezérelt utastér világítás késleltető elektronikát. Most viszont módosítani szeretnék 1-2 értéket illetve utasítást benne. Ehhez viszont C kódban kellene átírni a megfelelő dolgokat, majd lefordíttatni hex-be. Addig eljutottam, hogy letöltöttem a megfelelő progikat (MPLAB IDE több verzióját is illetve a megfelelő, 12-16F -es beépülő C fordítót). Ha jól értelmezem ennek a menetét, olyan fordító program sajnos nem létezik amit amivel megnyitom a C kódot és hex kódot csinál nekem. Amit már csak beleégetek a PIC-be ugyan úgy mint ahogyan a kész hex kóddal tettem korábban, amit le lehet tölteni a késleltető leírásából.
A fordítás menete elvileg az hogy elindítok egy új projektet az MPLAB IDE-ben, amihez hozzáadom a C kódot, ezután ezzel a progival közvetlenül lefordítom majd beleégetem a PIC-be. Itt akadtam meg, ha jól láttam a projekten belül olyan beállításokat kell végeznem a PIC típuúsához kötötten ami megoldaná, h hibát dobjon a fordítás közben. A jelenlegi beállításokkal (legalábbis szerintem beállítás baja van) ezeket a hiba üziket dobja ki:

Error [800] undefined symbol "INTIO"
Error [800] undefined symbol "WDTDIS"
Error [800] undefined symbol "PWRTEN"
Error [800] undefined symbol "MCLREN"
Error [800] undefined symbol "UNPROTECT"
Error [800] undefined symbol "BOREN_XSLP"
Error [800] undefined symbol "IESODIS"
Error [800] undefined symbol "FCMDIS"

(Ha a kódhoz hozzá sem nyúlok is ezt kapom, tehát nem a belepiszkálás rontotta el). Külföldi fórumok alapján szerintem a projekten belül kellett vna még vmit beállítanom. Vagy ha tévedek remélem meg tudja mondani valaki h mégis mi lehet a baja, mit rondottam el.
Előre is köszönöm.

üdv
(#) Gyimate válasza b0077 hozzászólására (») Jún 14, 2013 /
 
Üdv!
Tudnál esetleg küldeni egy linket a kapcsoláshoz, mert úgy könnyebb lenne megtalálni, hogy miről is van szó. Azokat a hibaüzeneteket meg azért kaptad mert rosszul lettek beírva a fuses bitek, ha ccs-t használsz akkor ezt úgy kell megtenni, hogy "#fuses INTIO, WDTDIS .......". Ha gondolod akkor viszont írok neked egy c kódot hozzá amiben könnyebben eligazodhatsz.
(#) sysy válasza b0077 hozzászólására (») Jún 14, 2013 /
 
Ezt a programot melyik C fordítóban kell fordítani, mert ez nem CCS C?
A hozzászólás módosítva: Jún 14, 2013
(#) MPi-c válasza b0077 hozzászólására (») Jún 14, 2013 /
 
A cikkben és potyo kódjában is benne van, hogy Hi-tech c, nem ccs. Úgyhogy mostanában marad az xc8, ami változtatás nélkül, símán fordítja.
(#) b0077 hozzászólása Jún 14, 2013 /
 
Bocs, jogos! Ez az a cikk
Megköszönném, ha kapnék egy kódot (project formájában) amit csak megnyitok átírok amit szeretnék és fordíttatnom.
Egyébként csak az időt szeretném átírni, és azt hogy gyújtás levétele után ne kapcsoljon vissza. Ahogy láttam a C kódot ez nem vészes, csak a fordítás bekavart sajnos....
Tehát a Fuse bitekkel voltak bajok, akkor jól gondoltam mert a "Configuration Bits"-eknél próbáltam állítgatni ezt azt, a fordító mappájában található PIC12F683-hoz tartozó kézikönyv vagy példa progi alapján, de nem jött össze sajnos.
Vagy az említett CCS C progival egyszerűben meg tudnám oldani?
A hozzászólás módosítva: Jún 14, 2013
(#) _vl_ válasza b0077 hozzászólására (») Jún 14, 2013 /
 
Tehát: a cikk Hi-Tech C fordítóra készített kódot tartalmaz.
Ez a topik a CCS C fordítóról szól. A CCS az életben nem fogja neked azt a kódot lefordítani.
El kell döntened, hogy azt a kódot szeretnéd használni - ebben az esetben javasolt az eredeti C fordító (vagy ahogy egyesek írták, az XC8) használata - viszont így akkor nem ebbe a topikba tartozik a történet.
Vagy megkérsz valakit, hogy írja újra az eredeti program alapján az egészet CCS C-re, és akkor tudod a CCS fordítóját használni - és csak azt, mivel semmi mással nem fog fordulni a program.
A hozzászólás módosítva: Jún 14, 2013
(#) b0077 válasza _vl_ hozzászólására (») Jún 14, 2013 /
 
Értem, köszönöm!
Azt nem figyeltem h nem ugyan olyan fordítótól szól a topik mint ami a cikkben szerepel. Átrakom a megfelelő topicba a kérdésemet. Ide
A hozzászólás módosítva: Jún 14, 2013
(#) mrcdcscc hozzászólása Júl 5, 2013 /
 
Kedves Fórumtársak!

Egy PIC16F1829-es PIC interrupt-on-change funkcióját próbálom megcsinálni ccs c compiler-rel (v4.114). De egyszerűen nem sikerül. Úgyhogy megcsináltam MPLAB X IDE-ben assembly-ben, és úgy meg megy. De én azt szeretném, hogy a ccs-ben készült C programmal is menjen, mert egy nagyobb programnak egy kis része lenne ez az interrupt-on-change funkció, és a program további nagy részét nem szeretném assembly-ben megcsinálni.

A kérdesem az lenne, hogy valaki meg tudná-e mondani, hogy mi a c programom hibája?

A PIC16F1829-es mikrovezérlőm C portjára 8 db LED van kapcsolva, valamint a PORTA 2-es pin-jére egy optokapcsoló (optointerrupter), mely úgy van a pin-re kapcsolva, hogy ha a fotodiódát megvilágítja a LED, akkor a fotodióda a földre húzza a pin-t (0.34V-ot mérek), ha meg eltakarom a fotodiódát a LED-től, akkor a fotodióda lezár, és a pin egy 1kOhm-os ellenálláson keresztül 5V-ra van felhúzva (ennyit is mérek).
A program azt csinálja, hogy bekapcsoláskor a PORTC,0 pin-jén levő LED-et felkapcsolja, hogy az mutassa, hogy bekapcsolt a mikrovezérlő és elindult a program. Ezt követően ha az optokapcsolóban letakarom az fotodiódát, akkor a logikai 0-ról logikai 1-re változik a jelszint a PORTA,2 pin-en, azaz el kellene indulnia az interrupt-on-change megszakitáskezelő szubrutinnak, ami azt csinálja, hogy ha az első LED világított, akkor most a második fog világítani, ha viszont a második LED világított, akkor az első fog. Nem a LED világítás a feladat, ez most csak a debuggolást szolgálja, hogy lássam elindul-e a megszakításkezelő szubrutin vagy sem.

Namost ezt a működést nem produkálja a C program:

  1. #include <16F1829.h>
  2. #fuses INTRC_IO, NOLVP, NOWDT, NOPROTECT,NOMCLR
  3. #use delay(clock=4000000)
  4.  
  5. static int gomb;
  6.  
  7. #INT_RA
  8. void interrupt_kezeles()
  9. {
  10.          if (gomb==1)
  11.          {
  12.             output_c(0x01);
  13.             gomb=0;
  14.          }
  15.          else
  16.          {
  17.             output_c(0x02);
  18.             gomb=1;
  19.          }
  20.          output_c(0x03);
  21.         delay_ms(100);
  22. }
  23.  
  24.    
  25. void main()
  26. {
  27.    gomb=0;
  28.    setup_oscillator(OSC_4MHZ);
  29.    
  30.    #byte ansela_reg=GETENV("SFR:ANSELA");
  31.    #byte porta_reg=GETENV("SFRORTA");
  32.    #byte lata_reg=GETENV("SFR:LATA");
  33.    porta_reg=0;
  34.    lata_reg=0;
  35.    ansela_reg=0; //PORTA digitális port
  36.    set_tris_a(0xff); //PORTA mindegyik pin INPUT
  37.    
  38.    OUTPUT_C(0x01); //1-es led világítson
  39.    
  40.    ENABLE_INTERRUPTS(INT_RA2_L2H);
  41.    ENABLE_INTERRUPTS(GLOBAL);
  42.    
  43.  
  44.     while (TRUE)
  45.     {
  46.            
  47.     }
  48. }



Bemásolom az assembly kódomat, ami szépen működik (ennél az interrupt nem felváltja kapcsolgatja az első és második LED-et, hanem 2 LED-et működtet, és minden egyes interrupt-ba lépéskor lépteti a LED-eket egyel jobbra, ugyanis ezt egyszerűbb volt beprogramoznom assembly-be, de ahogy fentebb is említettem, jelenleg nem a LED kapcsolgatás a lényeg).

Az assembly program:

  1. ;------------------[ PROCESSZOR + KONFIGURACIO + INCLUDE ]----------
  2. ;
  3.      LIST       P=16F1829               ;PROCESSZOR DEFINICIO
  4.      #INCLUDE   <P16F1829.INC>  ;A szukseges include file
  5.      __config _CONFIG1, 0x3FA4;
  6. ;
  7. ;------------------[ VALTOZOK ]------------------------------------
  8. ;A Minden BANK-ból látható GPR kezdőcím
  9. SEGED       EQU     0X70
  10.  
  11. ;==================[ P R O G R A M  K E Z D E T E ]================
  12. ;
  13.         ORG     0X000           ;PROCESSZOR RESET VEKTOR
  14.         GOTO    INI_MAIN        ;UGRÁS A PROGRAM KEZDETÉRE
  15. ;
  16.  
  17. ;==================[ M E G S Z A K I T A S V E K T O R ]============
  18. ;
  19.         ORG     0X004           ;EZ A 4H CIM
  20.         CALL    INT_KEZELO;
  21.         RETFIE                  ;VISSZATÉRÉS INTERRUPTBÓL
  22.  
  23. ;------------------[ INICIALIZALASOK ]------------------------------
  24. INI_MAIN
  25. INI_PORT
  26.     ; PORTA BEÁLLÍTÁSA
  27.         BANKSEL PORTA ;
  28.     CLRF PORTA ;Init PORTA
  29.     BANKSEL LATA ;Data Latch
  30.     CLRF LATA ;
  31.     BANKSEL ANSELA ;
  32.     CLRF ANSELA ;digital I/O
  33.     BANKSEL TRISA ;
  34.     MOVLW B'00111111' ;Set RA<5:0> as inputs
  35.     MOVWF TRISA
  36.     BANKSEL IOCAP;
  37.     MOVLW B'00000100' ; PA2 POZITIV INTERRUPT ON CHANGE-RE ALLITVA
  38.     MOVWF IOCAP;
  39.    
  40.     ;PORTC BEÁLLÍTÁSA
  41.     BANKSEL PORTC ;
  42.     CLRF PORTC ;Init PORTA
  43.     BANKSEL LATC ;Data Latch
  44.     CLRF LATC ;
  45.     BANKSEL ANSELC ;
  46.     CLRF ANSELC ;digital I/O
  47.     BANKSEL TRISC ;
  48.     MOVLW B'00000000' ; PORTC-N MINDEGYIK PIN OUTPUT
  49.     MOVWF TRISC;
  50.  
  51. INI_VALTOZO
  52.     MOVLW B'00000011'; PORTC-N LEVO 8 DARAB LED VILÁGITÁSÁT VEZÉRLŐ SEGÉDVÁLTOZÓ
  53.     MOVWF SEGED;
  54.  
  55.  
  56.  
  57. ;------------------[ PROGRAM TENYLEGES KEZDETE ]--------------------
  58. MAIN
  59.     Banksel PORTC;
  60.     MOVLW B'00000001'; 1-es LED VILÁGÍT
  61.     MOVWF PORTC;
  62.  
  63.     ;INTERRUPT ON CHANGE INDITAS
  64.     BSF INTCON,IOCIE ; IOCIE BIT 1-BE ALLITASA
  65.     BSF INTCON,GIE ; GLOBAL INTERRUPT ENGEDELYEZESE
  66.  
  67. VEGTELEN_CIKLUS_ELEJE
  68.     NOP
  69.     NOP
  70.     NOP
  71.     NOP
  72.     NOP
  73.     NOP
  74.     NOP
  75.     GOTO VEGTELEN_CIKLUS_ELEJE  ;
  76.    
  77.  
  78. ;------------------[ MEGSZAKITAS KEZELESE ]--------------------
  79. INT_KEZELO
  80.     BANKSEL PORTC;
  81.     RLF SEGED,1; SEGED VÁLTOZÓ BITJEINEK ELTOLÁSA BALRA A CARRY-N KERESZTÜL, HOGY AZ INTERRUPT ESETÉN MÁS LED-EK VILÁGÍTSANAK
  82.     MOVF SEGED,0; SEGED ERTEKE W-BE
  83.     MOVWF PORTC;
  84.     BANKSEL IOCAF;
  85.     MOVLW B'00000000'; interrupt flag torlese
  86.     MOVWF IOCAF;
  87.     RETFIE ;
  88.  
  89.     END ; PROGRAM Vege
A hozzászólás módosítva: Júl 5, 2013
(#) mrcdcscc hozzászólása Júl 5, 2013 /
 
Az előző nyitó hozzászólásomban bennemaradt a megszakításkezelő szubrutinban a output_c(0x03); sor, de azt csak próbaként írtam be, hogy hátha az if-be nem megy bele a program (bár akkor az if utáni else-be be kellene mennie). Azt most nem kell figyelembe venni, csak már nem tudtam a nyitó hozzászólásomat módosítani.
(#) nurseboy hozzászólása Júl 6, 2013 /
 
Sziasztok van egy problémám A ccs -el hexbe akarom forditani, de 1 hibát jelez és nem tudom miért

#use i2c(master,sda=DAL_SDA, scl=DAL_SCL, Force_HW)

a Force_HW hiba mit lehet tenni?

köszi Attila

main.c
    
(#) icserny válasza nurseboy hozzászólására (») Júl 6, 2013 /
 
Hardveres I2C kommunikációhoz azokat a lábakat kell használni, ahol az I2C busz kijön!
(#) nurseboy válasza icserny hozzászólására (») Júl 6, 2013 /
 
Oké de én nem nagyon értem a programozást. Segítenél ez mit jelent. Mit kell megváltoztatni, hogy jó legyen?
(#) icserny válasza nurseboy hozzászólására (») Júl 6, 2013 /
 
Ha az áramköri elrendezés már adott, akkor a FORCE_HW paramétert kellene hanyagolni. Vagyis szoftveres I2C kommunikációt kellene használni.
(#) Gyimate válasza nurseboy hozzászólására (») Júl 6, 2013 /
 
Üdv
A FORCE_HW. beállítással azt mondod a fordítónak hogy a hardveres I2C-t használja minden képpen, viszont ha a megadott lábak nem a pic hardveres I2C lábai akkor a fordító ellentmondásba kerül. Ez olyan mintha megparancsolnák neked hogy menj be egy épületbe a főbejáraton viszont de utasításként kapnád azt is hogy csak a hátsó ajtót használhatod amit ráadásul neked kell megépíteni (mivel szoftweres komunikációt kell végrehajtanod).
(#) nurseboy válasza Gyimate hozzászólására (») Júl 7, 2013 /
 
Oké, így már értem. De hogy tudom, hogy a pic, jelen esetben a 16F876A nak melyik a i2c lába és hogy lehet ezt a programban beállítani.

Próbáltam SW állítani, de akkor nem mutatta a hőmérsékletet, nem jelzett ki semmit.
(#) Gyimate válasza nurseboy hozzászólására (») Júl 7, 2013 /
 
Többek között erre való a PIC adatlapja, jelen esetben ez a RC3 (órajel) és RC4(adat)-es láb. Nem nehéz megtalálni őket, első lépésben ellenőrizzük, hogy a PIC-et ellátták-e egyáltalán a szükséges modullal, amennyiben igen 3 lehetőségünk van:
1, Megnézzük az IC lábkiosztását és megkeressük az SCK és SDA lábakat, ezek a hardveres I2C lábak.
2, Megkeressük az adatlapon belül a lábak leírását, ez egy hosszú táblázat az adatlap elején és itt keressük meg az I2C portot.
3, Megkeressük az SSP porttal (ebbe beletartozik az I2C és az SPI) foglalkozó bekezdést és itt is megtaláljuk a szükséges lábakat.
A programban úgy tudod beállítani, hogy a lábak helyett ennyit írsz be: "I2C1" persze idézőjelek nélkül, ezzel megmondod a fordítónak, hogy PIC hardveres I2C lábait használja, ő ezt onnan tudja, hogy létezik a C:/Program Files/PICC mappában egy Devices nevű almappa, ebben benne van az összes PIC amit a fordító támogat, ezek tartalmazzák többek között a lábkiosztást is.
Mellesleg hogy ha elindítod a CCS-C-t és megnyomod az F12-őt akkor előhozza a segítséget ahonnan bármit megtudsz, többek között az I2C beállítási lehetőségeit is.
Ha mindenképpen szoftveres kommunikációt szeretnél akkor pedig használd ezt: "FORCE_SW", viszont ennek megvannak a hátrányai, ilyenkor a a PIC-be égetett program fogja generálni a kommunikációhoz szükséges órajelet és a kimenő adatot ezáltal egy csomó programidőt vesztesz, míg a hardveres kommunikációnál csak betöltöd a kívánt adatot egy regiszterbe és a PIC magától elvégzi a feladatot és persze eközben a program fut tovább párhuzamosan az adatküldéssel.
Ha kérdésed van nyugodtan kérdezz, segítek a megoldásban.
Üdv Máté
(#) mrcdcscc hozzászólása Júl 9, 2013 /
 
Kedves Forumtársak!

A CCS C compiler-rel van gondom. A PIC16F1829 mikrovezérlő PORTA:2-es pinjén érkező felfutó él esetén megszakítás hívódik meg. Ez már jól müködik. A megszakításon belül az egyik felfutó élnél az 123 számnak kell megjelennie az LCD kijelzőn, ha újra jön egy felfutó él akkor pedig a 9876 számnak kellene megjelennie. Újabb felfutó élre megint az 123 karakter jelenik meg, és így tovább váltakozva (ez tesztelés miatt van). Az 123 karakter egyesével vannak kiiratva az LCD-re, mint különálló számok, és ez működik is. A 9876 számnál viszont egy szubrutin hívódna meg, ami ezt számjegyekre bontja, és ezeket a számjegyek lennének utána kiiratva. Na ez a rész nem működik, csak egy nulla jelenik meg ennél. A szubrutin a main(){} részben meghívva jól működik, akkor kiírja a számjegyeket. A problémám az, hogy nem értem, az interruptban meghívva miért nem működik.
Remélem valaki tud segíteni, és elmondja, miért nem hívódik meg a bit16szam_konverzio_BCD szubrutinom az interrupt-ot lekezelő szubrutinon belül, vagy ha meg is hívódik, akkor miért nem kerülnek a "tízezres, ezres, szazas, tizes, egyes" globális változókba bele az értékek. Bemásoltam a programot (az LCD_inicializalas szubrutint nem, mert elég hosszú, és az működik).
(Megjegyzés: Az LCD-t 4 biten vezérlem, ezért van az, hogy a karaktert reprezentáló byte felső és alsó 4 bitjét egymás után küldöm az LCD-nek)

  1. #include <16F1829.h>
  2. #fuses INTRC_IO, NOLVP, NOWDT, NOPROTECT,NOMCLR
  3. #use delay(clock=4000000)
  4.  
  5. int gomb = 0;
  6. signed int16 szamlalo = 5;
  7. int8 tizezres, ezres, szazas, tizes, egyes = 0;
  8.  
  9. //LCD vezérléséhez használt pinek
  10. #define LCD_ENABLE_PIN  PIN_A5  //
  11. #define LCD_RS_PIN      PIN_A4  //rs=register select RS=0 instruction register, RS=1 data register
  12. //#define LCD_RW_PIN      PIN_C2  //read/write RW=0 write, RW=1 read
  13. #define LCD_DATA4       PIN_C4  
  14. #define LCD_DATA5       PIN_C5                                    
  15. #define LCD_DATA6       PIN_C6                                    
  16. #define LCD_DATA7       PIN_C7
  17.  
  18. void LCD_enable(void)
  19. {
  20.     output_bit(LCD_ENABLE_PIN,1);
  21.     delay_us(10);
  22.     output_bit(LCD_ENABLE_PIN,0);
  23.     delay_us(10);
  24. }
  25.  
  26. void LCD_memoriacim(int8 sor, int8 oszlop) //adott sor-oszlop-ba teszi a kurzort
  27. {
  28.       int memoriacim;
  29.       if (sor==1) memoriacim=oszlop-1;
  30.       if (sor==2) memoriacim=63+oszlop;
  31.       if (sor==3) memoriacim=19+oszlop;
  32.       if (sor==4) memoriacim=83+oszlop;
  33.      
  34.        output_bit(LCD_ENABLE_PIN, 0);
  35.        output_bit(LCD_RS_PIN, 0);
  36.   //     output_bit(LCD_RW_PIN, 0);
  37.        
  38.        output_bit(LCD_DATA4, bit_test(memoriacim,4));
  39.        output_bit(LCD_DATA5, bit_test(memoriacim,5));
  40.        output_bit(LCD_DATA6, bit_test(memoriacim,6));
  41.        output_bit(LCD_DATA7, 1);
  42.        
  43.        LCD_enable();
  44.        
  45.        output_bit(LCD_DATA4, bit_test(memoriacim,0));
  46.        output_bit(LCD_DATA5, bit_test(memoriacim,1));
  47.        output_bit(LCD_DATA6, bit_test(memoriacim,2));
  48.        output_bit(LCD_DATA7, bit_test(memoriacim,3));
  49.  
  50.        LCD_enable();
  51.        delay_us(100);
  52.        
  53. }
  54.  
  55. void  LCD_kepernyotorles(void)
  56. {
  57.    output_bit(LCD_ENABLE_PIN, 0);
  58.    output_bit(LCD_RS_PIN, 0);
  59.        
  60.    output_bit(LCD_DATA4, 0);
  61.    output_bit(LCD_DATA5, 0);
  62.    output_bit(LCD_DATA6, 0);
  63.    output_bit(LCD_DATA7, 0);
  64.    LCD_enable();
  65.  
  66.    output_bit(LCD_DATA4, 1);
  67.    LCD_enable();
  68.    delay_ms(10); //FONTOS!!!
  69. }
  70.  
  71. void LCD_karakterkiiratas(int8 karakter) //kiiraja az aktualis pozicioba a karaktert, aminek kodolasa mar az LCD karaktertablazata szerinti
  72. {
  73.        output_bit(LCD_ENABLE_PIN, 0);
  74.        output_bit(LCD_RS_PIN, 1);
  75.       // output_bit(LCD_RW_PIN, 0);
  76.        
  77.        output_bit(LCD_DATA4, bit_test(karakter,4));
  78.        output_bit(LCD_DATA5, bit_test(karakter,5));
  79.        output_bit(LCD_DATA6, bit_test(karakter,6));
  80.        output_bit(LCD_DATA7, bit_test(karakter,7));
  81.        
  82.        LCD_enable();
  83.        
  84.        output_bit(LCD_DATA4, bit_test(karakter,0));
  85.        output_bit(LCD_DATA5, bit_test(karakter,1));
  86.        output_bit(LCD_DATA6, bit_test(karakter,2));
  87.        output_bit(LCD_DATA7, bit_test(karakter,3));
  88.        
  89.        LCD_enable();
  90.        delay_us(100); //FONTOS!!!
  91.        
  92. }
  93. void bit16szam_konverzio_BCD(signed int16 bit16) //16 bites elojeles szam konverzioja BCD-be
  94. {
  95.        signed int16 atmeneti=0;
  96.        tizezres=0;
  97.        ezres=0;
  98.        szazas=0;
  99.        tizes=0;
  100.        egyes=0;
  101.        atmeneti=bit16-10000;
  102.        
  103.        while (atmeneti>=0)
  104.        {
  105.             bit16=bit16-10000;
  106.             tizezres++;
  107.             atmeneti=atmeneti-10000;
  108.        }
  109.        
  110.        atmeneti=bit16-1000;
  111.        while (atmeneti>=0)
  112.        {
  113.             bit16=bit16-1000;
  114.             ezres++;
  115.             atmeneti=atmeneti-1000;
  116.        }
  117.        atmeneti=bit16-100;
  118.        while (atmeneti>=0)
  119.        {
  120.             bit16=bit16-100;
  121.             szazas++;
  122.             atmeneti=atmeneti-100;
  123.        }
  124.        atmeneti=bit16-10;
  125.        while (atmeneti>=0)
  126.        {
  127.             bit16=bit16-10;
  128.             tizes++;
  129.             atmeneti=atmeneti-10;
  130.        }
  131.        
  132.        egyes=bit16;
  133. }
  134.  
  135. #INT_RA
  136. void interrupt_kezeles(void)
  137. {
  138.        signed int16 kijelzendoertek=0;
  139.          #ASM
  140.            MOVLB 0x07 ;//  BANKSEL IOCAP;
  141.            MOVLW 0x00; // MOVLW B'00000000' ; PA2 POZITIV INTERRUPT ON CHANGE-RE ALLITVA LETILTÁSA
  142.            MOVWF 0x11; // MOVWF IOCAP;
  143.         #ENDASM
  144.        
  145.         #ASM
  146.             MOVLB 0x07; // BANKSEL IOCAF;
  147.             MOVLW 0x00; // MOVLW B'00000000'; interrupt flag torlese
  148.             MOVWF 0x13; // MOVWF IOCAF;
  149.          #ENDASM
  150.        
  151.          if (gomb==1) //egyik felfutó élre
  152.          {
  153.             gomb=0;
  154.            
  155.             LCD_kepernyotorles();
  156.                
  157.             LCD_karakterkiiratas(49);//1-es karakter
  158.             LCD_karakterkiiratas(50);//2-es karakter
  159.             LCD_karakterkiiratas(51);//3-as karakter
  160.          }
  161.          else //másik felfutó élre
  162.          {
  163.             gomb=1;
  164.             kijelzendoertek=9876;
  165.            
  166.             LCD_kepernyotorles();
  167.            
  168.             bit16szam_konverzio_BCD(kijelzendoertek);
  169.             if (tizezres!=0)
  170.                LCD_karakterkiiratas(tizezres+48);
  171.             if (tizezres!=0 || ezres!=0)
  172.                LCD_karakterkiiratas(ezres+48);
  173.             if (tizezres!=0 || ezres!=0 || szazas!=0)
  174.                LCD_karakterkiiratas(szazas+48);
  175.             if (tizezres!=0 || ezres!=0 || szazas!=0 || tizes!=0)
  176.                LCD_karakterkiiratas(tizes+48);
  177.             LCD_karakterkiiratas(egyes+48);
  178.          }
  179.      
  180.        delay_ms(10);
  181.        #ASM
  182.           MOVLB 0x07 ;//  BANKSEL IOCAP;
  183.           MOVLW 0x04; // MOVLW B'00000100' ; PA2 POZITIV INTERRUPT ON CHANGE-RE ALLITVA
  184.           MOVWF 0x11; // MOVWF IOCAP;
  185.           MOVLW 0x88;
  186.           MOVWF 0x0B; //INTCON
  187.         #ENDASM
  188.      
  189. }
  190.  
  191.  
  192.    
  193. void main(void)
  194. {
  195.    gomb=1;
  196.    szamlalo=9876;
  197.    
  198.    //LCD inicializálás
  199.    delay_ms(2000);
  200.    lcd_incializalas();
  201.    LCD_memoriacim(1,1);
  202.                
  203.        
  204.    bit16szam_konverzio_BCD(szamlalo);  
  205.    if (tizezres!=0)
  206.          LCD_karakterkiiratas(tizezres+48);
  207.    if (tizezres!=0 || ezres!=0)
  208.          LCD_karakterkiiratas(ezres+48);
  209.    if (tizezres!=0 || ezres!=0 || szazas!=0)
  210.          LCD_karakterkiiratas(szazas+48);
  211.    if (tizezres!=0 || ezres!=0 || szazas!=0 || tizes!=0)
  212.          LCD_karakterkiiratas(tizes+48);
  213.    LCD_karakterkiiratas(egyes+48);
  214.  
  215.    //PORTA:2-n IOC interrupt inicializálása
  216.    #ASM
  217.       MOVLB 0x00; // BANKSEL 0
  218.       CLRF 0x0C ; // PORTA torlese
  219.       MOVLB 0x02 ; // BANKSEL 2
  220.       CLRF 0x0C ; // clear LATA
  221.       MOVLB 0x03; // BANKSEL ANSELA ;
  222.       CLRF 0x0C; // digital I/O
  223.       MOVLB 0x01; //  BANKSEL TRISA ;
  224.       MOVLW 0x04 ; // Set RA2 as inputs, tobbi output
  225.       MOVWF 0x0C;      // MOVWF TRISA
  226.       MOVLB 0x07 ;//  BANKSEL IOCAP;
  227.       MOVLW 0x04; // MOVLW B'00000100' ; PA2 POZITIV INTERRUPT ON CHANGE-RE ALLITVA
  228.       MOVWF 0x11; // MOVWF IOCAP;
  229.  
  230.       MOVLW 0x08;
  231.       MOVWF 0x0B; //INTCON
  232.    #ENDASM
  233.    ENABLE_INTERRUPTS(GLOBAL);
  234.  
  235.    int seged1, seged2;
  236.    while (TRUE)
  237.    {
  238.           seged1=0;
  239.           seged2=0;
  240.           seged1=0;
  241.           seged2=0;
  242.           seged1=0;
  243.           seged2=0;
  244.    }
  245.    
  246. }
A hozzászólás módosítva: Júl 10, 2013
(#) mrcdcscc válasza mrcdcscc hozzászólására (») Júl 10, 2013 /
 
Tovább tesztelve a programot úgy látom, hogy az interruptnak a szubrutinjában meghívva a bit16szam_konverzio_BCD(kijelzendoertek) szubrutint az lefut, de nem adódik át neki a kijelzendoertek, ezert ir ki 0-t. Valaki meg tudná magyarázni nekem, hogy mi az oka annak, hogy a szubrutint meghívva miért nem adódik át a paraméterben megadott érték?
A hozzászólás módosítva: Júl 10, 2013
(#) sysy válasza mrcdcscc hozzászólására (») Júl 10, 2013 /
 
Lehet, hogy a bit16 kulcsszó a fordítónak és nem lehet használni változó névnek? Így kis betűvel még veszélyesebb. Próbáld ki valami másik névvel. Hátha...
(#) mrcdcscc válasza sysy hozzászólására (») Júl 10, 2013 /
 
Megváltoztattam a bit16 változónevet másra, de nemez volt a gond. Viszont még tovább kísérletezve azt vettem észre, hogy ha az interrupton belul a bit16szam_konverzio_BCD() függvényt úgy hívom meg, hogy bit16szam_konverzio_BCD(9876), akkor szépen kiírja a kijelzőre a 9876 számokat, viszont ha a
kijelzendoertek=9876;
LCD_kepernyotorles();
bit16szam_konverzio_BCD(kijelzendoertek);
módon hívom meg, akkor 0-t ad át függvényparaméternek.

Ha viszont felcserelem ebből a 3 sorból az első kettőt, akkor meg már jól működik:
LCD_kepernyotorles();
kijelzendoertek=9876;
bit16szam_konverzio_BCD(kijelzendoertek);
Azaz ha a változónak közvetlenül az előtt adok értéket, mielőtt meghívnám a bit16szam_konverzio_BCD() szubrutint.

Miért nem mindegy a sorrend?
(#) efiscp válasza mrcdcscc hozzászólására (») Júl 10, 2013 /
 
Szia!

Több dolog, ami megütötte a szemem:

Szerintem ezeket az ASM blokkokat nem érdemes erőltetni, mivel a CCS-nek vannak függvényei, amik megcsinálják (pl. interrupt beállítás). Egy csomó minden automatikusan megy, pl. az interrupt letiltása (ez ráadásul hardware-ből, a flag csak a compiler közbenjárására törlődik), miközben épp az interrupt fut. Ezt a programot meg lehet csinálni teljesen C nyelven, ezzel csak a hibát viszed be szerintem.

A TRIS állítgatását is elvégzi a compiler, hacsak nem használsz FAST_IO-t.

Magára a hibára: szerintem próbáld meg a printf, sprintf, stb. beépített függvényekkel. Ezek tudják az int->string konverziót. Ha jól emlékszem, arra is van lehetőség, hogy a printf függvényben megadd az argumentumban, hogy melyik függvény írja ki a kijelzőre a karaktert (függvény pointer), és akkor így közvetlenül mehet a kijelzőre is. (egy kis segítség: Bővebben: Link)

Ja és a CCS fórumon van egy flex_lcd.c nevezetű kis könyvtár, amia h44780-kompatibilis kijelzők meghajtására van. Szóval neked nem is kell megírnod ezt a részét.
A hozzászólás módosítva: Júl 10, 2013
(#) mrcdcscc válasza efiscp hozzászólására (») Júl 10, 2013 /
 
Kedves efiscp!

Nagyon szépen köszönöm, hogy foglalkoztál a problémámmal és válaszoltál, és részben a megérzésed az ASM blokkal igaznak is bizonyult. Ugyanis közben a CCS által készített .lst file átbogarászása során szerencsére rájöttem a problémára. Az interrupt-ot lekezelő void bit16szam_konverzio_BCD(signed int16 bit16_szam) szubrutinban levő ASM blokkban a bankváltást csináltam a 7-es bankra, amit aztán nem váltottam vissza. A CCS viszont a változóimat a 0-ás bank General Purpose Registereben helyezte el. A CCS a LCD_kepernyotorles(); (és egyébként minden más szubrutint) úgy fejezett be, hogy a bank-ot a 0-ásra váltotta vissza, ezért amikor először azt írtam a kódba, és utána jött a változónak az értékadás, akkor jól működött a dolog, fordítva meg nem.

Az ASM blokk azért kellett bele, mert valamiért a CCS függvényeivel megírt interrupt-on-change megszakítás a PORTA,2-es pinen (illetve más PORTA pinen) sem működött rendesen. Ráadásul ezen 16F1829-es chipnek a PORTB-jén is van ilyen interrupt-on-change lehetőség, viszont a CCS-ben ezen chiphez tartozó PIC16F1829.h header file alapján az enable_interrupt() utasításba csak PORTA-t, vagy PORTA-s pineket írhatok, PORTB-t egyáltalán nem. Nekem meg majd a PORTB kell.
Az, hogy CCS saját függvényeit felhasználva nem működik az interrupt-on-change megszakítás rendesen szintén megírtam ide a fórumba Bővebben: Link, de arra senki nem válaszolt.
Pedig lehet csak én rontok el ott is valamit, és örülnék, ha legalább a PORTA menne a CCS beépített függvényeivel.
A hozzászólás módosítva: Júl 10, 2013
Következő: »»   87 / 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