a_sorien Postat Decembrie 8, 2012 Partajează Postat Decembrie 8, 2012 Salutare ! Am un 12f508 , pilotat de un 4MHZ , alimentat la 5v , scris un cod in asm .GP0 iesire , GP1 intrare , GP2 iesire , GP3 intrare (implicit) Flow code :1 . GP0 aprinde un led alb2 . GP1 primeste "1 logic" TTL si stinge led alb 3 . GP2 aprinde un led verde4 . GP3 primeste "1 logic" TTL si stinge led verde5 . repeat forever list p=12F508 #include __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC org 0x0000 movlw b'111010' ; GP0 OUT, GP2 OUT tris GPIO ; s-au setat intrarile si iesirile start movlw b'000001' movwf GPIO ;am facut gp0 = 1 ;am dat drumu la led alb on_alb btfss GPIO,1 ; testez daca GP1 e in 1 logic goto on_alb movlw b'000000' ; sting led alb movwf GPIO off_alb btfsc GPIO,1 ; testez daca GP1 e in " 0 logic" goto off_alb movlw b'000100' ; aprinde led verde movwf GPIO on_verde btfss GPIO,3 ; testez daca GP3 este in "1 logic" goto on_verde movlw b'000000' ; sting led verde movwf GPIO off_verde btfsc GPIO,3 ; testez daca GP3 este in "0 logic" goto off_verde goto start endProgramul functioneaza doar cu led alb , si testeaza intrarea de alb , insa pe verde nuUnde gresesc ?!Am rupt codul si am scris pic ul doar pentru alb...si mergeApoi am scris codul doar pentru vedre si nu merge... Zau , is incepator dar totusi nu pricep...l-am scris si rescris de zeci de ori pana acum ..si tot nu merge ! Help! Link spre comentariu
10vid Postat Decembrie 8, 2012 Partajează Postat Decembrie 8, 2012 Ce trebuie, mai exact, sa faca acest program? Din ce am inteles, trebuie sa aprinda doua leduri in functie de starea a doua intrari? Asta se poate face simplu prin deplasarea bitilor dinspre intrari spre iesiri (intrarile si iesirile fiind intretesute): loop1 rrf PORTB,F goto loop1 Link spre comentariu
deejay2k1 Postat Decembrie 8, 2012 Partajează Postat Decembrie 8, 2012 problema e la goto-uri. cand testezi gp1, te reintorci mereu la test. in felul asta nu ai cum sa mai ajungi la testul gp3 alternativa ar fi call. clrf w ;w este 0btfss gpio,1 ;testezi gp1call alb_on ;daca gp1=0 asta se executa, te vei intoarce cu b'00000001' in wmovwf gpio ;pui continutul w in gpioclrf w ;w este 0btfss gpio,3 ;testezi gp3call verde_on ;daca gp3=0 asta se executa, te vei intoarce cu b'00000100' in wmovwf gpio ;pui continutul w in gpio....endalb_on retlw b'00000001'verde_on retlw b'00000100' sau , mai simplu, asa: clrf wbtfss gpio,1movlw b'00000001'movwf gpioclrf wbtfss gpio,3movlw b'00000100'movwf gpio Link spre comentariu
deejay2k1 Postat Decembrie 8, 2012 Partajează Postat Decembrie 8, 2012 tocmai mi-am dat seama ca nu o sa mearga, din cauza lui movwf gpio, care va sterge tot ce este deasupra lui deci asa o sa mearga: btfsc gpio,1bcf gpio,0 ;sting albnopbtfss gpio,1 ;test gp1bsf gpio,0 ;daca gp1=0, aprind albnop un mic sfat: evita goto-urile si buclele recursive la goto-uri exista riscul sa uiti sa inchizi vreo bucla, iar buclele recursive irosesc timpul (cu exceptia cazurilor in care vrei musai asta), poti executa alt cod intre timp Link spre comentariu
a_sorien Postat Decembrie 8, 2012 Autor Partajează Postat Decembrie 8, 2012 problema e la goto-uri.cand testezi gp1, te reintorci mereu la test.in felul asta nu ai cum sa mai ajungi la testul gp3alternativa ar fi call. clrf w ;w este 0btfss gpio,1 ;testezi gp1call alb_on ;daca gp1=0 asta se executa, te vei intoarce cu b'00000001' in wmovwf gpio ;pui continutul w in gpioclrf w ;w este 0btfss gpio,3 ;testezi gp3call verde_on ;daca gp3=0 asta se executa, te vei intoarce cu b'00000100' in wmovwf gpio ;pui continutul w in gpio....endalb_on retlw b'00000001'verde_on retlw b'00000100'sau , mai simplu, asa:clrf wbtfss gpio,1movlw b'00000001'movwf gpioclrf wbtfss gpio,3movlw b'00000100'movwf gpio ok, dar am citit ca dupa executia btfss/c cand se indeplineste conditia se face skip next instruction , adica goto ..! Link spre comentariu
deejay2k1 Postat Decembrie 8, 2012 Partajează Postat Decembrie 8, 2012 corect, insa problema la tine era ca programul tau nu avea cum sa ajunga la verde niciodata.venea cam asastarttest gp1, daca da inapoi la test gp1 daca nu, alb_ontest gp1, daca nu, inapoi la test gp1daca da, alb_offmai jos de atat nu are cum sa ajunga, programul ramane in goto ori la gp1 on, ori la gp1 offca sa ajunga la testul gp3, ar trebui sa ai gp1 off - gp1 on la interval de cateva us, cat ii ia pic-ului execute instructiunile Link spre comentariu
a_sorien Postat Decembrie 8, 2012 Autor Partajează Postat Decembrie 8, 2012 Cum vad eu....:list p=12F508 #include __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC org 0x0000 movlw b'111010' ; GP0 OUT, GP2 OUT tris GPIO ; s-au setat intrarile si iesirile start ledalb_on movlw b'000001' movwf GPIO ;am facut gp0 = 1 ;am dat drumu la led alb btfss GPIO,1 ; testez daca GP1 e in 1 logic call ledalb_on ledalb_off bcf GPIO,0 nop nop btfsc GPIO,1 ; testez daca GP1 e in " 0 logic" call ledalb_off nop nop ledverde_on bsf GPIO,2 nop nop btfss GPIO,3 ; testez daca GP3 este in "1 logic" call ledverde_on nop nop ledverde_off bcf GPIO,2 nop nop btfsc GPIO,3 ; testez daca GP3 este in "0 logic" nop nop goto start end 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