 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Ned Nov 12, 2006 6:33 pm Naslov sporočila: Program mi občasno ne dela - PIC se izgubi |
|
|
SPISAL SEM PROGRAM, KI MI VČASIH DELA IN VČASIH PA NE
Zanima me če se da iz spodnje kode razumeti kaj mi povzroča da se pic izgubi.?
Kodo sem predelal tako da so noter le zanke (call in goto)
Koda: |
ORG 0x0000
goto Main ;go to start of main code
ORG 0x0008
;_______________________________________________________________INTERRUPT______________________
int
retfie
Main
INI
tibet
call ADC
call arrived_sign_from_PC
call subReal_wish
call sub_H_E ;
btfsc DO_reg,0
call regulation
btfsS DO_reg,0
CALL _RESET
call sub_real_critic
BTFSC alarm,0
CALL alarm_ON
NOP
goto tibet
;==========================================================================================
ADC
RETURN
;___________________________________________________________________
;_____________________________________________________________
;______________________________________________________
arrived_sign_from_PC
btfsc main_flag,0 ; Check for a new character
call sign ; Did not find one go check again (or do other stuff)
return
;___________________________________________________________________________________
;______________________________________________________________________________
sign
bcf main_flag,0 ; Clear flag bit so that we don't look at it again
CALL set_flag
call test_a_flag
return
set_flag;____________________________________________________________________set_flag
call set_in_w
call set_in_H
call set_in_c
call read_w_TEM
call read_Hysteresis
call read_c_TEM
call read_R_TEM
RETURN
set_in_w
return
set_in_H
return
set_in_c
return
read_w_TEM
return
read_Hysteresis
return
read_c_TEM
return
read_R_TEM
return
test_a_flag; _____________________________________________________test_a_flag
call write_w
call write_h
call write_c
call read_w
call read_h
call read_c
call read_R
returN
write_w
call start_DIGIT_in
btfsS end_packet,0
goto wait
call BCDtoBin
wait
return
write_c
call start_DIGIT_in
btfss end_packet,0
goto wait1
call BCDtoBin
wait1
return
write_h
call start_DIGIT_in
btfss end_packet,0
goto wait2
call BCDtoBin
wait2
return
read_w
call BinTObcd
call send
return
read_h
call BinTObcd
call send
return
read_c
call BinTObcd
call send
return
read_R
call BinTObcd
call send
return
;;_______________________________________________________________________WRITE INTO MCU
start_DIGIT_in;
return
BCDtoBin
RETURN
;;_______________________________________________________________________READ FROM MCU
BinTObcd
RETURN
send
return
;________________________________________________________________________________________
;_________________________________________________________________________________________
;__________________________________________________________________________________________
;REGULATION
sub_real_critic
RETURN
subReal_wish
CALL negativ
RETURN
negativ
RETURN
sub_H_E
RETURN
regulation
call heate
call ventilate
return
heate
return
ventilate
return
_RESET
RETURN
alarm_ON
return
END |
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Ned Nov 12, 2006 6:58 pm Naslov sporočila: |
|
|
Če pričakuješ, da se bo nekdo za uro ali več poglobil v tvojo kodo, vsaj malo več napiši, kje se izgubi, to simuliraš ali [slovenščina je zame španska vas] v vezju, kaj sploh dela, ...
_________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Ned Nov 12, 2006 7:34 pm Naslov sporočila: |
|
|
Sedaj sem poslal kodo v celoti.
Poslal sem le zanke, ker mislim da je napaka nekje v povezovanju med glavno zanko in subrutinami.
reguliram temperaturo. Imam senzor grelec in ventilator.
Sestavil sem kodo, ki komunicira s Hiper terminalom.
Ko pošljem male črke: w(željena tem.),h(histereza,oz. dovoljeno odstopanje),c(kritična tem.), pomeni o da treba naslednje tri znake (številke)iz tipkovnice razvrstiti v dva registra za BCD v BIN pretvorbo. Pretvorjene vrednosti se potem uporabljajo v regulaciji.
Če pa napišem na tikovnici veliko črko W,H,C,R pomeni to branje iz MCU v Hiper terminal. Vrednosti najprej pretvorim v BCD in jih pošljem.
Kodo semsestavil iz posameznih blokov ki mi samostojno delujejo in sama koda
mi včasih deluje večinoma pa ne. Recimo učeraj zvečer sem jo pripravil do tega da je delovala, ko sem večkrat povlekel čip iz ležišča in ga potem vrniol nazaj pod napetostjo. Saj vem da to ni najbolj pametno početje ampak. Nevem več kaj storiti.
Priznati moram da imam še veliko lukenj v znannju programiranja.Zato prosim za pomoč.
Opis: |
|
 Download |
