Jump to content
ELFORUM - Forumul electronistilor

Un PIC de teorie şi un PIC de practică


NumLock
 Share

Recommended Posts

Salut

 

Vreau s? înv?? s? creez programe pentru microcontrolere PIC în limbaj de asamblare ?i voi posta aici de fiecare dat? când nu în?eleg sau nu reu?esc s? fac ceva. Microcontrolerele pentru care sunt f?cute lec?iile sunt PIC12F509 ?i PIC16F84A. Programul în care scriu codul este MPLAB IDE v8.20 iar cel în care fac simul?ri ISIS 6.

 

Primele mele nel?muriri sunt în leg?tur? cu regi?trii TRISA ,PORTA , TRISB, PORTB (am pus întreb?rile în codul surs? din fi?ierul zip).

 

http://i42.tinypic.com/2m29qbp.jpg

 

Sper c? m? pute?i ajuta :) V? mul?umesc.

Link to comment
Share on other sites

Guest yo9hnh

MOVLW 0xFFMOVWF TRISA ; pinii portului A sunt declarati ca intrare....MOVLW 0x00MOVWF TRISB ; pinii portului B sunt declarati ca iesire....BTFSS PORTA,0 ; verifici starea pinului RA0 deoarece a fost declarat ca intrare....MOVLW 0xFFMOVWF PORTB ; pinii portului B sunt in 1 logic(5V)Ai inteles ?

Link to comment
Share on other sites

  • 1 month later...

SalutVreau s? înv?? s? creez programe pentru microcontrolere PIC în limbaj de asamblare ?i voi posta aici de fiecare dat? când nu în?eleg sau nu reu?esc s? fac ceva. Microcontrolerele pentru care sunt f?cute lec?iile sunt PIC12F509 ?i PIC16F84A. Programul în care scriu codul este MPLAB IDE v8.20 iar cel în care fac simul?ri ISIS 6. Primele mele nel?muriri sunt în leg?tur? cu regi?trii TRISA ,PORTA , TRISB, PORTB (am pus întreb?rile în codul surs? din fi?ierul zip). http://i42.tinypic.com/2m29qbp.jpgSper c? m? pute?i ajuta :) V? mul?umesc.

Poti folosi link-ul de mai jos.E un tutorial foarte foarte util pt PIC ASM.Succeshttp://www.winpicprog.co.uk/pic_tutorial.htm
Link to comment
Share on other sites

Este posibil s? creez un semnal sinusoidal folosind o astfel de scar? ?i un PIC ?
Da

 

Dac? da, cum ?
Foarte simplu. Trimiti la intervale egale de timp urmatoarea secventa de numere:128, 217, 255, 217, 128, 38, 1, 38 la portul la care e legata reteaua R-2R, apoi repeti. Ca sa iasa un sinus frumos, poti sa faci si o filtrare trece jos. Fara filtrare iese in trepte.

 

Cum a? putea s? stabilesc din soft frecven?a semnalului sinusoidal ?
Prin modificarea intervalului dintre scrieri.

 

Varianta de mai sus este f simpla, dar merge. Genereaza un sinus din 8 puncte. Dupa ce o sa faci montajul si o sa mearga, o sa-ti arat com se face cu o formula recursiva. Metoda de mai sus e cu tabel si e cam ciobaneasca.

 

Cirip

Link to comment
Share on other sites

Varianta de mai sus este f simpla, dar merge. Genereaza un sinus din 8 puncte. Dupa ce o sa faci montajul si o sa mearga, o sa-ti arat com se face cu o formula recursiva. Metoda de mai sus e cu tabel si e cam ciobaneasca.

Cirip

Nu am realizat montajul practic ci doar virtual. Am folosit cele 8 valori dar nu eram prea mul?umit a?a c? am c?utat pe net ni?te formule de ob?inere a acelor valori. Dup? aceea am scris un mic program în C++ care îmi genereaz? un fi?ier text cu valorile pentru tabel (ca s? nu stau eu s? scriu de x ori 'retlw valoarea') ?i frecven?a cu care trebuie s? schimb datele din portul la care este legat? re?eaua R-2R.

