 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70655.61
|
Objavljeno: Čet Mar 09, 2006 11:06 pm Naslov sporočila: Delujoči koščki kode |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70655.61
|
Objavljeno: Čet Mar 09, 2006 11:16 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Čet Mar 09, 2006 11:30 pm Naslov sporočila: |
|
|
Ce S0SPDR ni 32-bitni register, potem je zadnji del kode potencialni problem; ce ze sprejmes unsigned long in ga podas naprej, potem bi bilo dobro narediti & 0xff, da zagotovo odrezes stran zgornjih 24 bitov parametra dat. Taki delcki kode vodijo do varnostnih lukenj na vecjih sistemih, povsod pa lahko povzrocijo nepredvideno delovanje. Domnevam, da je overhead zaradi ene logicne operacije (en ukaz) minimalen v primerjavi s celo funkcijo.
Pa se eno vprasanje: ali prevajalnik, ki ga uporabljas, pozna inline funkcije ? |
|
Nazaj na vrh |
|
 |
slawc Član

Pridružen-a: Ned 07 Mar 2004 11:43 Prispevkov: 210 Aktiv.: 0.88
|
Objavljeno: Čet Mar 09, 2006 11:57 pm Naslov sporočila: |
|
|
Ta register je v tem primeru 32 biten in samo maskiranje ne resi nic. Ce zelis zagotoviti 8 bitno podajanje je obvezen cast na 8bitni podatek.
Smotan je edino return, ker se zanasa na avtomaticni cast na char, morebitni align shifting in pa pravilno endian podajanje. Smotano v kontekstu prenosljivosti kode na drug procesor.
Ce pa kateri od C kompilerjev nima inline potem pa ...  |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.52
|
Objavljeno: Pet Mar 10, 2006 12:21 am Naslov sporočila: |
|
|
Aha ... hecno, da so naredili 32-biten register za manjse vrednosti ... ce je zgornji del trenutno neizkoriscen in bi zato to delovalo, pa najbrz ni nujno, da bo vedno ostalo tako ? (tisti tipicni disclaimer )
Ce compiler pozna inline, potem bi bilo verjetno bolj ucinkovito zadnjo funkcijo deklarirati kot inline (glede na pripombo o hitrosti), saj gre le za par vrstic in mora biti overhead klica in vracanja iz funkcije relativno velik glede na velikost funkcije, pa se najbrz bo doticna funkcija uporabljena v aplikaciji na enem samem mestu (v kaksni visji proceduri, ki tlaci bolj kompleksne podatke po delckih v SPI), pa se vrednost se uporabi neposredno iz registra, ce je ze prej tam zaradi obdelave, brez prenosa na drugo zacasno odlagalisce (RAM/drug register). To bi se moralo poznati precej bolj kot podajanje spremenljivk po registrih na tak hecen nacin (ali ima doticni compiler kaksne direktive za to ? "register" recimo). |
|
Nazaj na vrh |
|
 |
slawc Član

Pridružen-a: Ned 07 Mar 2004 11:43 Prispevkov: 210 Aktiv.: 0.88
|
Objavljeno: Pet Mar 10, 2006 12:47 am Naslov sporočila: |
|
|
Ni hecno, ce je lahko stream vecji od 8 bitov. Pravzaprav je podatek lahko 16biten, vendar so registri naravnani na 4byte in ni panike. Panika bi bila lahko, ce bi to kodo prenesel na 8bitnik in bi poleg zelenega registra popackal se kaksne sosednje.
Kar se pa tice prekladanja po stacku in registrih ... prevajalniki so danes tako dobri, da vecinoma namesto tebe opravijo "razmisljanje" kam bodo kaj shranili. Dodajanje rezerviranih besed register ze dolgo ni treba dodajat, sploh pa ne pri load-store arhitekturah (to je ARM), ko je itak vse prek registrov.
Lahko pa mare pripopa asm kodo za to doticno funkcijo. Meni se ne da :> |
|
Nazaj na vrh |
|
 |
slawc Član

Pridružen-a: Ned 07 Mar 2004 11:43 Prispevkov: 210 Aktiv.: 0.88
|
Objavljeno: Pet Mar 10, 2006 12:48 am Naslov sporočila: |
|
|
Hm, sele zdaj opazil da smo fejst off topic |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70655.61
|
Objavljeno: Pet Mar 10, 2006 8:45 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
tonko Član