Ime datoteke: |
Copy of Brazil.zip |
Velikost datoteke: |
6.18 KB |
Downloadano: |
7 krat |
|
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Ned Nov 12, 2006 7:39 pm Naslov sporočila: |
|
|
vidim da sem v prvem sporočilu poslal kodo dvakrat.
V drugem pa se nisem pravilno izjasnil kaj je v priponki.
Torej v priponki je celotna koda.
V prvem sporočilu pa samo zanke. (nažalost pa dvakrat)
Hvala
Ni se ti treba opravičevati, da si kodo poslal 2x, ampak imaš zgoraj desno gumb Uredi in enostavno popraviš. Sedaj sem jaz namesto tebe. aly.
|
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Ned Nov 12, 2006 7:46 pm Naslov sporočila: |
|
|
Si slučajno poskusil z drugim PICem?
_________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Ned Nov 12, 2006 8:06 pm Naslov sporočila: |
|
|
Sem.
Večkrat sem izmenjal 2 pica med seboj.
Sploh pa imam eno vprašanje , kaj program lahko skače s klicanjem subrotin po mili volji ali so kakšna pravila.
Primer:
main
call 1
call 2
goto main
1
call 1a
call 1b
return
1a
call 1aa
call 1ab
return
1b
call 1ba
cal 1bb
return
1aa
call 1aaa
call 1aab
return
in v tem smislu naprej?
|
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Ned Nov 12, 2006 8:11 pm Naslov sporočila: |
|
|
Lahko, ampak mislim da ima ta PIC 32 nivojev oz ugnezdenih klicev.
|
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.58
|
Objavljeno: Ned Nov 12, 2006 8:12 pm Naslov sporočila: |
|
|
Ne more - omejitev je v globini in izvedbi stacka in ta je pri PICih mocno (in vnaprej) omejen. Obstaja prakticna meja, ki je odvisna od konkretnega PICa, ki ga uporabljas.
_________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Ned Nov 12, 2006 8:19 pm Naslov sporočila: |
|
|
Če se prav spomnim ima PIC za klice in prekinitve uporabljen HW stack, ki ima 31 nivojev (prej sem se zmotil za 1 nivo).
|
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Ned Nov 12, 2006 9:04 pm Naslov sporočila: |
|
|
Mislim da nisem sel čez to mejo.
Kje se lahko sploh to vidi (pač na katerem nivoju si),?
pri uporabi MpLab simulatorja ?
|
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.17 Kraj: Ljubljana
|
Objavljeno: Ned Nov 12, 2006 9:52 pm Naslov sporočila: Re: Program mi občasno ne dela - PIC se izgubi |
|
|
pr2501 je napisal/a: |
SPISAL SEM PROGRAM, KI MI VČASIH DELA IN VČASIH PA NE
Zanima me če se da iz spodnje kode razumeti kaj mi povzroča da se pic izgubi.?
Kodo sem predelal tako da so noter le zanke (call in goto)
|
Ojla..
Sem le nahitro preletel tole solato..
Še en, ki uporablja absolute MPLAB asm model namesto relocated MPLAB asm model.
Vidim, da si izklapljal opozorila prevajalnika , super še žal ti bo!
Razlog boš odkril, ko boš delal z večimi bankami, dokler pa imaš BSF register zmerom 0 bo pa delovalo.
Program je popolna zmeda..
Nekaj si zložil skupaj in sedaj pa bi rad, da ti nekdo pove kaj to je..
Če pogledva prekinitev je povsem očitno, da ni ravno smiselna.
Pospravljanje/restavriranje registrov ni potrebno ker to naredi hardware, le na koncu mora biti ukaz 'retfie 1'
Prekinitev se ti zgodi, ko UART sprejme karakter. Nakar ta byte preložiš v arrived_sign in prižgeš zastavico main_flag češ, da program ve, da ga čaka nov karkter.
V tem primeru sploh ne rabiš prekinitvene. Enostavno preverjaš v programu 'PIR1,RCIF' flag namesto tvojega 'main_flag'.
Seveda pa to v realnosti ponavadi ne gre..
Ne podpisuješ vrstic.. Le kdo bo potem to gledal za teboj?
Dej najprej napiši v kakšnem programskem jeziku (Pascal al pa C) glavni program.
Še bol pa je, če narediš kar simulacijo.
Najprej naredi delujočo komunikacijo.
Komunikacija mora biti 'task' zase (kot si zastvil toda ne dokončal)! Šele ko sprejmeš celoten ukaz/string na to upozoriš glavni program.
Glavni program mora delati povsem neodvisno od komunikacije!
Ne vem zakaj siliš glavni program na koncu v ponovno inicializacijo procesorja??? Če je ta trenutek kaj v UART bufferju bo verjetno izgubleno!
LP GJ
|
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Pon Nov 13, 2006 1:07 am Naslov sporočila: |
|
|
Ojla..
Citiram: |
Sem le nahitro preletel tole solato.. Laughing
Še en, ki uporablja absolute MPLAB asm model namesto relocated MPLAB asm model.
|
Solato nisem poslal zaradi vitaminov.
Citiram: |
Vidim, da si izklapljal opozorila prevajalnika Shocked , super še žal ti bo!
Razlog boš odkril, ko boš delal z večimi bankami, dokler pa imaš BSF register zmerom 0 bo pa delovalo.
|
torej to ni razlog za nedelovanje kode. Ali mogoče je ?
Citiram: |
Program je popolna zmeda..
Nekaj si zložil skupaj in sedaj pa bi rad, da ti nekdo pove kaj to je.. Wink |
Točno vem kaj sem zložil skupaj.
Citiram: |
Če pogledva prekinitev je povsem očitno, da ni ravno smiselna.
Pospravljanje/restavriranje registrov ni potrebno ker to naredi hardware, le na koncu mora biti ukaz 'retfie 1'
Prekinitev se ti zgodi, ko UART sprejme karakter. Nakar ta byte preložiš v arrived_sign in prižgeš zastavico main_flag češ, da program ve, da ga čaka nov karkter. |
Tudi to torej ni razlog za nedelovanje kode.
Citiram: |
Ne podpisuješ vrstic.. Le kdo bo potem to gledal za teboj?
|
Koda ni še končana in nisem jo še imel dajati v javnost.
Samo sedaj nimam več moči, da bi rešaval problem. In mi je počasi že vseeno pa čeprav se gre za mojo diplomo.
Citiram: |
Dej najprej napiši v kakšnem programskem jeziku (Pascal al pa C) glavni program.
Še bol pa je, če narediš kar simulacijo |
.
Programskih jezikov ne poznam. simulacijo pa sem tudi delal, najprej za komunikacijo in potem za vsak del zase.
Bom pa probal iti jutri skozi simulacijo celotne zadeve.
Citiram: |
Najprej naredi delujočo komunikacijo. |
Komunikacijo sem spisal prvo in deluje. In enako kot delujejo vsi ostali deli kode dobro vsak zase.
Citiram: |
Komunikacija mora biti 'task' zase (kot si zastvil toda ne dokončal)! Šele ko sprejmeš celoten ukaz/string na to upozoriš glavni program. |
Program (regulacija) teče medtem ko jaz tipkam, oz. ne čaka da odtipkam vse tri števila. In šele ko so odtipkana vsa tri števila se začne z BCD v Bin pretvorbo. In nato z pisanjem spremenljivk.
[/quote]
Glavni program mora delati povsem neodvisno od komunikacije![/quote]
saj deluje. Iz glavne zanke grem v komunikacijo le ko dobim ukaz za branje ali pisanje.
Citiram: |
Ne vem zakaj siliš glavni program na koncu v ponovno inicializacijo procesorja??? Če je ta trenutek kaj v UART bufferju bo verjetno izgubleno! |
tega pa nisem razumel. Iz čega se razume da silim glavni program v ponovno inicjalizacijo
Po tvojem pisanju lahko sklepam, da sem porabil mesec dni brezveze, in si unčil hrbet in oči.
Lej mene prav malo zanima kako se lepo programira mene zanima zakaj moja koda včasih dela včasih pa ne.
|
|
Nazaj na vrh |
|
 |
