francezu Postat Martie 23, 2010 Partajează Postat Martie 23, 2010 Trebuie sa faci ceea ce ti-am spus in mesajul anterior : trebuie sa inveti assembler. Asm-ul nu este chiar asa "user friendly", nu este nici greu dar, nu poti sa modifici la intamplare doar niste valori numerice, sau altceva , si sa te astepti sa mearga asa cum vrei; trebuie sa intelegi programul, sa stii ce face fiecare linie din acesta. Net-ul este plin de tutoriale si exemple in assembler, poti invata si singur, cum de-altfel au facut multi, numai vointa sa fie. Incepi mai intai cu aplicatii simple ,gen licurici, apoi treci la altele mai complexe. Cand nu intelegi ceva, ne poti cere ajutorul.Daca nu esti interesat sa inveti vre-un limbaj de programare,si contactul cu uC-uri este doar unul pasager, spune-mi si iti modific eu programul asa cum doresti. Link spre comentariu
elcomar Postat Martie 23, 2010 Autor Partajează Postat Martie 23, 2010 pai vreau sa invat numai ca nu poti invata batand din palme, asta ia timp, altii fac facultati pentru asta.. Link spre comentariu
elcomar Postat Mai 17, 2010 Autor Partajează Postat Mai 17, 2010 as putea sa modific programul pentru 16f84 ca sa mearga cu PIC12F629I/P ? sau mai bine zis trebuie modificat? ce trebuie sa modific? (e vorba de programul de mai sus) Link spre comentariu
francezu Postat Mai 17, 2010 Partajează Postat Mai 17, 2010 Da, se poate porta programul pe pic12f629. Trebuiesc modificate in primul rand adresele la care se aloca variabilele- 12f629 are inceputul gpr-urilor la alta adresa fata de 16f84. Apoi trebuie dezactivat modulul comparator din 12f629, in cazul in care vei folosi oscilatorul intern trebuie introdusa si o rutina de recuperare a valorii osccal, si cel mai important trebuiesc redefiniti pinii IO si reconfigurat registrul TRISIO( in loc de TRISA si TRISB)Detaliile despre cele de mai sus le gasesti cu siguranta in dataseet Link spre comentariu
puiu Postat Mai 19, 2010 Partajează Postat Mai 19, 2010 1. Si bineinteles trebuie sa inlocuiesti unele comenzi pe care le ai in PIC16 si nu le ai in familia PIC12. Trebuie sa stii ca familia PIC12 este cu instructiuni scrise pe 12 biti, pe cand familia PIC16 are instructiunile pe 14 biti, iar PIC18 este pe 16 biti. Deci ai mai multe instructiuni in familia lui PIC16 ca unul din familia PIC12. Daca vrei sa programezi unul din familia PIC12, trebuie sa ai mai putine instructiuni(ca tip), deci vei avea mai multe linii de programare, deoarece va trebui sa descri instructiuni din familia lui PIC16 cu instructiuni recunoscute de PIC12. Link spre comentariu
elcomar Postat Martie 2, 2011 Autor Partajează Postat Martie 2, 2011 ma puteti ajuta si pe mine cu acest cod sursa? as vrea ca sa functioneze la fel numai ca timpul de pornire sa fie 5 minute, nu 5 secunde iar dupa ce isi va face ciclul pe cele 2 iesiri sa nu mai porneasca daca butonul este retinut in continuu ci doar daca este deschis si apoi reinchisaici atasez si codul sursa, multumesc:list p=16F84A ; list directive to define processor#include ; processor specific variable definitions__CONFIG 0x3FF2errorlevel -302 cblock 0x0Cw_tempstatus_tempd1d2d3counterendc;**********************************************************************TP equ .5 ;timp pornire (s)DI equ .5 ;durata impuls (s)DP equ .50 ;durata pauza (s);**********************************************************************#define PB PORTA,1#define L1 PORTA,2#define L2 PORTA,3;**********************************************************************ORG 0x000 ;Configclrf PORTAclrf PORTBbanksel TRISAmovlw 0x02movwf TRISAclrf TRISBbanksel PORTA;------------------------------------------------Loopbtfsc PBgoto $-1call debbtfsc PBgoto Loopmovlw TP*.20movwf counterwrcall deb btfsc PB goto Loop decfsz counter,f goto wr bsf L1movlw DImovwf counterl2call D1sdecfsz counter,fgoto l2bcf L1movlw DPmovwf counterl3call D1sdecfsz counter,fgoto l3bsf L2movlw DImovwf counterl4call D1sdecfsz counter,fgoto l4bcf L2call D1s goto Loopdeb ;debounce delay ,50ms;99993 cyclesmovlw 0x1Emovwf d1movlw 0x4Fmovwf d2Delay_0decfsz d1, fgoto $+2decfsz d2, fgoto Delay_0;3 cyclesgoto $+1nop;4 cycles (including call)returnD1s ;1s delay;1999996 cyclesmovlw 0x11movwf d1movlw 0x5Dmovwf d2movlw 0x05movwf d3Delay_1decfsz d1, fgoto $+2decfsz d2, fgoto $+2decfsz d3, fgoto Delay_1;4 cycles (including call)returnEND ; directive 'end of program' Link spre comentariu
francezu Postat Martie 2, 2011 Partajează Postat Martie 2, 2011 Ti-am modificat codul astfel incat se pot obtine valori mai mari pt TP ( pana la 65535 secunde- 16 biti ). list p=16F84A ; list directive to define processor #include <p16F84A.inc> ; processor specific variable definitions __CONFIG 0x3FF2 ;========= 8 MHz clock ============ errorlevel -302 cblock 0x0C w_temp status_temp d1 d2 d3 counterH counterL secs_cnt endc;**********************************************************************TPH equ .1 ;timp pornire MSB timp pornire (s) = TPH*256 + TPLTPL equ .44 ;timp pornire LSB DI equ .5 ;durata impuls (s)DP equ .50 ;durata pauza (s);**********************************************************************#define PB PORTA,1#define L1 PORTA,2#define L2 PORTA,3;********************************************************************** ORG 0x000;Config clrf PORTA clrf PORTB banksel TRISA movlw 0x02 movwf TRISA clrf TRISB banksel PORTA;------------------------------------------------Loop btfsc PB goto $-1 call deb btfsc PB goto Loop movlw TPH ; preload counter movwf counterH movlw TPL movwf counterL movlw .20 movwf secs_cnt ; preload seconds counterwr call deb btfsc PB goto Loop decfsz secs_cnt,f goto wr movlw .20 movwf secs_cnt ; preload seconds counter;-- tstf counterL ; if low byte>0 then btfss STATUS,Z goto decrem_lo ; decrement it ; else tstf counterH ; if high byte=0 then btfsc STATUS,Z goto Begin ; timeout, exit loop movlw .255 ; else movwf counterL ; preload low byte decf counterH,f ; and decrement high byte goto wr decrem_lo decfsz counterL,f ; decrement low byte goto wr tstf counterH ; if counter>0 btfss STATUS,Z goto wr ; stay in loop ; else timeout, exit loopBegin bsf L1 movlw DI movwf counterLl2 call D1s decfsz counterL,f goto l2 bcf L1 movlw DP movwf counterLl3 call D1s decfsz counterL,f goto l3 bsf L2 movlw DI movwf counterLl4 call D1s decfsz counterL,f goto l4 bcf L2 wr2 ; wait button release btfss PB goto wr2 call deb btfss PB goto wr2 goto Loop ; releaseddeb ;debounce delay ,50ms;99993 cycles movlw 0x1E movwf d1 movlw 0x4F movwf d2Delay_0 decfsz d1, f goto $+2 decfsz d2, f goto Delay_0;3 cycles goto $+1 nop;4 cycles (including call) returnD1s ;1s delay;1999996 cycles movlw 0x11 movwf d1 movlw 0x5D movwf d2 movlw 0x05 movwf d3Delay_1 decfsz d1, f goto $+2 decfsz d2, f goto $+2 decfsz d3, f goto Delay_1;4 cycles (including call) return END ; directive 'end of program' Link spre comentariu
elcomar Postat Martie 3, 2011 Autor Partajează Postat Martie 3, 2011 functioneaza, multumesc numai ca nu mai pot modifica timpul de pornire/ sau modific eu unde nu trebuie (am schimbat 44 cu 11 si nu s-a schimbat nimic dar am un quart de 4 Mhz)unde trebuie sa schimb ca sa mearga la 5 minute si pe 4 Mhz? Link spre comentariu
francezu Postat Martie 3, 2011 Partajează Postat Martie 3, 2011 In codul postat de mine mai sus scrie clar ;========= 8 MHz clock ============deci este pentru cristal de 8 MHz. Pentru a functiona pe 4 Mhz trebuiesc recalculate rutinele de intarziere, cea de 50ms - denumita "deb"; si cea de 1s - denumita D1s. Pentru generarea rutinelor de intarziere foloseste calculatorul de AICIPentru calcularea timpului este scris in cod la comentariu. Pt ca in asm nu poti defini variabile mai mari de 8biti se recurge la un artificiu, concatenand mai multi bytes.In cazul variabilelor pe 2 bytes, cel mai semnificativ are o pondere de 256 ori mai mare decat cel mai putin semnificativ. De aici rezulta formula de calcul pt variabila de 2 bytes : N=256*MSB+LSB. Daca de exemplu vrem N=2535, atunci MSB=9 si LSB= 231; astfel 256*9 +231 = 2535. In cod TP poate lua valori de la 0 la 65535 secunde, cu rezolutie de 1s. In codul postat anterior TP= 5min= 300s= 256*1 +44 ( pt ceas de 8 mega)/ Link spre comentariu
elcomar Postat Martie 5, 2011 Autor Partajează Postat Martie 5, 2011 poti sa mai verifici putin codul? ar trebui ca dupa ce face primul ciclu (adica daca tin butonul inchis 5 minute sa am iesire pe cele 2 iesiri asa cum era descris la inceputul proiectului) dar sa nu mai porneasca daca butonul ramane inchis decat daca butonul este deschis si apoi reinchis (timp de 5 minute)sper sa intelegeti ce am vrut sa spunFaza este ca a mers ok 2 zile iar acum a dat o eroare: a pornit si a doua oara ciclul ceea ce nu trebuia sa se intample pentru ca nu a deschis nimeni intrerupatorul kMentionez ca toate astea le fac pe o placa de test iar la iesiri am conectat cate un mic buzzer. Link spre comentariu
francezu Postat Martie 5, 2011 Partajează Postat Martie 5, 2011 Ma astept sa ai un intrerupator acolo si nu un buton pe care sa-l tii apasat 5min; este conectat ca in schema trimisa ? adica intre pinul 18 si masa cu pull-up de 10kohmi. Teoretic nu ar trebui sa treaca de ultima rutina "wr2" daca nu se deschide intrerupatorul. Incearca sa maresti delay-ul pt debounce apeland de mai multe ori rutina "deb": wr2 ; wait button release btfss PB goto wr2 call deb call deb btfss PB goto wr2 goto Loop ; released Link spre comentariu
elcomar Postat Martie 5, 2011 Autor Partajează Postat Martie 5, 2011 este conectat ca in schema si mentionez ca nu a facut aceasta problema decat o singura data, moment in care era deasupra masinii de spalat care era in stare de functionare (pe bune).Sa fi prins ceva paraziti? dar cum? montajul era conectat la o baterie, nu la retea. Am repetat testul acum in camera si aici nu am nici o problema. p.s. butonul este unul de tip basculant nu stau cu degetul pe el Link spre comentariu
francezu Postat Martie 5, 2011 Partajează Postat Martie 5, 2011 Sa fi prins ceva paraziti?lPosibil. Daca nu ai inca, pune un cond ceramic de 100-470nF cat mai aproape de pinii de alimentare ai Pic-ului si eventual alimenteaza-l si prin stabilizator :7805 , etc. Link spre comentariu
elcomar Postat Martie 5, 2011 Autor Partajează Postat Martie 5, 2011 are stabilizator 7805, condensator nu am decat la incarcatorul pentru baterie/1000 micro dar in momentul cu problema era decuplat. Sper din toata inima sa fi fost de la paraziti. Data viitoare o sa acord mai multa atentie filtrajului, e bine ca am ajuns si aici deci procesoarele sunt sensibile 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