Sari la conținut
ELFORUM - Forumul electronistilor

PIC 628 - nu "raspunde" comenzilor


Postări Recomandate

Se da schema atasata si sursa C. Schema e de altceva dar la partea cu preluarea tastelor ne-am incurcat.Bun, se incearca afisarea cifrei corespunzatoare tastei apasate.tastatura este tip 3 coloanex 4 rinduri.Programelul intii ar trebui sa numere pina la 09, apoi sa intre in regim de asteptare a apasarii unei taste.Sint puse acele intirzieri mari pentru a urmari semnalele. Asa cum este el cu sau fara tastatura numara si in faza de asteptare taste apasate, ca si cum acele intrari (col1-col3 ar fi atacate) Liniile "sar" pe rind in 1 logic.Am incercat ca in loc de "if (col1)" sa pun "if (!col1)", etc.. ei bine in cazul asta sare col2 ca si cum asta ar fi permanent in 1 logic, restul nu. Am pus acele col la masa efectiv si tot asa face, ca si cum INTERN acele colx ar fi legate la 0 sau 1.Unde e greseala?

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

Top autori în acest subiect

Uite si sursa C (cer scuze, nu m-a lasat s-o atasez)//***************************************************************************//******//****** Digital ignition for 4 stroke engines.//******//****** NOTE: use compiler: PCW v2.619//******//****** Digital parts: PIC16F628, XTAL 4MHz//******//******//****************************************************************************#include <16f628.H>#fuses XT,NOWDT,PUT,NOPROTECT,MCLR,NOBROWNOUT,NOLVP,NOCPD#use fast_io(a)#use delay(clock=4000000)//setup values#define prescaler 7 //2^7=128#define pickup PIN_A2 //pin 1#define thyristor PIN_A3 //pin 2#define led PIN_B7 //pin 13#define vacum PIN_A4 //pin 3#define strobe PIN_A0 //pin 17#define ceas PIN_A1 //pin 18#define col1 PIN_B0 //pin 6#define col2 PIN_B1 //pin 7#define col3 PIN_B2 //pin 8#define lin1 PIN_B3 //pin 9#define lin2 PIN_B4 //pin 10#define lin3 PIN_B5 //pin 11#define lin4 PIN_B6 //pin 12#byte TMR0=0x01#byte PORTA=0x05#byte PORTB=0x06#byte INTCON=0x0b#byte OPTION=0x81#byte PIE1=0x8cint8 tmr0h,perl,perh,avmin,avmed,avmax,avvacum,harta;int16 per,tmed,tmax;void afiseaza(int8 p){ int8 i; output_high(strobe);//resetare numaratoare output_low(strobe); // strobe 1 =reset output_high(ceas);// cat timp strobe este 0, se numara impulsurile date de ceas for (i=0; i

11) { perh=citire(); } afiseaza(perh); }//while} //main

Link spre comentariu
  • 2 săptămâni mai târziu...

Eu nu ma pricep foarte bine la C, insa sunt doua chestii care-mi sar in ochi:- RA0 pana la RA4 sunt intrari iesiri de comparator in PIC16F628, ori nu vad nicaieri comparatorul dezactivat (registrul CMCON)- TMR0 nu are nevoie de PIE setat pentru a contoriza overflow-ul, este singurul timer care nu are nevoie de intreruperi pentru a functionaIn rest sunt nelamuriri si observatii personale:- n-am inteles cum merge functia int8, mai ales cum o apelezi- schema hardware (partea de afisare) este extrem de complicata, (afisarea asta cu serializare si conversie bin-bcd) in mod normal afisorul putea impartii direct functiile pinilor de tastatura daca tot se utilizeaza convertor bin-bcd, si multiplexarea anozilor/catozilor afisoarelor cu cei doi pini cu care se face acum serializarea, exista multe note de aplicatie la Microchip pentru strategia asta.cele bune,Vasile

Link spre comentariu
Vizitator alex

