Szia,
Én hónapokkal ezelőtt nézegettem, de akkor belső Vref-et használtam és nem érdekelt. Ha jól emlékszem, akkor van egy javított A/D könyvtár, amivel lehet külső referenciát használni. De most nem találom, pedig nekem is kellene...
Sziasztok! Egy rádiós hőmérőt építek, TX-4MSIL adóval és BC-NBK vevővel. Az adó és vevő nélkül az adó out-ját a vevő in -jével összekötve tökéletesen működik a kapcsolás. Ha berakom az adót és a vevőt, nem jönnek a korrekt adatok. Szerintem a szinkronizálással lehet a baj. Készített már valaki ilyet? Esetleg egy példa program nincs nektek? Régebben már készítettem egy ilyet, akkor csak próbapanelen. Akkor a man_synchro -t kellett addig hívogatni, amíg egy megfelelő értékkel tér vissza. Ez akkor 62 volt. De most az akkor írt program sem működik. Beszúrom ide:[code=c] begin
ErrorCount := 0;
ANSEL := 0; // Configure AN pins as digital I/O
ANSELH := 0;
C1ON_bit := 0; // Disable comparators
C2ON_bit := 0;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
Lcd_Out(1,1,'Start');
delay_ms(200);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
sync:=5;
Man_Receive_Init();
while TRUE do // Endless loop
begin
Lcd_Cmd(_LCD_FIRST_ROW); // Move cursor to the 1st row
while sync<>62 do
begin
delay_ms(200);
sync:=man_synchro;
bytetostr(sync,st);
lcd_out(1,1,st); // Initialize Receiver
end;
Lcd_Cmd(_LCD_CLEAR);
while TRUE do // Wait for the "start" byte
begin
temp := Man_Receive(error); // Attempt byte receive
if (temp = 0x0B) then // "Start" byte, see Transmitter example
break; // We got the starting sequence
//if (error <> 0) then // Exit so we do not loop forever
// break;
end;
repeat
begin
temp := Man_Receive(error); // Attempt byte receive
if (error <> 0) then // If error occured
begin
Lcd_Chr_CP('?'); // Write question mark on LCD
Inc(ErrorCount); // Update error counter
if (ErrorCount > 20) then // In case of multiple errors
begin
while temp<>62 do
temp := Man_Synchro(); // Try to synchronize again
//Man_Receive_Init(); // Alternative, try to Initialize Receiver again
ErrorCount := 0; // Reset error counter
end;
end
else // No error occured
begin
if (temp <> 0x0E) then // If "End" byte was received(see Transmitter example)
Lcd_Chr_CP(temp); // do not write received byte on LCD
end;
Delay_ms(10);
end;
until ( temp = 0x0E );
end; // If "End" byte was received exit do loop
end.
--------------------------------------------------------------
MI lehet a gond?
próbálkoztam mindennel.
nyomogomb := not(nyomogomb);
de nem segít, az a gáz, hogy erre a problémára még csak rá se tudok guglizni, holott szerintem egy pofonegyszerű dolog (annak aki csinált ilyet)
Nem vagyok pascalos, de esetleg a mintapeldakbol leshetnel egy kicsit. C-ben igy csinalom
inbit=~nyomogomb;
Persze a pascalnal nem tudom hogy jelzik a negalast.
Esetleg a telepitett mintapeldakba kellene belelesni, vagy a Mikroe oldalon szetnezni a nem keves irodalomban. A C-re pl van egy igen komoly leiras, gondolom basicra, es pascalra szinten irtak valami par soros ismertetot (par szaz oldal).
Szoval....
1.: Ha elkezdesz egy programnyelvvel programozni eloszor is meg kell ismerni a sajatossagai, operatorait, adattipusait, es ugy altalanosan mindent. E-nelkul ez nem programozas, hanem kinlodas, es a tobbiek molesztalasa.
2.:A MikroE oldalan talalhato egy 586 oldalas "User Manual" , kb 2.5 MB mintapeldat. Ezek letoltese es reszletes tanulmanyozasa nagyban fog segiteni az elorehaladasban.
Hello
Valahol a programodban nyilván vizsgálod a nyomogomb változó értékét. Nem értem, hogy miért gond a nyomogomb nullás értékét venni "megnyomott" állapotnak:
pl. if nyomogomb = 0 then ...
Egyébként a nyomogomb változót nem tudod invertálni, mert az egy bemenet (macro). Ha viszont neked mégis fontos, hogy 1 legyen a gomb állapotát jelző változó értéke megnyomáskor, akkor ezt tudom elképzelni megoldásnak: gomb:= not nyomogomb;
A gomb pedig egy bit típusú változó, és a programban ennek az értékét vizsgáld.
Üdv.
Szia
Nem rossz módszer, csak az a gond, hogy a ciklus elején meg kell értetni , hogy gomb:= not nyomogomb.
Én meg pont ezt akartam elkerülni, de azért köszi.
Üdv
Szia
Szoktam használni, úgy tudom csak pergésmentesítésre használatos, ráadásul ennél nem lehet elnevezni a portot, csakis a gpio-val lehet rá hivatkozni.
Apropó, olyan függvényt nem tudsz véletlen, ami ennek gyakorlatilag az ellentettje, szóval x időn belül érkezik-e jel?
Üdv
3x4-es (matrix) keypad kezelésében tudna valaki segíteni? Egész pontosan a lenyomott gombot kéne kideríteni, de sajnos a mP beépített library-je nem jó, mert az külön porton lévő oszlop/sort nem kezeli, nekem meg a PORTC-n és D-n vannak Mellékeltem egy képet a bekötésről is, remélem tudtok segíteni, mert én sajnos nem vagyok elég tapasztalt ehhez
a keypadport magának a keypad-nek a portját adja meg, ahová a sorok és oszlopok lábai vannak kötve, külön külön nem lehet megadni, hogy 1-es sor RB.3, 2-es sor RB.5.. Már próbálkoztam saját rutint kitalálni, de elvesztem a sok 1 és 0 közt
Hello
Szerintem muszáj lesz saját keypad-szkennelő rutint írnod.
A dolog úgy működik, hogy ha keypad-en pl. megnyomod a 7-es gombot, akkor keypad összeköti az 1-es és C lábát. Nos, a PIC 28:30 lábának bemenetnek kell lennie jelen esetben, a 23:26 -nak pedig kimenetnek.
A PIC 23:26 lábait 0-ra állítod. Ezután a keypad A lábára magasat kapcsolsz és megnézed, hogy a keypad 1, 2, 3 lába közül melyik van alacsony, vagy magas szinten. Amelyik magas szinten van, ott az a gomb van megnyomva. Így megtudod, hogy az első sorban melyik gombok vannak megnyomva. Ezután ugyanígy végigmész az összes soron. Ha már érzékeled, hogy meg van nyomva az egyik gomb, akkor a függvényed adja vissza az annak a gombnak megfelelő számot. Ilyen keypad-del csak egyszerre egy gomb lehet megnyomva.
Egyébként megkérdezhetem, hogy milyen programmal rajzoltad ezt a kapcsolási rajzot?
Üdv.
Köszönöm, én is kb ez alapján a logika alapján próbáltam megírni, a szkennelő rutint, csak nem sikerült, de neki esek mindjárt megpróbálom újból. A rajzot a "ISIS Professional" programmal csináltam, ezzel kompletten le lehet szimulálni a pic-be égetett program működését is.
Nos sikerült végül nagy nehezen megcsinálni, de a kód az gusztustalan lett, mindenesetre megosztom veled/veletek. Egyelőre ez így működik, de ha valaki le tudná ezt egyszerűsíteni, nagyon hálás lennék érte!
16f pic után elkezdtem foglalkozni 12f675 pic-vel.
sajnos nem sikerült sok próbálkozás után sem megoldani egy darab led villogtatását gpio-n keresztül.
így próbálkoztam:
TRISIO := 0;
whiletruedo
begin
GPIO.2 := 1;
delay_ms(100);
GPIO.2 := 0;
delay_ms(100);
end;
korábbi hozzászólásokban olvastam, hogy a CMCON:=7; sorral még ki kell egészítenem az elején, de sajnos azzal sem működik.