www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Delujoči koščki kode

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70655.61

PrispevekObjavljeno: Čet Mar 09, 2006 11:06 pm    Naslov sporočila:  Delujoči koščki kode Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70655.61

PrispevekObjavljeno: Čet Mar 09, 2006 11:16 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Čet Mar 09, 2006 11:30 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
slawc
Član
Član



Pridružen-a: Ned 07 Mar 2004 11:43
Prispevkov: 210
Aktiv.: 0.88

PrispevekObjavljeno: Čet Mar 09, 2006 11:57 pm    Naslov sporočila:   Odgovori s citatom

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 ... Rolling Eyes
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.52

PrispevekObjavljeno: Pet Mar 10, 2006 12:21 am    Naslov sporočila:   Odgovori s citatom

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 Laughing )

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
slawc
Član
Član



Pridružen-a: Ned 07 Mar 2004 11:43
Prispevkov: 210
Aktiv.: 0.88

PrispevekObjavljeno: Pet Mar 10, 2006 12:47 am    Naslov sporočila:   Odgovori s citatom

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. Smile

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
slawc
Član
Član



Pridružen-a: Ned 07 Mar 2004 11:43
Prispevkov: 210
Aktiv.: 0.88

PrispevekObjavljeno: Pet Mar 10, 2006 12:48 am    Naslov sporočila:   Odgovori s citatom

Hm, sele zdaj opazil da smo fejst off topic
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70655.61

PrispevekObjavljeno: Pet Mar 10, 2006 8:45 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tonko
Član
Član



Pridružen-a: Sob 25 Jun 2005 13:45
Prispevkov: 541
Aktiv.: 2.28
Kraj: Črnomelj

PrispevekObjavljeno: Čet Avg 10, 2006 3:53 pm    Naslov sporočila:  Read Write strukture v eeprom Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70655.61

PrispevekObjavljeno: Pet Mar 16, 2007 11:23 am    Naslov sporočila: icon_roleplay  Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4770
Aktiv.: 20.09
Kraj: Kobarid

PrispevekObjavljeno: Pet Mar 16, 2007 6:35 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4770
Aktiv.: 20.09
Kraj: Kobarid

PrispevekObjavljeno: Pon Jan 07, 2008 9:16 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.59
Kraj: Trzic

PrispevekObjavljeno: Tor Jan 08, 2008 1:02 am    Naslov sporočila:   Odgovori s citatom

Š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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
SimonS
Član
Član



Pridružen-a: Čet 01 Jul 2004 11:18
Prispevkov: 4770
Aktiv.: 20.09
Kraj: Kobarid

PrispevekObjavljeno: Tor Jan 08, 2008 7:16 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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