int8 e tipul de date. Banuiesc ca e un integer pe 8 biti deci un char.Echivalentul tip pascal pascal ar fi var tmr0h, perl, perh, avmin, avmed, avmax, avvacum, harta: char;

Link spre comentariu
Vizitator bobina

Nu stiu daca ajuta sfatul meu, asa cum se vede schema ar proveni din Silicon Chip, am contruit si eu citeva de acolo unde sint implicate microcontrollere in combinatie cu tastaturi matrix. Legarea tastaturii mi-a dat dureri de cap, notarea din schema nu m-a ajutat cu nimic. Singura solutie a fost sa maresc jpg-urile cu tastatura si astfel am identificat corespondenta corecta a firelor. Ca sa merg la sigur mi-am comandat tastaturile direct in Australia.

Link spre comentariu

Schema e din SChip, intr-adevar. Acolo e o schema cu acea tastatura iar in loc de numarator-afisor pe 2 digiti era una pe un digit cu un alt integrat, la a carui "actionare" ne-am impotmolit; asta pentru ca autorul nu dadea si ".hex". In cazul asta ne-am hotarit sa rescriem softul.

 

Mda, se pare ca acele comparatoare nu-s inactivate, doar ca in C..nu stim apelul.

 

O solutie mai veche primita de la CalinP era:

in asm:

- modifici linia cu config asa:

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC & _BODEN_OFF & _LVP_OFF

- inainte de goto main dezactivezi comparatoarele

START ORG 0 ; processor reset vector MEM FLASH(0-3FF)

movlw 0x07

movwf cmcon

numai ca asta se aplica in .asm.

oare, cu #asm se poate pune in sursa C?

 

 

In plus, comparatoarele is pe PORTA, iar ca intrari/iesiri de tastatura folosim PORTB..

Link spre comentariu

Codul sursa nu prea respecta standardul ANSIExplica si mie ce inseamna: if (col1) i=1;S-ar putea sa te ajut

Daca col1 e la nivel logic high, 1..daca te uiti atent, pe rind liniile lin1-lin4 trec in 1, (output_high(linx).. daca se apasa o tasta, col1,2,3 functie de tasta apasata ar trebui sa treaca in acel 1 logic, caz in care se asigneaza valoarea tastei unei variabile.
Link spre comentariu

Dupa cate bag de seama asta e CCS C Compiler ... si la o prima vedere ai mai multe greseli ....1) ai setat set_tris_b ... insa nu ai setat nicaieri #use fast_io(B)2) de ce nu profiti de intreruperea portului B ... INT_RB si la schimbarea starii porturilor RB4-RB7(daca pe astea ai pus coloanele sa zicem) citesti starea celorlalti pini ai portului B si poti afla cu exactitate ce tasta a fost apasata ... etc ...3) daca folosesti CCS C Compiler e bine sa-l folosesti cat de mult se poate (sfatul meu e sa nu-l combini inutil cu comenzi de ASM sau cu setari de registrii atunci cand el are instructiuni dedicate pentru acelasi lucru)... vezi EnableInterrupts(...); etc ...4)Daca folosesti undeva Timer0 (nu de alta insa nu-mi dau seama din codul tau) nu vad nicaieri functia care se apeleaza la intreruperea asta ... Si ca un sfat final ... vezi ca cei de la CCS C Compiler au acolo pe site-ul lor si un mic manual in format pdf care e foarte bun pentru tine zic eu (e free acest manual)... contine niste exemple (ca sa nu mai zic de exemplele din soft) care te-ar ajuta foarte mult vis-a-vis de faza cu citirea tastaturii ... Spor la treaba!

Link spre comentariu
Vizitator alex

Sincer, eu ti-as recomanda sa treci pe HT-Soft PICC. Vezi ca e si varianta FREE (se numeste PICC Lite).Nu stiu in CSS cum e dar pentru picc, codul tau se traduce asa:__CONFIG(WDTDIS & PWRTEN & XT & UNPROTECT & LVPDIS & BORDIS);si CMCON=0x07;Daca treci pe picc pot sa-ti dau asistenta pe PM, aici sau pe DaciaClub :d

Link spre comentariu

UUUUUUF.. deja mi-s in ceata!

 

PIC-C se numeste "shortcut-ul" creat de insusi softul folosit, PCW Compiler scrie la "about" si e facut de Custom Computer Services Inc.

 

Pentru a raspunde unor intrebari anterioare subintelese: bucata de soft prezentata face parte dintr-un intreg: un gestionar de avans cu curbe preincarcate; adica din taste incarc citeva valori de baza ale curbei, iar montajul calculeaza tabelele de intirzieri. Se vor macar 2 curbe dar in mai mult de 64 puncte, de aceea am ales 628 si nu 84, cum era in varianta originala.

 

Bucatica asta trebuia sa permita citirea tastaturii si sa afiseze cifra apasata; el de fapt nu face asta, afisind pe rind toate tastele, ca si cum col 1,2,3 ar fi in nivel 1 ba mai mult, negind conditiile (in loc de if (col1) am pus if (!col1), etc) el numara la fel, deci coloanele sint si ZERO logic in acelasi timp-paradox.

 

Alex, acel soft functioneaza bine in varianta free? asta pe care-l folosesc acum, in varianta trial avea limitari muuuuuulte.

 

In fine, revin; am descarcat acel soft dar la PICC lite 9.5 am doar Activate and uninstal care accesat afiseaza repair si uninstal si MPLAB config.

Link spre comentariu
Vizitator DragosP

Off-topic: Mai împrăştiaţi mai băieţi, mai împrăştiaţi! :smt003 On-topic: Nu prea mă pricep eu la pic-uri, dar un sfat tot îmi permit să-ţi dau Liviu: debug-ul "live" fă-l pe bucăţi, adică lasă în program numai rutinele despre care eşti sigur că funcţionează apoi testează-le pe celelalte. Altfel sigur îţi prinzi urechile şi pierzi o groază de timp. Mai ales că spui că softul e adaptat la alt procesor.

Link spre comentariu

@diaconuliviu ... da-mi un pm cu adresa ta de mail si iti trimit versiunea completa de la CCS PIC C Compiler ... eu zic ca e un pic mai simplu decat HT Soft PIC C si are un suport mai mare ... multe exemple si documentatie destul de inteligibila, pe deasupra si un forum destul de activ .... HT Soft PicC e intr-adevar mult mai "professional" ...Acum sa revenim ontopic....Ce am observat eu la softul tau e ca tu nu verifici ce tasta a fost apasata ci chiar tu le apesi .... uita-te in documentatie la intreruperile INT_RB ... pune-ti firele de la tastatura pe portul B (liniile pe pinii RB4 - RB7 si coloanele pe porturile RB1-RB3) ... activeaza intreruperea INT_RB si la functia care se apeleaza la aceasta intrerupere vezi ce porturi s-au facut 1 la apasarea unei taste (linia respectiv coloana unei taste). Daca chiar nu te descurci o sa-ti fac un mic programel cu citirea tastelor de pe o tastatura asemanatoare cu ce folosesti tu ...Spor la treaba!

Link spre comentariu

[..]Ce am observat eu la softul tau e ca tu nu verifici ce tasta a fost apasata ci chiar tu le apesi .... [...]Spor la treaba!

Zerro, pai in acel if (col1) verific daca vreo tasta de pe col1 a "sarit" in 1 logic. Daca da, functie de linia care e in acel moment in 1 am intersectia lin/col, recte cifra apasata.Problema e ca indiferent daca am tastatura montata sau ba, si indiferent daca testez if(col1) sau if(!col1) el afiseaza 1...la fel si la col2..etc.. deci el gaseste col x SI in 1 SI in 0 logic.Tensiunea pe colx este (fara tasta apasata) 1,9V.. Am pus fizic coloanele la + sau la masa..dar tot apar ca fiind si 1 si 0 logic, ca si cum RB alea ar fi nu intrari ci ceva care se seteaza intern.
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