Vizitator ROCrysty Postat Noiembrie 20, 2012 Partajează Postat Noiembrie 20, 2012 Buna ziua. Am programat un pic16F877A cu urmatorul cod: LIST p=16F877A ;tell assembler what chip we are using include "P16F877A.inc" ;include the defaults for the chip __config 0x3D18 ;sets the configuration settings (oscillator type etc.) cblock 0x20 ;start of general purpose registers count1 ;used in delay routine counta ;used in delay routine countb ;used in delay routine endc org 0x0000 ;org sets the origin, 0x0000 for the 16F628, ;this is where the program starts running movlw 0x07 movwf CMCON ;turn comparators off (make it like a 16F84) bsf STATUS, RP0 ;select bank 1 movlw b'00000000' ;set PortB all outputs movwf TRISB movwf TRISA ;set PortA all outputs bcf STATUS, RP0 ;select bank 0Loop movlw 0xff movwf PORTA ;set all bits on movwf PORTB nop ;the nop's make up the time taken by the goto nop ;giving a square wave output call Delay ;this waits for a while! movlw 0x00 movwf PORTA movwf PORTB ;set all bits off call Delay goto Loop ;go back and do it againDelay movlw d'250' ;delay 250 ms (4 MHz clock) movwf count1d1 movlw 0xC7 movwf counta movlw 0x01 movwf countbDelay_0 decfsz counta, f goto $+2 decfsz countb, f goto Delay_0 decfsz count1 ,f goto d1 retlw 0x00 endAm folosit MPLAB IDE si mi-a rezultat codul hexazecimal: :020000040000FA:1000000007309C0083160030860085008312FF3085:100010008500860000000000122000308500860068:1000200012200728FA30A000C730A1000130A2003A:0E003000A10B1B28A20B1828A00B14280034CB:02400E00183D5B:00000001FFL-am introdus in microcontroller cu succes folosind ICProg (JDM programmer cu o placa AD-pic01) Problema e ca nu "porneste". Nu i-mi aprinde led-ul deloc. Imediat pun si schema pe care testez PIC-ul. Edit: Pe orice port pun LED-ul nu se aprinde (mai putin 11, 32 si 14) Mai trebuie sa pun ceva in schema sau e programul gresit? Link spre comentariu
vcdec Postat Noiembrie 20, 2012 Partajează Postat Noiembrie 20, 2012 Cu pinul 1 (mclr) ce ai facut? Pune un 4k7 spre +5V. Link spre comentariu
Vizitator ROCrysty Postat Noiembrie 20, 2012 Partajează Postat Noiembrie 20, 2012 pun cu intrerupator sau direct? Link spre comentariu
vcdec Postat Noiembrie 20, 2012 Partajează Postat Noiembrie 20, 2012 Fara intrerupator... daca pinul 1 e in gol, e probabil sa-ti stea in reset procesorul. Oricum codul tau pare pt 628a... Link spre comentariu
Vizitator ROCrysty Postat Noiembrie 20, 2012 Partajează Postat Noiembrie 20, 2012 l-am "adaptat" pentru PIC-ul meu. Am vazut ca nu da eroare la simulare si nici la scriere... am zis ca e ok. Ideea e sa vad eu ca i-mi aprinde un led, ceva, sa vad ca misca. Dupa, am sa invat eu toate cuvintele cheie pentru el sa ii scriu eu codul. Acuma lipesc rezistenta. Link spre comentariu
Vizitator ROCrysty Postat Noiembrie 20, 2012 Partajează Postat Noiembrie 20, 2012 Nu mai pot modifica post-ul anterior. Am lipit rezistenta, am modificat codul in : ; Title "LED flasher."; list P = 16F877A; include "P16f877A.inc" ; use definition file for 16F877;; --------------------; USER RAM DEFINITIONS; --------------------; CBLOCK 0x20 ; RAM starts at address 20hNaHiNaLoNbHiNbLo ENDC; org 0x0000 ; start address = 0000h; INITIALISE PORTS; binary used to see individual pin level movlw b'00000000' ; all port pins = low movwf PORTA movlw b'00000000' movwf PORTB movlw b'00000000' movwf PORTC movlw b'00000000' movwf PORTD movlw b'00000000' movwf PORTE bsf STATUS,RP0 ; set RAM Page 1 for TRIS registers; INITIALISE PORTS; binary used to see individual pin IO status movlw b'00000000' ; all IO pins = outputs movwf TRISA movlw b'00000000' movwf TRISB movlw b'00000000' movwf TRISC movlw b'00000000' movwf TRISD movlw b'00000000' movwf TRISE movlw b'00000110' ; all analog pins = digital movwf ADCON1 bcf STATUS,RP0 ; back to RAM page 0; LED FLASH LOOPLoop bsf PORTC,4 bsf PORTA,1 ; RC4 = high = led on bsf PORTA,2 bsf PORTA,3 bsf PORTA,4 bsf PORTA,5 call Delay bcf PORTC,4 ; RC4 = low = led off call Delay goto Loop; 1/2 SEC DELAY SUBROUTINE WITH 4MHz CLOCKDelay movlw 01h movwf NbHi movlw 03h movwf NbLo movlw 8Ah movwf NaHi movlw 5Bh movwf NaLoDeLoop0 decfsz NaLo,F goto DeLoop0 decfsz NaHi,F goto DeLoop0 decfsz NbLo,F goto DeLoop0 decfsz NbHi,F goto DeLoop0 ; return endL-am scris cu succes in microcontroller si nu face nimic. Trebuia sa i-mi deschida port-urile A1, A2, A3, A4 si C4Update la diagrama: Link spre comentariu
10vid Postat Noiembrie 20, 2012 Partajează Postat Noiembrie 20, 2012 In schema LED-ul apare legat invers.Vad ca ai renuntat la linia config care oricum era gresita, pentru ca era selectat un oscilator low power (LP), care nu e capabil sa antreneze in oscilatie un cristal cu frecventa mare ca de ex. 4MHz. Condensatori de 15-22 pF ai pus de la pinii quartzului la GND?Pune si linia asta, cu valoarea modificata pentru oscilator XT.__config 0x3D01 ;sets the configuration settings (oscillator type etc.) Link spre comentariu
Vizitator ROCrysty Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 Am rezolvat si cu linia de configurare si cu C-urile. LED-ul e desenat invers dar e ok in circuit. Desen facut in Paint S-au deschis porturile. Problema era din program si la oscilator (ca nu aveam puse prostiile alea de condensatoare) Multumesc pentru ajutor. Acuma am sa imi bat capu maine sa vad cum le fac sa clipeasca. Link spre comentariu
Vizitator ROCrysty Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 Am probleme cu oscilatorul. Nu sunt sigur ca e bun, nu stiu sigur daca sunt in regula condensatoarele... ma gandeam sa il schimb cu unul de 16MHz. Ce condensatori am nevoie pentru el si care e linia de configurare pentru acesta? Sau mai simplu nu pun nici-unul dar nu stiu cum sa il pornesc pe cel interior. Ce linie de comanda trebuie? Am citit datasheet-ul dar m-am pierdut in el.... Link spre comentariu
Liviu M Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 In fisierul "C:\Program Files\Microchip\MPASM Suite\P16F877A gasesti definitiile dieverselor "cuvinte cheie" folosite in program.La sfarsitul fisierului gasesti sectiunea CONFIG, cu diversele variante pentru bitii de configurare.Configurarea PIC-ului se face combinand variantele alea in directiva __config in programul tau.De exemplu, daca tu vrei oscilator HS (mai multe la pagina 145 in data-sheet), fara watchdog si fara protejat de coduri, n-ai decat sa inlocuiesti __config in programul tau cu.__config _FOSC_HS & _WDT_OFF & _CP_OFF & _CPD_OFFDaca-ti trebuie altceva, adaptezi cerintelor tale. La pagina 144 gasesti descrierea bitilor de configurare. Link spre comentariu
Vizitator ROCrysty Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 Am gasit o varianta mai simpla si exact ce am nevoie : MPLAB -> configure -> Configuration Bits. Acolo am internal sau external oscillator, tot ce i-mi trebuie. Link spre comentariu
Liviu M Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 E cu dus si intors.Setarile din mplab se pot pierde (eu, de exemplu, imi pastrez sursele pe server si generez proiectele de fiecare data in alt loc), asa ca peste o luna o sa uiti sa le setezi sau cum le-ai setat si n-o sa mai mearga. Bineinteles ca la proiecte ceva mai complexe, la aprins un LED nu-i problema.Daca le scrii in cod (cu __config), acolo raman. Link spre comentariu
Vizitator ROCrysty Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 Am observat ca nu le scria in hexa si am ramas la __config. Problema e ca nu reusesc sa il fac sa clipeasca... Circuitul este ok, programul este ok, (merge perfect in simulator). nu pot sa ii dau de cap. In program sunt mai multe functii care le-am scris sa fie acolo... vroiam sa fac ceva frumos de la inceput da nu reusesc sa fac sa se stinga ledurile din Port E COD: Hidden text: ONAvailable only to registered users. Hidden text: OFF ; Title "LED flasher."; list P = 16F877A; include "P16f877A.inc" ; use definition file for 16F877; --------------------; USER RAM DEFINITIONS; -------------------- __config _FOSC_HS & _WDT_OFF & _CP_OFF & _CPD_OFF; Delay = 3 seconds; Clock frequency = 4 MHz; Actual delay = 3 seconds = 3000000 cycles; Error = 0 % cblock d1 d2 d3 endc ; org 0x0000 ; start address = 0000h; INITIALISE PORTS; binary used to see individual pin level movlw b'00000000' ; all port pins = low movwf PORTA movlw b'00000000' movwf PORTB movlw b'00000000' movwf PORTC movlw b'00000000' movwf PORTD movlw b'00000000' movwf PORTE bsf STATUS,RP0 ; set RAM Page 1 for TRIS registers; INITIALISE PORTS; binary used to see individual pin IO status movlw b'00000000' ; all IO pins = outputs movwf TRISA movlw b'00000000' movwf TRISB movlw b'00000000' movwf TRISC movlw b'00000000' movwf TRISD movlw b'00000000' movwf TRISE movlw b'00000110' ; all analog pins = digital movwf ADCON1 bcf STATUS,RP0 ; back to RAM page 0; LED FLASH LOOPLoop call ledporteon call delay1s call delay1s call delay1s call delay1s call ledporteoff call delay1s call delay1s goto LoopDelay movlw 0xE3 movwf d1 movlw 0x7F movwf d2 movlw 0x37 movwf d3 returnDelay_0 decfsz d1, f goto $+2 decfsz d2, f goto $+2 decfsz d3, f goto Delay_0 ;6 cycles goto $+1 goto $+1 goto $+1ledb7on bsf PORTB,7 returnledb7off bcf PORTB,7 returnledporteon bsf PORTE, 1 bsf PORTE, 2 bsf PORTE, 0 returnledporteoff bcf PORTE, 0 bcf PORTE, 2 bcf PORTE, 1 returndelay1s call Delay call Delay call Delay call Delay call Delay call Delay call Delay call Delay call Delay call Delay call Delay call Delay call Delay return end Programul de delay este cam aiurea dar pentru cunostintele mele de amator, functioneaza. Hidden text: ONAvailable only to registered users. Hidden text: OFF Link spre comentariu
10vid Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 Din datasheet nu apare ca ar avea oscilator intern. Dar oricum, grija cu acel oscilator HS, sa nu busesti cuartul cu el.Daca s-a aprins LED-ul cu XT la 4MHz, inseamna ca oscilatorul XT functioneaza.La o prima vedere, delay-ul ala are vreo 30s. Esti sigur ca ai asteptat suficient de mult sa se stinga LED-ul? :nas:Mai taie din el. Link spre comentariu
Vizitator ROCrysty Postat Noiembrie 21, 2012 Partajează Postat Noiembrie 21, 2012 dap. am pus asa mare pentru ca la oscilatoru de 4 mhz cu programu de atunci i-mi deschidea si inchidea led-ul atat de repede incat nu se vedea. I-l vedeam doar mult mai slab (ca si cum l-as fi alimentat cu 2V in loc de 3,5) Am spus sa fie si de 30 secunde numa sa il vad ca se stinge... Am stat 5 minute cu el si nimic... care sa fie problema? la configurare? la circuit? eu nu pot sa i-mi dau seama...EDIT: Intr-adevar nu are oscilator intern... de aceea am apelat la 16 MHz. l-am dezlipit de pe o placa de la un scanner defect. Daca se are nu e problema... mai am vreo 20 de oscilatoare prin casa. 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