pr2501 Član

Pridružen-a: Sre 18 Okt 2006 10:40 Prispevkov: 28 Aktiv.: 0.12
|
Objavljeno: Pon Nov 13, 2006 8:21 am Naslov sporočila: |
|
|
Včeraj nisem izklapljal MCU-ja in danes še vedno dela. Ni da nepravilno deluje med obratovanjem. Če mi steče pri uklopu pol deluje.
Včeraj mi ni delal cel dan in je poptem zvečer začel Ko sem ga večkrat poiskusil vzeti iz ležišča ven in ka popnovno vtakniti.
|
|
Nazaj na vrh |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Pon Nov 13, 2006 9:51 am Naslov sporočila: |
|
|
Določeni programi začno pravilno delovati šele po določenem času. Če uporabljaš na primer max232 in pcju(oziroma neki napravi) takoj ob vklopu pošlješ znak in čakaš na odgovor, boš čakal v neskončnost. Če ned čakanjem (neskončnosti) pritisneš reset, bo program magično začel delovati. Razlog je v tem, da ob zagonu max232 potrebuje precej časa, da začne delovati (polnjenje kondenzatorjev). Znak, ki ga prekmalu pošlje kontroler maxu bo do maxa prišel, ven iz njega pa ne.
Preveri, če nimaš tekega v programu. Glede na to, da program dela, ko začne delovati, imaš morda neko inicializacijo (software ali hardware) narejeno narobe.
Citiram: |
Sploh pa imam eno vprašanje , kaj program lahko skače s klicanjem subrotin po mili volji ali so kakšna pravila. |
Ja, so pravila. Omejitev je globina klicev procedur (nesting), to je kolikokrat lahko procedura v proceduri kliče proceduro. Določena je z tipom procesorja (dolžina stacka. Posledica je stack overflow, kar je zelo pogosta in fatalna napaka.
Procedura mora imetu svoj return stavek. Če ni returna, ali pa se gre ven iz procedure z goto stavkom, je nedelovanje zagotovljeno.
Jur
Nazadnje urejal/a jur Pon Nov 13, 2006 10:03 am; skupaj popravljeno 4 krat |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.72 Kraj: Kranj - struževo
|
Objavljeno: Pon Nov 13, 2006 10:01 am Naslov sporočila: |
|
|
V programu imaš en kup klicev procedur. Vsak klic + interrupt ti zasede stack, ki je pri PICih fiksne dolžine. Po spominu (že 3 leta nisem delal s pici) je stack pri tamalih uC globok 8 lokacij. Za točen podatek poglej datasheet. Preverjaj v simulatorju stack pointer.
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 491 dni
Powered by phpBB © 2001, 2005 phpBB Group
|