Sari la conținut
ELFORUM - Forumul electronistilor

PIC16F268A + MPLAB + HiTECH pentru MATRICE LEDURI


Vizitator mosu90

Postări Recomandate

Vizitator mosu90

Salutare!

In primul rand vreau sa va spun ca sunt incepator cu programarea de microcontrollere.

Ce vreau eu sa fac este sa afisez pe o matrice de leduri cifrele de la 1 la 9.

 

Am avut o tentativa cu cod ASM, dar m-am impotmolit la delayuri/interrupt.(Faceam delay intre fiecare linie/coloana sa afisez numarul, dar nu stiam cum sa opresc asta si sa trec la cifra urmatoare, cred ca trebuia sa folosesc ceva de genu interrupts probabil dar mi s-au parut dificile si am zis sa trec pe C)

 

Am trecut pe C totul frumos pana cand vad ca MPLAB nu are compilator pentru microcontrollerul meu, eu citisem o carte cu un PIC24 unde foloseau MPLAB C30 ca si compilator, codul era foarte OK, mi se parea foarte asemanator de programarea pe care o stiam, insa m-am lovit de faptul ca acest compilator nu merge cu microcontrollerul meu.

 

Am citit ceva forumuri si am vazut ca as putea folosii HiTech sa-mi compileze codul.

Am scris un cod simplu sa-mi setez cateva din iesirile PORTA si PORTB pe high dar m-a bagat in ceata de tot!

Codul :

#include <pic16f628a.h>main(){	TRISA=0; //Am inteles ca trebuie sa scriu asta pentru a seta iesirile din A pe output	PORTA=0b00010111; // cu 1 ar fi porturile pe care le vreau high		TRISB=0;	//AD1PCFG=0xffff; asta scria in carte ca trebuie pusa neaparat sa pot lucra cu PORTB cum trebuie.	PORTB=0b11111111;}

Dupa ce am dat Build si totul scria ca e OK am incercat o simulare si la Watch PORTA:00010000, PORTB:00000001

 

E de la compilator, e de la cod, nu mai inteleg nimic, ma poate ajuta cineva? am un proiect la facultate si deja cam intru in criza de timp.

Link spre comentariu
  • Răspunsuri 9
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    4

  • Th3_uN1Qu3

    1

Top autori în acest subiect

Eu zic sa ramai la ASM ca o sa te tot lovesti de el, picul nu e suficient de puternic cat sa te descurci doar intr'un limbaj de nivel inalt. Cu interrupt'urile e relativ usor de lucrat pt ce vrei tu, citeste datasheet'ul la capitolul timer0. Eu am invatat tot ce tine de jocuri de lumini pe LED in 3 zile, pornind cu 0 cunostinte de pic (ce'i drept stiam ceva ASM x86, dar putin si acolo).

Link spre comentariu

#include <pic16f628a.h>
HiTech recomanda
#include <htc.h>.
Pentru selectarea microcontrollerului cu care lucrezi foloseste mplab (pe undeva prin settings).In afara de asta, e recomandata o sectiune __CONFIG(), in care sa setezi bitii de configurare (watchdog, clock...). Un ex. (pentru un 16F877)
__CONFIG(WDTDIS                                       // WD disable           & HS                                       // 20 Mhz crystal oscillator           & DUNPROT                                  // Data read EE unprotected           & LVPEN                                    // Low Voltage Programming enable             & UNPROTECT                                // Flash Write Pritection Off           & BORDIS                                   // Brown out disable           & PWRTEN);                                 // Power up timer enable    

main(){	TRISA=0; //Am inteles ca trebuie sa scriu asta pentru a seta iesirile din A pe output	PORTA=0b00010111; // cu 1 ar fi porturile pe care le vreau high
La 16F628 PORTA are mai multe functii multiplexate; presupun ca mai trebuie sa dezactivezi partea analogica - citeste despre CMCON in data-sheet.Despre PORTB n-am nici o idee.Dupa parerea mea, poti ramane linistit la C. Nu o sa ai prea curand nevoie de "fineturile" ASM.
Link spre comentariu

La mine codul de mai jos functioneaza OK (in debuger):

 

#include <htc.h>;__CONFIG(BORDIS & UNPROTECT & CPD & PWRTEN & WDTDIS & LVPDIS & MCLREN & INTCLK);/* !!! Selecteaza 16F628A in mplab->Configure->SelectDevice!!!*/void main(void){//    PORTA = 0x00;	CMCON = 0b00000111; 	TRISA = 0b00000000;		/***** PortB Code ****	 *  Port directions: 1=input, 0=output	 */	TRISB	= 0b00000000;	        PORTA=0xFF;  //toate iesirile 0    PORTB=0xFF;  //toate iesirile 0    PORTA=0x0F;     PORTB=0x0F;      } 
Link spre comentariu

In functie de versiunea de picc pe care o ai, daca vrei intarzieri chioare (echivalenti cu "NOP"- nu fa nimic in timpul asta), ai diverse functii pentru intarzieri.In ultima versiune (9.80 parca), ai __delay_ms() si __delay_us() (parca, vezi in directorul Program Files -> HT_Soft -> Docs ca ai manualul; poate e trecuta acolo).Daca vrei sa mai faci si altceva cat timp astepti, merge cu intreruperi si timere.

Link spre comentariu
Vizitator mosu90

multumesc liviu, m-am lovit acum de urmatoarea problemanu vreau sa memorez si combinatiile binare pentru PORTA pentru ca as consuma aiurea memoria daca le-as baga in arrayul cu combinatiile binare pentru a aprinde ledurile (linii)la PORTA am decat 5 variante000000 00000000 01000000 10000000 1100000 1 0 0eu pentru a repeta aceste combinatii la fiecare cifra afisata ma folosesc de o variabila pe care o folosesc la un for "j"formula era PORTA=j%5;problema e ca nu stiu de ce cand probez schema in PROTEUS cu fisierul HEX generat, coloanele nu se aprind cum trebuie.daca las doar j si sterg % merge (doar pentru prima cifra)

Link spre comentariu

Pai dupa umila mea parere, pentru j=0..4 cele doua forme, PORTA=j si PORTA=j%5 sunt echivalente. Sau? :nas: Oricum ca sa stim despre ce vorbim, poate pui o poza cu schema in proteus (poza, nu schema, ca n-am proteus).

Link spre comentariu
Vizitator mosu90

da sunt echivalente... dar cand voi trece la cifra DOI j-ul va fi intre 5 si 9 (indicii in array ai combinatiilor binare)am rezolvat acum cu o sol care insa nu se misca asa bine... "forul" nu se misca asa repede incat ochiul sa nu-si dea seama ca se sting pe acolo niste coloane.. asta in PROTEUS. Maine imi vine programatorul si o sa vad atunci pe viu ce o sa fie.Oricum iti multumesc mult Liviu pentru ajutor, si scuze daca sunt putin stresant :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