Sari la conținut
ELFORUM - Forumul electronistilor

Cel mai simplu cod pt PIC16F84A


XName

Postări Recomandate

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 intrerupere
Corect. 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 undeva
Vorba 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 :d, 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
  • Răspunsuri 51
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • XName

    23

  • CristianC

    10

  • cirip

    8

  • Abram Burel

    6

Top autori în acest subiect

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 :d 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 :d, 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

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

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
  • 2 săptămâni mai târziu...

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

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

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

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

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

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

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 :d

Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări