Sari la conținut
ELFORUM - Forumul electronistilor

BASCOM


yo9hnf

Postări Recomandate

  • 8 luni mai târziu...

Am o problema ciudata, in mod normal dupa initierea rutinei de mai jos pina la apasarea unui buton pe LCD nu trebuie sa fie afisat nimic dar la mine i-mi apare "Valoare = 100" ca si cum ar sarii din bucla "Do...Loop", problema e mult mai complicata eu prezint doar bucatica de cod care-mi da de cap.....

$regfile = "m8def.dat"Config Lcd = 16 * 2Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.0Cursor OffClsConfig Portd.3 = InputConfig Portd.4 = InputPortd.3 = 0Portd.4 = 0But1 Alias Pind.3But2 Alias Pind.4Dim Valoare As WordValoare = 100DoIf But1 = 0 Then Incr Valoare : Gosub SaltIf But2 = 0 Then Decr Valoare : Gosub SaltLoopSalt:Locate 1 , 1Lcd "Valoare" ; " = " ; Valoare ; "   "Waitms 150ReturnEnd

Astfel sint butoanele:post-175768-0-17442800-1439745520_thumb.jpg

 

Am incercat sa activez si rezistentele interne astfel ca butoanele sa nu mai fie conectate prin acele rezistente, de fapt de acolo a pornit problema si astfel am schimbat configurarea crezind ca primesc semnal fals..

 

As incerca si o alta compilatie banuind Bascomu` meu, daca cineva poate sa compileze si sa posteze HEX-ul as putea proba si aceasta "varianta".

 

Daca modific bucla "Do Loop" astfel :

DoIf But1 = 0 or But2 = 0 Then Gosub SaltLoop

nu i-mi mai sare peste, LCD ramine gol pina la apasarea unui buton....

Editat de nickrvl
Link spre comentariu

Ce se intampla daca scrii un if "cinstit"?

Do   If But1 = 0 Then       Incr Valoare      Gosub Salt   end if   If But2 = 0 Then       Decr Valoare      Gosub Salt   end ifLoop
Link spre comentariu

Fara " end if " puse corect eu n-as da vina pe Bascom . Nu poti gasi greseli elementare in Bascom , ori de cate ori nu mi-a  mers bine un program , aberatia de logica era din vina mea :rade:

Editat de Depanatoru
Link spre comentariu

Teoretic totul este (sintactic) in regula.

The one line version of IF can be used :IF expression THEN statement [ ELSE statement ]The use of [ELSE] is optional.

 

More than one BASCOM statement can be placed on a line, but colons ( : ) must separate statements, as illustrated below.

Eu voiam sa exclud din posibilele cauze combinatia "if pe o linie + instructiuni compuse". Editat de Liviu M
Link spre comentariu

Nu stiu cum functioneaza compilatorul acesta, nu l-am folosit niciodata dar eu as face initializarea butoanelor asa:

Portd.3 = 1Portd.4 = 1

avand in vedere ca starea lor default este HIGH fiind legate cu rezistori de pull-up la VCC. 

Nu stiu nici ce rol au acolo atata timp cat pinii sunt declarati ca intrari. Nu stiu cat de mult conteaza dar ... "my 2 cents".

Editat de mars01
Link spre comentariu

Nu stiu nici ce rol au acolo atata timp cat pinii sunt declarati ca intrari.

Activeaza/dezactiveaza pull-up-ul?

If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated.

Sau nu asta intrebai?
Link spre comentariu

Musai ca in bucla Do Loop trebuie facuta departajarea altfel o anulam (bucla) si scriam direct un "If cinstit" dar trecind peste (poate o sa schimb configuratia programului) de ce daca am bucla:

DoIf But1 = 0 Then Incr Valoare : Gosub SaltIf But2 = 0 Then Decr Valoare : Gosub SaltLoop

 

sau

 

DoIf But1 = 0 Then

 Incr Valoare 

 Gosub Salt

 end ifIf But2 = 0 Then

 Decr Valoare

 Gosub Salt

 end ifLoop

 

 

i-mi sare peste.

 

Daca scriu astfel:

DO

If But1 = 0 or but2 = 0 Then Gosub Salt

Loop

functioneaza "corect"

 

Asta nu intelg......................

 

 

 

L.E. Poate cineva sa scrie in alt limbaj de programare ce am incercat eu mai sus? asta daca exista echivalent, pentru a testa daca e o "logica" nepermisa sau "altceva", si sa posteze HEX-ul?

Editat de nickrvl
Link spre comentariu

Activeaza/dezactiveaza pull-up-ul?Sau nu asta intrebai?

 

:jytuiyu  I'm dumb this evening. N-o spun si-n romana ca deh, ego-ul meu ...

 

@nickrvl, eu zic sa renunti la tipul asta de jump-uri, cam toti spun sa te feresti de genul acesta de programare (sper sa nu spun prostii si limbajul asta sa se bazeze pe label-uri si jump-uri).

 

Cel mai bine folosesti o variabila flag, si imediat un break. Nu stiu cum e in Bascom dar sunt sigur ca trebuie sa ai instructiunea Break.

Ceva de genul:

Start bucla If conditieA then{ .... flag = 1 (break) exit do} if conditiaB then{ ..... flag = 2 (break) exit do}Stop buclaselect case flag case 1:   bla bla    case 2:  bla bla  

LE:

Bascom-ul are o alta semnificatie pentru break.

La ce ma refeream eu este instructiunea EXIT DO

http://avrhelp.mcselec.com/index.html?do_loop.htm

 

Hmmm . Astia nu au Switch Case, au ... Select Case

http://avrhelp.mcselec.com/index.html?select_case_end_select.htm

Editat de mars01
Link spre comentariu

De ce faci la inceput portd.3 = 0 si portd.4 = 0 ca si cum initial ar fi apasate butoanele ? E gresit sa dai tu valori la pinii ca intrari , ei citesc din afara . Asa se pare ca sunt indeplinite o data ambele conditii din bucla si sare la afisare pe lcd de doua ori , prea repede ca sa vezi , la 100 se aduna 1 si se scade 1 si ramane tot 100 pe afisaj , dupa care citeste starea reala a pinilor care e 1 , fiind legati la plus , si nu mai sare din bucla .

Elimina initializarile astea si vezi daca mai afiseaza ceva  .

Editat de Depanatoru
Link spre comentariu

Aceasta a fost si prima mea reactie, de acea am indicat initializarile acelea cu 1 dar de fapt sunt anulari de rezistori de pull up interni cum a reamintit Liviu (se face initializarea lor dupa ce au fost declarati ca intrari).

Se scrie latch-ul de pe pin dar nu inseamna ca partea de citire a starii pinului este afectata.

Editat de mars01
Link spre comentariu

nickrvl de ce nu folosesti tu functia "debounce"? Iti usurezi viata.

$regfile = "m8def.dat"Config Debounce = 30 Config Lcd = 16 * 2Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , E = Portb.3 , Rs = Portb.0Cursor OffClsConfig Portd.3 = InputConfig Portd.4 = InputPortd.3 = 1 ' nu setate pe 0 logicPortd.4 = 1But1 Alias Pind.3But2 Alias Pind.4Dim Valoare As WordValoare = 100Do'If But1 = 0 Then Incr Valoare : Gosub Salt'If But2 = 0 Then Decr Valoare : Gosub SaltDebounce But1 , 0 , Salt                                 'Debounce But2 , 0 , Salt   LoopEndSalt:Locate 1 , 1Lcd "Valoare" ; " = " ; Valoare ; "   "Waitms 150Return
Link spre comentariu

Pullup-urile nu se activeaza din oficiu daca sunt facuti pinii input , sunt registrii separati , dupa reset pinii sunt tristate din oficiu , tocmai scriind 1 se activeaza pullup-ul , si numai odata activat daca mai incolo in program e nevoie sa se dezactiveze trebuie facut 0 . Ceea ce intr-un program obisnuit nu prea ai de ce .

Editat de Depanatoru
Link spre comentariu

Pai daca nu se stie ca pullup-urile nu se activeaza automat pe intrari ce vina am eu ? Eu nu dau valoare initiala 0 pinilor ca intrari ca sa am dileme din astea , cand pui 1 ca sa se activeze pullup-ul oricum nu conteaza . Si chiar daca prin absurd pullup-ul e activat automat , de ce sa-l dezactivezi cand tot ai o rezistenta spre plus ? Raman in paralel si functioneaza foarte bine .

Daca din cauza asta nu merge corect inseamna ca chiar asa se interpreteaza , ca i-ai dat tu valoare 0 adica buton apasat pinului . Nu stiu ce se intampla atunci cand chiar vrei sa dezactivezi pullup-ul odata activat anterior ca sa folosesti altfel pinul , daca tot asa se interpreteaza , nu prea ai de ce sa folosesti optiunea asta in programele obisnuite

Editat de Depanatoru
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