Vizitator gabi_g26 Postat Aprilie 30, 2010 Partajează Postat Aprilie 30, 2010 Buna ziua, Am inceput sa invat sa programez microcontrolere si m-am lovit de o situatie la care nu gasesc solutie. Am scris urmatorul program si nu functoneaza cum ar trebui: #include <p16F690.inc>__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF) org 0Start: bsf STATUS,RP0 bcf TRISC,3 bcf STATUS,RP0 clrf PORTC bsf STATUS ,RP0 bsf TRISA,3 bcf STATUS, RP0 clrf PORTA btfss PORTA,3 goto Start bsf PORTC,3 goto $ endEl ar trebui sa aprinda un led in momentul apasarii unui buton. Problema e ca in modul simulare al programului MPLAB merge(modul animatie), dar cand il incarc in microcontroler, ledul sta aprins indiferent de starea butonului. Sper ca puteti sa ma ajutati. Cu stima, Gabi Link spre comentariu
adrian_pic Postat Aprilie 30, 2010 Partajează Postat Aprilie 30, 2010 In primul rind nu ai un delay in program. Deci tu aprinzi ledul si apoi il stingi si tot asa , dar la o frecventa foarte mare!!! Si da programul iti functioneaza corect si face ce vrei tu doar ca tu cu ochiul liber nu-l poti vedea cum se stinge si cum se aprinde. De aceea trebuie sa faci asa: aprinzi ledul, apoi urmeaza un delay (o intarziere in care microcontrolerul nu face nimic) de 0.5 secunde sa zicem, apoi stingi led-ul si iar un delay de 0,5 secunde si apoi o ia de la inceput. Deci dupa ce aprinzi led-ul trebuie sa faci o pauza de 0,5 secunde , apoi stingi si iar pauza de 0,5 secunde. Stii sa faci acest delay in asm?Vezi ca este aici pe undeva cod cu asa ceva. Daca nu-l gasesti da un semn si o sa iti puna cineva codul. Si inca ceva, tu ai in codul tau in bucla START configuarea portului A si C. Scoatele din bucla START instructiunile de configuare ca nu este nevoie sa faci asta de fiecare data. Inainte de a intra in bucla START faci configurarea porturilor si apoi urmeaza bucla START. Link spre comentariu
francezu Postat Aprilie 30, 2010 Partajează Postat Aprilie 30, 2010 @gabi_g26 - Codul scris de tine e departe de a fi ceea ce trebuie. Incearca programul de mai jos, care la prima apasare a butonului aprinde led-ul, la a doua il stinge, apoi se repeta secventa. Am incercat sa comentez cat mai complet fiecare instructiune. Daca ai nelamuriri raspund cu placere. Pentru rutine de intarziere este foarte util program-ul de aici . list p=16f690 ; list directive to define processor #include <P16F690.inc> ; processor specific variable definitions __CONFIG _CP_OFF & _CPD_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF errorlevel -302 ; anuleaza mesajul de atentionare 302 ;---------------------------;;Declarare variabile ;;---------------------------; cblock 0x20 ; adresa registrilor de scop general d1 ; variabile folosite d2 ; in rutina de intarziere endc;----------------------------------;;Definire intrari/iesiri ;;----------------------------------;#define buton PORTA,3 ; push-buton legat la pinul RA3#define led PORTC,3 ; led legat la pinul RC3;---------------------------------- ORG 0x000 ; processor reset vector;----------------------------------;;Configurare porturi si periferice ;;----------------------------------; banksel ANSEL ; selecteaza banca in care se afla registrul ANSEL clrf ANSEL ; dezactiveaza intrarile clrf ANSELH ; analogice banksel PORTA ; selecteaza bank0 clrf PORTA ; preincarca valorile clrf PORTB ; initiale clrf PORTC ; ale iesirilor banksel TRISA ; selecteaza bank1 movlw b'00001000' ; PORTA- pin RA3 setat movwf TRISA ; configurat ca intrare clrf TRISB ; PORTB-toti pinii iesiri clrf TRISC ; PORTC-toti pinii iesiri banksel PORTA ; selecteaza bank0 Loop btfsc buton ; buton apasat? goto Loop ; nu, asteapta ca butonul sa fie apasat call delay ; da, executa intarziere debouce btfsc buton ; inca apasat? goto Loop ; nu, asteapta reapasare ; da, basculeaza iesirea la care este cuplat led-ul btfss led ; daca led-ul este aprins goto $+3 bcf led ; => stinge led goto $+2 bsf led ; altfel aprinde led btfss buton ; buton eliberat? goto $-1 ; nu, asteapta eliberarea butonului call delay ; da, executa intarziere debounce btfss buton ; buton eliberat? goto $-4 ; nu, asteapta eliberarea butonului goto Loop ; da, proceseaza urmatoarea apasare a butonului.;----------------------------------------;; Rutina de intarziere pentru eliminarea ;; efectului de vibratie a contactelor ;;----------------------------------------;delay ; intarziere de 50ms pentru ceas de 4MHz movlw 0x0E movwf d1 movlw 0x28 movwf d2Delay_0 decfsz d1, f goto $+2 decfsz d2, f goto Delay_0 goto $+1 nop return endSi schema: Link spre comentariu
Vizitator gabi_g26 Postat Mai 2, 2010 Partajează Postat Mai 2, 2010 @gabi_g26 - Codul scris de tine e departe de a fi ceea ce trebuie. Incearca programul de mai jos, care la prima apasare a butonului aprinde led-ul, la a doua il stinge, apoi se repeta secventa. Am incercat sa comentez cat mai complet fiecare instructiune. Daca ai nelamuriri raspund cu placere. Pentru rutine de intarziere este foarte util program-ul de aici . list p=16f690 ; list directive to define processor #include <P16F690.inc> ; processor specific variable definitions __CONFIG _CP_OFF & _CPD_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF errorlevel -302 ; anuleaza mesajul de atentionare 302 ;---------------------------;;Declarare variabile ;;---------------------------; cblock 0x20 ; adresa registrilor de scop general d1 ; variabile folosite d2 ; in rutina de intarziere endc;----------------------------------;;Definire intrari/iesiri ;;----------------------------------;#define buton PORTA,3 ; push-buton legat la pinul RA3#define led PORTC,3 ; led legat la pinul RC3;---------------------------------- ORG 0x000 ; processor reset vector;----------------------------------;;Configurare porturi si periferice ;;----------------------------------; banksel ANSEL ; selecteaza banca in care se afla registrul ANSEL clrf ANSEL ; dezactiveaza intrarile clrf ANSELH ; analogice banksel PORTA ; selecteaza bank0 clrf PORTA ; preincarca valorile clrf PORTB ; initiale clrf PORTC ; ale iesirilor banksel TRISA ; selecteaza bank1 movlw b'00001000' ; PORTA- pin RA3 setat movwf TRISA ; configurat ca intrare clrf TRISB ; PORTB-toti pinii iesiri clrf TRISC ; PORTC-toti pinii iesiri banksel PORTA ; selecteaza bank0 Loop btfsc buton ; buton apasat? goto Loop ; nu, asteapta ca butonul sa fie apasat call delay ; da, executa intarziere debouce btfsc buton ; inca apasat? goto Loop ; nu, asteapta reapasare ; da, basculeaza iesirea la care este cuplat led-ul btfss led ; daca led-ul este aprins goto $+3 bcf led ; => stinge led goto $+2 bsf led ; altfel aprinde led btfss buton ; buton eliberat? goto $-1 ; nu, asteapta eliberarea butonului call delay ; da, executa intarziere debounce btfss buton ; buton eliberat? goto $-4 ; nu, asteapta eliberarea butonului goto Loop ; da, proceseaza urmatoarea apasare a butonului.;----------------------------------------;; Rutina de intarziere pentru eliminarea ;; efectului de vibratie a contactelor ;;----------------------------------------;delay ; intarziere de 50ms pentru ceas de 4MHz movlw 0x0E movwf d1 movlw 0x28 movwf d2Delay_0 decfsz d1, f goto $+2 decfsz d2, f goto Delay_0 goto $+1 nop return endSi schema: Multumesc pentru raspuns si program. Nu stiu ce se intampla dar microcontrolerul meu se comporta la fel ca si inainte (si cu programul trimis de tine). Se aprinde ledul indiferent de starea butonului :( O fi o problema de hard? Circuitul si butonul le-am masurat si sunt ok. Link spre comentariu
francezu Postat Mai 3, 2010 Partajează Postat Mai 3, 2010 Incerca sa muti led-ul pe alta iesire, modificand si linia de program unde este definita iesirea : #define led PORTC,3 ; led legat la pinul RC3 ; poate din greseala ai reusit sa arzi portul respectiv. Folosind programul postat de mine , dupa alimentarea montajului led-ul nu se aprinde decat la apasarea butonului. Link spre comentariu
Vizitator gabi_g26 Postat Mai 3, 2010 Partajează Postat Mai 3, 2010 Incerca sa muti led-ul pe alta iesire, modificand si linia de program unde este definita iesirea : #define led PORTC,3 ; led legat la pinul RC3 ; poate din greseala ai reusit sa arzi portul respectiv. Folosind programul postat de mine , dupa alimentarea montajului led-ul nu se aprinde decat la apasarea butonului.Mi-a mers programul trimis de tine, am deconectat microcontrolerul de la programator si l-am conectat la o sursa externa de 5 V si a mers. Initial rulam programul cu programatorul conectat la microcontroler si cred ca reseta el cumva ceva pe acolo. Multumesc pentru program si pentru sfaturi! 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