Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: lagyna, idő: Ápr 3, 2006
Lapozás: OK   116 / 116
(#) Lamprologus válasza bazsamasza hozzászólására (») Ápr 30, 2017 /
 
Nem mazsolázstam végig de szerintem itt megtalálod amit keresel ( valahol
az első lap utolsó hozzászólásában létrehoz egy Custom_chars tömböt amiben definiálni kell a karaktert, gondolom valahol a kódban az is benn van hogyan tölti be az LCD-be)
A hozzászólás módosítva: Ápr 30, 2017
(#) Gyimate hozzászólása Jún 13, 2017 /
 
Sziasztok!

CCS-C-ben (5.059-es verzió) próbálok dsPIC programmemóriát írni, de eddig nem sok sikerrel. A jelenség egyszerű, nem történik semmi. Próbálkoztam szimulátorral is, illetve a rendes HW-el is, de hiába. Megpróbáltam egyetlen cella írásával, illetve egy egész blokkal is , de hiába. A Flash törlés funkció sem működik megfelelően, annál beleír ugyan a memóriába, de a törlés helyett a memória címét írja csak bele. Valaki közületek próbált már hasonló mikrokontrollerben programmemóriát írni, és ha sikerült neki, megosztaná a tapasztalatait?

Kösz szépen!
(#) Lamprologus válasza Gyimate hozzászólására (») Jún 13, 2017 /
 
Nem tudom hogyan álltál neki, a drivers mappában van egy virtual_eeprom.c fájl, az segíthet...
Meg érdemes szétnézni a CCS fórumon, ott én még mindig megtaláltam amire szükségem volt.
PIC24-nél játszottam egy darabig, program memoriában lementeni adatokat, működött, de a végén mégis inkább kapott egy külső eepromot.
A hozzászólás módosítva: Jún 13, 2017
(#) Gyimate válasza Lamprologus hozzászólására (») Jún 13, 2017 /
 
Kösz szépen!
Holnap megpróbálom ezt a módszert, hátha működik. PIC18-ban már sikeresen írtam a program memóriába, remélem, hogy itt is sikerülni fog.
(#) Tardief hozzászólása Aug 29, 2017 /
 
Sziasztok!
Éppen ismerkedek a mikrokontrollerekkel és egy kis segítségre lenne szükségem.
Egy PIC-ről szeretnék átküldeni adatot egy másikra UART RS232-vel.

Ez küldeni az adatot. Kezdésnek csak egy számot szeretnék.
  1. #include <16F690.h>
  2. #device ADC=16
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES NOBROWNOUT               //No brownout reset
  6.  
  7. #use delay(internal=4000000)
  8. #use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B5,bits=8,stream=PORT1)
  9.  
  10. #include <errno.h>
  11. #include <math.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <stdio.h>
  15. #include <stdint.h>
  16.  
  17. void main()
  18. {
  19.    int value = 5;
  20.    while(TRUE)
  21.    {
  22.    
  23.       if(!input(Pin_c0)){
  24.         putc(value);
  25.       }
  26.       output_bit(Pin_b7, 0);
  27.       delay_ms(100);
  28.    
  29.    }
  30. }


Ez pedig fogadná.
C0-ra egy LED-et kötöttem, aminek annyiszor kéne felvillannia amekkora a kapott szám értéke.
A valóságban viszont nem 5-öt, hanem rengeteget villan a LED és egyszerűen nem tudom, hogy miért.
A B6 láb 1-re billentésével jelzi a más PIC-nek, hogy küldje az adatot.

  1. //#include <UartRec2.h>
  2. #include <16F690.h>
  3. #device ADC=16
  4.  
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES NOBROWNOUT               //No brownout reset
  7.  
  8. #use delay(internal=4000000)
  9. #use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B5,bits=8,stream=PORT1)
  10.  
  11.  
  12. #include <errno.h>
  13. #include <math.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <stdio.h>
  17.  
  18. void main()
  19. {
  20.    
  21.    int value= 2;
  22.    output_bit(Pin_c0, 0);
  23.    output_bit(Pin_b6, 1);
  24.    while(TRUE)
  25.    {
  26.       output_bit(Pin_b6, 0);
  27.       delay_ms(20);
  28.         if (kbhit()) {
  29.            delay_ms(50);
  30.            value = getc();
  31.            delay_ms(50);
  32.         }
  33.       output_bit(Pin_b6, 1);
  34.        
  35.          for(int i=0; i<value;i++){
  36.             output_bit(Pin_c0, 1);
  37.             delay_ms(50);
  38.             output_bit(Pin_c0, 0);
  39.             delay_ms(50);
  40.          }
  41.          
  42.          output_bit(Pin_c0, 1);
  43.          delay_ms(1000);
  44.          output_bit(Pin_c0, 0);
  45.          delay_ms(500);
  46.      
  47.    }
  48.  
  49. }


Mindkettő egy 16f690 és belső oszcillátorról megy.


Köszönöm!
(#) Tardief válasza Tardief hozzászólására (») Aug 29, 2017 /
 
A cél egyébként az lenne, hogy egy PIC feszültséget mér, majd továbbítja kb. 15m vezetéken keresztül a mért adatot. Nincs is szükség duplex kommunikációra.
Lehet, hogy nem is ilyen megoldással kéne elvégezni a feladatot?
(#) Lamprologus válasza Tardief hozzászólására (») Aug 29, 2017 /
 
Jól küldi ki az adatokat az adó PIC?
Logikai analizátorral vagy PC terminál programmal meg tudod nézni?

Esetleg MPlab nyomkövetésben megnézni mit vesz a második PIC...
(#) Tardief válasza Lamprologus hozzászólására (») Aug 29, 2017 /
 
Megnéztem oszcilloszkópon az adó PIC-et és szépen elküldi a biteket.

A vevő PIC nyomkövetését még meg kell néznem, hogy hogy is kell.
(#) Gyimate válasza Tardief hozzászólására (») Aug 31, 2017 / 1
 
Szia,
Próbáld meg feltölteni ezeket a kódokat és nézd meg, hogy ezekkel működik-e a dolog.

Adó:
  1. #include <16F690.h>
  2. #device ADC=16
  3. #use delay(internal=4M)
  4.  
  5. #use rs232(baud=9600, xmit=PIN_B7, rcv=PIN_B5)
  6.  
  7. void main ()
  8. {
  9.    unsigned char value = 5;
  10.    for (;;)
  11.    {
  12.       if(!input(Pin_c0))            // Figyeljük, hogy megnyomták-e a gombot
  13.       {
  14.          putc (value);              // Gombnyomást követően elküldjük UART-on az értéket
  15.          delay_ms (50);             // Prellmentesítés
  16.          while (!input(Pin_c0));    // Majd addig várakozunk, amíg a gombot nyomva tartják
  17.       }
  18.    }
  19. }


Vevő:

  1. #include <16F690.h>
  2. #device ADC=16
  3. #use delay(internal=4M)
  4.  
  5. #use rs232(baud=9600, xmit=PIN_B7, rcv=PIN_B5)
  6.  
  7. void main ()
  8. {
  9.    unsigned char value = 0;
  10.    unsigned char count = 0;
  11.    for (;;)
  12.    {
  13.       while (!kbhit ());         // Amíg nem érkezik adat az UART-on, várakozunk
  14.       value = getc ();           // Ha a kbhit () 1-et ad vissza, akkor kilépünk a while ciklusból és kiolvassuk a vett bájtot
  15.      
  16.       for (count = 0; count < value; count++)   // A for ciklusban pedig annyit villantunk a leden, amekkora a value értéke
  17.       {
  18.          output_high (PIN_C0);
  19.          delay_ms (100);
  20.          output_low (PIN_C0);
  21.          delay_ms (100);
  22.       }
  23.    }
  24. }


Üdv Máté
(#) Tardief válasza Gyimate hozzászólására (») Szept 1, 2017 /
 
Köszönöm!
Sajnos legkorábban hétfőn tudom kipróbálni.
A kód formázásában is van hova fejlődnöm.
(#) Jossz hozzászólása Szept 2, 2017 /
 
Sziasztok,
A segítségeteket szeretnék kérni FT800, ill. FT810 EVE fejlesztő modul témában.
Nemrég vettem egy FT800-ra épülő vm800b50a-bk EVE fejlesztő modult, illetve egy ugyancsak 5"-os 800x480-as FT810-es fejlesztő modult és szeretném használni PIC18F, ill. PIC24HJ MCU-val. Miután CCS C-vel dolgozom, az lenne a kérdésem, lenne-e valakinek az FT800-hoz, és/vagy az FT810-hez kimondottan CCS C-ben írt drivere és egy kis mintaprogramja, amelyen kicsit könnyebben el tudnék indulni, mint a gyári programozói leírásán, mert meg akarom tanulni a használatát. Vagy, ha nincs senkinek ilyen, akkor esetleg tudna-e valaki valahol a neten ilyenről (sokat kerestem, de nem találtam eddig), ha fizetős a csomag, az sem baj.
Előre is köszönöm a segítségeteket!
(#) Tardief válasza Gyimate hozzászólására (») Szept 14, 2017 /
 
Bocsánat a késői válaszért.
Kipróbáltam és működik is. Köszönöm! Sokat segített a megértésben.
(#) Tardief hozzászólása Okt 11, 2017 /
 
Sziasztok!
Egy PIC16f690 segítségével szeretnék adatokat kiírni egy 2x16-os LCD-re.
Sajnos bárhogy próbálkozok nem történik semmi.
A ccs c által készített példaprogramot is kipróbáltam, de a kijelzőn nem látható semmi.
A kontrasztot beállítottam úgy, hogy a "dobozok" éppen láthatóak legyenek.

  1. #include <TestLCD.h>
  2. #fuses   nomclr
  3. #include <LCD.C>
  4.  
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #define LCD_ENABLE_PIN PIN_C2
  9. #define LCD_RS_PIN PIN_C0
  10. #define LCD_RW_PIN PIN_C1
  11. #define LCD_DATA4 PIN_C3
  12. #define LCD_DATA5 PIN_C4
  13. #define LCD_DATA6 PIN_C5
  14. #define LCD_DATA7 PIN_C6
  15.  
  16. #include <lcd.c>
  17.  
  18. void main()
  19. {
  20.  
  21.  
  22.    lcd_init();
  23.  
  24.    lcd_init();
  25.    delay_ms(1000);
  26.    lcd_putc("\fReady...\n");
  27.  
  28.    while(TRUE)
  29.    {
  30.  
  31.  
  32.  
  33.             lcd_putc('\f');
  34.             lcd_gotoxy(3, 1);
  35.             printf(lcd_putc, "Temperature:");
  36.             delay_ms(1000);
  37.  
  38.    }
  39.  
  40. }


Itt van a kód amivel próbálkoztam.
Az lcd_init(); függvénynél akad el, de nem tudom miért.

Minden segítséget előre is köszönök.
A hozzászólás módosítva: Okt 11, 2017
(#) Hp41C válasza Tardief hozzászólására (») Okt 11, 2017 / 1
 
Az lcd_init eljárás várakozásokat tartalmaz, felhasználása előtt be meg kell adni az órajel frekvenciáját. Az LDC -re menő vonalakat kimenetté kellene és (mivel analóg funkciójuk is van) digitális módra célszerű állítani.
Bővebben: Link
(#) Tardief válasza Hp41C hozzászólására (») Okt 11, 2017 /
 
Köszönöm.
A tanácsok és a link alapján keresgéltem és végül sikerült is.
Továbbra sem értem, hogy a fordító mintaprogramja miért nem jó, de ez már nem is annyira lényeges.
(#) Lamprologus hozzászólása Jan 10, 2018 /
 
Egy olyan feladatot szeretnék megoldani, hogy ugyan azt a programot kéne lefordítani két különböző lábkiosztású áramkörre. ( tehát mondjuk az egyik panelon az LCD kijelző lábkiosztása más mint a másik panelon, de egyébként minden azonos)
Létezik arra lehetőség, hogy fordító megálljon, és megkérdezze melyik verziót akarom fordítani?

"Kőbaltás" módszerrel így oldanám meg, csak lehet elfelejtem kikommentelni a megfelelő sort mielőtt rányomok a fordításra.

  1. #define egyik
  2. // #define masik
  3.  
  4. #ifdef egyik
  5.   #define LCD_ENABLE_PIN  PIN_E2
  6.   #define LCD_RS_PIN      PIN_E4
  7.   #define LCD_RW_PIN      PIN_E3
  8.   #define LCD_DATA4       PIN_E1
  9.   #define LCD_DATA5       PIN_E0
  10.   #define LCD_DATA6       PIN_F1
  11.   #define LCD_DATA7       PIN_F0
  12.   #define LCD_A   PIN_D5
  13. #endif
  14.  
  15. #ifdef masik
  16.   #define LCD_ENABLE_PIN  PIN_F1
  17.   #define LCD_RS_PIN      PIN_F2
  18.   #define LCD_RW_PIN      PIN_F3
  19.   #define LCD_DATA4       PIN_F4
  20.   #define LCD_DATA5       PIN_F5
  21.   #define LCD_DATA6       PIN_F6
  22.   #define LCD_DATA7       PIN_F7
  23.   #define LCD_A   PIN_D5
  24. #endif
(#) Lucifer válasza Lamprologus hozzászólására (») Jan 10, 2018 /
 
Idézet:
„Létezik arra lehetőség, hogy fordító megálljon, és megkérdezze melyik verziót akarom fordítani?”


Fordítónál szerintem nem, de a Makefile-ba bele lehetne patkolni egy ilyen szkriptet ami bekéri ezt.

Idézet:
„"Kőbaltás" módszerrel így oldanám meg, csak lehet elfelejtem kikommentelni a megfelelő sort mielőtt rányomok a fordításra.


A fordítónak -Degyik segítségével tudsz define-okat átadni. (Ez olyan mintha a #define VALAMI-t írnál be.)
(#) Jossz hozzászólása Júl 16, 2018 /
 
Sziasztok,
Segítségre lenne szükségem. Adva van egy programom, amelyben a display szöveges üzeneteit egy const char tömbben tárolom. Kénytelen vagyok const tömböt alkalmazni, mert egyébként nem férek el a RAM-ban. Szeretném megoldani, hogy egy változó futás-közbeni átállításával a program szövegei angolul jelenjenek meg, így készítettem egy ugyanolyan elemszámú és méretű const char tömböt az angol szövegeknek is. Eddig nincs is gond, így szépen elfér mindkettő. A problémám ott kezdődik, hogy nem tudom, miként tudnám az angol szöveget tartalmazó const tömböt átmásolni a magyar szöveget tartalmazó const tömbbe, felülírva az abban levő elemeket. Az átmásolásra azért van szükség, mert a program az eredetileg magyar szöveget tartalmazó tömb megnevezését használja mindenhol, így annak a tartalmát kell megváltoztatnom. Lenne valami ötletetek a másolás elvégzésének módjára?
Előre is köszi a segítséget!
A hozzászólás módosítva: Júl 16, 2018
(#) bbb válasza Jossz hozzászólására (») Júl 16, 2018 /
 
Azért konstans, hogy az már ne változzon. A programodat kell átírni, nem a tömböket macerálni. Meg egyébként is, ha utána visszaállna magyarra, akkor azt hogyan tenné, ha felülírtad?
Én egyébként úgy csinálnám, hogy lenne egy nyelv pointer változóm, amit lehetne változtatni, s ennek adnám meg először a magyar tömb kezdőcímét, ha meg változás van, akkor az angolét. Így vissza is tudsz állni, ha kell, s a csere is egy pillanat műve.
(#) Jossz válasza bbb hozzászólására (») Júl 16, 2018 /
 
Kedves Bence, az ötleted nagyon jó, köszönöm, viszont kérlek, segíts kicsit, mert nincs sok gyakorlatom a pointer direkt programozásban, így a szintaxisában sem.
Idemásolok egy programrészletet, kérdőjelekkel jelöltem meg a pointer beállítási részt (mármint ahol szerintem lennie kellene), kérlek, pontosítsd, hogy Te hogyan csinálnád. Előre is köszönöm a fáradozásod.

  1. //----változók definiálása----
  2. .
  3. int nyelv; //nyelvet beállító változó
  4. .
  5. //----nyelvi konstansok-------
  6. char *muvkiir[32]; // pointer, 32 elemű tömb, minden kiírás előkészítésnél erre történik hivatkozás (elemszámmal)
  7.  
  8. char const muvkiir_hun[32][22] = {{"Hibajelentes"},{"PUTD HIBA!"},{"SETUP vetel HIBA!"},{"Kilep"},…}; //magyar szöveg, 32 elemű tömb
  9.  
  10. char const muvkiir_eng[32][22] = {{"Error report"},{"PUTD ERROR"},{"SETUP rec. ERROR!"},{"Exit "},…}; //angol szöveg, 32 elemű tömb
  11. .
  12. void main() {
  13.         .
  14.         //---Nyelvi szövegek beállítása (nyelv=0 magyar, nyelv=1 angol)---
  15.         if(nyelv==0) {
  16.                 ??????;
  17.         }
  18.         else {
  19.                 ??????;
  20.         }
  21.         .
  22. strcpy(char_kiiras1,muvkiir[18]);              //"Beallitasok" (18. elem) szöveg kiírás előkészítése
  23. .
  24. glcd_text57(28, 6, char_kiiras1, 1, ON);        // Display "Beallitasok" kiírás a grafikus LCD-re
  25. .
  26. }
(#) bbb válasza Jossz hozzászólására (») Júl 16, 2018 /
 
Őszintén nem látom a kódodban a muvkiir pointer szerepét és, hogy hol adod meg neki az értéket.
Én úgy csinálnám, hogy beállítanám a pointert, hogy mutasson az egyik tömb kezdőcímére (pointer=tomb1), ha meg váltani kell, akkor meg a másik címére (pointer=tomb2).
Annyi a lényeg, hogy a pointer típusa egyezzen meg azzal, amire mutat, az se baj, ha ugyan abban a sorban definiálod őket (pl. unsigned char valtozo, *valtozoramutatopointer; ).
A hozzászólás módosítva: Júl 16, 2018
(#) Jossz válasza bbb hozzászólására (») Júl 16, 2018 /
 
A 'muvkiir' pointer szerepe az lenne, hogy tartalmazza annak a tömbnek az elemeinek a címét, amelyet kiválasztottunk. A 22. sorban láthatod a felhasználását. Jelenleg az egynyelvű verzióban ez egy char const tömb, amelyben a magyar szövegek vannak. Miután ez több száz helyen van a 22. sorhoz hasonlóan használva a programban, ezért úgy gondoltam, hogy az a legegyszerűbb, ha ezt definiálom át a program elején pointernek és a magyar és angol szövegeket tartalmazó tömbök pedig a 'muvkiir_hun', ill. a 'muvkiir_eng' nevű char const típusú tömbökbe kerültek. Így a tanácsod alapján a 'muvkiir pointer' a 'nyelv' változó beállítása, ill. értékadása alapján vagy a 'muvkiir_hun', vagy a 'muvkiir_eng' tömbre mutat, igaz? Az értékadást azért nem látod a kódban, mert nem tudtam a szintaxisát, így kérdőjeleket írtam a helyére. Nem gondoltam, hogy a pointer értékadás egy sima egyenlővé tétellel megoldható... Ezek szerint az alábbi változat lenne a jó megoldás?
  1. //----változók definiálása----
  2. .
  3. .
  4. int nyelv; //nyelvet beállító változó
  5. char char_kiiras1[22];
  6. .
  7. .
  8. .
  9. //----nyelvi konstansok-------
  10. char const *muvkiir; // pointer, minden kiírás előkészítésnél erre történik hivatkozás (elemszámmal)
  11.  
  12. char const muvkiir_hun[32][22] = {{"Hibajelentes"},{"PUTD HIBA!"},{"SETUP vetel HIBA!"},{"Kilep"},…}; //magyar szöveg
  13.  
  14. char const muvkiir_eng[32][22] = {{"Error report"},{"PUTD ERROR"},{"SETUP rec. ERROR!"},{"Exit "},…}; //angol szöveg
  15. .
  16. .
  17. .
  18. void main() {
  19.         .
  20.         //---Nyelvi szövegek beállítása (nyelv=0 magyar, nyelv=1 angol)---
  21.         if(nyelv==0) {
  22.                 muvkiir = muvkiir_hun;
  23.         }
  24.         else {
  25.                 muvkiir = muvkiir_eng;
  26.         }
  27.         .
  28.         .
  29.         .
  30. strcpy(char_kiiras1,muvkiir[18]);              //"Beallitasok" szöveg kiírás előkészítése
  31. .
  32. .
  33. .
  34. glcd_text57(28, 6, char_kiiras1, 1, ON);        // Display "Beallitasok"
  35. .
  36. .
  37.  
  38. }
(#) bbb válasza Jossz hozzászólására (») Júl 16, 2018 /
 
Próbáld ki, de nagyjából jónak tűnik.
(#) pipi válasza Jossz hozzászólására (») Júl 17, 2018 /
 
Ha mégsem működik... akkor inkább szerintem
char const *muvkiir[32][22];
de nézd meg szimulátorban/debuggerben ...
A hozzászólás módosítva: Júl 17, 2018
(#) Lamprologus hozzászólása Nov 12, 2018 /
 
SPI kommunikációval küzdök ( PIC24FJ256BG106)
Az engedélyező kimenet átvált, de az órajel nem megy ki ... így adatok sem érkezhetnek be ...
Be kéne még valami mást is állítanom?

  1. #define MAX6675_CS PIN_D0
  2.        
  3.     #pin_select SCK2OUT=PIN_C14
  4.     #pin_select SDI2=PIN_D8
  5.     #use spi(MASTER, SPI2, MODE=0, BITS=16, ENABLE=MAX6675_CS, stream=SPI_MAX6675)
  6.  
  7.     setup_spi2(SPI_MASTER | SPI_L_TO_H | SPI_XMIT_L_TO_H | SPI_CLK_DIV_64);
  8.  
  9. ...
  10.  
  11.     output_low(MAX6675_CS);
  12.     delay_cycles(1);     
  13.     data=spi_xfer(SPI_MAX6675, 0L);
  14.     delay_cycles(1);
  15.     output_high(MAX6675_CS);
(#) Lamprologus hozzászólása Dec 7, 2018 /
 
Az alábbi két függvény közül az egyik visszatérési értéke 2!!!!!!
Miért?????

  1. int1  Bemenet_lekerdezes(unsigned int16 Bemenet, int1 Aktiv_magas)
  2. {
  3.     int1 a;
  4.    
  5.     if (Aktiv_magas==1)
  6.         a=(input(Bemenet));
  7.     else a=(!input(Bemenet));
  8.    
  9.     return(a);
  10. }


  1. int1  Bemenet_lekerdezes(unsigned int16 Bemenet, int1 Aktiv_magas)
  2. {
  3.     if (Aktiv_magas==1)
  4.         return(input(Bemenet));
  5.     else return (!input(Bemenet));
  6. }
A hozzászólás módosítva: Dec 7, 2018
(#) sysy válasza Lamprologus hozzászólására (») Dec 7, 2018 /
 
int1-be hogyan fér bele 2?
(#) Lamprologus válasza sysy hozzászólására (») Dec 7, 2018 /
 
Hát ez az!!! És honnan jön???
És nem egyenértékű a két megoldás?
A hozzászólás módosítva: Dec 7, 2018
Következő: »»   116 / 116
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu