Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   1021 / 1203
(#) mps válasza _BiG_ hozzászólására (») Feb 18, 2018 /
 
Köszi a választ!
Ezeket néztem. mint írtam, ha angolra állítom a win.-ben a beviteli nyelvet nincs is semmi gond. De ha magyar akkor ezt a két karaktert nem találom. Magyarnál viszont a + és az ö jön.Ha az x-et küldöm a jobb alt-al, akkor meg ű. A többi a helyén van.(Pedig már kínomban írtam egy pascal progit is. Na ott valamiért a 0-ra 96 jön vissza.) Mondjuk ami nekem még fura, hogy többféle táblázatot találtam, pl az első linkeden a 0 az 0x0b a másodikon (ezt még nem láttam) 0x45 ezen pedig 0x27.
A # még kacifántosabb, mert vagy jobb altot vagy shiftet is "nyomni" kell mellé.
(#) _BiG_ válasza mps hozzászólására (») Feb 18, 2018 /
 
Akkor feltöltöm a Microsoft ™©®֍֏ stb-stb saját doksiját, szintén gugli barátom tálalta.
Ebben a különböző billentyű-elrendezések vannak részletezve, hogy a winfos miként kezeli őket.
Réges-régen kellett írnom programot (suliban), ami a scan-kódokat használta, nem a BIOS-on át vette a bevitt karaktereket. Akkor megoldottam. Itt se lehet vele gond, hiszen a hardver ugyanaz.
Idézet:
„ha angolra állítom a win.-ben a beviteli nyelvet nincs is semmi gond. De ha magyar akkor ezt a két karaktert nem találom. Magyarnál viszont a + és az ö jön.”

Fel kell készíteni a programot az eltérő beállításokra. De, mint mondám, ha jól emlékszem, a billentyűzet küld valami scan-kódot, azt az oprendszer kezeli le, helyettesíti be a megfelelő karakter ASCII kódját. Neked nem az ASCII-kód kell, hanem a scan kód, ami a csatin kibuggyan. Elvileg az csak billentyűzet-függő (hány gombos, stb). Tehát rittyents egy progit, ami közvetlenül kiolvassa és aszerint te kezeld le, mit kezdesz vele. Ja, és persze a PIC-re kell megírni, a vett kódot soros vonalon küldd be a PC-be, és láthatod. Mintha tettem volna fel ide pár hónapja linkeket, hogy milyen elektronika kell a billentyűzet-PIC összekötéshez.
Keress rá a nevemre.

scancode.pdf
    
(#) mps válasza _BiG_ hozzászólására (») Feb 18, 2018 /
 
Köszi! Átnézem ezt a doksit is.
Amúgy lehet nem teljesen egyértelműen írtam a gondom. Soros porton jön egy adat, ezt kell a pc felé küldenem mintha egy billentyűzet lenne rákötve. A pic-ben csinálom az ASCII-scan konverziót. Ez működik is amíg a gépen a win beviteli nyelve az angol. Ill. nem akarok nullát vagy # küldeni. Egyedül ezt a két karaktert nem sikerül konvertálni. Elméletileg ezek a billentyű kódok az ősidőktől megvannak. Az érdekel, hogy a win mit szeretne kapni, és első ránézésre a küldött doksi jó is lesz erre
(#) pajti2 hozzászólása Feb 18, 2018 /
 
Anno kérdeztem, kinek milyen gányolási tapasztalata van USB töltőkkel. Azóta beleakadtam egy általános teszter oldalba is. Némelyik tényleg szörnyű Bővebben: Link
(#) sparowjoe válasza Bakman hozzászólására (») Feb 19, 2018 /
 
Igen tisztelt Bakman!

Valami ehhez hasonló a dolog.
Kérhetek valami infó hogy mi tudja ezt?
(#) pipi válasza mps hozzászólására (») Feb 19, 2018 /
 
Hali!
Nem világos miért nem tudod konvertálni...
A scan kódok a billenytű gomb helytől függenek, nem a nyelvi beállítástól
fenti pdf 11. oldal
29 scan(vagy a 01scan), angol ~ , magyar 0
02 scan angol/magyar 1
0a scan, angol/magyar 9
0b scan, angol 0, magyar ö
vagyis a 0-hoz angol módban 0b scant kell küldened, magyar módban meg 29-et.
A # bonyolultabb, kikeresed melyik helyen van(2d?), és egy alt gr nek megfelelő scan-t is kell küldeni nyomást előtte/utána elengedést...
Lehet a pdf valami régebbi cucc, én úgy látom a bal felső 110dec az inkább a 01hex, a második sor első meg 1 helyett 29hex scannak kellene lenni...
Szerintem...
A hozzászólás módosítva: Feb 19, 2018
(#) Elektro.on válasza mps hozzászólására (») Feb 19, 2018 /
 
Esetleg még ez segíthet:

Bővebben: Link
(#) mps válasza pipi hozzászólására (») Feb 19, 2018 /
 
Számomra sem világos, ennek egyszerűnek kellene lennie mint egy faék. De most "megoldódott", akinek csináltam jó az angol is. Viszont ha lesz egy kis időm, előveszem mert izgat. Ha másként nem megy akkor végiglépkedek minden kódon,meg minden módosító billentyűn.
Köszi mindenkinek a segítséget!
(#) DJozso hozzászólása Feb 20, 2018 /
 
Kedves elektronika szerető fórum társaim! Komoly fába vágtam a fejszém, most viszont elakadtam. Gondoltam, itt hátha van olyan, aki csípőből megoldja a problémám. Vagy csak megjelölné a helyes utat.
MikroC fejlesztő környezetben próbálok életre kelteni egy kapcsolást, mely tartalmaz egy 18f46k22 kontrollert és egy HC06-os bluetooth modult. A két egység soros kommunikációval(USART) beszélget.
Célom, hogy egy okos telefonról parancsokat küldjek a piknek. A problémám a következő:
Csatlakozom a telefonnal a bluetooth modulhoz, Bluetooth Terminal nevű programmal, melyet a Play áruházból töltöttem le. Ezzel tudok adatot küldeni/fogadni, amit látok a telefon kijelzőjén. Irtam egy programot, a fent említett kontrollerbe, hogy ha a tx lábra adat érkezik (RCREG), megszakítás keretében dolgozza fel az adatot, egy tömbbe, egymás után szépen sorba...
Majd ha vége a bejövő adatnak, akkor küldje vissza a xy nevű tömb tartalmát az rx lábon keresztül a bluetooth modulra.
A forráskód:
  1. #define LED PORTD.F0    
  2.  
  3. unsigned char Szoveg[10] ;
  4. unsigned short Rx_KarakterSzam = 0, Vissza_Kuldes = 0, Rx_KarakterSzam_Last = 0;
  5.  
  6. void Config_PIC(){
  7.   OSCCON.F4 = 1; //64Mhz órajel beállítás
  8.   OSCCON.F5 = 1; //  
  9.   OSCCON.F6 = 1; //
  10.   OSCTUNE.PLLEN = 1; / INTERNAL RC OSC 16MHZ * 4
  11.   TRISA = 0xFF;
  12.   TRISB = 0xFF;
  13.   TRISC = 0b10010111;
  14.   PORTC = 0;
  15.   TRISD = 0b11111100;
  16.   PORTD = 0;
  17.   TRISE = 0xFF;
  18.   ANSELA = 0;
  19.   ANSELB = 0;
  20.   ANSELC = 0;
  21.   ANSELD = 0;
  22.   ANSELE = 0;
  23.    INTCON = 0xC0; //Glob.int, Perf. int, TMR0 int
  24.    PIE1 = 0x20; //Tx int.
  25.    PIR1.RC1IF = 0;
  26.    UART1_Init(9600);
  27.    delay_ms(100);
  28.     BAUDCON1.BRG16 = 1;  // Ezeket a beállításokat egy másik forráskódban találtam,
  29.     TXSTA1.BRGH = 1;   //  gondoltam, hátha ezek működnek ha már a bitráta itt is 9600.
  30.     SPBRGH1 = 0x06;   //
  31.     SPBRG1 = 0x82;
  32.     RCSTA1.SPEN = 1;
  33.     RCSTA1.CREN = 1;
  34.     TXSTA1.TXEN = 1;
  35.    RCON.IPEN = 1;  //High piority interrupt
  36.    IPR1.RC1IP = 1;}  //Transmitter soros port
  37.  
  38. void Interrupt(){
  39.    if (PIR1.RC1IF == 1) {
  40. //     Szoveg[Rx_KarakterSzam] = RCREG1-1;
  41.  
  42.      if (RCSTA1.OERR == 1 | RCSTA1.FERR == 1) {  // Ha hiba lenne az átvitelnél
  43.            RCSTA1.CREN = 0;  //Hiba esetén a CREN bit ki, be kapcsolása
  44.            RCSTA1.CREN = 1;  //
  45.            Rx_KarakterSzam = 0; //Tömb elejére ugrás
  46.            Vissza_Kuldes = 2;} // Hiba Visszaküldése
  47.  
  48.      else {  // Ha minden "OK"
  49.           Szoveg[Rx_KarakterSzam] = UART1_Read();
  50.           Rx_Karakterszam++;}
  51.      if ( UART1_Tx_Idle() == 1 & Rx_KarakterSzam > 0 ) {// Ha vége van az adat fogadásnak
  52.           Szoveg[Rx_KarakterSzam+1] = 0; // tömb utolsó üres karakterének írása, hogy a tömb mérete kiolvasható legyen
  53.           Rx_KarakterSzam = 0; // Tömb elejére ugrás
  54.           Vissza_Kuldes = 1;}// Visszaküldés paramétere
  55.      PIR1.RC1IF = 0;
  56.      PIE1.RC1IE = 1;}}
  57.  
  58. void main() {
  59.   Config_PIC();
  60.   while(1){
  61.     if (Vissza_Kuldes != 0) {
  62.          if (Vissza_Kuldes == 1){
  63.                 UART1_Write_Text(Szoveg);// tömb vissza küldése
  64.                 Vissza_Kuldes = 0;}
  65.          if (Vissza_Kuldes == 2) {
  66.                UART1_Write_Text("Olvasasi hiba!"); // hiba kuldes
  67.                 Vissza_Kuldes = 0;}
  68.          if (Szoveg[0] == 'B' & Szoveg[1] == 'e'  ) LED = 1;  //Led be kapcsolása
  69.          if (Szoveg[0] == 'K' & Szoveg[1] == 'i'  ) LED = 0;}}}   //Led ki kapcsolása

A mellékelt usart beállításokkal a pic doksija szerint a frekvencia hiba (Eltérés a várt 9600-hoz képest) 0,16%! Szóval azt csinálja a drága, hogy küldök neki egy számsort (mondjuk 0-9ig), és a válaszba beleszúr olyan számot, ami nem volt ott. Pl.: 0123456789 elküldve a válasz:0123545678;De nem mindig ugyanazt küldi vissza. Van hogy az utolsó két karakter hiányzik. Vagy két lépcsőben küldi vissza: 012 elsőként, a többit utána másik "csomagként". Amit a bluetooth modul alapbeállításairól sikerült megtudnom: Baud: 9600, 8 bites adatszélesség, aszinkron adat, no parity bit, 1 széles stop bit. Tudom, hogy néha előfordul a kommunikációban hibás adat, de ilyen sűrűn azért nem. Véleményem szerint, valami adatátviteli sebesség probléma, de fogalmam sincs mit néztem el az adatlapon.... Minden segítséget nagyon szépen köszönök!
A hozzászólás módosítva: Feb 20, 2018
(#) Hp41C válasza DJozso hozzászólására (») Feb 20, 2018 / 1
 
Az adást is megszakításosra írd meg. Vegyél fel egy adási puffert. Ha valamit el akarsz küldeni, írd be a bufferbe. Ne használd a UART1_Write_Text() eljárást.
(#) DJozso válasza Hp41C hozzászólására (») Feb 20, 2018 /
 
Ha jól emlékszem, adatlapon olvastam, hogy ilyen regisztere van a pic-nek(nem tudom mindegyiknek van-e). Mi fogja elindítani a megszakítást? Az, hogy ennek a regiszternek értéket adok, amit küldeni kell?
(#) kissi válasza DJozso hozzászólására (») Feb 20, 2018 / 1
 
Szia!

Az indítja el, hogy feltöltöd a buffert, majd engedélyezed a megszakítást ( innen tud autmatikusan működni az egész!) és az utolsó adat után tiltod a megszakítást !
(#) DJozso válasza Hp41C hozzászólására (») Feb 20, 2018 /
 
Szia! Megírtam, de valami nem jó, mert így nem is küldd semmit. A küldéshez szükséges beállításokat szerintem beállítottam (többször átnéztem). A kód:
  1. #define LED PORTD.F0
  2.  
  3. unsigned char Hiba[] = "Olvasasi hiba!" ;
  4. unsigned char Szoveg[10] ;
  5. unsigned short Rx_KarakterSzam = 0, Vissza_Kuldes = 0, KarakterSzam_Tx = 0, Karakter_Tx = 0, Ciklus;
  6.  
  7.  
  8.  
  9. void Config_PIC(){
  10.   OSCCON.F4 = 1; //64Mhz órajel beállítás
  11.   OSCCON.F5 = 1; //
  12.   OSCCON.F6 = 1; //
  13.   OSCTUNE.PLLEN = 1; // INTERNAL RC OSC 16MHZ * 4
  14.   TRISA = 0xFF;
  15.   TRISB = 0xFF;
  16.   TRISC = 0b10010111;
  17.   PORTC = 0;
  18.   TRISD = 0b11111100;
  19.   PORTD = 0;
  20.   TRISE = 0xFF;
  21.   ANSELA = 0;
  22.   ANSELB = 0;
  23.   ANSELC = 0;
  24.   ANSELD = 0;
  25.   ANSELE = 0;
  26.    INTCON = 0xC0; //Glob.int, Perf. int, TMR0 int
  27.    PIE1 = 0x30; //Tx int., RX int
  28.    PIR1.RC1IF = 0;
  29.    PIR1.TX1IF = 0;
  30.    UART1_Init(9600);
  31.    delay_ms(100);
  32.     BAUDCON1.BRG16 = 1;
  33.     TXSTA1 = 0x24;   //   TXEN = 1 és SYNC = 1
  34.     SPBRGH1 = 0x06;   //
  35.     SPBRG1 = 0x82;
  36.     RCSTA1.SPEN = 1;
  37.     RCSTA1.CREN = 1;
  38.    RCON.IPEN = 1;  //High piority interrupt
  39.    IPR1.RC1IP = 1;}  //Transmitter soros port
  40.  
  41.  
  42. void Interrupt(){
  43.    if (PIR1.TX1IF == 1) {
  44.        PIR1.TX1IF = 0;
  45.        PIE1.TX1IE = 1;}
  46.    if (PIR1.RC1IF == 1) {
  47.      if (RCSTA1.OERR == 1 | RCSTA1.FERR == 1) {  // Ha hiba lenne az átvitelnél
  48.            RCSTA1.CREN = 0;  //Hiba esetén a CREN bit ki, be kapcsolása
  49.            RCSTA1.CREN = 1;  //
  50.            Rx_KarakterSzam = 0; //Tömb elejére ugrás
  51.            Vissza_Kuldes = 2;} // Hiba Visszaküldése
  52.      else {  // Ha minden "OK"
  53.           Szoveg[Rx_KarakterSzam] = RCREG1;
  54.           Rx_Karakterszam++;}
  55.      if ( UART1_Tx_Idle() == 1 & Rx_KarakterSzam > 0 ) {// Ha vége van az adat fogadásnak
  56.           Szoveg[Rx_KarakterSzam+1] = 0; // tömb utolsó üres karakterének írása, hogy a tömb mérete kiolvasható legyen
  57.           Rx_KarakterSzam = 0; // Tömb elejére ugrás
  58.           Vissza_Kuldes = 1;}// Visszaküldés paramétere
  59.      PIR1.RC1IF = 0;
  60.      PIE1.RC1IE = 1;}}
  61.  
  62. void main() {
  63.   Config_PIC();
  64.   while(1){
  65.     if (Vissza_Kuldes != 0) {
  66.          if (Vissza_Kuldes == 1){
  67.                KarakterSzam_Tx = strlen(Szoveg); //Karakter számlálás
  68.                for (Ciklus = 0; Ciklus <= KarakterSzam_Tx; Ciklus++){
  69.                    Karakter_Tx = Szoveg[Ciklus];
  70.                     TXREG1 = Karakter_Tx;   // TxReg írása
  71.                     while(TXSTA1.TRMT == 0);} //Várj, míg TSR teli van
  72.                 Vissza_Kuldes = 0;}
  73.          if (Vissza_Kuldes == 2) {
  74.               KarakterSzam_Tx = strlen(Hiba); //Karakter számlálás
  75.                for (Ciklus = 0; Ciklus <= KarakterSzam_Tx; Ciklus++){
  76.                    Karakter_Tx = Hiba[Ciklus];
  77.                     TXREG1 = Karakter_Tx;     // TxReg írása
  78.                     while(TXSTA1.TRMT == 0);} //Várj, míg TSR teli van
  79.                 Vissza_Kuldes = 0;}
  80.          if (Szoveg[0] == 'B' & Szoveg[1] == 'e'  ) LED = 1;  //Led be kapcsolása
  81.          if (Szoveg[0] == 'K' & Szoveg[1] == 'i'  ) LED = 0;}}}   //Led ki kapcsolása

Rá tudna nézni valaki, mi lehet a baj?
Kissi: Most látom írtál. Értem, mit mondasz, megpróbálom így átírni a kódot.
A hozzászólás módosítva: Feb 20, 2018
(#) DJozso válasza DJozso hozzászólására (») Feb 20, 2018 /
 
kissi: Javítottam a kódot, ahogy mondtad, mégsem küldd vissza semmit.
A javított kód:
  1. #define LED PORTD.F0
  2.  
  3. unsigned char Hiba[] = "Olvasasi hiba!" ;
  4. unsigned char Szoveg[10] ;
  5. unsigned short Rx_KarakterSzam = 0, Vissza_Kuldes = 0, KarakterSzam_Tx = 0, Karakter_Tx = 0, Ciklus;
  6.  
  7. void Config_PIC(){
  8.   OSCCON.F4 = 1; //64Mhz órajel beállítás
  9.   OSCCON.F5 = 1; //
  10.   OSCCON.F6 = 1; //
  11.   OSCTUNE.PLLEN = 1; // INTERNAL RC OSC 16MHZ * 4
  12.   TRISA = 0xFF;
  13.   TRISB = 0xFF;
  14.   TRISC = 0b10010111;
  15.   PORTC = 0;
  16.   TRISD = 0b11111100;
  17.   PORTD = 0;
  18.   TRISE = 0xFF;
  19.   ANSELA = 0;
  20.   ANSELB = 0;
  21.   ANSELC = 0;
  22.   ANSELD = 0;
  23.   ANSELE = 0;
  24.    INTCON = 0xC0; //Glob.int, Perf. int, TMR0 int
  25.    PIE1 = 0x30; //Tx int., RX int
  26.    PIR1.RC1IF = 0;
  27.    PIR1.TX1IF = 0;
  28.    UART1_Init(9600);
  29.    delay_ms(100);
  30.     BAUDCON1.BRG16 = 1;
  31.     TXSTA1 = 0x24;   //   TXEN = 1 és SYNC = 1
  32.     SPBRGH1 = 0x06;   //
  33.     SPBRG1 = 0x82;
  34.     RCSTA1.SPEN = 1;
  35.     RCSTA1.CREN = 1;
  36.    RCON.IPEN = 1;  //High piority interrupt
  37.    IPR1.RC1IP = 1;}  //Transmitter soros port
  38.  
  39. void Interrupt(){
  40.    if (PIR1.TX1IF == 1) {
  41.        PIR1.TX1IF = 0;}
  42.    if (PIR1.RC1IF == 1) {
  43.      if (RCSTA1.OERR == 1 | RCSTA1.FERR == 1) {  // Ha hiba lenne az átvitelnél
  44.            RCSTA1.CREN = 0;  //Hiba esetén a CREN bit ki, be kapcsolása
  45.            RCSTA1.CREN = 1;  //
  46.            Rx_KarakterSzam = 0; //Tömb elejére ugrás
  47.            Vissza_Kuldes = 2;} // Hiba Visszaküldése
  48.      else {  // Ha minden "OK"
  49.           Szoveg[Rx_KarakterSzam] = RCREG1;
  50.           Rx_Karakterszam++;}
  51.      if ( UART1_Tx_Idle() == 1 & Rx_KarakterSzam > 0 ) {// Ha vége van az adat fogadásnak
  52.           Szoveg[Rx_KarakterSzam+1] = 0; // tömb utolsó üres karakterének írása, hogy a tömb mérete kiolvasható legyen
  53.           Rx_KarakterSzam = 0; // Tömb elejére ugrás
  54.           Vissza_Kuldes = 1;}// Visszaküldés paramétere
  55.      PIR1.RC1IF = 0;
  56.      PIE1.RC1IE = 1;}}
  57.  
  58. void main() {
  59.   Config_PIC();
  60.   while(1){
  61.     if (Vissza_Kuldes != 0) {
  62.          if (Vissza_Kuldes == 1){
  63.                KarakterSzam_Tx = strlen(Szoveg); //Karakter számlálás
  64. //               PIE1.TX1IE = 1;  // Int. engedélyezés
  65.                TXSTA1.TXEN = 1; // Int. engedélyezés
  66.                for (Ciklus = 0; Ciklus <= KarakterSzam_Tx; Ciklus++){
  67.                    Karakter_Tx = Szoveg[Ciklus];
  68.                     TXREG1 = Karakter_Tx;   // TxReg írása
  69.                     while(TXSTA1.TRMT == 0);} //Várj, míg TSR teli van
  70. //                PIE1.TX1IE = 0; // Int. kikapcsolás
  71.                TXSTA1.TXEN = 0;  // Int. kikapcsolás
  72.                 Vissza_Kuldes = 0;}
  73.          if (Vissza_Kuldes == 2) {
  74.               KarakterSzam_Tx = strlen(Hiba); //Karakter számlálás
  75. //               PIE1.TX1IE = 1;
  76.                TXSTA1.TXEN = 1;
  77.                for (Ciklus = 0; Ciklus <= KarakterSzam_Tx; Ciklus++){
  78.                    Karakter_Tx = Hiba[Ciklus];
  79.                     TXREG1 = Karakter_Tx;     // TxReg írása
  80.                     while(TXSTA1.TRMT == 0);}
  81.                TXSTA1.TXEN = 0;
  82. //                PIE1.TX1IE = 0;
  83.                 Vissza_Kuldes = 0;}
  84.          if (Szoveg[0] == 'B' & Szoveg[1] == 'e'  ) LED = 1;  //Led be kapcsolása
  85.          if (Szoveg[0] == 'K' & Szoveg[1] == 'i'  ) LED = 0;}}}   //Led ki kapcsolása

Valami ötlet, mi nem lehet jó?
A hozzászólás módosítva: Feb 20, 2018
(#) kissi válasza DJozso hozzászólására (») Feb 20, 2018 / 1
 
Az adatot kiküldeni is megszakításból kell, ez így nem jó !!
Feltöltöd a tömböt, engedélyezed a megszakítást, ennyi a főprogram dolga. A megszakításban, ha a PIR1.TX1IF aktív, akkor a tömb következő elemét betöltöd a TXREG-be. Ha a kiküldendő adatok elfogytak, akkor az adási megszakítást tiltod !!
(#) DJozso válasza kissi hozzászólására (») Feb 20, 2018 /
 
Bocsánat, hogy értetlenkedek, de:
Adott a tömböm, amit szeretnék elküldeni uart-on keresztül. Hogy tudom a tömböt "feltölteni"? A megszakítás engedélyezése az oké...
A megszakításban a TX1IF bitet, mi váltja egyre, mert a megszakítás akkor fut le ? Az, hogy engedélyezem a megszakítást a PIE1.TX1IE bit 1-re állításával? És, ha jól értem a megszakításban kell a tömb elemeit egymás utánban küldeni, míg a TX1IF bit= 1, majd a végén kikapcsolni a PIE1.TX1IE = 0. Jól értem?
A hozzászólás módosítva: Feb 20, 2018
(#) kissi válasza DJozso hozzászólására (») Feb 20, 2018 / 1
 
Idézet:
„Hogy tudom a tömböt "feltölteni"?”

Biztosítod, hogy a küldendő elemek már benne vannak a megfelelő helyeken !

Idézet:
„A megszakításban a TX1IF bitet, mi váltja egyre, mert a megszakítás akkor fut le ?”

Maga a hardver jelzi ezzel, ha kész újabb adat fogadására, neked ezt sem beállítani, sem törölni nem kell !!
(#) DJozso válasza kissi hozzászólására (») Feb 20, 2018 /
 
És az egyes karakterek közt, a TX1IF bit néha átvált 0-ra? Amikor "dolgozik"? Kezdem kapiskálni.Megpróbálom ezen elvek szerint átírni. Addig is köszönöm szépen a segítséget.
A hozzászólás módosítva: Feb 20, 2018
(#) kissi válasza DJozso hozzászólására (») Feb 21, 2018 / 1
 
Idézet:
„És az egyes karakterek közt, a TX1IF bit néha átvált 0-ra? Amikor "dolgozik"?”

Igen, igen !
(#) Hp41C válasza DJozso hozzászólására (») Feb 21, 2018 / 1
 
Még egy apróság:
A PIR1.TX1IF és a PIR1.RC1IF programból nem törölhető.
Az adási megszakításkérése akkor keletkezik, ha az adó kész az új adatra és a megszakítás kérés engedélyezett. Ebből következik, hogy akkor kell engedélyezni, ha van legalább egy adandó adat és le kell tiltani, ha nincs adni való. Ha a TXREG1 -et feltöltöd az új adattal, automatikusan törlődik a TX1IF.
Ugyanígy az RCIF1 is automatikusan törlődik az RCREG1 kiolvasásával, a vevő kikapcsolása viszont nem törli...
  1. RCSTA1.CREN = 0;  //Hiba esetén a CREN bit ki, be kapcsolása
  2. WREG=RCREG1;
  3. RCSTA1.CREN = 1;
A hozzászólás módosítva: Feb 21, 2018
(#) Zekageri hozzászólása Feb 21, 2018 /
 
Sziasztok! Lenne egy nagy problémám. Jelenleg egy PICDEM net 2 DEV boardot programozok tanulási céllal. Egy PIC18F97J60-as vezérlő van benne. A microchip egyik demo appját vettem alapul , a webvend-et. Mplab X IDE v4.05-öt használok , C18-as fordítóval , ( Azért C18 mert ide lett megírva a demo program és képtelen vagyok átírni XC8-ra) és egy ICD3-as debuggerrel. Etherneten töltöm fel a weboldal HTML tartalmát aminek a kódolása kifejezetten könnyűnek bizonyult eddig. A forrás kódban van egy demo UART program , amit rá szeretnék bírni hogy kommunikálni tudjak a PC-vel Serial RS232-es porton. Tudna nekem ebben valaki egy kis segítséget nyújtani? Mit kellene még beírnom a kódba illetve hogyan kellene módosítanom hogy erre rábírjam? Tudom hogy Baud ratet kell állítanom pl. Két potenciális kód jelöltem van erre a feladatra. Beírom ide őket remélve hogy valaki ad egy kis támpontot. Előre is köszönöm!

Ő lenne az alap Microchipes webvendhez tartozó demo UART kód:

  1. #define __UART_C
  2.  
  3. #include "TCPIPConfig.h"
  4.  
  5. #if defined(STACK_USE_UART)
  6.  
  7. #include "TCPIP Stack/TCPIP.h"
  8.  
  9.  
  10. /*                      *CONFIG1H*
  11. #pragma config IESO = OFF       // osc switchover, default = off
  12. #pragma config FOSC = HS        // Belső oszcillátor block, használd az RA6 és RA7 portokat normál port pineknek.
  13. #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable, default = off
  14. //                      *CONFIG2H*
  15. #pragma config WDTPS = 32768    // Watchdog Timer Postscale, default érték = div. 32768
  16. #pragma config WDT = OFF        // Watchdog Timer Engedélyező, default érték = on
  17. //                      *CONFIG3H*
  18. #pragma config CCP2MX = OFF     // CCP2 input/output  multiplexelve az RB3-al.
  19. //                      *CONFIG1L*
  20. #pragma config DEBUG = OFF      // Background Debugger Engedélyezés.
  21. #pragma config XINST = OFF      // Extended Instruction Set Enable
  22. //                      *CONFIG2L*
  23. #pragma config CP0 = OFF        // Program memória írás védettség OFF.
  24.                         *CONFIG4H*                           //Nincs ilyen sajnos!
  25. #pragma config CPD = ON         // Data EEPROM Code read Protection
  26. #pragma config CPB = ON         // boot block code read protect enable
  27.  
  28. * * * * * * * * * * * * END OF CONFIG BITS * * * * * * * * * * * * * * * * * */
  29.  
  30. BYTE ReadStringUART(BYTE *Dest, BYTE BufferLen)
  31. {
  32.         BYTE c;
  33.         BYTE count = 0;
  34.  
  35.         while(BufferLen--)              // Amíg az UART bufferben lévő bitek
  36.         {                               // 0-ásak
  37.                 *Dest = '\0';
  38.  
  39.                 while(!DataRdyUART());      // Amíg az UART bufferben vannak
  40.                 c = ReadUART();             // Olvassuk ki őket!
  41.  
  42.                 if(c == '\r' || c == '\n')  // Ezt nem vágom!  
  43.                         break;                  // Talán ha as C megegyezik az R-el vagy az
  44.                                     // N-el akkor szünet?
  45.                 count++;
  46.                 *Dest++ = c;                // Adjunk hozzá a desthez amíg = a C bittel.
  47.         }
  48.  
  49.         return count;                   // Visszatérítjük a countot ha megvan.
  50. }
  51.  
  52.  
  53.  
  54. #if defined(__18CXX)    // PIC18
  55.         char BusyUSART(void)
  56.         {
  57.                 return !TXSTAbits.TRMT;     // A bufferben lévő stringeket visszaadjuk
  58.         }
  59.        
  60.         void CloseUSART(void)
  61.         {
  62.           RCSTA &= 0x4F;                // Kikapcsoljuk a vevőt ezzel a bittel: 0x4F
  63.           TXSTAbits.TXEN = 0;           // Transmitter bitet adunk hozzá!
  64.        
  65.           PIE1 &= 0xCF;                 // Kikapcsoljuk a 2 interruptot!
  66.         }
  67.        
  68.         char DataRdyUSART(void)
  69.         {
  70.                 if(RCSTAbits.OERR)          // Ha az OERR 1 es akkor
  71.                 {
  72.                         RCSTAbits.CREN = 0;     // A CREN-t 0-ra rakjuk
  73.                         RCSTAbits.CREN = 1;     // Aztán 1-re? Not sure why...
  74.                 }
  75.           return PIR1bits.RCIF;
  76.         }
  77.        
  78.         char ReadUSART(void)
  79.         {
  80.           return RCREG;                     // Vissza az RCREGbe kapott adatot!
  81.         }
  82.        
  83.         void WriteUSART(char data)
  84.         {
  85.           TXREG = data;                     // A data bitet beírjuk az USARTBA!
  86.         }
  87.        
  88.         void getsUSART(char *buffer, unsigned char len)
  89.         {
  90.           char i;                           // Adat hossz számláló bit az " I "!
  91.           unsigned char data;
  92.        
  93.           for(i=0;i<len;i++)                // Csak a megadott hosszúságú karaktereket
  94.           {                                 // Visszük vissza. " LEN "!
  95.             while(!DataRdyUSART());         // Várunk kicsit hogy megkapjuk az adatot!
  96.        
  97.             data = getcUART();              // Kivesszük az USARTBÓL a karaktert!
  98.                                         // És STRINGKÉNT mentjük el!
  99.             *buffer = data;
  100.             buffer++;                       // Inkrementáljuk a string pointert!
  101.           }
  102.         }
  103.        
  104.         void putsUSART( char *data)
  105.         {
  106.           do
  107.           {  // Átviszünk egy bájtot!
  108.             while(BusyUSART());
  109.             putcUART(*data);
  110.           } while( *data++ );
  111.         }
  112.        
  113.         void putrsUSART(const rom char *data)
  114.         {
  115.           do
  116.           {  // Átviszünk egy bájtot!
  117.             while(BusyUSART());
  118.             putcUART(*data);
  119.           } while( *data++ );
  120.         }


Ő pedig egy másik amit egy angol fórumon találtam , elvileg ugyan erre a PIC-re lett írva ugyan ezen a boardon:

  1. #include <p18f97j60.h>
  2.  #include <stdio.h>
  3.  #include<delays.h>
  4.  #define USE_OR_MASKS
  5.  #include<usart.h>
  6.  #define EAUSART_V4
  7.  #include <UART.h>
  8.  
  9.  /*Configuration bits
  10.  #pragma config WDT=OFF
  11.  #pragma config XINST=ON
  12.  #pragma config FOSC=HSPLL
  13.  */
  14.  //End configuration bits
  15.  #define delay_number 2
  16.  #define spbrg_val 542
  17.  unsigned char msg[]="Hello world !";
  18.  
  19.  void main(){
  20.      int i;
  21.      char data=0x54;
  22.      WDTCON=0x00;
  23.      OSCTUNE = 0x40;
  24.      OSCCON = 0x08;
  25.      BAUDCON1=0x00; //clearing BAUDCON1
  26.      TRISJ=0x00;
  27.      PORTJ=0x00;
  28.      baud1USART(BAUD_IDLE_CLK_LOW |\
  29.          BAUD_16_BIT_RATE |\
  30.          BAUD_WAKEUP_OFF |\
  31.          BAUD_AUTO_OFF);
  32.          
  33.      Open1USART(USART_TX_INT_OFF  |\
  34.          USART_ADDEN_OFF      |\
  35.          USART_RX_INT_OFF  |\
  36.          USART_ASYNCH_MODE |\
  37.          USART_EIGHT_BIT   |\
  38.          USART_CONT_RX     |\
  39.          USART_BRGH_HIGH,\
  40.          spbrg_val              );
  41.      
  42.      
  43.      
  44.  
  45.  
  46.      //Main Routine
  47.      while(1){
  48.          for(i=0;i<delay_number;i++){
  49.              Delay10KTCYx(0);
  50.          }
  51.          if(PORTJ==0xff)
  52.              PORTJ=0x00;
  53.          else
  54.              PORTJ=0xff;
  55.          for(i=0;i<delay_number;i++){
  56.              Delay10KTCYx(0);
  57.          }
  58.          putc1USART(data);
  59.  //        putrs1USART ("Hello World! putRs\n");
  60.          puts1USART(msg);
  61.      //    printf("Hello World!");
  62.      //    for(i=0;i<0xFFFF;i++);
  63.      //    for(i=0;i<0xFFFF;i++);
  64.  }    
  65.  
  66.  }


A fordító ennél a kódnál dobál olyan hibákat pl hogy a void Main 2x van , mivel 2x is van , a projektben a main az természetesen nem itt található. Ha átírom akkor pl olyan hibát dob hogy nincs definiálva a "baud1USART" annak ellenére hogy includolva van a file ahol definiálva van.
(#) pajti2 válasza Zekageri hozzászólására (») Feb 21, 2018 /
 
Pár ellenőrző kérdés azt felmérni, valójában mivel is akadtál el.

-Szakmai angol szöveg elolvasás okoz gondot?
-C programozási alapok megvannak?
-Érted az aszinkron állapotgépek koncepcióját?
-Megtalálod a forrásban a főciklus kódját?
-Az mla help könyvtárában az ethernet stack pdf-jét megtaláltad?
-Pic adatlapot megtaláltad?
-Érted az uart periféria működését?

És a konkrét példát majd csak utána.
(#) pipi válasza Zekageri hozzászólására (») Feb 21, 2018 /
 
Próbáld a TCPIP\Demo App-ot,
ebben a STACK_USE_UART2TCP_BRIDGE kapcsold be...
(#) Zekageri válasza pajti2 hozzászólására (») Feb 21, 2018 /
 
-Nem okoz gondot.
-Megvannak viszont még csak kissebb programokat írtam.
-Nem tudom mik azok.
-Megtalálom.
-Igen , el is olvastam.
-Igen megtaláltam.
-Értem.

^_^
(#) pajti2 válasza Zekageri hozzászólására (») Feb 21, 2018 /
 
Az alapok kb okés

Ha a doksi anyagot megtaláltad a projecthez, és el is tudod olvasni, akkor megtalálod a config kapcsolókat. Modulokra van szétszedve minden, modulonként config kapcsoló van hozzá, hogy egyes kódrészletek bekerüljenek-e a projectbe, vagy sem, és hogy hogyan működjenek. Nem ismerem konkrétan azt a projectet, de biztosra veszem, hogy ugyan olyan, mint bármelyik másik. Az összes könnyítés, hogy a config kapcsolók csoportokba vannak szedve, és ha valami csoport egyben nem kell, annak a részleteit átugorhatod, de a többit egyesével mind végig kell nyálaznod, és célszerű lenne meg is értened, mire szolgál. Ha mást nem, kikeresheted a kódban, hol használja, de arra nem szokott szükség lenni, mert a régebbi mla-k még elég normálisak, le van írva minden elég részletesen. Be kell majd állítani halom sok dolgot webhez, helyi hálózathoz, a soros porthoz. Elvileg meg kell találnod a doksiban legalább a config file megemlítését, de javarészt az ott szereplő kapcsolókat is egyesével mind leírja. Amit nem ír le, azt a forrásban találod meg kommentben (az adott config file-ban).

Ami az állapotgépeket illeti, ha belenézel a kódba, halom sok switch-case-t fogsz találni, ami ránéz egy változóra, és annak alapján halom sok opció közül egyet hajt végre, egy picike kódrészletet futtat, aztán visszatér. A program részletek addig tartanak, amíg perifériára várakozás nélkül tudnak bármi egységnyi feladatot elvégezni. Ha azt elvégezték, akkor állapot változók módosítása, végrehajtás snitt, majd legközelebb folytatja, de addig visszaadja a vezérlést, és futhat a többi állapotgép is. Amolyan önkéntes processzor idő feladás elve alapján épített multitasking. Hogy ne legyen teljesen érthetetlen, mit csinálnak azok a config kapcsolók: olyan pici snippetek forráskódba beépülését és működési paramétereit vezérlik. Olyanokból áll az egész alkalmazás. Kicsit közelebbről majd akkor kell összebarátkoznod velük, ha bele is akarsz nyúlni valahova. Amíg csak a példa project előre kitalált látványosságát akarod megszemlélni, addig még magához a kódhoz nem kell madártávlatnál közelebb menned, logikai szinten is kezelheted, és a config kapcsolók abban segítenek neked.
(#) Zekageri válasza pajti2 hozzászólására (») Feb 21, 2018 /
 
Nos igen , köszönöm a választ. Ezeket a config kapcsolókat meg is találtam , használtam is őket , bele raktam a projectbe azt ami kell és kivettem azt ami nem kell. Végig követtem az útjukat , hogy milyen program részeket tudok velük bekapcsolni illetve ki. Ezek után sikerült rábírnom a programomat hogy működjön az én boardommal , hogy elérjem a TCP/IP-t , a webes felületet módosítottam ezek által , illetve a ledeket és az LCD kijelzőt. Ezeket sikerült megcsinálnom , az alap dolgokat amiket a demo leírt , tanulásnak. Viszont ezek felett és már egy Serial RS232 porton való kommunikációt szeretnék létrehozni a PC-M és a PIC board között , egyenlőre. Később pedig ha sikerül teljesen ( vagy nagy részt ) megértenem a program kódot akkor az a terv hogy egy kártya olvasó modulról kérek adatot az RS232-n , amit feldolgozok a programban a PIC18-al aztán megjelenítem a webes felületén. Viszont nem vagyok benne biztos hogy a demo UART program amit ide leírtam képes lenne-e nekem RS232-n adatot fogadni nem PC-ről. Illetve találtam még egy UART_TCP bridge-s source filet amiben megvan határozva a PIC baud rateja meg ilyen kis mókaságok meg valószínűleg ( amennyire az én tudásommal látom ) egy híd a TCP és az UART között.

itt a kód:

  1. #define __UART2TCPBRIDGE_C
  2.  
  3. #include "TCPIPConfig.h"
  4. #include "HardwareProfile.h"
  5.  
  6.  
  7. // TCP listen port and UART baud rate settings.  Due to a current C18
  8. // preprocessor bug (tested on compiler 3.30), the BAUD_RATE definition needs
  9. // to be placed above the #if defined(STACK_USE_UART2TCP_BRIDGE) test.  
  10. // Otherwise, it won't compile when STACK_USE_UART2TCP_BRIDGE is UNdefined.  
  11. // Also, HardwareProfile.h also needs to be included before the
  12. // STACK_USE_UART2TCP_BRIDGE test.
  13. #define UART2TCPBRIDGE_PORT     9761
  14. #define BAUD_RATE                       19200
  15.  
  16.  
  17. #if defined(STACK_USE_UART2TCP_BRIDGE)
  18.    
  19.  
  20. #include "TCPIP Stack/TCPIP.h"
  21.  
  22. // Komment ezt a definet ha nem vagyunk szerver!
  23.  #define USE_REMOTE_TCP_SERVER  "192.168.2.50"   //Szerverek vagyunk elvileg!
  24.  
  25. // Ring buffers for transfering data to and from the UART ISR:
  26. //  - (Head pointer == Tail pointer) is defined as an empty FIFO
  27. //  - (Head pointer == Tail pointer - 1), accounting for wraparound,
  28. //    is defined as a completely full FIFO.  As a result, the max data
  29. //    in a FIFO is the buffer size - 1.
  30. static BYTE vUARTRXFIFO[65];
  31. static BYTE vUARTTXFIFO[17];
  32. static volatile BYTE *RXHeadPtr = vUARTRXFIFO, *RXTailPtr = vUARTRXFIFO;
  33. static volatile BYTE *TXHeadPtr = vUARTTXFIFO, *TXTailPtr = vUARTTXFIFO;
  34.  
  35.  
  36. /*********************************************************************
  37.  * Function:        void UART2TCPBridgeInit(void)
  38.  *
  39.  * Overview:        UART perifériák felállítása!
  40.  *
  41.  * Note:            Interruptokat használunk!
  42.  ********************************************************************/
  43. void UART2TCPBridgeInit(void)
  44. {
  45.         // Initilize UART
  46. #if defined(__18CXX)
  47.     TXSTA = 0x20;
  48.     RCSTA = 0x90;
  49.  
  50.         #define CLOSEST_SPBRG_VALUE ((GetPeripheralClock()+2ul*BAUD_RATE)/BAUD_RATE/4-1)
  51.         #define BAUD_ACTUAL (GetPeripheralClock()/(CLOSEST_SPBRG_VALUE+1))
  52.         #if (BAUD_ACTUAL > BAUD_RATE)
  53.                 #define BAUD_ERROR (BAUD_ACTUAL-BAUD_RATE)
  54.         #else
  55.                 #define BAUD_ERROR (BAUD_RATE-BAUD_ACTUAL)
  56.         #endif
  57.         #define BAUD_ERROR_PRECENT      ((BAUD_ERROR*100+BAUD_RATE/2)/BAUD_RATE)
  58.         #if BAUD_ERROR_PRECENT > 2
  59.                 // Use high speed (Fosc/4) 16-bit baud rate generator
  60.                 BAUDCONbits.BRG16 = 1;
  61.                 TXSTAbits.BRGH = 1;
  62.                 SPBRGH = ((GetPeripheralClock()+BAUD_RATE/2)/BAUD_RATE-1)>>8 & 0xFF;
  63.                 SPBRG = ((GetPeripheralClock()+BAUD_RATE/2)/BAUD_RATE-1) & 0xFF;
  64.         #else
  65.                 // See if we can use the high baud (Fosc/16) 8-bit rate setting
  66.                 #if ((GetPeripheralClock()+2*BAUD_RATE)/BAUD_RATE/4 - 1) <= 255
  67.                         SPBRG = (GetPeripheralClock()+2*BAUD_RATE)/BAUD_RATE/4 - 1;
  68.                         TXSTAbits.BRGH = 1;
  69.                 #else   // Use the low baud rate 8-bit setting
  70.                         SPBRG = (GetPeripheralClock()+8*BAUD_RATE)/BAUD_RATE/16 - 1;
  71.                 #endif
  72.         #endif
  73.        
  74.         // Use high priority interrupt
  75.         IPR1bits.TXIP = 1;
  76.  
  77. #else
  78.         UARTTX_TRIS = 0;
  79.         UARTRX_TRIS = 1;
  80.         UMODE = 0x8000;                 // Set UARTEN.  Note: this must be done before setting UTXEN
  81.  
  82.         #if defined(__C30__)
  83.                 USTA = 0x0400;          // UTXEN set
  84.                 #define CLOSEST_UBRG_VALUE ((GetPeripheralClock()+8ul*BAUD_RATE)/16/BAUD_RATE-1)
  85.                 #define BAUD_ACTUAL (GetPeripheralClock()/16/(CLOSEST_UBRG_VALUE+1))
  86.         #else   //defined(__C32__)
  87.                 IPC8bits.U2IP = 6;              // Priority level 6
  88.                 USTA = 0x00001400;              // RXEN set, TXEN set
  89.                 #define CLOSEST_UBRG_VALUE ((GetPeripheralClock()+8ul*BAUD_RATE)/16/BAUD_RATE-1)
  90.                 #define BAUD_ACTUAL (GetPeripheralClock()/16/(CLOSEST_UBRG_VALUE+1))
  91.         #endif
  92.  
  93.         #define BAUD_ERROR ((BAUD_ACTUAL > BAUD_RATE) ? BAUD_ACTUAL-BAUD_RATE : BAUD_RATE-BAUD_ACTUAL)
  94.         #define BAUD_ERROR_PRECENT      ((BAUD_ERROR*100+BAUD_RATE/2)/BAUD_RATE)
  95.         #if (BAUD_ERROR_PRECENT > 3)
  96.                 #warning UART frequency error is worse than 3%
  97.         #elif (BAUD_ERROR_PRECENT > 2)
  98.                 #warning UART frequency error is worse than 2%
  99.         #endif
  100.  
  101.         UBRG = CLOSEST_UBRG_VALUE;
  102. #endif
  103.  
  104. }
  105.  
  106.  
  107. /*********************************************************************
  108.  * Function:        void UART2TCPBridgeTask(void)
  109.  *
  110.  * PreCondition:    Stack is initialized()
  111.  ********************************************************************/
  112. void UART2TCPBridgeTask(void)
  113. {
  114.         static enum _BridgeState
  115.         {
  116.                 SM_HOME = 0,
  117.                 SM_SOCKET_OBTAINED
  118.         } BridgeState = SM_HOME;
  119.         static TCP_SOCKET MySocket = INVALID_SOCKET;
  120.         WORD wMaxPut, wMaxGet, w;
  121.         BYTE *RXHeadPtrShadow, *RXTailPtrShadow;
  122.         BYTE *TXHeadPtrShadow, *TXTailPtrShadow;
  123.  
  124.  
  125.         switch(BridgeState)
  126.         {
  127.                 case SM_HOME:
  128.                         #if defined(USE_REMOTE_TCP_SERVER)
  129.                                 // Connect a socket to the remote TCP server
  130.                                 MySocket = TCPOpen((DWORD)USE_REMOTE_TCP_SERVER, TCP_OPEN_ROM_HOST, UART2TCPBRIDGE_PORT, TCP_PURPOSE_UART_2_TCP_BRIDGE);
  131.                         #else
  132.                                 MySocket = TCPOpen(0, TCP_OPEN_SERVER, UART2TCPBRIDGE_PORT, TCP_PURPOSE_UART_2_TCP_BRIDGE);
  133.                         #endif
  134.                        
  135.                         // Abort operation if no TCP socket of type TCP_PURPOSE_UART_2_TCP_BRIDGE is available
  136.                         // If this ever happens, you need to go add one to TCPIPConfig.h
  137.                         if(MySocket == INVALID_SOCKET)
  138.                                 break;
  139.  
  140.                         // Eat the first TCPWasReset() response so we don't
  141.                         // infinitely create and reset/destroy client mode sockets
  142.                         TCPWasReset(MySocket);
  143.                        
  144.                         // We have a socket now, advance to the next state
  145.                         BridgeState = SM_SOCKET_OBTAINED;
  146.                         break;
  147.  
  148.                 case SM_SOCKET_OBTAINED:
  149.                         // Reset all buffers if the connection was lost
  150.                         if(TCPWasReset(MySocket))
  151.                         {
  152.                                 // Optionally discard anything in the UART FIFOs
  153.                                 //RXHeadPtr = vUARTRXFIFO;
  154.                                 //RXTailPtr = vUARTRXFIFO;
  155.                                 //TXHeadPtr = vUARTTXFIFO;
  156.                                 //TXTailPtr = vUARTTXFIFO;
  157.                                
  158.                                 // If we were a client socket, close the socket and attempt to reconnect
  159.                                 #if defined(USE_REMOTE_TCP_SERVER)
  160.                                         TCPDisconnect(MySocket);
  161.                                         MySocket = INVALID_SOCKET;
  162.                                         BridgeState = SM_HOME;
  163.                                         break;
  164.                                 #endif
  165.                         }
  166.                
  167.                         // Don't do anything if nobody is connected to us
  168.                         if(!TCPIsConnected(MySocket))
  169.                                 break;
  170.                        
  171.                        
  172.                         // Make sure to clear UART errors so they don't block all future operations
  173.                         #if defined(__18CXX)
  174.                         if(RCSTAbits.OERR)
  175.                         {
  176.                                 RCSTAbits.CREN = 0;
  177.                                 RCSTAbits.CREN = 1;
  178.                                 LED1_IO ^= 1;
  179.                         }
  180.                         if(RCSTAbits.FERR)
  181.                         {
  182.                                 BYTE dummy = RCREG;
  183.                                 LED2_IO ^= 1;
  184.                         }
  185.                         #else
  186.                         if(U2STAbits.OERR)
  187.                                 U2STAbits.OERR = 0;
  188.                         #endif
  189.                        
  190.  
  191.                         // Read FIFO pointers into a local shadow copy.  Some pointers are volatile
  192.                         // (modified in the ISR), so we must do this safely by disabling interrupts
  193.                         RXTailPtrShadow = (BYTE*)RXTailPtr;
  194.                         TXHeadPtrShadow = (BYTE*)TXHeadPtr;
  195.                         #if defined(__18CXX)
  196.                         PIE1bits.RCIE = 0;
  197.                         PIE1bits.TXIE = 0;
  198.                         #else
  199.                         IEC1bits.U2RXIE = 0;
  200.                         IEC1bits.U2TXIE = 0;
  201.                         #endif
  202.                         RXHeadPtrShadow = (BYTE*)RXHeadPtr;
  203.                         TXTailPtrShadow = (BYTE*)TXTailPtr;
  204.                         #if defined(__18CXX)
  205.                         PIE1bits.RCIE = 1;
  206.                         if(TXHeadPtrShadow != TXTailPtrShadow)
  207.                                 PIE1bits.TXIE = 1;
  208.                         #else
  209.                         IEC1bits.U2RXIE = 1;
  210.                         if(TXHeadPtrShadow != TXTailPtrShadow)
  211.                                 IEC1bits.U2TXIE = 1;
  212.                         #endif
  213.  
  214.                         //
  215.                         // Transmit pending data that has been placed into the UART RX FIFO (in the ISR)
  216.                         //
  217.                         wMaxPut = TCPIsPutReady(MySocket);      // Get TCP TX FIFO space
  218.                         wMaxGet = RXHeadPtrShadow - RXTailPtrShadow;    // Get UART RX FIFO byte count
  219.                         if(RXHeadPtrShadow < RXTailPtrShadow)
  220.                                 wMaxGet += sizeof(vUARTRXFIFO);
  221.                         if(wMaxPut > wMaxGet)                           // Calculate the lesser of the two
  222.                                 wMaxPut = wMaxGet;
  223.                         if(wMaxPut)                                                     // See if we can transfer anything
  224.                         {
  225.                                 // Transfer the data over.  Note that a two part put
  226.                                 // may be needed if the data spans the vUARTRXFIFO
  227.                                 // end to start address.
  228.                                 w = vUARTRXFIFO + sizeof(vUARTRXFIFO) - RXTailPtrShadow;
  229.                                 if(wMaxPut >= w)
  230.                                 {
  231.                                         TCPPutArray(MySocket, RXTailPtrShadow, w);
  232.                                         RXTailPtrShadow = vUARTRXFIFO;
  233.                                         wMaxPut -= w;
  234.                                 }
  235.                                 TCPPutArray(MySocket, RXTailPtrShadow, wMaxPut);
  236.                                 RXTailPtrShadow += wMaxPut;
  237.  
  238.                                 // No flush.  The stack will automatically flush and do
  239.                                 // transmit coallescing to minimize the number of TCP
  240.                                 // packets that get sent.  If you explicitly call TCPFlush()
  241.                                 // here, latency will go down, but so will max throughput
  242.                                 // and bandwidth efficiency.
  243.                         }
  244.  
  245.                         //
  246.                         // Transfer received TCP data into the UART TX FIFO for future transmission (in the ISR)
  247.                         //
  248.                         wMaxGet = TCPIsGetReady(MySocket);      // Get TCP RX FIFO byte count
  249.                         wMaxPut = TXTailPtrShadow - TXHeadPtrShadow - 1;// Get UART TX FIFO free space
  250.                         if(TXHeadPtrShadow >= TXTailPtrShadow)
  251.                                 wMaxPut += sizeof(vUARTTXFIFO);
  252.                         if(wMaxPut > wMaxGet)                           // Calculate the lesser of the two
  253.                                 wMaxPut = wMaxGet;
  254.                         if(wMaxPut)                                                     // See if we can transfer anything
  255.                         {
  256.                                 // Transfer the data over.  Note that a two part put
  257.                                 // may be needed if the data spans the vUARTTXFIFO
  258.                                 // end to start address.
  259.                                 w = vUARTTXFIFO + sizeof(vUARTTXFIFO) - TXHeadPtrShadow;
  260.                                 if(wMaxPut >= w)
  261.                                 {
  262.                                         TCPGetArray(MySocket, TXHeadPtrShadow, w);
  263.                                         TXHeadPtrShadow = vUARTTXFIFO;
  264.                                         wMaxPut -= w;
  265.                                 }
  266.                                 TCPGetArray(MySocket, TXHeadPtrShadow, wMaxPut);
  267.                                 TXHeadPtrShadow += wMaxPut;
  268.                         }
  269.                        
  270.                         // Write local shadowed FIFO pointers into the volatile FIFO pointers.
  271.                         #if defined(__18CXX)
  272.                         PIE1bits.RCIE = 0;
  273.                         PIE1bits.TXIE = 0;
  274.                         #else
  275.                         IEC1bits.U2RXIE = 0;
  276.                         IEC1bits.U2TXIE = 0;
  277.                         #endif
  278.                         RXTailPtr = (volatile BYTE*)RXTailPtrShadow;
  279.                         TXHeadPtr = (volatile BYTE*)TXHeadPtrShadow;
  280.                         #if defined(__18CXX)
  281.                         PIE1bits.RCIE = 1;
  282.                         if(TXHeadPtrShadow != TXTailPtrShadow)
  283.                                 PIE1bits.TXIE = 1;
  284.                         #else
  285.                         IEC1bits.U2RXIE = 1;
  286.                         if(TXHeadPtrShadow != TXTailPtrShadow)
  287.                                 IEC1bits.U2TXIE = 1;
  288.                         #endif
  289.  
  290.                         break;
  291.         }
  292. }
  293.  
  294.  
  295. #if defined(__18CXX)
  296. /*********************************************************************
  297.  * Function:        void UART2TCPBridgeISR(void)
  298.  *
  299.  * PreCondition:    UART interrupt has occured
  300.  *
  301.  * Input:           None
  302.  *
  303.  * Output:          None
  304.  *
  305.  * Side Effects:    None
  306.  *
  307.  * Overview:        None
  308.  *
  309.  * Note:            This function is supposed to be called in the ISR
  310.  *                                      context.
  311.  ********************************************************************/
  312. void UART2TCPBridgeISR(void)
  313. {
  314.         // NOTE: All local variables used here should be declared static
  315.         static BYTE i;
  316.  
  317.         // Store a received byte, if pending, if possible
  318.         if(PIR1bits.RCIF)
  319.         {
  320.                 // Get the byte
  321.                 i = RCREG;
  322.  
  323.                 // Clear the interrupt flag so we don't keep entering this ISR
  324.                 PIR1bits.RCIF = 0;
  325.  
  326.                 // Copy the byte into the local FIFO, if it won't cause an overflow
  327.                 if(RXHeadPtr != RXTailPtr - 1)
  328.                 {
  329.                         if((RXHeadPtr != vUARTRXFIFO + sizeof(vUARTRXFIFO)) || (RXTailPtr != vUARTRXFIFO))
  330.                         {
  331.                                 *RXHeadPtr++ = i;
  332.                                 if(RXHeadPtr >= vUARTRXFIFO + sizeof(vUARTRXFIFO))
  333.                                         RXHeadPtr = (volatile BYTE*)vUARTRXFIFO;
  334.                         }
  335.                 }
  336.         }
  337.  
  338.         // Transmit a byte, if pending, if possible
  339.         if(PIR1bits.TXIF)
  340.         {
  341.                 if(TXHeadPtr != TXTailPtr)
  342.                 {
  343.                         TXREG = *TXTailPtr++;
  344.                         if(TXTailPtr >= vUARTTXFIFO + sizeof(vUARTTXFIFO))
  345.                                 TXTailPtr = (volatile BYTE*)vUARTTXFIFO;
  346.                 }
  347.                 else    // Disable the TX interrupt if we are done so that we don't keep entering this ISR
  348.                 {
  349.                         PIE1bits.TXIE = 0;
  350.                 }
  351.         }
  352. }


Szóval igazából a kérdés az az hogy ezeknek a demo kódoknak a bekapcsolásával vajon képes lehet a PIC egy ilyen adat fogadásra egy külső terminálról az RS232-es serial porton? És ha nem miket kellene még bele írnom hogy képes legyen?
(#) pipi válasza Zekageri hozzászólására (») Feb 21, 2018 /
 
Ha PC-n telnettel megnyitod a definiált tcpip porton a cuccodat, akkor amit bepötyögsz, az kiesik az uarton, amit a cuccod kap a soroson azt meg kipöfögi a pc-re, a telnetben fogod látni.
Ha bekapcsoltad ezt a funkciót, máshol nem kell belenyúlni a tcpip/uart forrásszövegéhez
A hozzászólás módosítva: Feb 21, 2018
(#) pajti2 válasza Zekageri hozzászólására (») Feb 21, 2018 /
 
Ahogy néztem a boardot, van rajta soros porti meghajtó db9 csatlakozóval, van rajta eeprom is, van minden a boardon, hogy alkalmas legyen egy ethernet / uart bridge feladat elvégzésére, és még jelszót is rárakhatsz a boardra védelem gyanánt. Az más kérdés, hogy memória nincsen túl sok abban a pic-ben, de ha nem izomból akarod hajtani, és ésszel írsz soros port oldali protokolt, akkor bőven elég lesz.

Ha én akarnék belőle fabrikálni valamit, én hagynám a webezést, és sima udp-t használnék hozzá. Azzal sokkal tisztább és stabilabb. Nem tud elfogyni a memória, meg túl nagy terhelést kapni a pic, vagy bármi hasonló. Ha te webezni szeretnél, persze csináld.

Viszont ha nem elég pont az és úgy, ahogy a példa project támogatja neked, akkor az a project csak a komponens felső szintű kipróbálásához lesz neked jó, és ha kijátszadoztad magad vele, akkor tiszta lapról kell majd kezdened nulláról mindent. Elolvasod az ethernet stack doksiját, te app initelsz, állítod be a modulokat, és ami összetevő nem jó a régi projectből, azt újraírod. Ahhoz már kelleni fog a programozási gyakorlat, nem fog menni legózás szintjén. Nincsenek olyan legó darabok, amik gondoltak rá, hogy minden lehetséges igényt ki tudjanak szolgálni. Szóval rágcsáld a project doksiját egészen addig, míg el tudod különíteni a projectből a neked szükséges modulokat, és azokat be tudod húzni teljesen üres projectbe önállóan, valamint megtalálod a modulokban azokat az interface pontokat, ahol adatokat mozgathatsz, és az ahhoz tartozó folyamat vezérlést is megérted. Szájba is rághatnám, de az úgy nem buli, és nem tanulsz belőle.

Vagy ha csak egy megoldás kell és gyorsan, kaphatóak egyben port szerverek is készen, azokhoz nem kell fejleszteni semmit se.
(#) Zekageri hozzászólása Feb 21, 2018 /
 
Köszönöm szépen a válaszaitokat , nagyon hasznosak voltak. A webes részét nem szeretném hanyagolni , mert valós időben szeretném megjeleníteni a bejövő adatokat egy felületen , ez a legjobb megoldás rá szerintem. Van itt telnet is , csak még nem tudom hogy használjam , megvan írva benne minden , a jelszó , a felhasználó név is , csak nemtudom hogy érjem el telneten keresztül , mert semmi elérési út nincs megadva ezeken kívül a programban. Az IP címével pedig csak a webes felületet érem el amihez meg nem kell jelszó. Hát igen , meg is vehetném de azzal meg nem érnék el semmit. Mindenképp tanulmányozom tovább és össze pakolok egy saját projectet ezekből! ^_^
(#) pajti2 válasza Zekageri hozzászólására (») Feb 21, 2018 /
 
Ha erőltetni akarod a webezést, szükséged lehet nagyobb teljesítményű pic-re. A pic18-asokban túl kevés a belső ram. Falnak tud futni a fejlesztés, ha kiegészítgetnéd ezzel-azzal. Utólag majd ne sírj nekünk, miért nem szólt senki Valami pic32-es boardot javasolnék inkább. Pic18-at inkább csak olyankor használnék, ha elégséges a média felület mentes funkcionalitás. Például udp-n csomag kérdés / válasz, magasabb szintű protokol semmi, és az adat megjelenítés is egy másik számítógép dolga, amiben már van bőven proci, meg ram, meg minden. Néztem én is a pic-ek webezési lehetőségeit, és össze lehet velük rakni valamit, ami tisztára úgy néz ki, "mintha", de az akkor sem az, hanem fából vaskarika, és nem fog tudni terhelést bírni. Még a pic32-essel is bele tudsz szaladni abba, hogy eléred a teljesítménykorlátot, mert nem lesz elég ram - mindig az a fránya ram - de egy pic18-al meg pláne két pillanat alatt fogsz belefutni a korlátaiba.
Következő: »»   1021 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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