Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
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
Ü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 ![]() Előre is köszönöm.
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.
Szerintem az a szorzandó. Legalábbis én még úgy tanultam....
![]()
Én úgy tanultam, hogy szorzásnál nincs szorzandó meg szorzó, hanem két tényező van
![]()
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); } >>
Az ee_0 hol kap értéket?
Használd a Kód gombot legközelebb!
Szia,
A program elején van definiálva #define e_0 0x0 formában.
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)
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?
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).
Ok, ha hazaérek kipróbálom.
Köszi addig is a segitséget.
Az eepromba írást próbáld meg így:
write_eeprom(i + n, *((int8*)&data + i));
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 ?
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.
Rakd fel a legújabb verziót, mert a honlapjuk szerint ismeri!
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. >>
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...
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!
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
Például az
sorok közé ne írjál semmit, mert így nem lesz belőle interrupt kiszolgálás!
A timerflag=0;-t tedd az if (timerflag==1) blokkba, a végére.
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é!
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...).
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ó.
É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.
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 ![]()
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
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?
Hali,
Azért, mert nem tudtam róla... ![]() Melyik hardver elemet kellene használni hozzá? Üdv: Buddha |
Bejelentkezés
Hirdetés |