Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   637 / 1319
(#) Hp41C válasza benjami hozzászólására (») Jan 7, 2010 /
 
Szia!

Itt egy web szerver, ami FAT felhasználásával kezel SD kártyát.

Szia
(#) watt válasza Hp41C hozzászólására (») Jan 7, 2010 /
 
Ha jól sejtem, még a 18F sem jött számításba, nem a 24FJ, 16F-el akarja megoldani FAT kezelés nélkül, valamilyen milyen módon PC-re juttatva a tárolt adatokat.
Csak mi kezdtünk itt bonyolódni azzal, hogy FAT kezelés nélkül is lehet egy fájl tartalmát módosítani úgy, hogy utána PC-vel ki lehessen olvasni a tartalmát kártyaolvasóval.
(#) tirisztortetróda válasza watt hozzászólására (») Jan 7, 2010 /
 
Köszönöm a válaszod !
(#) tirisztortetróda válasza Hp41C hozzászólására (») Jan 7, 2010 /
 
Neked is kösz, a segítségért !
(#) potyo válasza Hp41C hozzászólására (») Jan 7, 2010 /
 
Kérdés, hogy át lehet-e gyúrni egy ilyet, hogy 18F-en fusson? Ahogy néztem a Microchip csomagjában, nem tűnik nagy problémának átírni 18F-re, csak kevés fájlt kell módosítani hozzá
(#) icserny válasza potyo hozzászólására (») Jan 7, 2010 /
 
Ha FAT kezelés kell, akkor AN1045
Ha pedig WEB szerver, akkor Olimex PIC-MINI-WEB és társai
(#) potyo válasza icserny hozzászólására (») Jan 7, 2010 /
 
Kösz, de webszerver van a Microchip csomagjában, azzal már építkeztem. Az 5.20-as csomagban van egy TCPIP MDD Demo App nevű cucc, ami egyelőre csak C30-ra van elkészítve, én abból akarok C18-ra kódot gyártani.
(#) valaki2 hozzászólása Jan 7, 2010 /
 
Hali,

Azt szeretném megoldani, hogy ha az usart megszakitást generál, akkor a megszakitás kerüljön kiszolgálásra és utánna a vett bájtot dolgozza fel, ha nincs megszakitás akkor Sleep -be menjen a pic.

A Sleep parancs kiadása előtt kell valamit még beállitani?

if (jelzo == 0)
{
#pragma IDLEN = 1;
Sleep();
}

if (jelzes != 0x01) // nem lett beállitva, vagyis nincs megszakitás
{
#pragma IDLEN = 1;
Sleep();
}
// Ha van megszakítás akkor annak kiszolgálása
usart_isr();

//vet bájt feldolgozása...

Még egy kérdés: wdt(PIC18F45J10):
Tegyük fel, hogy a wdtps nél 1111-t állitok be. Ekkor ezzel 1:32,768 -as osztást állitok be, ami kb. 4ms.

Akkor ezt azt jelentené, hogy a CLRWDT-t 4 ms-nként kéne kiadni? Vagy van valami más módszer arra, hogy mikor és hányszor kell kiadni??


(#) trudnai válasza valaki2 hozzászólására (») Jan 7, 2010 /
 
Sleep elott meg kell gyozodnod rola, hogy az osszes olyan kulso aramkort lekapcsolod aminek nem kell/szabad mennie alvas alatt.

Altalaban amugy ha csak ezt az egy dolgot kezeli le az ember, hogy bejon egy megszakitas, csinalni valamit majd elaludni, akkor azt ugy szoktak megcsinalni, hogy a fo ciklus nem csinal mas, csak elalszik:
  1. for(;;) {
  2.     sleep();
  3. }

Ha azonban varsz bejovo adatokat, akkor a megszakitas kezeloben beallitasz egy flag-et, amit ebben a fo ciklusban figyelsz:
  1. for(;;) {
  2.     sleep();
  3.     nop();
  4.     if ( 1 == jelzes ) {
  5.         ......
  6.     }
  7. }

(A nop() azert kell, mert felebredes utan meg egy utasitast vegre hajt mielott a megszakitasi rutint meghivna...)

Idézet:
„....... a CLRWDT-t 4 ms-nként kéne kiadni? Vagy van valami más módszer arra, hogy mikor és hányszor kell kiadni??”


Nem egeszen. Ez azt jelenti, hogy 4ms all rendelkezesedre, hogy a WDT szamlalojat torold. Azt torolheted akar 1us-kent is... Viszont ha altatod a PIC-et, akkor ugye nem torlod a szamlalot es emiatt 4ms mulva fel fog ebredni (sleep szinten torli a szamlalot). Ekkor beallitastol fuggoen vagy csak felebred, vagy resetet is ad, de akkor a reset vektoron le kell kezelned, hogy nem a szokasos bekapcsolas miatt kerult oda a vezerles (POR - Power On Reset), hanem a WDT miatt (WDT Reset during Sleep)
(#) valaki2 válasza trudnai hozzászólására (») Jan 7, 2010 /
 
Még nem teljesen tiszta. A jelzés beállitást így érted?
És az a megoldás nem jó, ha az usart megszakitás flegjét figyelem?


void usart_isr (void)
{
id == USART_vetel();
jelzo = 1;
}

void main (void)
{

for(; {
sleep();
nop();
if ( 1 == jelzes ) {
......
}
}

(#) El_Pinyo válasza valaki2 hozzászólására (») Jan 7, 2010 /
 
Szia!
Idézet:
„És az a megoldás nem jó, ha az usart megszakitás flegjét figyelem?”

Az azért nem jó, mert az RCIF flaget csak olvasni lehet, írni nem. Tehát, ha kiolvassuk az RCREG regisztert, akkor a flag hardveresen törlődni fog, így a főprogramban már nem lesz látható a jelzés. A megoldás, hogy egy változót beállítunk az IT rutinban, és a főprogramban pedig azt figyeljük és töröljük.
Üdv

Szerk: Amúgy sem szabad engedélyezett IT mellett a flaget a főprogramban törölni, azt az IT kiszolgáló rutinban kell megtenni.
(#) robotech hozzászólása Jan 7, 2010 /
 
Üdv!

Még csak most ismerkedem a C nyelvvel, a Microchip USB framework programjait irkálom át, és közben igyekszem leszűrni a tanulságot.

Ha a következő függvénnyel stringet küldök virtuális soros porton a Pc-nek:

Idézet:

putrsUSBUSART("Microchip Technology Inc., 2007\r\n");


Akkor a string utolsó karakterét ami ugye NUL, azt is elküldi, így a terminálban nem túl szép,hogy a következő sorba betesz egy <0> értéket.

A kérdésem az lenne, hogy hogyan lehet C úgy elküldeni egy stringet, hogy a számunkra lényegtelen (tudom, a C számára lényeges) utolsó NUL karaktert ne küldjük el?

Köszönöm előre is a válasz(oka)t.

Márk.
(#) trudnai válasza robotech hozzászólására (») Jan 8, 2010 /
 
EZT olvasd el figyelmesen

[OFF]motto: Aki keres talal...
(#) icserny válasza robotech hozzászólására (») Jan 8, 2010 /
 
Én egy másfajta megközelítést használok, melynek részleteit itt találod meg. Ennek lényege az, hogy putc(), puts(), getc() mintájára csináltam olyan blokkoló típusú fv-eket, amelyek várakozás közben hivogatják a ProcessIO függvényt, ezáltal kezelik az USB CDC tamagocsit. Így a főprogramban bárhol, bármennyit írogathatok, vagy várhatok bejövő karakterekre.
(#) watt válasza icserny hozzászólására (») Jan 8, 2010 /
 
Én is hasonló megoldást választottam, csak Timer megszakítást állítottam rá erre, mert nekem sokszor megszakadt a kapcsolat, ha nem maceráltam a vonalat rendszeresen.
(#) trudnai válasza valaki2 hozzászólására (») Jan 8, 2010 /
 
Idézet:
„Még nem teljesen tiszta. A jelzés beállitást így érted?
És az a megoldás nem jó, ha az usart megszakitás flegjét figyelem?

void usart_isr (void)
{
id == USART_vetel();
jelzo = 1;
}


Nem egeszen. Egyreszt lehet felre ertettem mit szeretnel, masreszt a megszakitas jelzot torolnod kell az ISR-ben.

Tehat en ugy ertettem veszel adatokat, es mikor a megfelelo adat bejon akkor kell valamit csinalnod. Pl. egy speci byte jon be, ekkor:
  1. void usart_isr (void)
  2. {
  3.     id = USART_vetel();
  4.     if ( 0x34 == id ) {
  5.         jelzo = 1;
  6.     }
  7. }

Tehat hex 34-re varsz, es ha bejon beallitod a flag-et.

Vagy egy stringet kell beolvasnod:
  1. void usart_isr (void)
  2. {
  3.     ch = USART_vetel();
  4.     if ( '\0' == ch ) {
  5.         jelzo = 1;
  6.     }
  7.     str[idx++] = ch;
  8. }

Tehat mikor bejon a stringet lezaro 0 akkor jelzed, amugy meg ugye a fo programban nem tortenik semmi ameddig az egesz string be nem jott...

Ha azonban mindig minden karakternel kell valamit csinalni, akkor ha belefer lehet bele lehet preselni az ISR-be -- de most igy atgondolva ha nem fer bele akkor sem tudsz majd mit kezdeni a tobbi bejovo karakterrel, tehat akkor mar baj van, mindenkeppen fel kellene allitanod egy buffert es a string kezeleshez hasonlo modon feldolgozni.
(#) icserny válasza watt hozzászólására (») Jan 8, 2010 /
 
Az USBDeviceTasks(); periodikus hivogatása a timer interrupt kiszolgálásból csak az egyik fele a dolognak. Az nálam is interrupton zajlik.

A dolog másik fele az USB buffereket kezelése, ami a getsUSBUSART(), putUSBUSART(), s a CDCTxService() hívásával történik. Ezt végzi a ProcessIO() minden ki/bemeneti várakozáskor. Ez utóbbit is interruptra tetted?
(#) watt válasza icserny hozzászólására (») Jan 8, 2010 /
 
Már nem emlékszem, nincs előttem, majd megnézem, de lehet, hogy félre értettem valamit.
(#) icserny válasza watt hozzászólására (») Jan 8, 2010 /
 
Idézet:
„Már nem emlékszem, nincs előttem”

Ne aggódj, a Fórum keresőjének kitűnő a memóriája.
A korábbi beírásodból úgy tűnik, hogy nálad is az időkritikus USBTasks(); megy interrupton, a többit meg a főprogramban egy végtelen ciklusban hivogatod.

Nálam annyi a különbség, hogy a főprogram végtelen ciklusa blokkolódhat, ezért be kellett iktatni egy-egy belső tamagocsi ciklust a karakterbeolvasásra és kiírásra történő várakozásnál.
(#) miklosch hozzászólása Jan 8, 2010 /
 
Sziasztok!

Keresek egy kompakt alfanumerikus LCD programot C-ben írva, 16-os sorozathoz, mely nem időzítést használ, hanem olvassa a busy flag-et. Merre találok ilyen előre megírt programokat, melyeket csak konfigurálni kell egy adott pic lábkiosztásához? Assemblyhez vannak ilyen oldalak, gondolom C-hez is, viszont még nem találtam rá.
(#) googa hozzászólása Jan 8, 2010 /
 
Sziasztok! Óriási segítségre van szükségem, mert három este óta nem bírok egy dologgal Hi_Tech C-ben...és lassan megőrülök. Mondom amit kellene tudni a programnak és nekem sehogy sem jön össze. Se haverok,se Google nem tudott segíteni...

Kellene egy ilyesmi saját parancs, amit bármikor fel tudok használni programozás közben:
PrintMe("ide max. 21 karakter", 3,6); és ez egy olyan függvényt hívjon meg, ahol a két idézőjel közé tett char tömb (vagy string) egyes karaktereinek az ascii értékét egy változóba (pl. i-be) tegye át, hogy utána már tudjak vele dolgozni.
A fenti esetben mondjuk az első karakterről tudja meg, hogy annak a decimális kódja: 105, a másidokról: 100, stb...
Nagyon szépen kérem aki tud az írjon nekem egy függvényt erre! Köszönöm!
(#) watt válasza icserny hozzászólására (») Jan 8, 2010 /
 
Igen-igen, már értem mi a helyzet nálad. Elsőre másképp értettem.
(#) csanyipal hozzászólása Jan 8, 2010 /
 
Egy egyszerű robotot tervezek, melyet PIC16F877A vezérelne.
Két kerekét egy-egy kefés egyenáramú motor hajtaná. A két azonos motor üresjáratban 0,14 A, teljesen lefogva 0,66 A áramerősséget vesz fel. A rotor három tekercsének ellenállása 3,1 Ohm (a motoron sajnos nicsen semmilyen jelzés, hogy katalógusban megkereshessem az adatait). A játék, amelyből kiszedtem a motort, 2 db 1,5 V-os, sorbakötött elemmel működik. Kipróbáltam 2db, sorbakötött 1.2V-os akkumulátorral is.
A motorok forgási sebességét, és forgási irányát vezérelném.
Egy infravörös érzékelője (GP2D12) is lenne a robotnak, akadályok elkerülésére.
4 db, sorbakötött, újratölthető akkumulátor lenne az áramforrása.

A kapcsolási rajzon egyenlőre csak a motorok, és az érzékelő csatlakoztatása van meg.

Van-e a kapcsolási rajzon hiba?

Hogyan oldjam meg az áramellátást a roboton? Az a probléma, hogy egyrészt a PIC, a GP2D12 és a L293, másrészt meg a motor más áramforrásból kell, hogy táplálkozzon, igaz? Erre energiatakarékosság miatt van szükség, mert L293D adatlapján olvastam:
Idézet:
„On the L293, external high-speed output clamp diodes should be used for inductive transient suppression.
A VCC1 terminal, separate from VCC2, is provided for the logic inputs to minimize device power dissipation.”


L239-nek min. 4,5V kell, ami azt jelenti, hogy 4 db, sorbakötött 1,2V-os akku elég lesz neki. PIC16F877A adatlapján ovasom, hogy:
Idézet:
„Wide operating voltage range: 2.0V to 5.5V”
azaz jó lesz neki is a 4,8V, úgyszintén GP2D12-nek is. Csak a motornak kell max. 3.2V. Hogyan oldjam ezt meg?

Igen, a SES5001 dióda azért kell, hogy elfojtsa a motor indukcójának zavaró hatását. Esetleg, ha éppen nincs ilyen, akkor milyen diódát ajánlotok?

Ha meglesz minden alkatrész, a programozás már gyerekjáték lesz a számomra. Assembly nyelven írom majd meg a vezérlő programot.

Minden építő jellegű hozzászólást megbecsülök!
(#) watt válasza csanyipal hozzászólására (») Jan 8, 2010 /
 
Idézet:
PIC16F877A adatlapján ovasom, hogy:
Idézet:
„Wide operating voltage range: 2.0V to 5.5V””

Olvasd el mégegyszer, hogy melyik az a típus, amelyikre ez igaz!
(#) Hp41C válasza miklosch hozzászólására (») Jan 8, 2010 /
 
Szia!
C nyelvű rutintár. Van itt LCD kezelő rutincsomag is...

Szia
(#) miklosch válasza Hp41C hozzászólására (») Jan 8, 2010 /
 
Köszönöm!
(#) valaki2 válasza trudnai hozzászólására (») Jan 8, 2010 /
 
Hali,
kössz, már letisztult.
(#) csanyipal válasza watt hozzászólására (») Jan 8, 2010 /
 
Idézet:
„Olvasd el mégegyszer, hogy melyik az a típus, amelyikre ez igaz!”

Az igaz, hogy sietségemben nem a PIC16F87XA, hanem a PIC16F877 adatlapját olvastam el, de most megnéztem mindkettőt.
A PIC16F877 adatlapban ez áll:
Idézet:
„Microcontroller Core Features:
Devices Included in this Data Sheet:
PIC16F873PIC16F876
PIC16F874PIC16F877
...
Wide operating voltage range: 2.0V to 5.5V

A PIC16F87XA adatlapban ez áll:
Idézet:
„Devices IncIuded in this Data Sheet:
* PIC16F873A * PIC16F876A
* PIC16F874A * PIC16F877A
...
CMOS TechnoIogy:
...
* Wide 0perating voItage range (2.0V ta 5.5V)”

Nos, ha jól értem, akkor a PIC16F877A dolgozik 2V-5,5V feszültségtartományban, nem?
Írd már ide légyszíves, hogy Te hol olvasod a helyes értéket!
(#) potyo válasza csanyipal hozzászólására (») Jan 8, 2010 /
 
Az adatlap vége felé az Electrical characteristics (azthiszem) második oldalán vannak diagramok, azokat is nézd meg.
(#) watt válasza csanyipal hozzászólására (») Jan 8, 2010 /
 
Tényleg félreérthető, nem is kicsit, én sem értem miért így van ez letéve.
Nézd meg az ELECTRICAL CHARACTERISTICS résznél(az én adatlapomban a 15. fejezet) a feszültség és típus adatokat. Keresd az LF típusjelzést(16LF877), illetve a sima F-est. Van ott frekitérkép is.
Következő: »»   637 / 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