Fórum témák

» Több friss téma
Fórum
Keresés
Lapozás: OK   2 / 117
(#) Lamprologus válasza Hp41C hozzászólására (») Jan 10, 2019
Bocsi, lehet én fogalmaztam pontatlanul, vagy valamit nem veszek észre a válaszodban!

Van egy PIC-en két Nextion kijelző. A feladat az lenne, ha az A kijelzőn nyomok egy gombot akkor oda küldje vissza az adatokat, ha a B-n akkor oda. 10-20 adat lenne ablakonként, 15-20 ablak, és nem akarom kétszer leírni szinte ugyan azt a programba, azért lenne jó ha egy paraméter ( Pl a stream, csak az sajna nem működik nekem) átírásával a másik porta küldené ki.
(#) Hp41C válasza Lamprologus hozzászólására (») Jan 10, 2019
Sajnos csak a kérdést olvastad el, a megoldást nem. Pedig ott van alatta...
  1. #USE RS232 (BAUD = 9600, XMIT = PIN_B0, RCV = PIN_B1, STREAM = COM_A)
  2. #USE RS232 (BAUD = 9600, XMIT = PIN_B2, RCV = PIN_B3, STREAM = COM_B)
  3.  
  4. void main(void) {
  5.    char c;
  6.    
  7.    fprintf(COM_A, "Online\n\r");
  8.    fprintf(COM_B, "Online\n\r");
  9.    
  10.    while(TRUE) {
  11.       c = fgetc(COM_A);
  12.      
  13.       fputc(c, COM_A);
  14.       fputc(c, COM_B);
  15.    }
  16. }
(#) Lamprologus válasza Hp41C hozzászólására (») Jan 10, 2019
  1. #USE RS232 (BAUD = 9600, XMIT = PIN_B0, RCV = PIN_B1)
  2.  
  3. void put_to_a(char c) {
  4.    put(c);
  5. }
  6.  
  7. char get_from_a(void) {
  8.    return(getc());
  9. }
  10.  
  11. #USE RS232 (BAUD = 9600, XMIT = PIN_B2, RCV = PIN_B3)
  12.  
  13. void put_to_b(char b) {
  14.    putc(c);
  15. }
  16.  
  17. void main(void) {
  18.    char c;
  19.    
  20.    put_to_a("Online\n\r");
  21.    put_to_b("Online\n\r");
  22.    
  23.    while(TRUE) {
  24.       c = get_from_a();
  25.      
  26.       put_to_b(c);
  27.       put_to_a(c);
  28.    }
  29. }


Ha jól értelmezem akkor az első #use rs232 ... sor utáni függvények a B0, B1 lábakat használják, a második #use rs232 ... után a B2, B3-at, függetlenül attól honnan vannak meghívva?
A főciklusba, ha beteszek egy putc(c)-t az hova küldi az adatot? Az utolsó #use rs232-t veszi figyelembe?
Bááár ... nem tudom ez megoldás-e az én problémámra.
A hozzászólás módosítva: Jan 10, 2019
(#) Lamprologus válasza Lucifer hozzászólására (») Jan 10, 2019
Próbáltam, de a UART_NEXTION helyén változót nem fogad el, csak olyan értéket fogad el amit az #use rs232-nél adok meg.
(#) Lucifer válasza Lamprologus hozzászólására (») Jan 10, 2019
Az fprintf első paramétere a stream (esetedben UART_NEXTION). Ha ide a másik UART streamet adod át akkor oda fog printelni.
(#) Hp41C válasza Lamprologus hozzászólására (») Jan 10, 2019
(#) Lamprologus hozzászólása Jan 10, 2019
Hogyan tudnám az fprintf-sort úgy "paraméterezni", hogy másik UART protra küldje ki az adatokat.
Magyarul van két nextion kijelző egy PIC-en és néha az egyikre néha a másikra kéne küldeni az adatokat, attól függően melyikről érkezett be adat.

  1. #pin_select U1TX=PIN_D1
  2. #pin_select U1RX=PIN_D2
  3. #use rs232(UART1, baud=115200, RECEIVE_BUFFER=0, TRANSMIT_BUFFER=0, stream=UART_NEXTION)
  4. ...
  5. fprintf(UART_NEXTION,"t10.txt=\"%s\"%c%c%c",Uzem[Erzekelo_hiba],0xFF, 0xFF, 0xFF);
(#) sysy válasza Jani_80 hozzászólására (») Jan 4, 2019
#asm
.
.
.
.
#endasm
(#) Jani_80 hozzászólása Jan 4, 2019
Sziasztok! Azt szeretném kérdezni, hogy van-e arra mód, hogy ha én C-ben (CCS C compiler) írok PIC16F877-re programot, de ebbe a C kódba szeretnék régebben ASM-ben megírt programrészletet beilleszteni, akkor arra van valamilyen lehetőség? Köszi!
(#) 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
(#) sysy válasza Lamprologus hozzászólására (») Dec 7, 2018
int1-be hogyan fér bele 2?
(#) 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
(#) 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);
(#) 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
(#) 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.
(#) 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
Ő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
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
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 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
(#) 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.)
(#) 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
(#) 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.
(#) Hp41C válasza Tardief hozzászólására (») Okt 11, 2017
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 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
(#) 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.
(#) 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 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.
(#) Gyimate válasza Tardief hozzászólására (») Aug 31, 2017
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 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.
Következő: »»   2 / 117
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