Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   16 / 153
(#) GreaT válasza GreaT hozzászólására (») Ápr 27, 2010 /
 
A "loop1" után már az én új projectjeimet is elfogadta.
(#) cassis hozzászólása Ápr 30, 2010 /
 
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?

  1. while (len--)
  2. {
  3. spdr=*data++  ,
  4. while(!(spsr & (1< < spif)));
  5. }


A fenti kód ugyan AVR re íródott, de PIC esetén is hasonló lenne.
(#) user hozzászólása Ápr 30, 2010 /
 
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?

RING.txt
    
(#) pipi válasza cassis hozzászólására (») Ápr 30, 2010 /
 
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.
(#) pipi válasza user hozzászólására (») Ápr 30, 2010 /
 
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?
(#) cassis válasza pipi hozzászólására (») Ápr 30, 2010 /
 
Köszi a választ, de ki tudnád egészíteni?
Engem pontosa az a részlet érdekelne, hogy a
Idézet:
„programozónak kell gondoskodnia”
arról milyen valós területen mozoghat.
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.
(#) user válasza pipi hozzászólására (») Ápr 30, 2010 /
 
igen működik ezt próbáltam.
A receive változónak char típusnak kell lennie?
(#) cassis válasza cassis hozzászólására (») Ápr 30, 2010 /
 
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)
(#) pipi válasza cassis hozzászólására (») Ápr 30, 2010 /
 
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.>
(#) icserny válasza cassis hozzászólására (») Ápr 30, 2010 /
 
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.
  1. rom char *text = "Test string"; // text with trailing zero
  2. rom char *data = { 0x64, 11, 12 }; // 3 data bytes: 0x64, 0x0B, 0x0C

Függvénymutatók is használhatók, bizonyos korlátozással.
Bővebben: Link
(#) pipi válasza user hozzászólására (») Ápr 30, 2010 / 1
 
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)...
(#) potyo válasza user hozzászólására (») Máj 2, 2010 /
 
Lehet, hogy rosszul értem, de a PIC és a telefon közé nem kell a max232, direktben kell bekötni a vonalakat.
(#) potyo válasza cassis hozzászólására (») Máj 2, 2010 /
 
Biztos, hogy nem ezt a választ várod, de én egyszerűen megnézném a lefordított kódot
(#) poznamokus hozzászólása Máj 3, 2010 /
 
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:
  1. tmp = (((uint32_t)(ADRES*500))/1024);

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.
(#) potyo válasza poznamokus hozzászólására (») Máj 3, 2010 /
 
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
  1. tmp=(ADRES*500ul)/1024;

Í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?
(#) poznamokus válasza potyo hozzászólására (») Máj 3, 2010 /
 
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.
(#) user válasza potyo hozzászólására (») Máj 3, 2010 /
 
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?
(#) user válasza pipi hozzászólására (») Máj 4, 2010 /
 
RTS nem volt bekötve azért nem vett semmit a telefontól.
Kösz az ötletet.
(#) Bonca válasza user hozzászólására (») Máj 10, 2010 /
 
Szia!
Proteusban szimuláltam és működött:
void main() {
TRISB = 0;
PORTB = 0;

while(1){
PORTB = ~PORTB;
delay_ms(500);
}
}

Bonca
(#) Amarton hozzászólása Máj 16, 2010 /
 
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.
(#) potyo válasza Amarton hozzászólására (») Máj 16, 2010 /
 
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.
(#) Amarton válasza potyo hozzászólására (») Máj 16, 2010 /
 
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:
  1. rom const char table[][20] =
  2. { "string 1", "string 2","string 3", "string 4"};
(#) potyo válasza Amarton hozzászólására (») Máj 16, 2010 /
 
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];
(#) Amarton válasza potyo hozzászólására (») Máj 17, 2010 /
 
Így próbáltam, a szimulátorban megy:
  1. #include <p18f4550.h>
  2.  
  3. rom const char table[8] =
  4.         {
  5.                 0x31,
  6.                 0x32,
  7.                 0x33,
  8.                 0x34,
  9.                 0x35,
  10.                 0x36,
  11.                 0x37,
  12.                 0x38
  13.         };
  14.  
  15. void main(void)
  16. {
  17.         unsigned char i = 0, TMP;
  18.  
  19.  
  20.                 while(1)
  21.                 {
  22.                         for (i=0; i<8; i++)
  23.                         {
  24.                                 TMP = table[i];
  25.  
  26.                         }
  27.                         while(1);
  28.                 }
  29.  
  30. }
(#) jeges hozzászólása Máj 18, 2010 /
 
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!>>>
(#) Amarton hozzászólása Jún 6, 2010 /
 
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?
(#) potyo válasza Amarton hozzászólására (») Jún 6, 2010 /
 
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.
(#) atideath hozzászólása Jún 17, 2010 /
 
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)
(#) Norberto válasza atideath hozzászólására (») Jún 17, 2010 /
 
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.
(#) atideath válasza Norberto hozzászólására (») Jún 17, 2010 /
 
Már kerestem és azzal szenvedek.

  1. void ReadTemp1()
  2. {
  3.         unsigned char volts;
  4.         unsigned char decivolts;
  5.         unsigned char last_value;
  6.         unsigned char last_channel=2;   // to force an update at startup
  7.        
  8.                 ADCON1=(PORTC&0x0F);
  9.                 /* update the channel to the A2D converter */
  10.                 CHS0=(CHANNEL&0b00000001);
  11.                 CHS1=((CHANNEL&0b00000010)>>1);
  12.                 CHS2=((CHANNEL&0b00000100)>>2);
  13.                        
  14.                 /* request the A2D conversion */
  15.                 GODONE=1;
  16.                 while(GODONE)continue;
  17.                 ADIF=0;
  18.                 if((ADRESH!=last_value)||(CHANNEL!=last_channel))
  19.                 {
  20.                 /* if update required, output the results */
  21.                 /* calculate the output voltage */
  22.                         volts=0;
  23.                         for(decivolts=(ADRESH*50/255);decivolts>=10;decivolts-=10)
  24.                                 volts++;
  25.                         //printf("%cChannel %d has %d.%d volts.  ",0x0D,(CHANNEL&0x07),volts,decivolts);
  26.                         char kiiratni[20];
  27.                         sprintf(kiiratni,"%d.%d",volts,decivolts);
  28.                         lcdGoto(0,0);
  29.                         lcdPuts(kiiratni);
  30.  
  31.  
  32.                 }
  33.                 last_value=ADRESH;
  34.                 last_channel=CHANNEL;
  35. }


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.
Következő: »»   16 / 153
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