Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   84 / 153
(#) vicsys válasza univerzum hozzászólására (») Okt 8, 2013 /
 
Szerintem gondolkodj visszafelé... Mit csinál a kapcsolásod? Mikor csinálja? (feltételek) Meddig csinálja (időzítések, Timerek) Hányszor csinálja (Változók, konstansok), stb... Ebből már írhatsz programot, feltételekkel, elágazásokkal, időzítőkkel, ki és bemenetekkel.
A hozzászólás módosítva: Okt 8, 2013
(#) janimester hozzászólása Okt 8, 2013 /
 
Sziasztok, kérem szépen aki tud 18F4550-re vagy vele hasonszőrű pic-re DS1307 RTC működő kódot mikroc-ben írva amit fel tudnék használni kérem jelezze valamilyen módon amit neten találtam az nem működik szimulátorban sem :/
(#) univerzum válasza vicsys hozzászólására (») Okt 9, 2013 /
 
Jó de most nem vagyok egy nagy c programozó viszont ezt az egy nyelvet még fel tudom fogni.
Azért is lenne jó, mert kicsit gépész gondolkozású vagyok és pld most egy tuskóhasítót akarok csinálni, és elektronika is kell hozzá, akkor nem kell ttl kapukkal vagy multiplexerel játszanom hanem csak beírom amit megterveztem. Azaz egy plc-t akarok kiváltani picel.
Létradiagram - blokkdiagram - utasítás lista átalakítás az elég jól megy, de ezt szeretném egyszerű c-be bevinni költségspórolás miatt és egyben tudásomat is bővíteni szeretném.
A hozzászólás módosítva: Okt 9, 2013
(#) vicsys válasza univerzum hozzászólására (») Okt 9, 2013 /
 
Nosza. Jól leírtad, állj neki C-t olvasni!
(#) Stefan válasza univerzum hozzászólására (») Okt 9, 2013 / 1
 
Lehet létradiagramban is programot írni PICre:
Bővebben: Link
(#) univerzum válasza Stefan hozzászólására (») Okt 10, 2013 /
 
Ismerem, de nem ezzel akarok hanem rendesen C-ben akarom ezt legenerálni.
(#) whalaky válasza janimester hozzászólására (») Okt 11, 2013 / 1
 
Parancsolj!
(#) pipi válasza whalaky hozzászólására (») Okt 12, 2013 /
 
Hali!
Nézd meg a megfelelő include fájlban az igazi deklarációt, ha eltérsz tőle akkor warning van, jogosan, illetve használj castolást, mint a példádban, de nyilván olyan tipusra, mint a definicióban van
(#) pepe1125 hozzászólása Okt 19, 2013 /
 
Segítséget kérek!

Van egy szerkezetem, két motor rajta... Egyik (M1) - DC motor, másik (M2) - léptető motor.

Most az M2 vezérlését mutatom. A sok delay-t szeretném kiváltani. A lépések gyorsasága most az AD-re kötött potméterrel szabályozható.

  1. void le() {
  2.              for(i=0; i<65; i++){
  3.                 M2A = 1; M2B = 1;
  4.                 VDelay_ms((ADC_Read(0)/16)+1);
  5.                 M2A = 1; M2B = 0;
  6.                 VDelay_ms((ADC_Read(0)/16)+1);
  7.                 M2A = 0; M2B = 0;
  8.                 VDelay_ms((ADC_Read(0)/16)+1);
  9.                 M2A = 0; M2B = 1;
  10.                 VDelay_ms((ADC_Read(0)/16)+1);
  11.                 }
  12. }
  13.  
  14. void fel() {
  15.             for(i=0; i<65; i++){
  16.                 M2A = 0; M2B = 1;
  17.                 VDelay_ms((ADC_Read(0)/16)+1);
  18.                 M2A = 0; M2B = 0;
  19.                 VDelay_ms((ADC_Read(0)/16)+1);
  20.                 M2A = 1; M2B = 0;
  21.                 VDelay_ms((ADC_Read(0)/16)+1);
  22.                 M2A = 1; M2B = 1;
  23.                 VDelay_ms((ADC_Read(0)/16)+1);
  24.                 }
  25. }


Ez a kód "jól" működik, mert a szerkezet 64 lépésben leteszi amit kell és 64 lépésben fel is emeli.

DE! Hogyan alakítható át úgy, hogy megszakítással, időzítővel megoldható legyen a 64 lépés?!


Próbálkoztam a következővel:

  1. void interrupt() {
  2.      if (TMR0IF_bit){
  3.      t++;
  4.      if (t>1024) t=0;
  5.      x++;
  6.      if (x==8) x=0;
  7.      TMR0IF_bit = 0;
  8.      }
  9. }
  10.  
  11. void le() {
  12.                  if (t>512 && t<1024){
  13.                    switch(x){
  14.                    case 0: M2A=1; M2B=1; break;
  15.                    case 2: M2A=1; M2B=0; break;
  16.                    case 4: M2A=0; M2B=0; break;
  17.                    case 6: M2A=0; M2B=1; lee++; break;
  18.                    }
  19.  
  20.                  }
  21.                 lebit=1;
  22. }
  23.  
  24. void fel() {
  25.                 if (t>512 && t<1024){
  26.                    switch(x){
  27.                    case 0: M2A=0; M2B=1; break;
  28.                    case 2: M2A=0; M2B=0; break;
  29.                    case 4: M2A=1; M2B=0; break;
  30.                    case 6: M2A=1; M2B=1; fell++; break;
  31.                    }
  32.                  }
  33.                 felbit=1;
  34. }
  35.  
  36. void inicializalas() {
  37. Delay_ms(1000);
  38. TRISA = 0b00000111;    // 1 = input; 0 = output;
  39. TRISB = 0b00000000;
  40. TRISC = 0b00000000;
  41. PORTA = 0b00000111;
  42. PORTB = 0b00000000;
  43. PORTC = 0b00000110;
  44.  
  45. ADC_init();
  46. ADCON0 = 0xCF;
  47. ADCON1 = 0x0E;
  48.  
  49.  
  50.      // Megszakítás és időzítő beállítása
  51.  
  52.      TMR0ON_bit = 0;      // TMR0 kikapcs
  53.      INTCON = 0xA0;       // megszakítás engedélyezése TMR0-án
  54.      TMR0IE_bit = 1;      // TMR0 Overflow Interrupt Flag bit
  55.      T08BIT_bit = 1;      // TMR0 8bites
  56.      T0CS_bit = 0;        // Timer0 Clock Source Select bit
  57.      PSA_bit = 0;         // prescaler
  58.  
  59.      // prescaler
  60.      // 111 = 1:256 Prescale value
  61.      // 110 = 1:128 Prescale value
  62.      // 101 = 1:64 Prescale value
  63.      // 100 = 1:32 Prescale value
  64.      // 011 = 1:16 Prescale value
  65.      // 010 = 1:8 Prescale value
  66.      // 001 = 1:4 Prescale value
  67.      // 000 = 1:2 Prescale value
  68.      T0PS0_bit = 1;
  69.      T0PS1_bit = 1;
  70.      T0PS2_bit = 0;
  71.  
  72.      TMR0L   = 0;
  73.      TMR0ON_bit = 1;      // időzítő indítása
  74.  
  75. void main() {
  76. inicializalas();
  77.  
  78.                 while(1){              // Végtelen ciklus
  79.  
  80.  
  81.                 if (t==0) k=1;
  82.                 if (t==1) k=0;
  83.  
  84.                 if (k) y++;                   // K (0-1) átmenet miért nem csak egyesével növeli y értékét???
  85.  
  86.                 switch(y){
  87.                 case 0: le(); break;
  88.                 case 1: break;
  89.                 case 2: fel(); break;
  90.                 case 3: y=0; break;
  91.                 }
  92.  
  93.         }
  94. }


De nem megy... Össze vissza lépked és az ideg már kezd megölni, gondolkodni se tudok. Valaki akinek egy perc lenne az egész átgondolni szánna rám egy kis időt és konkrétumot tudna esetleg adni?

Előre is köszöm!
A hozzászólás módosítva: Okt 19, 2013
(#) Wudoou hozzászólása Okt 21, 2013 /
 
Sziasztok!
Lenne egy kis problémám.
Van egy lcd+pic+ds18b20 projektem. A program elején van egy olyan rész, ahol megvizsgálom, hogy van-e eszköz a buszon az OW_reset() függvénnyel.
  1. switch(presence=OW_reset()){
  2.                 case 1: lcd_puts("Nincs eszköz!"); while(OW_reset()){CLRWDT();} break;
  3.                 case 2: lcd_puts("Zárlat a buszon!"); while(OW_reset()){CLRWDT();} break;
  4.                 default: break;
  5.         }

Ha presence eredménye nem 0, akkor addig vár, míg 0 nem lesz.
Na most van úgy, hogy egyszer csak induláskor kiírja, hogy nincs eszköz majd néhány pillanat múlva már tovább lép.
De már volt olyan is (valószínüleg a hosszú kábel miatt), hogy zárlat a buszon volt az eredmény.
Mitől lehet ez?
Csatolom a kód elejét is:
  1. unsigned char melyik_csoport=0;
  2. //signed char tomb[24][4];                        //átlagok számításához
  3. //osszeg=0;
  4. volatile unsigned char presence=0;
  5. TRISA=0b00011110;
  6. PORTA=0;
  7. TRISC=0b10001111;
  8. PORTC=0;
  9. TRISB=0;
  10. PORTB=0;
  11. ANSEL=0;
  12. ANSELH=0;
  13. OPTION_REG=0x07;
  14. initUART();
  15. RTS_OFF();
  16. lcd_init();
  17. lcd_clear();
  18. lcd_init_cgram();
  19.  
  20.  
  21. if(is_OK_pressed()==1){
  22. while(is_OK_pressed());
  23. bus_init();
  24. }
  25.  
  26. lcd_clear();
  27. lcd_goto(0x00);
  28.  
  29.         switch(presence=OW_reset()){
  30.                 case 1: lcd_puts("Nincs eszköz!"); while(OW_reset()){CLRWDT();} break;
  31.                 case 2: lcd_puts("Zárlat a buszon!"); while(OW_reset()){CLRWDT();} break;
  32.                 default: break;
  33.         }
  34.         szam=FindDevices_withoutsaving();
  35.         lcd_goto(0x00);
  36.         lcd_puts("Talált eszköz: ");lcd_senddecimal(szam,1);
  37.         T0IE=1;

Előre is köszönöm.
A hozzászólás módosítva: Okt 21, 2013
(#) whalaky válasza Wudoou hozzászólására (») Okt 21, 2013 /
 
Gyanúm szerint sokat lendítene a helyzeten, ha megosztanád legalább az ow_reset függvényedet is, vagy elárulnád hogy melyik lib, illetve melyik fordító.... szerintem...
(#) Wudoou válasza whalaky hozzászólására (») Okt 22, 2013 /
 

Jogos. Fordító Hitech C16

  1. /*
  2.  * OW_reset
  3.  * visszatérési érték: 0 = van eszköz, 1 = nincs eszköz, 2 = rövidzár a buszon
  4.  */
  5.  
  6. unsigned char OW_reset(void)
  7. {
  8.         unsigned char presence, temp;
  9.  
  10.         DisableAllInterrupts();
  11.         OW_HIZ();
  12.         OW_LO();
  13.  
  14.         vWait_us(480)//480
  15. //      vWait_us(60);
  16.  
  17.         OW_HIZ();
  18.  
  19.         vWait_us(70);   //70
  20. //      vWait_us(60);
  21.  
  22.         presence = OW_DATA;
  23.  
  24.         vWait_us(410);
  25. //      vWait_us(60);
  26.         temp = OW_DATA;
  27.         ResumeAllInterrupts();
  28.  
  29.         return (!temp ? 2 : presence);
  30. }


  1. #define OW_TRIS TRISC4
  2. #define OW_DATA RC4
  3.  
  4. #define OW_HIZ()        (OW_TRIS = INPUT)
  5. #define OW_HI() (OW_DATA = 1, OW_TRIS = OUTPUT) /* ez a 'strong pullup' */
  6. #define OW_LO() (OW_DATA = 0, OW_TRIS = OUTPUT)


  1. unsigned char FindDevices_withoutsaving (void){
  2. unsigned char egyezo=0,egyezo_1=0;
  3. unsigned char temp_rom[8];
  4.         numROMs = 0;
  5.         if (OW_reset() != 0)
  6.                 return numROMs;
  7.  
  8.         if (First()) {  //Begins when at least one part is found
  9.                 do {                   
  10.                         for(unsigned char n=1;n<=c;n++){
  11.                                 for(unsigned char z=0;z<8;z++){
  12.                                         if(eeprom_read((n-1)*0x08+z)==ROM[z]){
  13.                                                 egyezo++;
  14.                                         }
  15.                                 }
  16.                                 if(egyezo>=8)egyezo_1++;
  17.                                 egyezo=0;
  18.                         }
  19.                         if(egyezo_1==0){
  20.                                 for(unsigned char x=0;x<8;x++){
  21.                                 temp_rom[x]=ROM[x];    
  22.                                 }
  23.                         }
  24.                         egyezo=0;egyezo_1=0;
  25.                         numROMs++;
  26.                 } while (Next() && (numROMs < MAX_DEVICES)); //Continues until no additional devices are found
  27.         }
  28.         return numROMs;
  29. }
  30.  
  31.  
  32. static unsigned char First(void)
  33. {
  34.         lastDiscrep = 0;
  35.         doneFlag = false;
  36.  
  37.         return Next();
  38. }
  39.  
  40. static unsigned char Next(void)
  41. {
  42.         unsigned char m = 1; // ROM Bit index
  43.         unsigned char n = 0; // ROM Byte index
  44.         unsigned char k = 1; // bit mask
  45.         unsigned char x = 0;
  46.         unsigned char discrepMarker = 0; // discrepancy marker
  47.         unsigned char g; // Output bit
  48.         unsigned char nxt; // return value
  49.         int flag;
  50.  
  51.         nxt = 0;                                                // set the next flag to false
  52.         dowcrc = 0;                                     // reset the dowcrc
  53.         flag = OW_reset();              // reset the 1-wire
  54.         if(flag || doneFlag) {  // no parts -> return false
  55.                 lastDiscrep = 0;                // reset the search
  56.                 return false;
  57.         }
  58.         OW_write_byte(SEARCH_ROM);      // send SearchROM command
  59.  
  60.         do {            // for all eight bytes
  61.                 x = 0;
  62.                 if (OW_read_bit() == 1)
  63.                         x = 2;
  64.                 if (OW_read_bit() == 1)
  65.                         x |= 1; // and its complement
  66.                 if (x == 3) // there are no devices on the 1-wire
  67.                         break;
  68.                 else {
  69.                         if (x > 0) // all devices coupled have 0 or 1
  70.                                 g = x >> 1; // bit write value for search
  71.                         else {
  72.                                 // if this discrepancy is before the last
  73.                                 // discrepancy on a previous Next then pick
  74.                                 // the same as last time
  75.                                 if (m < lastDiscrep)
  76.                                         g = ((ROM[n]&k)>0);
  77.                                 else // if equal to last pick 1
  78.                                         g = (m == lastDiscrep); // if not then pick 0
  79.                                         // if 0 was picked then record
  80.                                         // position with mask k
  81.                                 if (g == 0)
  82.                                         discrepMarker = m;
  83.                         }
  84.                         if (g == 1) // isolate bit in ROM[n] with mask k
  85.                                 ROM[n] |= k;
  86.                         else
  87.                                 ROM[n] &= ~k;
  88.                         OW_write_bit(g); // ROM search write
  89.                         m++; // increment bit counter m
  90.                         k = k<<1; // and shift the bit mask k
  91.                         if(k == 0) { // if the mask is 0 then go to new ROM
  92.                         // byte n and reset mask
  93.                                 ow_crc(ROM[n], &dowcrc); // accumulate the CRC
  94.                                 n++; k++;
  95.                         }
  96.                 }
  97.         } while (n < 8); //loop until through all ROM bytes 0-7
  98.  
  99.         if (m < 65 || dowcrc) // if search was unsuccessful then
  100.                 lastDiscrep=0; // reset the last discrepancy to 0
  101.         else {
  102.                 // search was successful, so set lastDiscrep,
  103.                 // lastOne, nxt
  104.                 lastDiscrep = discrepMarker;
  105.                 doneFlag = (lastDiscrep == 0);
  106.                 nxt = true; // indicates search is not complete yet, more
  107.                 // parts remain
  108.         }
  109.  
  110.         return nxt;
  111. }
A hozzászólás módosítva: Okt 22, 2013
(#) whalaky válasza Wudoou hozzászólására (») Okt 22, 2013 /
 
Kivetni valót ugyan nem látok benne, próbálkozz az időzítésekkel kicsit manipulálni.
A hosszú gyenge minőségű kábel nagy kapacitása miatt okozhat érdekes jelenségeket.
Ne a minimum értékre kalibráld a progit, próbálj meg kicsit rátartani. pl a master reset minimum 480μs, az akár lehet 5-600 is, aztán a 15-60μs mire a szenzor(ok) válaszolnak.
Itt is hagyni kell egy kis időt a kábel kapacitás kisütésére/feltöltésére, vagyis a 70μs lehet hogy kicsit kevés, az lehet akár 100-110 is.
Bár csak tippek, de egy próbát megér. Nekem legtöbbször az időzítésekkel volt bajom az 1wire buszon.
Egy jobb minőségű riasztó kábelen 40m hosszon gond nélkül megy.
A hozzászólás módosítva: Okt 22, 2013
(#) Wudoou válasza whalaky hozzászólására (») Okt 22, 2013 /
 
Itt 3 busz lenne egy lábon, buszonként 8 eszköz, mindegyik busz kb 35-40 méter, mind UTP-vel van készítve.
Próbáltam a felhúzó ellenállást csökkenteni, most 2,2K.
A gond az, hogy valamikor egy busznál is kiírja ezt a hibát.
A 3 busz csatlakoztatásakor meg már csak 1 eszközt ír ki.
Szóval lehet hogy átléptem a 1wire határait. De azon gondolkodtam, hogy hogyan tudnám megcsinálni a 3 buszt 3 különböző lábra, úgy hogy ne kelljen már 3x megírni minden függvényt.
A hozzászólás módosítva: Okt 22, 2013
(#) vicsys válasza Wudoou hozzászólására (») Okt 22, 2013 /
 
Én azt csináltam, hogy az első bekapcsoláskor vártam egy- két mp-et, majd kiolvastam 5x. Ezeket eldobtam és utána ment az "éles" mérés/ellenőrzés.
(#) Wudoou válasza vicsys hozzászólására (») Okt 22, 2013 /
 
És ez mire jó? Szóval miért kellett belerakjad?
(#) vicsys válasza Wudoou hozzászólására (») Okt 22, 2013 /
 
Azt vettem észre, hogy hosszú kábel esetén tovább tart a szenzor éledése. Ha nincs ilyen gond, akkor nem kell. Amit írtam eléggé extrém eset, de ha egyszer megírod a rutint, nyugodtan használhatod később is mert az a néhány másodperc a bekapcsoláskor nem oszt... (Ilyenkor szoktam reklámszöveget kiíratni az LCD-re)
(#) whalaky válasza Wudoou hozzászólására (») Okt 22, 2013 /
 
Akkor lehet hogy az UTP lesz a ludas....
Én is csináltam egyet anno UTP kábelen, és bizony el kellett vele szórakozni mire elindult.
A szenzorok táplábaira kellett egy 1u kondi, és a felhúzókkal is játszani kellett 15K és 2K között..... Akkor nem tulajdonítottam neki jelentőséget.
Most hogy riasztó kábelt használok minden ugrik első rugásra.
Lehet hogy semmi köze hozzá, de ha tudsz szerezz egy adag jobb minőségű riasztó kábelt és próbáld meg. Hátha.....
(#) vicsys válasza whalaky hozzászólására (») Okt 23, 2013 /
 
Én is azt használok és panel felőli végén az árnyékolás be van kötve. Ezzel értem el a legjobb eredményt.
A hozzászólás módosítva: Okt 23, 2013
(#) Wudoou válasza vicsys hozzászólására (») Okt 23, 2013 /
 
Úgy érted a táp minuszra, vagyis ez esetben a GND-re?
4x0.22-es jó? Kössem rá a maradék fölös eret is a GND-re?
(#) watt válasza Wudoou hozzászólására (») Okt 23, 2013 /
 
Igen.
(#) Wudoou válasza watt hozzászólására (») Okt 23, 2013 /
 
hajaj ez elég érdekes lesz, mivel már a szondák bent vannak a silóban. Mindenesetre van a kábelekre hagyva vagy 20-20 méter szóval ha levágom a ráhagyásokat még van esély a működésre. Esetleg csökkentsem a felhúzó ellenállást 1,5 K-ra? Alá nem szabad lenne menni.
(#) watt válasza Wudoou hozzászólására (») Okt 23, 2013 /
 
Szerintem 1K ig is le lehet menni 5V esetében, talán még lejjebb is.
(#) vicsys válasza watt hozzászólására (») Okt 23, 2013 /
 
Így van. Használtam már 1K-val.
(#) Wudoou válasza vicsys hozzászólására (») Okt 23, 2013 /
 
Ha ti mondjátok, akkor ki fogom próbálni.
Amúgy van még valami trükközés a felhúzó ellenállás, meg az időzítések játszadozása mellett?
Esetleg valami illesztő IC?
A hozzászólás módosítva: Okt 23, 2013
(#) vicsys válasza Wudoou hozzászólására (») Okt 23, 2013 /
 
A lényeg a kommunikációs jelek minősége. Amiket eddig írtunk, az mind a jelkondicionálásról és feldolgozás pontosságáról szólt. Szerintem 3-4 dologgal lehet játszani:
- Jó és minél rövidebb kábel
- Felhúzó ell. értéke, (szűrés)
- Időzítések hozzáigazítása
- Kiugró mérési hülyeségek eldobása
(#) _vl_ válasza Wudoou hozzászólására (») Okt 23, 2013 /
 
Vagy van még az az opció, hogy nem 1-wire megoldást használsz...
(#) potyo válasza vicsys hozzászólására (») Okt 23, 2013 /
 
1k alatt azért már csak óvatosan, nehogy átassünk a ló másik oldalálra. Az adatlap szerint csak 4mA lehúzó áramot garantálnak.
(#) Wudoou válasza _vl_ hozzászólására (») Okt 24, 2013 /
 
És akkor melyik az a hőmérő, ami 1 vezetéken kommunikál, buszos, legalább 40-50 métert tud és belefér egy 10mm átmérőjü saválló csőbe?
(#) _vl_ válasza Wudoou hozzászólására (») Okt 24, 2013 /
 
Nem azt írtad, hogy UTP-kábeled van? Abban a legutolsó emlékeim szerint 4x2 ér volt...
Következő: »»   84 / 153
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