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 

Assembler <-> višji programski jeziki

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pon Nov 22, 2004 7:45 pm    Naslov sporočila:  Assembler <-> višji programski jeziki Odgovori s citatom

To vprašanje se dostikrat poraja.

Simon je sicer lepo napisal:
---dobro. Brezplacen, izredno hitre rurine, porabi malo flasha ter spomina na uCju (ce seveda znas delati z njim!), lahko si napises svoje rutine in je delo z njim preprostejse
---slabo. Zahteva zelo dobro znanje arhitekture uCja, slabo pregledno pisanje, ponavadi ne dobis zraven simulatorja


Post sem odprl z namenom, da tole tudi poskusimo Wink - za začetek velikost. V prilogi programčič, ("night rider") ki sem ga spisal v petih minutah (pic assembler) ter se lahko poskusi na elektorjevi testni plošči.
Uporablenih je vseh 8 izhodov na portub. Led dioda se prižiga od leve proti desni ter nazaj s pavzo ca 0.5s.
Če kdo piše v kakem višjem jeziku naj podobno stvar napiše z njim. Zanima me pred vsem velikost prevedene datoteke (hex)



test.zip
 Opis:

Download
 Ime datoteke:  test.zip
 Velikost datoteke:  667 Bytov
 Downloadano:  41 krat


_________________
lp
Silvo
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: 4769
Aktiv.: 20.13
Kraj: Kobarid

PrispevekObjavljeno: Pon Nov 22, 2004 9:01 pm    Naslov sporočila:   Odgovori s citatom

Evo kratkek programcek napisan v bascomu. Prevedena HEX koda 778byt d'oh!
Za C pa verjetno nebi znal napisati ravno najbol oprimalne kode, zato prepuscam drugim



night.zip
 Opis:

Download
 Ime datoteke:  night.zip
 Velikost datoteke:  707 Bytov
 Downloadano:  28 krat


_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pon Nov 22, 2004 9:11 pm    Naslov sporočila:   Odgovori s citatom

Zanimivo, zna kdo to napisat še v assemblerju. A "pušča" bascomov prevajalnik za sabo tudi assemblersko kodo. Prav zanimivo bi jo bilo videt. Če na oko pogledaš tvoj bascomov ter moj assmblerski programček sta si dokaj "podobna" pa, če prav gre celo za različno družino mikrokontrolerjev Wink
_________________
lp
Silvo
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: 4769
Aktiv.: 20.13
Kraj: Kobarid

PrispevekObjavljeno: Pon Nov 22, 2004 9:48 pm    Naslov sporočila:   Odgovori s citatom

Uh, tako dolllgo je od tega, ko sem pisal v assemblerju. Ce prav ustrajas se lahko tudi potrudim in napisem se v assemblerju. Sicer pa C naredi tudi assembler kodo. Bascom ne. Tako na hitro sem napisal tudi v Cju. Ne poznam ukaza za rotiranje v levo in desno. No namesto tega sem dal kar ukaz naj pristeje 1 in rezultat prevedene kode je 312 bytov. Glede na to da sta ukaza ADD in RL oba dolga 1 byte kaksnih vecjih razlik v kodi nebi smelo biti.
Sicer pa Silvo saj je vec ali manj podobno. Bascom 8051 ter AVR se le malenkostno razlikuje. V C-ju pa menda koda z minimalnimi popravki deluje na vseh uCjih ....

_________________
Lep dan
Simon
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pon Nov 22, 2004 10:09 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
Ce prav ustrajas se lahko tudi potrudim in napisem se v assemblerju

ma ne, saj ne gre za "tekmovanje" ampak zgolj za informativno primerjavo. Zanimivo bi bilo da bi nekdo to napisal v Picbasic-u. Bi sicer sam probal a nimam naloženega - poleg tega bi se ga moral še učit Confused Sem pa sedaj razmišljal, če bi tole hotel izvesti s klasično logiko bi potreboval kar nekaj čipov Confused

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
frenki
Moderator
Moderator



