Vizitator david1 Postat Iulie 5, 2012 Partajează Postat Iulie 5, 2012 Buna seara tuturor, Sunt un membru nou pe acest forum, de aceea daca am postat cumva un subiect care a fost deja dezbatut, imi cer scuze. De fapt sunt incepator si in microcontrolere. Am reusit sa fac cateva montaje cu PIC16F84 care au functionat dar acum sunt nevoit sa cer sfatul celor experimentati. In mai multe tutoriale despre PIC-uri am citit despre macrouri ce pot fi folosite la programarea PIC-urilor. Nelamurirea mea este daca aceste macrouri pot fi gasite sub forma unor firiere de tip macro.inc si daca da, de unde pot fi descarcate ? Va multumesc. Link spre comentariu
Vizitator david1 Postat Iulie 10, 2012 Partajează Postat Iulie 10, 2012 Chiar nu ma poate ajuta nimeni cu un raspuns ? Link spre comentariu
cirip Postat Iulie 11, 2012 Partajează Postat Iulie 11, 2012 Macro-urile ti le faci singur. Tot ceea ce ai nevoie sa stii despre creearea uniui macro este descris in Help -> Topics -> MPASM Assembler. Dupa ce s-a deschis Helpul, clic in stanga pe MPASM Assembler, expandezi si clic pe Macro Language. Link spre comentariu
Bamse Postat Iulie 11, 2012 Partajează Postat Iulie 11, 2012 Salut david1 !... nu m-am prins in ce limbaj programezi ?! daca programezi cu limbaj de nivel inalt vezi la mikroe.com ca au ceva librarii.Cel mai corect este .. sa asculti de cirip si sa le faci singur asa nu vei pierde timp cand le modifici parametrii . Link spre comentariu
Vizitator david1 Postat Iulie 11, 2012 Partajează Postat Iulie 11, 2012 Multumesc mult, Eu am inceput sa programez in limbaj de asamblare. In tutorialele pe care le-am studiat sunt cateva exemple de macro-uri ca de exemplu wait.inc, print.inc, etc. Am sa incerc sa le scriu si pe urma sa fac cateva incercari cu ele. Link spre comentariu
cirip Postat Iulie 12, 2012 Partajează Postat Iulie 12, 2012 Salut,E interesant de ce vrei musai sa flosesti macro? Ai o nevoie anume sau e ceva cu scop educational?Cateva situatii in care ar fi util un macro:-Nu ai initializat stiva si nu poti face call. Nu se aplica la PIC urile mici, dar e un caz valid ptr procesoare care au Stack Pointer.-Vrei sa creezi o instructiune mai sucara, de exemplu o adresare in care setarea bankului se face automat. Instantierea macro-ului in cod va scrie ptr tine si codul necesar setarii bankului. Scrii mai putin, dar rezultatul in cod obiect va fi mai mult.-Vrei sa desfasori o bucla ca sa optimizezi timpul de executie, in dezavantajul memoriei ocupate.Or mai fi si altele, dar astea mi-au venit acum in minte. In orice caz, ceea ce face macro-ul este ca iti copiaza secventa de cod din definitie de cate ori chemi macro-ul in codul principal. Ideea e ca trebuie sa iti fie foarte clar de ce vrei sa folosetsi macro in loc de subrutina (call), altfel nu te alegi decat cu memorie mancata.Cirip Link spre comentariu
Bamse Postat Iulie 12, 2012 Partajează Postat Iulie 12, 2012 Salut David ! ... Eu am inceput sa programez in limbaj de asamblare. .... Nu pot sa spun decat felicitari ! ... dar tin sa te avizez ca "ai ales drumul cel mai anevoios".Programarea in assembler desi are "putine instructiuni" cere mult din partea programatorului. ... una este sa aprinzi un led si alta sa implementezi un protocol 1wire. (in asamblare bineinteles). diferenta de cod scris este cam 1:3 , pentru fiecare pagina in C sau Basic vei avea peste 3 in asm. incearca sa scri cod pentru un text curgator (scroll text) in asm si vezi ce iasa ! mai jos ai in basic codul: DEVICE 16F84A ' WE ARE USING...(ANY TYPE:CAPABLE OF DRIVING LCD) xtal 8' CHANGE CONFIG DIREVTIVES AS PER DEVICE USE ' CHAGNGE LCD DECLARATIONS AS PER YOUR CHOICE DECLARE LCD_TYPE ALPHA ' Inform the compiler as to the type of LCD DECLARE LCD_DTPIN PORTB.4 ' Used for 4-line interface. DECLARE LCD_ENPIN PORTB.2 ' Assigns the Port and Pin that the LCD's EN line will attach to. DECLARE LCD_RSPIN PORTB.3 ' Assigns the Port and Pins that the LCD's RS line will attach to. DECLARE LCD_INTERFACE 4 ' 4-line or 8-line interface is required by the LCD. DECLARE LCD_LINES 1 ' Inform the compiler as to how many lines the LCD has ' *** DEFINE VARIABLES *** DIM MESSAGE_ARRAY[20] AS BYTE ' $$$ LENGTH OF LCD DIM DATUM AS BYTE ' DATA STORAGE DIM Y AS BYTE ' JUST A COUNTER' *** ALIAS CONSTANT *** SYMBOL EOM = 1 ' END OF MESSAGE SYMBOL SPEED = 125 ' $$$ SCROLL SPEED SYMBOL LCD_LENGTH = 19 ' $$$ WE ARE USING 2x20 LCD (IN THIS CASE 0-19) DELAYMS 500 ' WAIT LCD TO STABILIZED CLS ' CLEAR SCREEN ' *** HERE IS YOUR MESSAGE *** NOTE: No double space! (1 is the End Of Message) DATA "Cod preluat de pe situl PROTON si modificat pentru 16F84A " DATA "cu LCD 16x1 caractere ,modificat si configurat de BAMSE (C) " DATA " !!!MESSAGE!!!",1 GOTO START '------------------------------------------------------------------------------------ SCROLL_MESSAGE: PRINT AT 1,1,STR MESSAGE_ARRAY ' DISPLAY THE MESSAGE DELAYMS SPEED ' WAIT FOR Y=0 TO LCD_LENGTH-1 ' MAKE A LOOP MESSAGE_ARRAY[Y] = MESSAGE_ARRAY[Y+1] ' SHIFT LEFT THE BYTES CONTENTS NEXT ' FINISH THE JOB RETURN ' BYE!START: Y=0 ' CLEAR POINTER REPEAT ' DO A LOOP MESSAGE_ARRAY[Y]=" " ' CLEAR ARRAY INC Y ' INCREMENT POINTER UNTIL Y=LCD_LENGTH ' FINISH THE JOBLOOP: RESTORE ' POINT TO FIRST CHARACTER OF DATA WHILE 1=1 ' MAKE AN ENDLESS LOOP READ DATUM ' GET THE FIRST CHARACTER... AND SO ON.... IF DATUM=EOM THEN BLANK_TXT ' TRACK END OF MESSAGE & EXIT IF FOUND MESSAGE_ARRAY[19]=DATUM ' $$$ SAVE THE DATA TO LAST BYTE OF THE ARRAY GOSUB SCROLL_MESSAGE ' GO AND PLAY WEND ' END OF STATEMENTBLANK_TXT: IF MESSAGE_ARRAY[10]=" " THEN ' $$$ TRACK THE FIRST BLANK CHARACTER IF MESSAGE_ARRAY[11]=" " THEN ' $$$ TRACK THE SECOND BLANK CHARACTER GOTO LOOP ' IF FOUND? GO BACK TO LOOP ENDIF ' END OF 2ND STATEMENT ENDIF ' END OF 1ST STATEMENT MESSAGE_ARRAY[19]=" " ' $$$ STORE A BLACK CHARATER TO THE LAST BYTE OF THE ARRAY GOSUB SCROLL_MESSAGE ' GO AND FINISH THE PLAY GOTO BLANK_TXT ' DO IT AGAIN END ' END OF PROGRAMPersonal folosesc rar asamblare si doar inserata in cod basic .... te las pa mana lui cirip el cunoaste mai bine ca mine asm ! Link spre comentariu
Vizitator david1 Postat Iulie 13, 2012 Partajează Postat Iulie 13, 2012 Sunt interesat de macro-uri pentru ca am citit despre ele, si in tutoriale se spune ca ar fi foarte utile. Eu in ceea ce am facut pana acuma am folosit instructiunile goto si call, am facut chiar un proiect pentru iluminarea inteligenta a trotuarului in care la intreruperea unei bariere optice programul mergea la eticheta potrivita pentru situatia respectiva. Dar cum spuneam sunt inca incepator in microcontrolere si nu vreau sa trec peste sectiunea cu macrouri. Sunt convins ca sunt si ele utile in anumite situatii. Ideea este sa le inteleg si sa stiu sa le folosesc. In ceea ce priveste limbajul de programare, deja m-am convins ca nu este tot una sa aprind un led sau sa fac altceva. Voi incerca sa abordez si alte limbaje. Multumesc oricum pentru sfaturi. Link spre comentariu
XAN77 Postat Iulie 14, 2012 Partajează Postat Iulie 14, 2012 acesta este un fisier cu macro-uri facut de mine acum multi ani, cand programam numai in asmablare ca nu aveam nici un compilator de nivel inalt. Multe din ele sunt prostii de moment, care nu le-am folosit niciodata, dar iti faci idee in ce consta o astfel de colectie. E un fisier txt care il includeam in antetul programelor. Contine inclusiv macrouri de folosire LCD alfanumeric clasic sau i2c software (rutine copiate din compilatoare basic versiuni lite ce nu permiteau pe vremea aia programe mai mari de 50 lini de cod ).Eu fiind pe vremera aia mare amator de Basic, cam asa mi-am gandit si macro-urile, programele facute apoi pentru asamblarea in Mpasm, folosind macro-urile din colectie, aratau chiar ca un cod Basic. Nu mai semanau deloc cu asambler.Repet, rutinele i2c, lcd, rs232 din fisier nu sunt conceptia mea, sunt copiate din Pic Basic de la Crownhill de pe acea vreme, prin compilare si dezasamblarea hex-ului rezultat. un fel de reverse enginiering. M16F84.zip Link spre comentariu
puriu Postat Iulie 15, 2012 Partajează Postat Iulie 15, 2012 Pentru programarea Pic-urilor mici nu e necesara folosirea macroinstructiunilor, ci economisirea memoriei. Codul unui macro necesar se poate copia si lipi in listigul programului cu o eticheta in fata si se apeleaza cu CALL. Scrierea in .asm este foarte utila atunci cand se urmareste obtinerea unui program compact, rapid si precis (comunicatie seriala, etc.). Link spre comentariu
Vizitator david1 Postat Iulie 16, 2012 Partajează Postat Iulie 16, 2012 Inteleg ca trebuie sa acord mare atentie memoriei pe care il folosesc pentru scrierea unui program. Probabil la programe mai complexe ma pot trezi ca ,,nu mai am memorie". Dar as mai avea o intrebare : La folosirea macro-urilor eu pot sa folosesc argumente. De exemplu intr-una din tutoriale am un macro pentru folosirea butoanelor. La acest macro pot scrie la argumente unele date ca de exemplu portul, pin-ul, daca sa reactioneze la 0 sau 1 logic, intarzierea, etc. In acest caz folosirea macroului mi se pare foarte eficienta chiar daca imi va ocupa din memorie. Intrebarea mea este daca pot face acelasi lucru si cu instructiunea call ? pot avea astfel de argumente ? Sau care ar fi tehnica de a rezolva problema ? XAN77, vreau sa iti multumesc pentru modelul de macro atasat. Link spre comentariu
cirip Postat Iulie 17, 2012 Partajează Postat Iulie 17, 2012 Intrebarea mea este daca pot face acelasi lucru si cu instructiunea call ? pot avea astfel de argumente ? Sau care ar fi tehnica de a rezolva problema ?Instructiunea call are un singur argument si anume adresa de salt. Este o instructiune nativa, care nu poate fi modificata. Un macro poate fi modificat ptr ca este de fapt scris de programator.Asta nu inseamna ca nu se pot da argumente instructiunii call. Rezervi o zona de memorie pentru comunicare. Inainte de call ai grija sa scrii toate argumentele necesare in zona respectiva de memorie. Rutina chemata cu call isi va gasi argumentele in bufferul de memorie stabilit pentru acest scop. La procesoarele mai destepte, transferul argumentelor se face prin stiva. Faci push inainte sa chemi rutina, apoi, odata intrat in rutina, faci pop ca sa extragi datele din stiva. Link spre comentariu
Vizitator david1 Postat Iulie 22, 2012 Partajează Postat Iulie 22, 2012 Am incercat sa folosesc macrourile din tutoriale pentru lucrul cu LCD. Dar la compilare am urmatoarea eroare :MPLINK 3.80.02, LinkerCopyright © 2004 Microchip Technology Inc.Error - section '.org_1' can not fit the absolute section. Section '.org_1' start=0x00000004, length=0x00000020Errors : 1 Ce inseamna eroarea ? Am atasat si fisierul sursa, poate ma ajuta cineva. lcd.txt Link spre comentariu
Vizitator david1 Postat Iulie 26, 2012 Partajează Postat Iulie 26, 2012 Am reusit sa rezolv problema cu eroarea. Am instalat o versiune mai noua de MPLAB si problema a disparut. In schimb mi-a aparut o alta problema : Am rescris programul si am incercat sa renunt la macrouri. Problema a fost ca atunci cand am folosit macrouri imi spunea ca stiva este plina. Dar la fel patesc si fara macrouri. Ideea este ca folosesc TMR0 si cand acesta ajunge la valoarea maxima programul revine la vectorul reset. (problema apare la linia 74, in subprogramul de asteptare)Nu inteleg de ce ? Ma poate ajuta cineva ? Link spre comentariu
Vizitator david1 Postat Iulie 26, 2012 Partajează Postat Iulie 26, 2012 Am uitat sa atasez fisierul sursa. lcd.txt Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum