Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   21 / 118
(#) kurucz_peter válasza icserny hozzászólására (») Máj 18, 2009 /
 
Helló!

Így működik.
Azt hiszem akkor elmondhatjuk, hogy egy szorzásnál (a*b), a szorzót (a) kell a megfelelőre típusra kasztolni. Ez végül is logikus.

Köszi!

P
(#) Thowra hozzászólása Máj 18, 2009 /
 
Üdv mindenkinek!
Ismét sikerült beleszaladni egy kis problémába.
Már korábban is volt olyan gondom, hogy egyszerre több lábat kellett ki/be kapcsolni. Most nagyon pontosan kellene ezt elkövetnem. Van esetleg valami olyan utasítás amivel 1 paranccsal lehet több lábat kapcsolni? Azt hiszem ASm ba van hasonló ******10100011, a * az a rész amit nem tudok . Van esetleg valakinek ötlete?
Előre is köszönöm.
(#) Thowra válasza Thowra hozzászólására (») Máj 18, 2009 /
 
Megoldódott, elfelejtkeztem a "Nulláról a robotokig" című cikkről
#set_tris_b(0b00000000); //PORTD kimenet
#output_b(0b11111111); //LED bekapcs
Erre gondoltam.
(#) icserny válasza kurucz_peter hozzászólására (») Máj 18, 2009 /
 
Szerintem az a szorzandó. Legalábbis én még úgy tanultam....
(#) potyo válasza icserny hozzászólására (») Máj 18, 2009 /
 
Én úgy tanultam, hogy szorzásnál nincs szorzandó meg szorzó, hanem két tényező van
(#) kukac_24 hozzászólása Jún 11, 2009 /
 
Hály mindenkinek!

18f4620-at programozok éppen. Ha a data eepromba beirok egy float számot, majd utána visszaolvasom és kiiratom LCD-re, teljesen más számot kapok vissza.
Tapasztalt már valaki ilyet? Nem birok rájönni mitől lehet.
Kódrészlet:

// 18f4620
float eredmeny;
float e0;

e0=1.2;

WRITE_FLOAT_EEPROM(ee_0, e0);
delay_ms(200);

eredmeny=READ_FLOAT_EEPROM(ee_0);

lcd_gotoxy(1,1); printf(lcd_putc,"o= %3.5f", eredmeny);

// n is an offset into the eeprom. For floats
// you must increment it by 4. For example if
// the first float is at 0 the second one should
// be at 4 and the third at 8.
WRITE_FLOAT_EEPROM(long int n, float data)
{ int i;
for (i = 0; i < 4; i++)
write_eeprom(i + n, *(&data + i) ) ;
}
float READ_FLOAT_EEPROM(long int n)
{
int i;
float data;
for (i = 0; i < 4; i++)
// *(&data + i) = read_eeprom(i + n);
*((int8 *)(&data) + i) = read_eeprom(i + n);
return(data);
}
>>
(#) potyo válasza kukac_24 hozzászólására (») Jún 11, 2009 /
 
Az ee_0 hol kap értéket?

Használd a Kód gombot legközelebb!
(#) kukac_24 válasza potyo hozzászólására (») Jún 11, 2009 /
 
Szia,

A program elején van definiálva #define e_0 0x0 formában.
(#) potyo válasza kukac_24 hozzászólására (») Jún 11, 2009 /
 
A write_eeprom() megvárja, amíg az adat bekerül az eeprom-ba, vagy nem? (mivel CCS, gondolom megvárja, de ismét, mivel CCS, nem árt leellenőrizni)
(#) kukac_24 válasza potyo hozzászólására (») Jún 11, 2009 /
 
Ezért irtam az irás után egy 100ms-os várakozást.
Vagy lehet hogy megszakitásra kellene várnom inkább ami az irás végét jelzi?
(#) potyo válasza kukac_24 hozzászólására (») Jún 11, 2009 /
 
Nem ott kell megvárni, hanem a write_eeprom() után közvetlenül, mert amíg egy cella írása nem fejeződik be, addig a következő írásra a parancsot nem veszi figyelembe a pic. Próbaképp tegyél be oda a for ciklusba egy 10ms-os várakozást. Illetve nézd meg a listing fájlban, hogy megvárja-e az EEIF bebillenését vagy a WR bit nullára váltását (ha jól emlékszem, WR-nek hívják azt a bitet).
(#) kukac_24 válasza potyo hozzászólására (») Jún 11, 2009 /
 
Ok, ha hazaérek kipróbálom.
Köszi addig is a segitséget.
(#) MPi-c válasza kukac_24 hozzászólására (») Jún 11, 2009 /
 
Az eepromba írást próbáld meg így:

write_eeprom(i + n, *((int8*)&data + i));
(#) pepe33 hozzászólása Jún 11, 2009 /
 
Vetem egy 18F26J50 -es PIC-et , és most vettem észre hogy a CCS nem ismeri , valaki tud esetleg valmi megoldást, müködjön vele a CCS ?
(#) MPi-c válasza pepe33 hozzászólására (») Jún 11, 2009 /
 
Megnéztem, a devices könyvtárban benne van a header fájl. Lehet, hogy verzió frissítés (innen a topikból megoldható) segítene.
(#) potyo válasza pepe33 hozzászólására (») Jún 11, 2009 /
 
Rakd fel a legújabb verziót, mert a honlapjuk szerint ismeri!
(#) Jossz válasza kukac_24 hozzászólására (») Jún 11, 2009 /
 
Szia!

Én 18f4620-ba az alábbi rutinokkal rögzítettem és olvastam ki float számokat:

WRITE_FLOAT_EXT_EEPROM(long int n, float data) {
int i;

for (i = 0; i < 4; i++)
write_ext_eeprom(i + n, *((int8*)&data + i) ) ;
}

float READ_FLOAT_EXT_EEPROM(long int n) {
int i;
float data;

for (i = 0; i < 4; i++)
*((int8*)&data + i) = read_ext_eeprom(i + n);

return(data);
}

Hiba nélkül, mindig működött eddig.
>>
(#) Jossz válasza kukac_24 hozzászólására (») Jún 11, 2009 /
 
Ja igen, és a várakozási ciklust pontosan úgy kell alkalmazni, ahogy Potyo is írta. Anélkül képes nagyon megkavarodni a dolog...
(#) kukac_24 válasza Jossz hozzászólására (») Jún 12, 2009 /
 
Halihó,

Az alábbit módositottam csak egyenlőre az irásnál:

write_eeprom(i + n, *((int8*)&data + i));

Eddig úgynéz ki működik rendesen, de még tesztelem.
Köszi a segitségeteket!
(#) Buddha hozzászólása Jún 17, 2009 /
 
Sziasztok,

A segítségetekre volna szükségem: írtam egy kis programot egy PIC 12F675-re, ami a timer0 interrupt-ját használja egy LED villogtatására. Hibátlanul lefordul de nem működik; a chip jó, mert más program hibátlanul fut rajta.
Mit rontottam el?
A végcél persze nem egy LED villogtatása, hanem egy RC szervó vezérlése volna. Egy ilyen szervó 1-2ms hosszú, 50Hz frekvenciájú négyszögjeleket igényel amit én interruptos időzítéssel generálnék.
Előre is kössz a segítséget. Üdv: Buddha
(#) icserny válasza Buddha hozzászólására (») Jún 17, 2009 /
 
Például az

  1. #int_TIMER0
  2. void  TIMER0_isr(void)

sorok közé ne írjál semmit, mert így nem lesz belőle interrupt kiszolgálás!
(#) potyo válasza Buddha hozzászólására (») Jún 17, 2009 /
 
A timerflag=0;-t tedd az if (timerflag==1) blokkba, a végére.
(#) szilva válasza Buddha hozzászólására (») Jún 17, 2009 /
 
Szerintem az #INT direktíva rossz helyen van. A help szerint ugyanis az az után következő függvény lesz interrupt-kiszolgálóként meghívva, esetedben tehát a LED_on(). Tedd át a direktívát a TIMER0_isr() fejléce elé!
(#) icserny válasza Buddha hozzászólására (») Jún 17, 2009 /
 
A programban van néhány értelmetlenség is, mert az --i==0 feltételt vizsgálod, de nem írod vissza 50-re.

A LED kapcsolgatásánál (ha szervovezérlés a cél, akkor célszerűbb volna a másik timert is használni!

Ezen a honlapon nézd meg a Tutorial 7-et, és próbált átírni CCS-re (azt hiszem, MikroC-ben írták...).
(#) szilva válasza icserny hozzászólására (») Jún 17, 2009 /
 
A help szerint ráadásul a kiszolgáló rutin neve nem is érdekes, egyedül annyit ír a dologról, hogy az #INT direktíva után következő függvény lesz a kiszolgáló.
(#) szilva válasza icserny hozzászólására (») Jún 17, 2009 /
 
Én a main()-ben lévő timerflag=0 értékadást az if-be tenném a LED_on() utánra, mivel így szerencsétlen helyen beeső (az if után, épp a timerflag=0 előtt) interrupt esetén a LED_on() nem fog végrehajtódni.
(#) icserny válasza szilva hozzászólására (») Jún 17, 2009 /
 
Idézet:
„az if-be tenném a LED_on() utánra”

Jogos, de méginkább LED_on() elé kellene (ha pl. 100 %-os PWM-et játszunk )
(#) Buddha hozzászólása Jún 18, 2009 /
 
Sziasztok,

Köszönöm szépen a segítséget!
Kijavítottam a programocskát és máris működik.
icserny, köszönöm a linket a szervóvezérlésről.

Üdv: Buddha
(#) icserny válasza Buddha hozzászólására (») Jún 18, 2009 /
 
Váljék egészségedre!
Én csak azt nem értem, hogy miért nem PIC12F683-mal akarsz szervót vezérelni, amiben van hardveres támogatás?
(#) Buddha válasza icserny hozzászólására (») Jún 18, 2009 /
 
Hali,

Azért, mert nem tudtam róla...
Melyik hardver elemet kellene használni hozzá?

Üdv: Buddha
Következő: »»   21 / 118
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