Meglehet oldani egy rotatry encoderrel azt, hogy:
1. ha tekerem akkor hangerőt szabályoz
2. ha megnyomom a középső gombot akkor mute
3. ha x mp-ig nyomom a középső gombot stand by
A mellékelt thermostátokat szeretném kipróbálni.
A HW-es rész megépítés, pr./hex/ Pic-be töltése, beüzemelés nem okoz gondot.
Korábban, tíz-egynéhány évvel ezelőtt próbálkoztam Pic progz.-al, de mivel egy led villogtatásához kb. másfél oldalnyi pr.-ot kellett volna írni, feladtam.
A mellékelt Thm.-ok forrás fileket próbáltam Hex-be konvertálni sikertelenül és itt elfogyott a türelmem.
A mellékelt forrás fileket kérném hex-be fordítani.
Köszönettel: Kepitu
1. A problémával rossz topikban kopogtattál, mivel köze nincs a C nyelvhez!
2. Ez nem szolgáltatóház. Tanulni viszont szívesen segítünk.
3. A belinkelt helyről letöltött programot át kell nevezni, hogy ne legyen a fájlnévben szóköz, s .asm legyen a kiterjesztése.
4. A CBLOCK sor elejére kell szóköz vagy tabulátor
5. Az MPLAB MPSWIN.exe programja ezután lefordítja, az alapértelmezett beállításokkal (legyen pipával kijelölve a Case Sensitive kérdés!).
Köszi a segítséget.
Kezdő vagyok, nem tudhatom hol kell kopogtatnom.
"3. A belinkelt helyről letöltött programot át kell nevezni, hogy ne legyen a fájlnévben szóköz, s .asm legyen a kiterjesztése."
Nem gondoltam, hogy ilyen egyserű, mert alapból asm.-ben van írva, akkor miért txt kiterjesztésben rakja fel a tulaj, talán az ilyen zöldfülüek megtévezstésére mint én vagyok.
Sajnos nem műkszik az ák.
A txt.-ben /forrás/ Pic 628 szerepel én viszont 628A-t használok. Ez okozhat-e problémát?
A kapcs rajzon 4MHz-s rezonátor van, viszont az általad konvertált Hex-el Rc konfigot állít be.
Próbáltam 628A-ra az általad leírtak alapján hex-et készíteni, sikertelenül, sőt ugyanazt sem tudtam produkálni amit felraktál.
Azért köszönöm, további segítséget szivesen veszek.
A Hw. résszel nem gondolnám, hogy probléma lehet, mert egy sima hőmérő és az "EPE LCF METER" megfelelő hex és lábkonfig után rb. műkszik.
Köszi: kepitu
Idézet: „Kezdő vagyok, nem tudhatom hol kell kopogtatnom.”
Annyi elvárható egy kezdőtől is, hogy a topik címét elolvassa, a fórumszabályzatról nem is szólva, ami kifejezetten tiltja, hogy egy kérdést több témakörben is feltegyenek.
Idézet: „miért txt kiterjesztésben rakja fel a tulaj”
Például azért, mert sok tartalomkezelő rendszer korlátozza a feltölthető mellékletek kiterjesztését.
Idézet: „A txt.-ben /forrás/ Pic 628 szerepel én viszont 628A-t használok. Ez okozhat-e problémát?”
Igen, okozhat. S nem biztos, hogy elég a név átírása, lehetnek hardver eltérések, amelyeket figyelembe kell venni.
Köszönöm a kioktatást, ezzel is okosabb lettem.
/Mivel első próbálkozásomra mapokon keresztül nem kaptam választ, próbálkoztam másutt./
Az 5X-emen túl sem szégyenlem, ha nálam fiatalabbaktól tanulhatok.
Üdv: kepitu
Van egy olyan topic, hogy PIC kezdoknek. Szerintem ott kellene ezt megkerdezni mert itt a C programnyelvvel kapcsolatos kerdeseket varjak es valaszoljak meg a forumtarsak.
A program fejléce szerint "Compiles with B. Knudsen CC5X(Trial version/without optimization)".
Valószínűleg erről a fordítóról van szó. S felhívja a figyelmet, hogy az optimalizálást ki kell kapcsolni, mert kritikus időzítések vannak a programban.
Köszönöm a segítséget, de az eddigi próbálkozások sikertelenek voltak,
Nem gondolom, hogy kb. 3Pr. nyelvet kellene megtanulnom, mert egy sz.-os thermostátot szeretnék megépíteni és nem hex-ben van a pr.-ja.
Ha mégis valakit érdekel, a köz javára konvertálhatná a pr.-ot, hogy aki tudja hasznosítsa.
Köszi: kepitu
Sziasztok!
Tanácsot szeretnék kérni C18 nyelven egy viszonylag összetettebb menükezeléssel kapcsolatban. Úgy szeretném megoldani, hogy minden gombnak, minden menüpontban írok egy-egy függvényt, ami lekezeli az ott épp végrehajtandó műveleteket. Ezeket a függvényeket inicializáláskor beleteszem gombonként 1-1 függvény pointer típusú tömbbe. Majd a gomb megnyomásakor ebből a tömbből az aktuális menü pozícióval indexelve könnyen tudnám hívni az adott függvényeket. Így elkerülhetném a nagy if-else vagy switch case szerkezeteket a gombkezeléskor. Nem tudom érthetően írtam-e le, csatolok egy forrás részletet az elképzelésről, abban talán jobban látszik hogy gondoltam megvalósítani. Gombból csak 4 db lesz, de menüpontból jóval több mint a példában, körülbelül 30, de lehet hogy még több is. Az lenne a kérdésem, hogy ez így mennyire működőképes, szép/ronda, hatékony, vagy memóriapazarló megoldás lenne? Érdemes így belevágni a dologba?
Köszönöm, Gábor
Szeretnék egy unsigned int változót ugyan úgy kezelni mint egy SFR regisztert, tehát bitenként elnevezne külön külön is tudjak rá hivatkozni, (ez megy is, meg volt is már itt szó róla (#804327) ) de hogy tudok az egész 16 bites változóra is hivatkozni?
A PORTD állapotáról szeretnék egy pillanatképet PORTD_T = PORTD, és utána bitekre külön hivatkozni PORTD_Tbits.RDT3
Egy struct -ot létrehoztam ahogy a header -ben láttam, de akkor PORTD_T = PORTD erre hibát ír.
Valahol már erről is volt szó, de nem találom.
Köszi a gyors választ.
Ennek segítségével már megértettem hogy mi a különbség az union és a struct között, de akár hogy próbálom nem jövök rá hogy enné meg a fordító.
Addig jutottam hogy egy union -on belül kéne létrehoznom egy unsigned int változót, és egy struct -ot a szükséges bitekkel.
A C30-at nem ismerem konkrétan, de ha C-ről van szó, az unionnak nem adtál nevet és az union elemeire is hasonlóan kell hivatkozni mint struktura elemeire:
Kicsit gugliztam, mert engem nem csak a definiálás, hanem a típuskényszerítés része is érdekelt. Pl. ha egy függvényemben char változóként érkezik meg az adat, hogyan férek hozzá annak a bitjeihez anélkül hogy átmásolnám unionos változóba, vagy logikai ésekkel bűvészkednék. Íme a minta:
typedefunion
{
struct
{
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
};
struct
{
char byte;
};
}UJTIPUS;
void teszt(char ch)
{
staticchar c;
// átmásolós verzió
UJTIPUS adat;
adat.byte = ch;
LATBbits.LATB0 = adat.bit3;
// átmásolás nélküli típuskényszerítéses verzió
LATBbits.LATB1 = ((UJTIPUS*)&ch)->bit6;
// C18-on ezt sajnos nem fordítja le 4 utasítássá (ahogy ASM-ben csinálná az ember)
if(((UJTIPUS*)&ch)->bit7)
LATBbits.LATB5 = 0;
if(!((UJTIPUS*)&ch)->bit7)
LATBbits.LATB5 = 1;
c = ch;
// viszont nem veremben tárolt változónál már igen
if(((UJTIPUS*)&c)->bit4)
LATBbits.LATB4 = 0;
if(!((UJTIPUS*)&c)->bit4)
LATBbits.LATB4 = 1;
}
Kipróbáltam, a C30 is megeszi. Első körben úgy tűnik ugyanazt a kódot fordítja mintha a union bitjeit használnám (persze csak akkor ha a változó azonos hozzáférésű tárhelyen található: adatmem <-> verem).
Mondjuk ezt a mutatós, címképző operátoros megoldást magamtól ki nem találtam volna
Pont forditva van mint ahogy azt a kommentben irod, a 'c' valtozo nem a stack-en (veremben) lesz, hanem a sima adat szekcioban, hiszen 'static'-nak deklaraltad. A 'ch' parameter azonban a veremben lesz -- ezert nem tudja azt 4 utasitasban megoldani. Nyilvan FSR-t allitgat es INDF-ekkel eri el a valtozot, bar nem lattam a visszafejtett kodot. A 'c' eseteben erre nincs szukseg hiszem a valtozo helye a forditasi idoben mar ismert.
MikroC-ben próbálok egy pic16f628-siemens m35i telefon közötti kommunikációt megírni,de elakadtam. A pic feladata mindössze annyi lenne hogy ha érkezik egy hívás a vele összekötött telefonra akkor ellenőrizze le a hívószámot,és ha stimmelt akkor rb4-et kapcsolja be.
Beégettem a programot a pic-be,de hívószámtól függetlenül mindig bekapcsolja rb3-at, és rb4-et.
Csinált már valaki bejövő hívószám ellenőrzést mikroc-ben?
Igen, a 'c' változót direkt azért deklaráltam staticnak, hogy ne a verembe tegye hanem a sima adat szekcióba. Ezért tudja 4 utasítással megcsinálni. Szerintem jól írtam mert "NEM veremben tárolt" -at írtam rá és ez így is van.
Ez a programkezdemény igencsak sok sebből vérzik.
A feltételed csak azt vizsgálja hogy GSM_MSG5 változód legelső karaktere igaz-e (ha nem nulla akkor igaz), márpedig a '+' jel asc kódja nem nulla.
Miután a telefonra kiküldöd a számlekérdezést vársz 2,5 másodpercet, ezalatt a telefon már rég válaszolt, de te nem tároltad el a választ sehova. Én a telefonszámnak csak az utolsó 9 számjegyét ellenőrizném, így mindegy hogy +36 vagy 06-ot tesz a szám elejére.