cirip Postat Aprilie 24, 2007 Partajează Postat Aprilie 24, 2007 Atentie, nu citi RB-ul in intr, ca-ti sterge conditia de port change. Nici eu nu prea am inteles la ce te referi, dar eu zic ca la intrarea in intrerupere trebuie sa incarc portul b intro variabila, deci trebuie neaparat sa fac o citire de port b OK. In manualul lui 87x, la sectiunea PORTB scrie: The user, in the Interrupt Service Routine, can clear the interrupt in the following manner: a) Any read or write of PORTB. This will end the mismatch condition. b) Clear flag bit RBIF. A mismatch condition will continue to set flag bit RBIF. Reading PORTB will end the mismatch condition and allow flag bit RBIF to be cleared. Asta inseamna ca daca primesti o intrerupere pe un bit, sari la ea si taman atuci mai primesti un tzaf pe alt bit, prin citirea portului ca raspuns la primirea primei intreuperi, stergi si mismaciul datorat celei de-a doua, in felul asta mascand-o pe a doua. Deci ratezi o intrerupere ptr ca o stergi prin citirea portului si nu mai stii ca a existat vreodata. Totusi, ma indoiesc ca aplicatia ta cere ceva asa de complicat. Poate exista o excludere "naturala" intre sursele respective de intr. Detaliaza aplicatia, daca poti. Am ajuns la concluzia ca totusi nu se pot gestiona prea bine intreruperile pe port, daca eu gestionez intreruperea de la primul pin, intre timp apare intreruperea pe pinul 2 dar si dispare ft repede, inainte ca eu sa fi terminat cu prima intrerupereCorect. Exact scenariul de mai sus. Trebuie sa scrii soft dibaci. O solutie ar fi fost daca picul ar fi avut flag pt fiecare pin al portului, sau ar mai fi o solutie ca la fiecare cateva cicluri sa testezi portul si daca este si pe al pin sa memorezi undevaVorba anecdotei: "Da, da' n-are". Picul e un fel de strutzocamila in lumea controlerelor, dar ne-am obisnuit cu el asa. Se poate sa existe intrerupere in intrerupere, cred ca nu , ca GIE e dezactiva, dar daca eu il activez imediat la prima intrerupere?!Bineinteles ca se poate, dar gestiunea stivei si a programului in general se complica. Rareori ai neaparata nevoie de intrerupere in intrerupere la zgaibe din astea gen PIC. In situatii de genul asta, eu setez un flag in intr ca sa anunt ca a aparut "ceva", apoi ies si procesez in nivelul de baza. Bucla nivelului de baza se uita daca a aparut vreun flag si il achita cand e cazul. Si se poate ca sa imi maresc stiva de mai mult de 8 biti Nu la pic16. Aia e batuta in cuie. Nu te intinzi mai mult decat ti-e plapuma :smt003 sau faci stiva soft. Cirip Link spre comentariu
Abram Burel Postat Aprilie 24, 2007 Partajează Postat Aprilie 24, 2007 Eu zic ca cel mai bine ar fi putintica citire. Iaca de aici: http://ww1.microchip.com/downloads/en/A ... 00566b.pdf Link spre comentariu
XName Postat Aprilie 25, 2007 Autor Partajează Postat Aprilie 25, 2007 Stiu ca acest tip de microcontroler nu este potrivit pt apliicatiile pe care vreau sa le dezvolt, insa pt studiu este bun, mai ales ca luan in considerare ca acum o luna nu stiam mai nimica despre microcontrolerePrintre proiectele care imi stau in minte se numara un sistem de comunicatie bidirectional numit DCC folosit la comanda digitala in modelismul feroviar. Pt ideea de smart home care este destul de populara vreau sa-mi construiesc un utilaj destul de mica care sa faca singur curatenie in casa. Aici am pus cate idee pe foaie, metode de localizare, de recunoastere, de memorare a hartii, reincarcare, comunicatie si raspuns la interogare Poate ca veti rade de ele dar mai am idee din astea , un submarin miniatura cu camera video si comanda (aici nu am gasit inca o metoda de transimisie a semnalului si comenzilor prin apa, radio nu merge, din cate stiu eu), o tabla de sah care comunica cu un soft de pe PC si care muta piesele singura (ma gandeam la o suspensie magnetica), un ceas de bord pt toagla , etc, etc :PIdeea este ca trebuie sa cunosc ft bine limitele microcontrorelor ca apoi sa decid ce tip e necesar ce se poate si ce nu implementa Link spre comentariu
CristianC Postat Aprilie 25, 2007 Partajează Postat Aprilie 25, 2007 Daca vrei sa te orientezi spre aplicatii mai complexe ar trebui sa te gandesti de pe acum la o alternativa pentru PIC16. Un exemplu ar fi PIC24 care nu e cu mult mai scump decat PIC16 si are: - registrii de 16 biti - stiva software - mai multe intreruperi externe separate si multe multe alteleMai mult decat atat setul de instructiuni este optimizat pt limbaje de nivel inalt si chiar se gaseste un compilator de C gratuit (MPLAB C30 student edition)Inca ceva. PIC16F84A e depasit. La vremea lui a fost tare dar acum e unul dintre cele mai prapadite PIC-uri. Se mai fabrica doar ca piesa de schimb. Daca vrei sa continui cu PIC16 alege unul din generatia noua. De exemplu PIC16F88 sau PIC16F690 care costa jumate si face mult mai multe (ex: oscilator intern, 3 timer-e, ADC, PWM, mai multa memorie, .... ) Link spre comentariu
Abram Burel Postat Aprilie 25, 2007 Partajează Postat Aprilie 25, 2007 E greu de spus daca are legatira cu topicul, dar eu zic ca cel mai bun PIC este cel pe care ti-l permiti si care face ce trebuie. Daca in mod suplimentar te-ai scremut putin sa pui toate intrarile si iesirile pe un anumit numar de pini si daca ai stat nopti intregi sa sapi la cod pentru a "intra" intr-un anumit spatiu de memorie, inseamna ca asta e PIC-ul tau.Desigur, trebuie sa fii atent: mai sunt si altele :DUn 16F84 poate fi de multe ori mai "prapadit" decat un 12F275 (!), dar cateodata poate fi exact ce trebuie cuiva care de-abia incepe si care isi trage... seva din proiectele publicate pe net! Link spre comentariu
XName Postat Mai 7, 2007 Autor Partajează Postat Mai 7, 2007 Cat de bine se poate simula WatchDog-ul in MPLAB?La mine nu da restart la aplicatie , doar avertizare si continua mai departe. Link spre comentariu
cirip Postat Mai 8, 2007 Partajează Postat Mai 8, 2007 Cat de bine se poate simula WatchDog-ul in MPLAB?Perfect si ceva in plus.La mine nu da restart la aplicatie , doar avertizare si continua mai departe.Mergi la Debug->Options->Break Options si ii spui ce vrei sa faca atunci cand expira WDTul in simulare.Parerea mea e ca e preferabil sa dea avertizare ptr ca vezi unde era programul in mom ala.Cirip Link spre comentariu
XName Postat Mai 10, 2007 Autor Partajează Postat Mai 10, 2007 Si acuma ma lovii de o ciudatenie probabil prea simpla si nu-mi pot da eu seama :DPana recent programtorul bobprog a functionat perfect. Astazi am vrut sa mai fac si hard ceva teste nu numai in simulator si mirare. Am incercat ceva ft simplu, sa dau 1 pe toti pinii portului A in prealabil acestia au fost setati in trisa ca iesiri. Dar sper surprindere pinul RA4 nu vrea , numai ceilalti 4. Am incercat cu un al doilea microcontroler la fel. Nu pot sa imi explic, sa fie din cauza ca am schimbat cablul la portul serial, are vreo 40cm, dar la verificare nu da erori in icprogSper ca nu sau dus ambele integrate :((Cum pot testa daca iesire e moarta sau nu? Link spre comentariu
CristianC Postat Mai 10, 2007 Partajează Postat Mai 10, 2007 La PIC16F84 pinul RA4 e iesire open-colector. Ca sa-l folosesti ca iesire trebuie sa pui o rezistenta de pull-up Link spre comentariu
XName Postat Mai 10, 2007 Autor Partajează Postat Mai 10, 2007 Dar nu este suficient ca din pin merge prin 330 omi si printrun led spre masa? daca este iesire tot are nevoie de pull-up?Am modificat partea de hard si am legat o rezistenta spre plus de 4K7, intradevar ledul lumineaza ft slab. La ce valoare ar trebui sa fie rezistenta? Link spre comentariu
CristianC Postat Mai 10, 2007 Partajează Postat Mai 10, 2007 http://content.honeywell.com/sensing/pr ... apter4.pdf Link spre comentariu
XName Postat Mai 10, 2007 Autor Partajează Postat Mai 10, 2007 Revin iarasi cu o problema Am facut o lumina dinamica care foloseste cei 5 pini ai portului A si pini 0,1, 2, 3 de la portul B. Pini 4 si 5 sunt legati la 2 taste. Aceste taste ar trebui sa creasca si sa scada, sa creasca viteza luminii dinamice. Pe simulator totul pare sa mearga cum trebuie, in realitate nu este afectata deloc viteza de deplasare aceasta ramanand constant Am mai introdus o limitare a vitezei, intre 255 si 200 Codul ar trebui sa mearga lam tot studiat vreo 2 zile si nu vad erori de logica?!?!? program LUMINA DINAMICA CU SETARE VITEZA;se pun 2 butoane la RB4 si RB5;se folosesc pt iesiri spre leduri cei 4 pini RB0-RB3;si se foloseste si cele 5 iesiri ale portului A RA0-RA4;la cate o apasare pe butoane creste sau scade viteza lumini dinamice#include p16F84a.inc LIST p=PIC16F84A ;modelul de microcontroler __CONFIG _XT_OSC & _WDT_OFF cblock 0x1C vitezaport_bdelay1 ;declar variabile delay2delay3delay4delay5delay7delay8 endc BANK0 macro bcf STATUS,RP0 endm BANK1 macro bsf STATUS,RP0 endmdelay_10m macro movlw b'00000110' movwf delay7 clrf delay8 decfsz delay8,f goto $-1 decfsz delay7,f goto $-3 endm ;******************************************************* ORG 0x0000 ;Vectorul RESET goto Main ;------------------------------------------------------- ORG 0x0004 ;Vectorul INTRERUPERE BANK0 movfw PORTB movwf port_b btfss port_b,5 ;sari pt 0 call ISR_RB5 btfss port_b,4 ;sari pt 0 call ISR_RB4 bcf INTCON, RBIF retfieISR_RB5 ;incrementeaza daca viteza difera de 256 movfw viteza xorlw b'11111111' btfss STATUS,Z incf viteza,1 delay_10m btfss PORTB,5 goto $-1 returnISR_RB4 ;decrementeaza daca viteza difera de 200 xorlw b'11001000' btfss STATUS,Z decf viteza,1 delay_10m btfss PORTB,4 goto $-1 return ;-------------------------------------------------------;************** Programul principal ******************** Main BANK0 clrf PORTB BANK1 movlw B'11110000' movwf TRISB BANK0 clrf PORTA BANK1 movlw B'00000000' movwf TRISA BANK0 clrf INTCON movlw B'10001000' movwf INTCON movlw B'11100000' movwf vitezaLoop clrf PORTA movlw b'00000001' movwf PORTB call Delay movlw b'00000010' movwf PORTB call Delay movlw b'00000100' movwf PORTB call Delay movlw b'00001000' movwf PORTB call Delay clrf PORTB movlw b'00000001' movwf PORTA call Delay movlw b'00000010' movwf PORTA call Delay movlw b'00000100' movwf PORTA call Delay movlw b'00001000' movwf PORTA call Delay movlw b'00010000' movwf PORTA call Delay goto Loop ;****************** Functia Delay ********************* Delay movlw b'00000110' movwf delay1 clrf delay2 movfw viteza movwf delay3 decfsz delay3,f goto $-1 decfsz delay2,f goto $-3 decfsz delay1,f goto $-1 nop return ;*************************************************** end Link spre comentariu
Abram Burel Postat Mai 10, 2007 Partajează Postat Mai 10, 2007 Nu stiu daca neaparat asta e problema, dar modul in care tratezi intreruperea de la butoane e destul de straniu.Din cauza ca nu ai debouncing, chiar daca intreruperea pe care o tratezi e, de exemplu, tasta de pe RB5, adica generata de un "0", manevrele pe care le faci la intrarea in intrerupere pot citi bine-mersi un "1". Pe simulator n-ai ce sa vezi, e o tranzitie "curata".Fa un debouncing "ca la carte" si trebuie sa mearga.Logica e buna, dar intrarea in ea e defectuoasa. Stii vorba: garbage in, garbage out Link spre comentariu
XName Postat Mai 10, 2007 Autor Partajează Postat Mai 10, 2007 Da bine zici, acuma imi dau seama unde sar fi putut sa gresesc, am pus o intarziere de 10m sau mai mult, insa e pusa dupa cateva operatii.O sa incerc sa schimb logica sa vad daca se va modifica ceva sau nu :P Link spre comentariu
XName Postat Mai 11, 2007 Autor Partajează Postat Mai 11, 2007 Am gasit greseala! Se pare ca era de natura logica )rutina delay era gresit facuta. La intrarea in aceasta rutina alocam viteza variabilei delay 1, dar ce puteam eu controla cu ea era un interval de 256 microseunde maxim, imposibil de vazut la oki 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