Vizitator adrian87 Postat Decembrie 20, 2008 Partajează Postat Decembrie 20, 2008 Salutare!Sunt nou in lucrul cu microcontrolere. Ceea ce vreau sa realizez acum este un numarator care sa afiseze numere de la 0 la 99, pe un afisor cu 2 cifre. Mai jos am atasat codul pe care l-am scris. Am atasat si un screanshot cu simularea din proteus. In MPLAB am facut un debug folosind MPLAB SIM. Programul ruleaza dupa cum ma asteptam, cel putin cu MPLAB SIM. In proteus ma confrunt cu realitatea. Imi afiseaza cifre identice de fiecare data Ceea ce mi se pare ciudat este ca nu reuseste sa scrie pe portul A. Aveti idee cu ce gresesc? Sau ce ar trebui sa mai inteleg inainte de a finaliza cu succes acest mic proiect? INCLUDE "P16F628A.INC" CBLOCK 0x20 CIFRA_UNIT CIFRA_ZECI ENDC ORG 0x00 GOTO START ORG 0x04 GOTO TMR1_ROUTINE ;initializarea porturilorINIT_PORTS ;bank0 select CLRF STATUS CLRF PORTA CLRF PORTB ;bank1 select BSF STATUS, RP0 MOVLW 0x00 MOVWF TRISA MOVWF TRISB ;bank0 select CLRF STATUS RETURN ;initializare registrii asociati modulului timer1 INIT_TMR1 ;bank0 select BCF STATUS, RP1 BCF STATUS, RP0 ;---------------- BSF INTCON, GIE BSF INTCON, PEIE CLRF TMR1L CLRF TMR1H BCF PIR1, TMR1IF MOVLW 0x31 MOVWF T1CON ;bank1 select BCF STATUS, RP1 BSF STATUS, RP0 ;--------------- BSF PIE1, TMR1IE RETURN ;rutina de executat, odata ce se petrece intrerupereaTMR1_ROUTINE BCF PIR1, TMR1IF ;setare cifra unitati CLRW XORWF CIFRA_UNIT, 0 CALL TABELA MOVWF PORTB ;CLRF PORTA MOVLW 0x40 MOVWF PORTA ;-------------------- ;setare cifra zecilor CLRW XORWF CIFRA_ZECI, 0 CALL TABELA MOVWF PORTB ;CLRF PORTA MOVLW 0x80 MOVWF PORTA ;-------------------- INCF CIFRA_UNIT, F ;-------------------- MOVLW 0x0A XORWF CIFRA_UNIT, 0 BTFSS STATUS, Z RETFIE ;-------------------- MOVLW 0x00 MOVWF CIFRA_UNIT MOVLW 0x0A XORWF CIFRA_ZECI, 0 BTFSC STATUS, Z CLRF CIFRA_ZECI ;-------------------- INCF CIFRA_ZECI, F ;-------------------- CLRW RETFIE ;lookup table TABELA ADDWF PCL, F RETLW 0x3F RETLW 0x06 RETLW 0x5B RETLW 0x4F RETLW 0x66 RETLW 0x6D RETLW 0x7D RETLW 0x07 RETLW 0xFF RETLW 0x6F ;inceput programSTART CALL INIT_PORTS CALL INIT_TMR1 ;bank0 select BCF STATUS, RP1 BCF STATUS, RP0 MOVLW 0x00 MOVWF CIFRA_UNIT MOVWF CIFRA_ZECILOOP NOP GOTO LOOP END Link spre comentariu
sofian Postat Decembrie 20, 2008 Partajează Postat Decembrie 20, 2008 ptr portul A trebuie setat ca intrari/iesiri sa fie digitale parca codul asta este movlw 0x07hmovwf CMCON vad din poza ta "stack overflow" adica tot face apeluri de subrutine(call) si nu se mai intoarce dupa ce setezi sa afiseze cifra pe digit 1 trebuie sa astepti putin (1mS) si dupa aia sa afisezi pe digit 2 poti face asa : 1.setezi intreruperile la 1mS 2.cind apare intreruperea afisezi digit 1 ,la urmatoare intrerupere afisezi digit 2, etc. Link spre comentariu
Vizitator adrian87 Postat Decembrie 20, 2008 Partajează Postat Decembrie 20, 2008 Multumesc pentru sfaturi.Pana la urma am reusit sa obtin ceva functional, dar nu perfect. N-am reusit sa fac temporizarea cum trebuie, adica se observa cum se sting si se-aprind ledurile de la afisor, foarte repede. Felul in care mi-am realizat proiectul ma obliga sa folosesc acelasi oscilator si pentru pic si pentru tmr1, portul b fiind complet ocupat pentru afisor. Poate fi asta o problema? Acum am atasat un oscilator cu cuartz de 4MHz la pic. Ce inteleg eu pana in prezent :cry: este ca pic-ul executa 1.000.000 instructiuni pe secunda. Modulul tmr1 se incrementeaza independent de ce se-ntampla in microcontroler. Adica in timp ce se executa o instructiune in pic, in paralel si independent este incrementat si tmr1. Gresesc cumva? Link spre comentariu
puiu Postat Decembrie 21, 2008 Partajează Postat Decembrie 21, 2008 1.Da si nu. Se incremeteaza cu valoarea data de prescaler, daca este TMR1ON setat. Daca nu este setat nu se incrementeaza. 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