Sari la conținut
ELFORUM - Forumul electronistilor

corect sau nu


pegas

Postări Recomandate

salutva adresez urmatoarea intrebare, pentru ca softul meu nu functioneaza cum trebuie si mi-am cam epuizat toate variantele... in simulator merge, dar pe placa nu.deci, sunt in interiorul unei subrutine si am de luat o decizie. in functie de ea, am 2 goto-uri. intrebarea mea e daca de exemplu "eticheta1" care se termina cu un return e corect si ma scoate imediat dupa apelul "call subrutina1"call subtrutina 1.....subrutina 1btfsc STATUS,2goto eticheta1goto eticheta2eticheta1........returneticheta2........return

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

Top autori în acest subiect

  • pegas

    6

  • francezu

    5

  • Liviu M

    3

  • 10vid

    3

Top autori în acest subiect

asta stiu, insa in cazul codului meu concret, nu ar fi bun.pentru ca return-ul din call m-ar duce imediat la executarea urmatorului call, ceea ce nu vreau...

C Compilers fan for microcontroller's. In C nu e profesional a se utiliza instructiunea goto. Assemblerul e deja demodat. Doar daca chiar nu gasesti compilator si nici in acest caz ...mai bine schimbi microcontrollerul cu unul la care gasesti compilator si poti face debugg"ca lumea" si rulezi pas cu pas si vezi exact unde-i hiba ... facand IN-circuit debugginng ... :sparge:
Link spre comentariu

intrebarea mea e daca de exemplu "eticheta1" care se termina cu un return e corect si ma scoate imediat dupa apelul "call subrutina1"

Exact asa se intampla; studiaza datasheet-ul si vezi ce face stiva hardware in cazul une instructiuni "call" , si ce face in cazul unei instructiuni "return". Cu siguranta nu aici este problema, constructia codului e corecta; depinde bineinteles si ce se afla intre eticheta1 si return, respectiv eticheta2 si return.In ce simulator merge bine ? Poti sa postezi codul intreg ?
Link spre comentariu

Au spus altii mai sus si mai spun si eu o data:Nu se iese cu return daca ai ajuns la subrutina cu goto. Diferenta dintre goto si call este ca la call se salveaza adresa de revenire in stiva. Call incarca contorul de program cu adresa de la valoarea curenta a pointerului de stiva, ceea ce determina continuarea de unde a ramas. Daca intri in rutina cu goto, nu se stie ce este in stiva cand faci call si de cele mai multe ori programul o ia razna.Ar putea fi corect daca ai intra cu call, in loc de goto.Cirip

Link spre comentariu

cand se face call, se face "push" automat cu PC-ul si la return se fac "pop" automat cu PC-ul si nimeni nu mai umbla la stiva, deci e clar ce e acolo...fac un decodor de telecomanda, RC5. stiu ca sunt pe net, dar am vrut sa vad daca pot face eu de la 0.codul il rulez in MPSIM, cu logic analyzer.practic, detectez trenul de impulsuri de la telecomanda pe RA0, si (pentru simplificare, in acest moment) daca se detecteaza un anumit cod, dau un puls pe RB4. daca se detecteaza alt cod, dau un puls pe RB5.problema e ca, in simulator functioneaza, dar pe target, indiferent pe ce tasta apas am puls si pe RB4 si pe RB5...nu stiu daca simultan ca am osc doar cu un canal.am sa postez codul diseara, cand ajung acasa...

Link spre comentariu

Nu se iese cu return daca ai ajuns la subrutina cu goto.

Corect, dar in cazul lui se ajunge la subrutina( subrutina1) printr-un apel (call). Mai departe subrutina1 se ramifica in doua directii in functie de valoarea lui Z. Fiecare executa niste cod si forteaza iesirea din subrutina1 printr-un return. Nu vad ce ar fi gresit, poate doar ca nu e foarte intuitiv codul, nu are o structura de genul if..then.. else.
Link spre comentariu

iata si codul cu pricina.;**********************************************************************; This file is a basic code oldlate for object module code *; generation on the PIC16F876A. This file contains the *; basic code building blocks to build upon. *; *; Refer to the MPASM User's Guide for additional information on *; features of the assembler and linker (Document DS33014). *; *; Refer to the respective PIC data sheet for additional *; information on the instruction set. *; *;**********************************************************************; *; Filename: xxx.asm *; Date: *; File Version: *; *; Author: *; Company: *; * ; *;**********************************************************************; *; Files required: P16F876A.INC *; *; *; *;**********************************************************************; *; Notes: *; *; *; *; *;********************************************************************** list p=16f876a ; list directive to define processor #include ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF; '__CONFIG' directive is used to embed configuration data within .asm file.; The labels following the directive are located in the respective .inc file.; See respective data sheet for additional information on configuration word.;***** VARIABLE DEFINITIONS (examples); nu ma intereseaza bitii de start, stare si; adresa (la mine e 0x00 tot timpul); comanda de volum+ este 0x10; comanda de volum- este 0x11org 0x0000ADRESA equ 0x20COMANDA equ 0x21OLD equ 0x22TEMP equ 0x23COUNTER equ 0x24RAPID equ 0x25NEW equ 0x26startbcf STATUS, RP0 ;aducerea lui RP0 si RP1 in 00,bcf STATUS, RP1 ; pentru selectarea bank-ului 0clrf PORTAbcf PORTB, 4 ; aducerea pe 0 a iesirilor RB1bcf PORTB, 5 ; si RB2bsf STATUS, RP0 ;aducerea lui RP0 si RP1 in 10 bcf STATUS, RP1 ; pentru selectarea bank-ului 1movlw 0x06 ; selectarea lui RA0 ca pinmovwf ADCON1 ; digital, nu analogicmovlw 0x1 ; setarea portului A movwf TRISA ; ca intrarebcf TRISB, 4 ; setarea RB1 sibcf TRISB, 5 ; RB2 ca iesiribcf STATUS, RP0 ; ajungem iar in bank-ul 0bcf STATUS, RP1 ; pentru punerea de valori in PORTAclrf ADRESA ; initializare clrf COMANDA ; registri rezultateclrf OLD clrf TEMPclrf NEWmovlw 0xe ;initiere contor generalmovwf COUNTERacall feedermovwf OLD ; o copii ca stare anterioara in OLDxcall delaycall feedersubwf OLD,0 ; scad din OLD (starea anterioara), ; starea curenta si am rez in OLDbtfsc STATUS,2 ; daca rezultatul scaderii ; anterioare este zero, ma ducgoto x ; la intarzierecall valoareacall shiftareacall delaygoto afeeder movf PORTA,0 ; acum am in W starea curenta RA0returnvaloareabtfsc STATUS,0retlw 1retlw 0delaymovlw 0xddmovwf RAPIDbarnop decfsz RAPID,1goto barreturnshiftareabcf STATUS,0 ; aduc carry la 0, ca sa nu am ; probleme la rotirerlf COMANDA,1 ; fac o shiftare la stanga pentru ; urmatorul bitiorwf COMANDA,1 ; fac OR intre W si reg comandadecfsz COUNTER,1; daca s-a achimbat starea la RA0 ; decrementez contorulgoto saltbtfsc COMANDA,0goto volupgoto voldnmovlw 0xemovwf COUNTERsalt returnvolupbsf PORTB,4call delaybcf PORTB,4returnvoldnbsf PORTB,5call delaybcf PORTB,5return;goto start END ; directive 'end of program'

Link spre comentariu

Iti sugerez sa vezi/verifici in simulator cum au facut altii. Protocolul RC5 este o forma de codare Manchester, ce inglobeaza atat datele cat si clock-ul, deci este dependenta de timp. Daca se foloseste metoda polling, atunci citirea portului trebuie sincronizata cu bit-ul/bitii de start, esantionarea facandu-se la intervale regulate de timp, pt un numar definit de biti. In codul tau nu vad nicaieri detectia bitilor de start.

Link spre comentariu

l-am simulat in mpsim cu logic analyzer si functioneaza corect. dar... pe target nu mai merge cum trebuie...in principiu, mie nu imi pasa de acei biti de start.eu decodez 14 schimbari de front (COUNTER = 0xe). si le shiftez intr-un registru de 8 biti. intr-un final, am in acel registru codul de comanda (6 biti) si chiar in cazul meu concret doar ultimul bit (LSB) ma intereseaza, el dictand comanda.

Link spre comentariu

in principiu, mie nu imi pasa de acei biti de start.

Gandeste-te ce se intampla daca din diverse motive, "prinzi" transmisia in alt punct decat bit-ul de start, sau pur si simplu pierzi cativa biti. Totul va fi decalat, iar bit-ul tau de interes nu va mai cadea pe aceiasi pozitie in registru.
Link spre comentariu

Pe Wikipedia e poza protocolului RC-5 si se vede ca atunci cand un "1" e urmat de un "0" nu se produce nici o schimbare de nivel la RA0, aici se pacaleste codul tau, care nu face diferenta intre un impuls si doua impulsuri unite.

Link spre comentariu

Daca e manchester cel mai bine se decodeaza cu intreruperi de schimbare de stare (se detecteaza fronturile semnalului) + timere ca sa vezi lungimea pulsului (un puls scurt inseamna repetarea bitului precedent, unul lung inseamna schimbarea bitului).

Si bitii de start sunt destul de importanti, esti sigur ca incepi cum trebuie si ai sanse sa receptionezi bine.

Daca e vorba despre protocolul pentru telecomenzi (RC5 de la philips), colegul nostru louis a pus la un moment dat un link la un site care trateaza detaliat protocolul.

Cu informatiile de pe site-ul respectiv am reusit sa decodez o telecomanda IR.

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