Pridružen-a: Ned 23 Feb 2003 21:26
Prispevkov: 6732
Aktiv.: 28.42
Kraj: Ljubljana (JN76GB)

PrispevekObjavljeno: Pon Nov 22, 2004 11:57 pm    Naslov sporočila:   Odgovori s citatom

Tole je zelo na hitro spackano skupaj. Nisem niti preveril na testni plošči, upam pa, da dela. Verjamem, da obstajajo tudi boljše rešitve, ampak za test, ...
Koda:
/* ----- PIC16F84A rider.c --------- */
#include <16f84a.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=4000000)
#define BIT_MASKA 14

/* -- Rider gor/dol --*/
unsigned char bitmaska[BIT_MASKA] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2};

/* -- Glavni program -- */
main() {
  /* -- Pripravi porte -- */
  set_tris_b(0x0);         /* Port B[0:7] Izhod */
  /*-- Neskoncna zanka --*/
  while(1) {
    unsigned char i;
    for(i=0;i<BIT_MASKA;i++) {
      output_b(~bitmaska[i]); /* maska na port    */
      delay_ms(500);          /* Pavza            */
    };
  };
}
/* ----- EOF PIC16F84A rider.c ----- */

V prilogi še .hex in asembler listing za primerjavo.

Lp, Frenki



rider.zip
 Opis:
Rider C test

Download
 Ime datoteke:  rider.zip
 Velikost datoteke:  1.64 KB
 Downloadano:  18 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.04
Kraj: Novo mesto

PrispevekObjavljeno: Pet Nov 26, 2004 12:42 am    Naslov sporočila:   Odgovori s citatom

Da se še jaz vtaknem v to debato:

C prevajalnik je PICC Lite (HI-TECH Software) in je brezplačna zadeva.
Da ne bi izumil tople vode sem v C prevajalnik skorajda prepisal Frenkijev program.
Koda izgleda takole:
Koda:

#include <pic.h>
#include "delay.h"

__CONFIG (HS & WDTDIS & UNPROTECT);

#define BIT 14

unsigned char bitki[BIT] = {1,2,4,8,16,32,64,128,64,32,16,8,4,2};

main()
{
   TRISB = 0x0;

   while(1)
   {
      unsigned char i;

      for(i=0; i<BIT; i++)
      {
         PORTB = bitki[i];
         DelayMs(250);
         DelayMs(250);
      }
   }
}

(Pavza je napisana tako, da vrednosti večje od 256 ne morem vnesti, zato je dvakrat po 250.)

No, ko sem stvar prevedel -> 546 bajtov velika hex datoteka. To znese kar 90 besed programskega pomnilnika! Za primerjavo: Frenkijev program se prevede v 529 bajtov, kar znese 86 besed p.p. medtem ko Silvotov program (248B) zasede samo 34 besed p.p.

Pomislil sem, ali je C program morda možno napisati bolj spretno? Mislim da težko - saj že sedaj obsega samo par besed...

Zelo podobno sem program napisal tudi v BASIC-u. Prevajalnik je integriran v PIC Simulator IDE.

Koda:
Koda:

Dim bitek(14) As Byte

bitek(0) = 1
bitek(1) = 2
bitek(2) = 4
bitek(3) = 8
bitek(4) = 16
bitek(5) = 32
bitek(6) = 64
bitek(7) = 128
bitek(8) = 64
bitek(9) = 32
bitek(10) = 16
bitek(11) = 8
bitek(12) = 4
bitek(13) = 2

Dim x As Bit
x = 1

TRISB = 0

Dim i As Byte
While x
   For i = 0 To 13
   PORTB = bitek(i)
   WaitMs 500
   Next i
   
Wend

Program se prevede v kar 632B veliko datoteko. To znese 113 besed p.p.
Mislim, da je ta prevajalnik napisan nekoliko nerodno in bi s kakšnim drugim dosegel boljše rezultate...

Zanima me kako se vse skupaj obnaša pri kakšnem velikem programu?

Nobenega programa pa nisem probal na testni plošči - enkrat sem spustil čez simulator in naj bi delalo...

V prilogi pa primerjava disasemblanih hex datotek...



c_bas_test.zip
 Opis:
C in Basic Hex, ter disasemblani hexi

Download
 Ime datoteke:  c_bas_test.zip
 Velikost datoteke:  7.73 KB
 Downloadano:  7 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
frenki
Moderator
Moderator



Pridružen-a: Ned 23 Feb 2003 21:26
Prispevkov: 6732
Aktiv.: 28.42
Kraj: Ljubljana (JN76GB)

PrispevekObjavljeno: Pet Nov 26, 2004 9:20 am    Naslov sporočila:   Odgovori s citatom

Program mislim, da bi moral teči, vendar ne ravno tako kot je bilo sprva mišljeno d'oh! - vrednosti v tabeli niso OK - tole bo ledico ugašalo. Vidi se, da sem spackal brez kaj veliko razmišljanja. No, če pustim to ob strani, stvar je kljub vsemu dovolj podobna, da je o tem možno debatirati. En segment problema je seveda poraba programskega pomnilnika, drugi - po moje tudi nezanemarljiv pa poraba rama. Rešitev s takšno tabelo v danem primeru ni dobra. Stvar bi bilo treba realno napisat nekoliko drugače. Verjamem sicer, da ročno napisani assembler kodi ne bom prišel niti blizu po optimizaciji, vendar bom čez vikend vseeno poskusil še na drug način.

Lp, Frenki
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.04
Kraj: Novo mesto

PrispevekObjavljeno: Pet Nov 26, 2004 2:21 pm    Naslov sporočila:   Odgovori s citatom

Napisal sem več kratkih c programčkov, od katerih pa se je najbolje izkazal tale:

Koda:

#include <pic.h>
#include "delay.h"

__CONFIG (HS & WDTDIS & UNPROTECT);

unsigned char i=0;

void main()
{
   TRISB = 0x0;
   PORTB = 1;
   DelayMs(250);
   DelayMs(250);
   while(1)
   {
      for(i=0; i<14; i++)
      {
         if(i<7)
         {
            PORTB *= 2;
            DelayMs(250);
            DelayMs(250);
         }

         else
         {
            PORTB /= 2;
            DelayMs(250);
            DelayMs(250);
         }
      }   
   }      
}


Prevede se v 391B in zasede 61 besed programskega pomnilnika. Še vedno skoraj 2x večje od zbirniške kode, a ni več tako slabo kot prej. Bi bilo lahko še boljše?

Naj dodam še, da skoraj popolnoma enak program napisan v Basicu zavzame kar 154 besed p.p. Meni se zdi malo čudno - rabim drug prevajalnik?

V prilogi hex in disasemblan file.



hex_disasm.zip
 Opis:
Hex in disasemblana oblika

Download
 Ime datoteke:  hex_disasm.zip
 Velikost datoteke:  828 Bytov
 Downloadano:  4 krat



Nazadnje urejal/a Umnik Pet Nov 26, 2004 9:15 pm; skupaj popravljeno 2 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
slawc
Član
Član



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

PrispevekObjavljeno: Pet Nov 26, 2004 3:05 pm    Naslov sporočila:   Odgovori s citatom

Delay je v kodi 6x, to vsekakor ni dobro. Ali je to inline rutina? Koliksen je sizeof(int)?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.04
Kraj: Novo mesto

PrispevekObjavljeno: Pet Nov 26, 2004 7:14 pm    Naslov sporočila:   Odgovori s citatom

Slawc hvala za namig - pomotoma sem namreč enkrat napisal int namesto char. Tip int je dolg dva bajta, char pa samo en bajt. Popravil sem tudi zgornji post.

Pregledal sem kako se prevede moja pavza;

preden kličem pavzo v W nalozim 250 in potem kličem pavzo. To pomeni dva ukaza namesto enega. Ker moram vsako 500Ms pavzo klicati dvakrat to pomeni 4 ukaze namesto enega. Uou! Drugače pa je pavza prevedena povsem normalno.