SineWave_Generator.asm

*Frecven?a semnalului sinusoidal ob?inut: 10Hz

*Num?rul de puncte: 100

Simularea (Frecven?a ceasului - 4MHz)

 

Îmi spui acum cum fac asta recursiv (cu detalii) :)? ...c? programul meu nu genereaz? ni?te valori prea bune (mai scap? ?i câte un .256) ?i nu merge dac? dau valori prea mari pentru frecven?? sau nr. de puncte.

Link to comment
Share on other sites

Am folosit cele 8 valori dar nu eram prea mul?umit [...]*Frecven?a semnalului sinusoidal ob?inut: 10Hz*Num?rul de puncte: 100

Hehe... Cand nu ai constrangeri de timp real, sigur ca poti sa pui si 3 catralioane de puncte. Asta se cheama supraesantionare, dar cand incepi sa ai limitari date de circuitul real, va trebui sa gasesti un compromis. Si la frecvente mari, daca o sa poti face sinusul din 8 puncte o sa fii fericit. Asta inseamna deja supraesantionare 2X. Mai discutam. Daca puneai un filtru trece jos dupa varianta cu 8 puncte, ar fi iesit la fixeanu.

Îmi spui acum cum fac asta recursiv (cu detalii) :)?

Ar fi fost politicos sa bagi si un "te rog" , dar hai sa zicem ...Generarea recursiva a sinusului se face prin calculul repetat al urmatoarei relatii:y[k]=A*y[k-1]+B*y[k-2]in care y sunt esantioanele, A=2*cos(omega*T), B=-1, T=1/fs este perioada de esantionare , iar omega=2*pi*f, f=frecventa pe care vrei sa o generezi.--Incepi prin a aloca 3 variabile ptr cele 3 esantioane ale lui y. y[k] este esantionul curent, y[k-1] este esantionul anterior iar y[k-2] este valoarea cu 2 esantioane in urma. --Initializezi y[k-2]=0, y[k-1]=sin(omega*T] si calculezi y[k]. Cand ii vine sorocul, il dai afara pe port.--Dupa ce l-ai dat afara pe y[k], scrii y[k-1] peste y[k-2] (y[k-2] se pierde, dar nu mai ai nevoie de el.), y[k] peste y[k-1] si il recalculezi pe y[k], dar nu il scoti afara decat atunci cand ii vine randul, adica la exact T dupa ce ai scos afara esantionul anterior.--repeti procedeul pana la adanci batranetiS-ar putea sa constati ca nu ai timp sa faci toate calculele astea si sa generezi 100 de esantioane la frecvente mai mari :)Locatiile de memorie in care pastrezi esantioanele y formeaza un fel de memorie jgheab sau buffer alunecator sau rotativ. Valoarea cea mai veche se pierde, iar locatia y[k] este scrisa cu noul esantion. Calculul se poate face prin deplasarea valorilor dintr-o locatie in alta, dar mult mai eficient se face in procesoarele DSP cu ajutorul aritmeticii modulo aplicata pointerilor. In loc sa plimbi valorile, ai un pointer care se incrementeaza si care iti schimba locatia esantionului curent din bufferul rotativ. Toate calculele se fac relativ la locatia indicata de pointerul ala smecher. Cu picul e mai greu de facut asa ceva, dar nu e imposibil.Iti sugerez sa incerci algoritmul in excel, ca sa te familiarizezi intai cu mecanismul.Spor la treaba!Cirip
Link to comment
Share on other sites

Cel mai bine e s? faci sinusul cu dou? look up table. Una în care pui valorile e?antioanelor ?i una în care pui timpii pentru anumite frecven?e. E mult mai rapid a?a, dar consumi mai mult flash.

Salut ratza,Desi ai dreptate in legatura cu rapiditatea, apar alte probleme. Schimband timpii, schimbi frecventa de esantionare, ceea ce face dificila sarcina filtrului trece jos de la iesire (asa numitul filtru de reconstructie). Un compromis intre varianta cu tabel si cea recursiva este interpolarea, dar si aia are alte probleme. Nimic nu e gratis.Cirip
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines