Fórum témák
» Több friss téma |
A "loop1" után már az én új projectjeimet is elfogadta.
C nyelven az alábbi kód értelmezése egyértelmű, de hogyan fordítanátok át asm kóddá?
A dolog onnan nem világos, hogy a *data pointer valójában hova mutat a PIC ben? Ahol tudok szabd helyet az a File regiszterek között van, mint általános célú regiszter. 16F877 nél pl. bank1 ben 0xh20 - 0x7F között, de ez csak D'95' szabad regiszter. A többi bankban ettől már csak kevesebb van. A példában pedig *data a fentiektől jóval több byte feldolgozásában szerepel. Hogyan?
A fenti kód ugyan AVR re íródott, de PIC esetén is hasonló lenne.
Nekem mikrocben adódott egy problémám.
Egy 877-est szeretnék összekötni egy siemens m35i-vel. A telefonnal van gyári adatkábele,a pic max 232-n keresztül fogadná a jeleket. Szimulátoron szépen működik is,de a valóságban nem. Paraméterek: Pic 16f877 4Mhz XT kvarc Siemens M35i A telefon 19200,N,8,1 beállítással docklightból,hiperterminálból az AT kódokat fogadja. Tud valaki segíteni?
a pointer egy mezei ram változó, az értéke megy az indexregiszterbe...
arról hogy milyen VALÓS területen mozogHAT a programozónak kell gondoskodnia, nyilván nem mehet 0..255 tartományban.
A 877 tx-rx összekötve veszi az önmaga küldött kódokat? ha igen, a 877-et is kösd a terminálra, úgy működik?
Köszi a választ, de ki tudnád egészíteni?
Engem pontosa az a részlet érdekelne, hogy a Idézet: arról milyen valós területen mozoghat.„programozónak kell gondoskodnia” Továbbra sem értem akkor valójában hova kerülnek az adatok fizikailag a while (len--) hivása előtt. Igazán annak a válasznak örülnék, ha hardveresen látnám az adatok elhelyezkedését a PIC valamely memoriájában.
igen működik ezt próbáltam.
A receive változónak char típusnak kell lennie?
tudna valaki segíteni a fenti kérdésben?
(PIC esetében hogyan működik a c++ pointer kezelése és a fizikai memoria viszonya)
az adatok a függvény hívása előtt ott vannak, ahol dekraláltad, bemásoltad
pl valahol a progiban van egy char data[20]; ilyenkor a fordító ellenőrzi, hogy az adott bankban van-e ekkora szabad terület a foglaláshoz, ha nincs akkor hibaüzenet, már fordításkor. Igy futáskor egész addig jól fog működni amig a len <20, vagyis ha korrektek a deklarációid akkor jól fog működni a program. Az idézett C részletből ebből semmi nem derül ki mivel erősen hiányos (data,len deklarációi és értékadásai), és egyébként is úgy látom atmel specifikus regisztert is használ.>
Túl sok C++ fordítót nem láttam még a PIC mikrovezérlőkhöz. A SourceBoost Technologies BoostC++ fordítója esetén különbséget kell tenni a ROM, illetve a RAM területre mutató pointerek között. Az előbbiek elé kell a "ROM" kulcsszó, deklarálásnál inicializálni kell a tartalmat, s csak a [] oprátorral történő hivatkozás megengedett. A mérete 8 bites, tehát csak max 256 bájtos területet ér el.
Függvénymutatók is használhatók, bizonyos korlátozással. Bővebben: Link
Az idézett progiban jelenleg mindegy,de én inkább unsigned chart szoktam. Szóval a nem működik mit jelent nálad? pl azért valami szemét karakter becsorog (akkor pl lehet rossz a baudrate). Ha a PCről küldöd a RINGet akkor jól működik?
pl a telefon kábelben nem lehet hogy még valamit nem kötöttél be, nem kezeled (pl rts/cts)...
Lehet, hogy rosszul értem, de a PIC és a telefon közé nem kell a max232, direktben kell bekötni a vonalakat.
Biztos, hogy nem ezt a választ várod, de én egyszerűen megnézném a lefordított kódot
Sziasztok!
PIC18F4550-re fordítanék AD értéket átkonvertáló kódot C18-al, de gondom van. Az AD-zott érték kiolvasása jó, de amikor át akarom számolni feszültséggé, rossz eredményt kapok. A kódrészlet a következő lenne:
Nem akarok lebegőpontot használni, ezért inkább 100-al felszorzom, és két tizedest ezzel is megtartok (hétszegmensesen van kijelezve). Teljesen rossz értéket ad vissza, nem jövök rá miért. Amúgy az uint32_t unsigned int -et takar.
ADRES ugye 0 és 1023 közötti értéket vehet fel, ez szorozva 500-al már nem fér bele az unsigned int tartományába, ami 0-65535 között lehet. Próbáld úgy, hogy
Így az 500 már 32 biten kerül ábrázolásra, amivel kényszerítve van az egész kifejezés, hogy 32 biten ábrázoljon mindent. Az unsigned int a C18-ban 16 bites, nem 32, mint amire az uint32_t elnevezés utal. Vagy unsigned longot akartál írni?
Köszi, próbáltam long-gal is, csak rossz helyre tettem annál a castolást. Mellesleg köszi az infot, hogy az int 16 bites, hirtelen elfelejtettem.
Kipróbáltam,amit írsz,simán rákötöttem a telefon kábelét a pic rx,tx-ére,de sajna nem reagál.Külön-külön tudnak kommunikálni,de együtt nem,tehát a pic terminálból veszi az adatokat,csak a telefontól nem.
Van esetleg bekötési rajzod?
RTS nem volt bekötve azért nem vett semmit a telefontól.
Kösz az ötletet.
Szia!
Proteusban szimuláltam és működött: void main() { TRISB = 0; PORTB = 0; while(1){ PORTB = ~PORTB; delay_ms(500); } } Bonca
PIC18-hoz kellene nekem TABLE C-s példa.
Hogyan kell a programkódban elhelyezni az adatokat, mint az asm-nél volt. Például: .... retlw 0xAA retlw 0xBA retlw 0xCA retlw 0xDA .... És hogyan lehet majd azt a programban visszaolvasni.
Tömbben kell elhelyezni az adatokat, mint amikor egy változót inicializálsz. Emellett utasítani kell a fordítót, hogy a kódmemóriába tegye a tömböt. Ez viszont fordítófüggő, hogy hogyan kell utasítani. Utána egyszerűen indexeled a tömböt az elemeinek beolvasásához.
MCC18-ra tudsz mondani valami konkrét példát.
A C-vel még csak most ismerkedem, így nem minden egyértelmű elsőre. Ilyet találtam:
Valahogy így kell. Szimulátorban próbáld ki, aztán kiderül, hogy jó vagy nem. MCC18-ban a rom a kulcsszó a flash memóriában tároláshoz, a const önmagában nem elég. HiTech C-ben és CCS-ben csak a const kell.
Használata meg pl. x=table[2][3];
Így próbáltam, a szimulátorban megy:
sziasztok szeretnék kérni egy kis segitséget ebben pwm kod részletben beileszteni egy eepromba letárolni a new_DC, current_DC változokat!
mikroC Test configuration: MCU: PIC16F628A Oscillator: XT, 4.0 MHz */ unsigned short new_DC, current_DC; void main() { PORTB = 0; // Initial state of port B TRISB = 3; // RB0, RB1 input, RB3 (PWM1) output PWM1_Init(5000); // PWM module initialization (5KHz) new_DC = 0; // Initial value of variable Duty Cycle current_DC = 0; PWM1_Start(); // Start PWM1 module with Zero DC PWM1_Set_Duty(current_DC); while (1) { if (Button(&PORTB, 0,1,0)) { // If the button connected to RB0 is pressed if (new_DC < 250) // Don't go above 250 new_DC = new_DC + 25 ; // increment Duty Cycle by 25 } if (Button(&PORTB, 1,1,0)) { // If the button connected to RB1 is pressed if (new_DC !=0) // Don't go below 0 new_DC= new_DC - 25 ; // decrement Duty Cycle by 25 } if (current_DC != new_DC) { current_DC = new_DC ; PWM1_Set_Duty(current_DC); // Change the current DC to new value } Delay_ms(150); } } ------------------------------------------- eeprom unsigned short i, NUM ; unsigned int ADD = 0x00, temp; // Start EEPROM Location // Read Operation if (Button(&PORTB, 0, 1, 0)) { // Detect logical one to zero Delay_ms(300); for (i=0; i<=9; i++) { temp = ADD+i; NUM = EEPROM_Read(temp); digits[i] = NUM+48; } delay_ms(3000); goto start; } // Write Operation if (Button(&PORTB, 1, 1, 0)) { // Detect logical one to zero Delay_ms(300); for (i=0; i<10; i++) { temp = ADD + i; EEPROM_Write(temp,i); } delay_ms(2000); goto start; } ----------------------------------- az eeprom rész nem teljesen értem hogy lehetne az eeprom kodrészletbe a new_DC, current_DC változokat be helyetesiteni? köszönöm a segitséget!>>>
Most egy olyan kérdésem volna, hogy egy 100 elemű tömböt hogyan tudok sorba rendezni?
Van rá valamilyen függvény, vagy írnom kell hozzá sajátot (pl. buborék). Ebben az esetben melyik a leggyorsabb algoritmus?
Leggyorsabb a quick nevű algoritmus, viszont PIC-en nem biztos, hogy jó ötlet a rekurzivitás miatt. Attól függ, hogy milyen PIC-el dolgozol. Egyébként google-be beütöd, hogy "shell sort in c" vagy "quick sort in c", akkor találsz forráskódokat.
Sziasztok!
Támadt egy kis problémám. LM35DZ-nek a feszültségét szeretném mérni (Hőmérséglet miatt). Az istenért nem boldogulok az A/D átalakítással HI-Tech-ben. Tudna valaki rá adni egy példát? AN0-án szeretnék mérni majd később AN1,AN2-őn is lenne egy szenzor. Előre is köszönöm! (Nem igazán értem ezt az AD átalakítós dolgot :S) Idézet: „Az istenért nem boldogulok az A/D átalakítással HI-Tech-ben.” Fel tudsz tenni 1-2-t a próbálkozások közül? Hátha csak 1-2 fontos sor hiányzik, közben pedig a saját kódod többi részét mégis te érted legjobban. :yes: Egyébként szoktak lenni gyári mintapéldák úgy tudom, minden modulhoz, úgy hívják ezeket, hogy Application Note. AN***-nek nevezi a gyártó, ahol a csillagok számokat jelölnek. Keress rá ezekre, kicsit böngészgesd ezeket, lehet, hogy rátalálsz értékes dolgokra.
Már kerestem és azzal szenvedek.
Ezt próbáltam. De a problémám azzal van hogy mV-ot kellene mérnem és ő csak min decivoltot mér. LCD-n megjelenítettem, 268mV-nál 2-őt ad vissza és olyan 290mV-nál már 3-ra ugrik fel. Elméletileg jó lenne de nem bírom kibogarászni. |
Bejelentkezés
Hirdetés |