Definitivno bi moral to pavzo napisati drugače. Je pa tudi problem, ker mi prevajalnik za vsako stvar briše RP0, tako da se 'zihr' nahaja v Bank 0.

Nisem pa razumel tole z inline rutino? Če si želel vedeti ali je 'integrirana' v prevajalnik - ni. Dobil sem jo posebej, saj bi jo napisal sam pa ne znam...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
slawc
Član
Član



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

PrispevekObjavljeno: Sob Nov 27, 2004 2:17 am    Naslov sporočila:   Odgovori s citatom

inline pomeni vrinjena, to pomeni, da se funkcija ne klice ampak se kar skopira v vse tiste dele kjer je funkcija napisana. V tvojem primeru, bi imel delay v programu 6x napisan.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Tor Apr 05, 2005 12:09 pm    Naslov sporočila:   Odgovori s citatom

Stara tema, vem ampak glede na to, da ste zgoraj uporabljali veliko kode, za premikanje bitov po portu .... tule je še en primer kako se da to naredit v C-ju ... oziroma v mojem primeru CCS.

Koda:
#include <16F84.h>
#use delay(clock=4000000)
#fuses NOWDT,HS, PUT, NOPROTECT

void main()
{
   unsigned int tt;
   boolean naprej;
   
   port_b_pullups(TRUE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   
   tt=1;
   naprej=true;
   
   while(true)
   {
      output_a(tt);     
      if (naprej) tt<<=1;
      if (!naprej) tt>>=1;
      if (tt==0x80||tt==1) naprej=!naprej;
      delay_ms(500);         
   } 
}


Tule je pa dodan še paketek s HEX-om, LST-jem in C kodo. Kako velik je tisti originalni hex, ker ga na žalost ne morem potegnit dol. Confused



night.zip
 Opis:
Night rider v CCS

Download
 Ime datoteke:  night.zip
 Velikost datoteke:  1.8 KB
 Downloadano:  8 krat

Nazaj na vrh
Odsoten 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.: 70831.74

PrispevekObjavljeno: Sre Apr 06, 2005 10:06 pm    Naslov sporočila:   Odgovori s citatom

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



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

PrispevekObjavljeno: Sre Apr 06, 2005 11:43 pm    Naslov sporočila:   Odgovori s citatom

Par komentarjev:
- ne mores primerjat kode za x51 in arm.
- programa nista enaka.

ARM primer ima startup datoteko v katerem se vzpostavi PLL, MAM in stack za vsak mode. Po defaultu je vkljucen tudi debug info. Nova koda:

Koda:

#include <LPC21xx.H>                        /* LPC21xx definitions */

void wait ()
{                         
  volatile int i;
  for (i=0;i<100;i++);
      
}

int main (void) {
  unsigned int j;                           /* LED var */

  IODIR1 = 0xFF0000;                        /* P1.16..23 defined as Outputs */

  while (1)  {                                  /* Loop forever */
    for (j = 0x010000; j < 0x800000; j <<= 1) { /* Blink LED 0,1,2,3,4,5,6 */
      IOSET1 = j;                               /* Turn on LED */
      wait ();                                  /* call wait function */
      IOCLR1 = j;                               /* Turn off LED */
    }
    for (j = 0x800000; j > 0x010000; j >>=1 ) { /* Blink LED 7,6,5,4,3,2,1 */
      IOSET1 = j;                               /* Turn on LED */
      wait ();                                  /* call wait function */
      IOCLR1 = j;                               /* Turn off LED */
    }
  }
}


Velikost .text sekcij (.data in .bss 0 - jasno, ko pa ni globalnih spremenljivk)

z -O2
ARM 504
Thumb 472

z -Os
ARM 504
Thumb 456

Sedaj pa s skoraj minimalnim startup filetkom (brez PLL, brez MAM, samo en stack, v supervisor modu)
z -O2
ARM 344
Thumb 312

z -Os
ARM 344
Thumb 296

BTW, se da to se dodatno sfrizirat (ampak ne .c koda!!!).
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju Č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: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group