Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   402 / 1319
(#) potyo válasza frecsko hozzászólására (») Jan 27, 2009 /
 
Az áramkör alapvetően semmire nem jó. Ha a led közös katódos, akkor az anódot pnp tranzisztorral kell kapcsolni. Vagy lehet npn-el is emitterkövetőként, de ahhoz meg nem így kell az egészet bekötni. A pic-ről hiányzik a tápszűrés, és a felhúzó ellenállás az mclr lábáról. A pic önmagában a feladathoz teljesen jó.


Idézet:
„Hogy kezdjek a programhoz?”


Na én annakidején ezen kérdés feltevése helyett kb. 500 oldalnyit olvastam az ezzel foglalkozó fórumokon. Neked is ezt ajánlom, mert nem lehet csak úgy levegőből csinálni a dolgot.
(#) trudnai válasza watt hozzászólására (») Jan 27, 2009 /
 
Melyik C-t nezegeted?
(#) lidi válasza watt hozzászólására (») Jan 27, 2009 /
 
Én csak csendben olvasgatom itt a dolgokat, de szerintem nem lenne gyorsabb a bitfield-el sem. Sőt még lassabb is lenne. Legalábbis nálam 16F-es procihoz a Hitech-C kisebb kódot generált ha maszkolással vizsgáltam a biteket, mint az unionos struktúrással. De ez azért van szerintem mert elég szerencsétlen a bit vizsgáló asm utasítás, nem tud csak előre lekódolt bitet vizsgálni. Azaz az nem lehet paraméter hogy melyiket nézze. Én ezen úgy lendültem túl, hogy #DEFINE -ekkel deklaráltam a maszkokat. Így szépen olvasható a kód, meg gyors is. Ha pedig nem fix, hanem paraméterezhetően kell biteket kapcsolgatni arra meg van két makróm:
#define CBITSET(x,mask) (x) = (x) | (mask)
#define CBITCLR(x,mask) (x) = (x) &~ (mask)

a maszk itt nem a bit száma, hanem 1,2,4,8 stb..
(#) lidi hozzászólása Jan 27, 2009 /
 
Most látom hogy Watt fix bit pozíciókat vizsgál. Úgy jó, csak nekem nem fixek kellettek.

Ezt viszont tökre nem értem :

if( !(PORTA & 0x02) == !(PORTB & 0x80) ) {}

Ennek semmi értelme, mert mind a két logikai vizsgálatot negálod aztán meg összehaszonlítod. Még jó hogy ugyanaz lesz az eredmény csak hosszabb úton.
(#) trudnai válasza lidi hozzászólására (») Jan 27, 2009 /
 
Idézet:
„Ennek semmi értelme, mert mind a két logikai vizsgálatot negálod aztán meg összehaszonlítod. Még jó hogy ugyanaz lesz az eredmény csak hosszabb úton.”


Nem, ez ket bitmuvelet, amit ha csak ugy ossze hasonlitana akkor soha sem lenne igaz az eredmeny mivel mas-mas biteket vannak kivadaszva... Gondolom a negalassal a logikai kifejezesse torteno konvertalast szerettek volna elerni - talan egy jobb optimalizacio eszre is veszi, hogy egyszerubben is meg lehet ezt csinalni, de valoszinleg C18 nem veszi ezt (sem) eszre
(#) lidi hozzászólása Jan 27, 2009 /
 
Na most olvasom mégegyszer át a postokat, és látom hogy ennek az egésznek nincs így értelme. Mivel ez az if tényleg csak akkor lesz igaz, ha mindkettő nulla, pedig valószínűleg nem ez lett volna a feladata. Icerny jól irta a #361694 -ben. A #define -olt maszkok is természetesen csak "fix" bitek vizsgálatára jók.

Nem fix bitek vizsgálata alatt azt értem pl, hogy egy for ciklussal végiglépkedünk egy byte bitjein. Na ezt nem lehet egyszerűen megcsinálni.

Aztán még bekavartam a feltételes összehasonlításba a bit állítgatást. Az külön téma, csak azért írtam le mert hasznos lehet.

Na asszem mára elég is ennyi inkább ledőlök filmet nézni.
(#) icserny válasza lidi hozzászólására (») Jan 27, 2009 /
 
Idézet:
„Ennek semmi értelme”

Szerintem azért csinálta, hogy az aritmetikai kifejezéseket logikaivá konvertálja. Mert a 2 és a 80 összehasonlítása nemkívánatos eredményre vezetne, de ha csak a nullától való különbözőséget vetjük össze, akkor már jó.

Tulajdonképpen így is írhatta volna:

  1. if( (PORTA & 0x2 == 0) == (PORTB & 0x80 == 0)) {}
(#) watt hozzászólása Jan 27, 2009 /
 
Ismét itt. Szándékosan nem valakinek az írására válaszolok, mert nem szeretnék senkit megsérteni, hogy kihagyom, ezért most mindenkinek ismét köszönöm a segítségeket.

Én meg közben megoldottam a megoldhatatlant? Tömböt hoztam létre, amit bitenként is el lehet érni. Még nem néztem a kódot, de előtte sem volt túl fényes, és most mint ha rövidebb lenne! Így sikerült:

  1. typedef union
  2. {       unsigned char Byte;
  3.         struct{
  4.         unsigned DQ0:1;        
  5.     unsigned DQ1:1;
  6.     unsigned DQ2:1;
  7.     unsigned DQ3:1;    
  8.     unsigned DQ4:1;    
  9.     unsigned DQ5:1;                            
  10.     unsigned DQ6:1;
  11.     unsigned DQ7:1;
  12.         };
  13. }RS_232_Bbits;
  14.  
  15.  
  16.         RS_232_Bbits    RS_232_Buff[130];
  17.  
  18. //elérések
  19.  
  20.         c = 15;
  21.        
  22.         RS_232_Buff[c].DQ4 = 1;
  23.  
  24.         RS_232_Buff[c].Byte = 45;
  25.  
  26.         if (RS_232_Buff[c].DQ4  == STATUS_Cbits.DQ5)
  27.         {
  28.         }

Mi a véleményetek, jó ez így? Már azon kívül, hogy működik(az előző is működött. )
(#) MPi-c válasza lidi hozzászólására (») Jan 27, 2009 /
 
Nem jól nézted, a (PORTA & 0x02) maszkolás...

Ne csak a C18-ról és Hitech-C-ről legyen szó, érdekesség képpen a "nem annyira szeretett" ccs-ben van külön bitvizsgáló függvény. Azt használva ilyen lesz a kód:
  1. ....................    if (bit_test(PORTA,1) == bit_test(PORTB,7))
  2. 0984:  MOVLW  00
  3. 0986:  BTFSC  F80.1
  4. 0988:  MOVLW  01
  5. 098A:  MOVWF  3E
  6. 098C:  MOVLW  00
  7. 098E:  BTFSC  F81.7
  8. 0990:  MOVLW  01
  9. 0992:  SUBWF  3E,W
  10. 0994:  BNZ   099C
  11. ....................    {
  12. ....................            r = 2;
  13. 0996:  MOVLW  02
  14. 0998:  MOVWF  3D
  15. ....................    }
  16. ....................    else
  17. 099A:  BRA    099E
  18. ....................    {
  19. ....................            r = 0;
  20. 099C:  CLRF   3D
  21. ....................    }
(#) lidi hozzászólása Jan 27, 2009 /
 
és ha úgy irja hogy:

  1. if( (PORTA & 2 ) & (PORTB & 128) == 128+2 )) {}
(#) potyo válasza lidi hozzászólására (») Jan 27, 2009 /
 
Végigmenni nem olyan vészes.

  1. static unsigned char a, b, c=0b01001001;
  2. static unsigned char e=0;
  3.  
  4. for(a=0,b=1;!(a&8);a++,b<<=1)
  5. {
  6.         if (b&c)
  7.         {
  8.                 e++;
  9.         }      
  10. }       }


  1. 102:               for(a=0,b=1;!(a&8);a++,b<<=1)
  2.   1144    0100     MOVLB 0
  3.   1146    6B79     CLRF 0x79, BANKED
  4.   1148    0E01     MOVLW 0x1
  5.   114A    6F7A     MOVWF 0x7a, BANKED
  6.   114C    B779     BTFSC 0x79, 0x3, BANKED
  7.   114E    D008     BRA 0x1160
  8.   1156    0100     MOVLB 0
  9.   1158    2B79     INCF 0x79, F, BANKED
  10.   115A    9F7A     BCF 0x7a, 0x7, BANKED
  11.   115C    477A     RLNCF 0x7a, F, BANKED
  12.   115E    D7F6     BRA 0x114c
  13. 103:               {
  14. 104:                    if (b&c)
  15.   1150    517A     MOVF 0x7a, W, BANKED
  16.   1152    0100     MOVLB 0
  17.   1154    1572     ANDWF 0x72, W, BANKED
  18. 105:                    {
  19. 106:                            e++;
  20. 107:                    }      
  21. 108:               }



18F esetén, ha a sebesség számít, akkor a TBLRD utasításokkal megoldható egy kis táblázatba elhelyezni a szükséges maszkokat, és annak segítsével AND művelettel tesztelni.
(#) potyo válasza watt hozzászólására (») Jan 27, 2009 /
 
Ha működik, akkor jó. Valami ilyent akartam én is kipróbálni, de megelőztél.
(#) szilva válasza icserny hozzászólására (») Jan 27, 2009 /
 
C-ben nem igazán vagyok otthon, de azt kérdezném, hogy logikai értékeket szerencsés-e aritmetikai egyenlőség szerint összehasonlítani?

Arra gondolok ugyanis, hogy azt tudjuk, a C-nél a nulla érték hamis, a nemnulla pedig igaz. Viszont megköveteli-e bármi, hogy a fordító által generált kód a két logikai kifejezés kiértékelésekor az igaz értékhez ugyanazt a nemnulla értéket rendelje? Mert ha igen, akkor korrekt a dolog, ha nem, akkor viszont nem biztos, hogy jól működik (fordítófüggő).
(#) lidi válasza potyo hozzászólására (») Jan 27, 2009 /
 
Uhmm! Én jó vagyok C ből, de ez... hát itt nem egyszerű kikövetkeztetni hogy hogyan készül el a maszk amit megvizsgálunk az if-el. Na azért csak kibogoztam.
"c"-n vizsgáljuk a biteket, "b"
a maszk, "a" meg a számlálónk.
Ennél azért talán lehet egyszerűbben. Szerintem az "a" változó nem kell, a maszk ellenőrzésével is eldönthető hogy megvolt e már a 8. bit.

Tömbbe foglalt maszkokat próbáltam még. De ott meg a tömb címezgetése volt ami megdobta a kódot.

Még a legjobb megoldás a végiglépegetésre tényleg egy alap maszk shiftelgetése.
(#) watt válasza potyo hozzászólására (») Jan 27, 2009 /
 
Megnéztem mit fordít a régi és az új verziómmal. A régi nem volt valami optimális, még a ti verzótokat is ki kéne próbálni, csak azzal az a baj, hogy tömböm is van, amivel ti nem számoltatok eddig!

Ez a régi kódom egy részlete:
  1. mFlags.DQ7 = STATUS_C >> 6;
  2.         if (mFlags.DQ7 == mFlags.DQ5)  //Ha a két bit egyforma
  3.         {
  4.                 NOP_C;
  5.         }
  6.         mFlags.DQ5 = mFlags.DQ7;  // Előző adat letárolása

Ez 32 sorra fordult le és volt benne ciklus is a C >> 6 miatt!

Ez az újabbik kód:
  1. if (STATUS_Cbits.DQ6 == mFlags.DQ5)  //Ha a két bit egyforma
  2.         {
  3.                 NOP_C;  //
  4.         }              
  5.         mFlags.DQ5 = STATUS_Cbits.DQ6;  // Előző adat letárolása

18 sorra fordul! Ezzel már elégedett vagyok.
(#) potyo válasza szilva hozzászólására (») Jan 27, 2009 /
 
Idézet:
„Viszont megköveteli-e bármi, hogy a fordító által generált kód a két logikai kifejezés kiértékelésekor az igaz értékhez ugyanazt a nemnulla értéket rendelje?”


Én úgy tudom, hogy nem garantálja senki egy logikai kifejezés nemnulla értékét. Valószínűleg a fordítók 99%-a 1-et tesz be az x változóba egy (x=b>c) után, de erre nem szabad építeni szerintem, és kerülöm is az ilyesmit.
(#) MPi-c válasza szilva hozzászólására (») Jan 28, 2009 /
 
Idézet:
„Arra gondolok ugyanis, hogy azt tudjuk, a C-nél a nulla érték hamis, a nemnulla pedig igaz. Viszont megköveteli-e bármi, hogy a fordító által generált kód a két logikai kifejezés kiértékelésekor az igaz értékhez ugyanazt a nemnulla értéket rendelje?”


Jó a kérdés. Én a netről szerzem az ismereteimet. Ebben a leírásban ez olvasható, ezért gondoltam, hogy a logikai értékek összehasonlíthatóak. Azért, ha a leírás hibádzik, jelezzétek!
(#) delmur82 hozzászólása Jan 28, 2009 /
 
Sziasztok!

Egy napkövető elektronikát szeretnék készíteni PIC - el. 16F628 - asom van otthon. Érzékelőnek mit ajánlotok? Mivel lenne a legoptimálisabb megcsinálni? Esetleg van valakinek tapasztalata?
(#) icserny válasza delmur82 hozzászólására (») Jan 28, 2009 /
 
Egy hasonló projekt itt található

Egy másik projekt fényérzékeny ellenállást használ.
(#) gtk hozzászólása Jan 28, 2009 /
 
Sziasztok !

PICnel hogy kell keresni a fuse biteket az adatlapban?

Koszi.
(#) potyo válasza gtk hozzászólására (») Jan 28, 2009 /
 
configuration bits
(#) gtk válasza potyo hozzászólására (») Jan 28, 2009 /
 
Koszi !
(#) vilmosd válasza delmur82 hozzászólására (») Jan 28, 2009 /
 
Hali
Egyszeruen megoldhato, de valami AD-s PIC-el. Pl 16F819, 16F690. Veszel 2 fotoellenallast (LDR) egyik kivezetest a GND-re a masikat egy 4k7 v. 10k ellenallassal a 5 V-ra. A csomopontokban levo feszt mered a PIC AD-jevel. Ha kulonbseg van a ket fesz kozott meghuzatsz egy relet ami egy motoron keresztul mozgatja a mechanikadat. Ugy nagy vonalakban ennyi.
Termeszetesen a reles aramkor fugg az alkalmazott motortol. Jol hasznalhato pl a SAT antenna mozgato motor, de ha beirod a kedvenc keresodbe a "sun tracker"
szavakat lesz millio talat hazi gyartasu napkovetokre.
Udv Vili
(#) gtk hozzászólása Jan 28, 2009 /
 
OshonSoft-nal a Config. WOrd alatt csak egy byte hosszu adat van: 0044. Ez most az also vagy felso byte lesz?
(#) vilmosd válasza delmur82 hozzászólására (») Jan 28, 2009 /
 
Hali
Egy jo oldal REDROCK. Itt talalsz sok leirast a napkovetokrol.
Udv Vili
(#) potyo válasza gtk hozzászólására (») Jan 28, 2009 /
 
Ha négy hexadecimális karakterből áll, akkor az csak egy bájt? Vagy esetleg kettő?
(#) watt válasza gtk hozzászólására (») Jan 28, 2009 /
 
Idézet:
„WOrd alatt csak egy byte hosszu adat van: 0044”

Ez nagyon gáz, nem gondolod?
(#) delmur82 válasza vilmosd hozzászólására (») Jan 28, 2009 /
 
Most ismerkedek az A/D konverzióval. Nézzétek el ha valamit rosszul látok. Olvasgatom a 16F819 adatlapját.
Szépen írja hogyan kell beállítani. Azt ADCON1(ADCS2) bit mit is állít tulajdonképpen? Akkor állítsam 1 - re ha belső osciról megy a cucc, egyébként 0 ?? ez nem tiszta. És ha beállítotam akkor az ADCON0 (ADCS1:ADCS0) biteket hogyan állítsam be?
(#) gtk válasza watt hozzászólására (») Jan 28, 2009 /
 
Jol beneztem..Utolag rajottem.
Koszi.
(#) vilmosd válasza delmur82 hozzászólására (») Jan 28, 2009 /
 
Hali
Az ADCS2 bit beallitja a 2-es osztast ha a system clockot allitod be mint az orajel forrast. egyszerobb ha a belso RC oszcit allitod be mint AD-clock forrast (ADCS0:ADCS1 = 11). Itt nincs jelentosege a gyors AD-nak. Eleg lassu a valtozas ezert van ideje olvasgatni a bemeneteket.
  1. movlw   B'01000001'     ; Fosc/8, A/D enable
  2. movwf   ADCON0          ; 0. chanel (RA0) select
  3. bsf             STATUS,RP0      ; bank1 select
  4. movlw   B'10000100'     ; ADRES Left justified
  5. movwf   ADCON1          ; RA0,RA1,RA3 analog input !!!

Ez egy pelda ami beallitja az AD_t a system clock 1/8-ra
Udv Vili
Következő: »»   402 / 1319
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