Pridružen-a: Sob 25 Jun 2005 13:45 Prispevkov: 541 Aktiv.: 2.28 Kraj: Črnomelj
|
Objavljeno: Čet Avg 10, 2006 3:53 pm Naslov sporočila: Read Write strukture v eeprom |
|
|
Za shranjevanje oz. branje strukture nastavitvami v oz. iz eeproma.
KODA:
Koda: |
//***********************************************************************
struct EEPROM_PARAMETRI
{
int ee_int;
float ee_float;
unsigned long ee_long;
};
struct EEPROM_PARAMETRI nastavitve;
//***********************************************************************
unsigned char ee_read(unsigned int ee_adr) //BRANJE ENEGA BYTA IZ EEPROMA IZ DOLOCENEGA NASLOVA
{
return 123;
}
//***************************************************************************
void ee_write(unsigned int ee_adr,unsigned char ee_data) //VPIS ENEGA BYTA V EEPROM NA DOLOCEN NASLOV
{
return;
}
//***************************************************************************
void load_from_eeprom(char *struct_pntr,unsigned int eeprom_adress,unsigned char nr_of_bytes) //BRANJE NASTAVLJENIH PODATKOV V EEPROMA
{
//BRANJE STRUKTURE IZ EEPROMA
while(nr_of_bytes--)
{
*struct_pntr = ee_read(eeprom_adress++);
struct_pntr++;
}
return;
}
//***************************************************************************
void save_to_eeprom(char *struct_pntr,unsigned int eeprom_adress,unsigned char nr_of_bytes) //VPIS NASTAVLJENIH PODATKOV V EEPROM
{
//VPIS STRUKTURE V EEPROM
while(nr_of_bytes--)
{
ee_write(eeprom_adress++,*struct_pntr);
struct_pntr++;
}
return;
}
//***************************************************************************
int main(void)
{
load_from_eeprom((char *)&nastavitve,0x00,sizeof(nastavitve)); //PREBERI NASTAVITVE IZ EEPROMA IN JIH VPIŠI V STRUKTURO
save_to_eeprom((char *)&nastavitve,0x00,sizeof(nastavitve)); //VPISI NASTAVITVE IZ STRUKTURE V EEPROM
while(1);
}
//***************************************************************************
|
|
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70655.61
|
Objavljeno: Pet Mar 16, 2007 11:23 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Pet Mar 16, 2007 6:35 pm Naslov sporočila: |
|
|
Tonko
Tvoja rutina mi deluje zelo pomankljiva?
Ali ima ARM tudi interni eeprom, ali se zapisuje le preko IAP na flash? _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Pon Jan 07, 2008 9:16 pm Naslov sporočila: |
|
|
Da se jaz nekaj dodam
LPC2138 (ter ostali seveda) imajo RTC. Ali po domace uro realnega casa. Nastavi se zelo enostavno, prav tako bere! Jaz sem uporabil kar 12MHz kristal in se deljenje ne izzide ravno najbolj tocno. Ni se mi pa dalo ciniti 32kHz kristlcka (ker ga v mojem projektu ne rabim!) Prav tako program ne generira nikakrsnih prekinitev.
tu definiramo, kateri kristal imamo
Koda: |
#define PCLK 12000000 // sistemski kristal (za RTC)
|
inicializacija
Koda: |
PREINT = (PCLK/32768)-1; // deljenje za glavni kristal (RTC)
PREFRAC = PCLK-((PREINT+1)*32768);
CCR = 0x0; //rtc izkljucen / glavni kristal
AMR = 0;
CIIR = 0x00;
ILR=0x0;
SEC = 0; //postavimo cas na 0 (sec, min, ure)
MIN = 0;
HOUR = 0;
CCR = 0x1; //pozeni RTC preko glavnega kristala
|
ter zelo enostavno beremo kar direktno iz registra in izpisemo na LCD
Koda: |
sprintf(izpis,"Cas %02d:%02d:%02d",HOUR,MIN,SEC); // izpise cas delovanja sistema
lcd_print(izpis);
|
_________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.59 Kraj: Trzic
|
Objavljeno: Tor Jan 08, 2008 1:02 am Naslov sporočila: |
|
|
Še vedno ni odgovora glede tonkovega programa. Torej kako zapisat v Flash ARMja? Kolikor sem bral, niti ni tako zelo trivialno...
Da dodam še nekaj z moje strani. Nekateri mogoče poznate API funkcijo GetTickCount v Windowsih, ki vrne uptime sistema v ms in je uporabna za merjenje kakšnih intervalov.
Koda: |
#define per_clock 18000000 // Peripherial clock
void InitTimer2()
{
PCONP |= 1<<22; // Power control for peripherial register > Timer 2 ON
T2TCR = 0; // Timer control register > Counter disable
T2MCR = 0; // Match control register > All interrupts disabled
T2PR = per_clock/1000; // Prescaler set > 1 ms increment of Timer counter
T2TC = 0; // Timer counter = 0
T2TCR = 1; // Timer control register > Counter enable
}
int GetTickCount()
{
return T2TC;
} |
Ali pa funkcije za uporabo AD pretvornika na precej enostaven način (ni poudarka na hitrosti) - za LPC2378 razporeditev AD pinov.
Koda: |
#define PCAD 1<<12; // Enable bit for AD
// Initialize ADC
void init_ADC(int pin)
{
int const bitoffset[8] = { (1<<14), (1<<16), (1<<18), 1<<20, 1<<28, 1<<30, 1<<24, 1<<26};
PCONP |= PCAD; // Turn on the power for AD
AD0CR &= 0xFFFFFF00;
AD0CR |= (1<<pin);
AD0INTEN = 0; // No interrupts
// Select pin as analog
if (pin<4) PINSEL1 |= bitoffset[pin];
else if (pin<6) PINSEL3 |= bitoffset[pin];
else if (pin<8) PINSEL0 |= bitoffset[pin];
}
// Get ADC value
int read_ADC(int pin)
{
AD0CR |= 1<<21;
AD0CR |= 1<<24;
while (!(AD0GDR&(1<<31)));
return (*(&AD0DR0+pin)>>6)&0x3FF;
}
|
_________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
SimonS Član



Pridružen-a: Čet 01 Jul 2004 11:18 Prispevkov: 4770 Aktiv.: 20.09 Kraj: Kobarid
|
Objavljeno: Tor Jan 08, 2008 7:16 pm Naslov sporočila: |
|
|
Aha napakica, ki sem jo sele sedaj pregledal!
PCLK ne gre za frekvenco kristala, temvec clock periferije! Se pravi, ce imamo 12M kristal in procesor dela na 60M ter da dela pereferija z /4 upisemo vrednost 15M !!
Se opravicujem, ampak tudi jaz se raziskujem zadevo.... _________________ Lep dan
Simon |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 6 dni
Powered by phpBB © 2001, 2005 phpBB Group
|