rutina za reset

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

zed
Posts: 18
Joined: 20-03-2011, 01:06

rutina za reset

Post by zed »

Pozdrav svima hteo bih da mi neko pomogne ,imam hekskod pisan u assambleru hteo bih da mi neko napise rutinu za reset radi se o pic 16f877. :azdaja:
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7873
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: rutina za reset

Post by pedja089 »

A sta je to :roll:
zed
Posts: 18
Joined: 20-03-2011, 01:06

Re: rutina za reset

Post by zed »

komanda za reset u jednom delu programa koji bi trebalo da vrati koparator na pocetne pozicije . da bi izlazni signali iz dva komparatora bili izjednaceni komandom reset .
zed
Posts: 18
Joined: 20-03-2011, 01:06

Re: rutina za reset

Post by zed »

Dali mogu da postavim ceo kod radi se o magnetometru .
buco-1
Napredujem
Napredujem
Posts: 105
Joined: 24-10-2010, 21:22

Re: rutina za reset

Post by buco-1 »

Reset probaj odraditi reinicijalizavijom MCU-a ili direktnim skokom na po;etak prekidnog vektora, adresu 0000.
mbruck wrote: ...imam hekskod pisan u assambleru...


Ovo je biser.... :lol:
Vjerojatno je mislio na program koji je pisam u assebleru, a posto ga kompileri i assembleri pohranjuju u formatu intel hex koda (uglavnom) nije nista netocno reako. :wink:
Today's scientists have substituted mathematics for experiments, and they wander off through equation after equation, and eventually build a structure which has no relation to reality.
- Nikola Tesla
_heX
Napredujem
Napredujem
Posts: 136
Joined: 29-10-2009, 20:09
Location: Republika Zagorje

Re: rutina za reset

Post by _heX »

skok na lokaciju 0x000 nije dovoljan jer ne stavlja registre u stanje nakon reseta. 16f serija nema instrukciju za reset, ali ga mozes simulirati upotrebom wdt-a. Kada ga zelis resetirati izvrsi instrukciju goto $ (loop goto loop) i pricekaj da wdt odradi ostalo. Normalno podrazumjeva se da u ostalom djelu svog programa periodicki brises wdt (clrwdt instrukcija).
User avatar
mbruck
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 333
Joined: 27-02-2005, 11:36

Re: rutina za reset

Post by mbruck »

Ako imaš viška nogicu...?
Ja sam to jednom prilikom uradio hardverski. Spojio sam NPN tranzisistor na Reset PIN.
zed
Posts: 18
Joined: 20-03-2011, 01:06

Re: rutina za reset

Post by zed »

Kod je pisan u ass i postoi u samom kodu komanda koja je pisana za resetovanje odredjenih parametara a mislio sam da pitam da se reset odradi i za drugi parametar koji meni treba , .
lab1722tec
Napredujem
Napredujem
Posts: 123
Joined: 26-12-2010, 12:12
Location: sad_tu_sad_tamo

Re: rutina za reset

Post by lab1722tec »

Pretpostavljam da se radi o vanjskom komparatoru jer 877 nema komparator, ili možda misliš na 877A(on ima),ali zato ti ne treba reset nego :clrf CMCON (pogledaj datasheet). Iako bi uz source kod u assembleru dao možda neki precizniji odgovor.

Pozdrav!
User avatar
mbruck
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 333
Joined: 27-02-2005, 11:36

Re: rutina za reset

Post by mbruck »

A što se tiče viška nogice mislio sam na PIN procesora na koji je vezana baza tranzistora (preko 1K). Kolektor ide na MCLR pn (reset), emiter na masu.
Kad želiš resetirati procesor, samo na tu nogu dadneš 1. Tranzistor povuče MCLR na masu, kao da je i hardwerski. Čim se procesor resetira, taj PIN će opet biti 0. To sam ja nekad davno uradio sa nekim 8051 procesorom jer kao niti nisam znao kako to uraditi softwerski.
Nadam se da je jasno....
buco-1
Napredujem
Napredujem
Posts: 105
Joined: 24-10-2010, 21:22

Re: rutina za reset

Post by buco-1 »

_heX wrote:skok na lokaciju 0x000 nije dovoljan jer ne stavlja registre u stanje nakon reseta.
Naravno da stavlja!

Neznam dal si ikad pisao programe u assembleru za dati MCU, ili ikoji MCU, s aderese 0000 99% programa (svi oni koji bar malo poštuju proceduru) skače u inicijalizacijsku rutinu (njena funkcija i način rada je objašnjena u priči o assembleru) u kojoj se postavljaju svi početni parametri sustava (pa tako i registara; općih i specijalne namjene).
Njegov se problem može riješiti na više načina, no najbolji je da resetira u početno stanje same registre ADC-a koje koristi.

Inače za reset MCU-a ne treba nikakv tranzistor jer su izlazi portova tog MCUa dovoljno dobri da direktno resetiraju MCU preko šant otpornika od 100-220 oma sprajanjem na reset ulaz i postavljanjem u logičku "0". Inače uvijek pali i fora s kontroliranim preopterećenjem kad se MCU sam resetira radi vlastite zaštite. Ima puno načina izazivanja reseta. Skok u nepostojeću rutinu MCU vraća na početak itd.
Today's scientists have substituted mathematics for experiments, and they wander off through equation after equation, and eventually build a structure which has no relation to reality.
- Nikola Tesla
User avatar
mbruck
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 333
Joined: 27-02-2005, 11:36

Re: rutina za reset

Post by mbruck »

Skok u nepostojeću rutinu MCU vraća na početak itd.
Zar se nebi kompajler prije pobunio?
I ako je to moguće, po meni prije će CPU zaglaviti ili napraviti neko sranje na portovima, nego skočiti sam od sebe na početak...
_heX
Napredujem
Napredujem
Posts: 136
Joined: 29-10-2009, 20:09
Location: Republika Zagorje

Re: rutina za reset

Post by _heX »

buco-1 wrote:
_heX wrote:skok na lokaciju 0x000 nije dovoljan jer ne stavlja registre u stanje nakon reseta.
Naravno da stavlja!

Neznam dal si ikad pisao programe u assembleru za dati MCU, ili ikoji MCU, s aderese 0000 99% programa (svi oni koji bar malo poštuju proceduru) skače u inicijalizacijsku rutinu (njena funkcija i način rada je objašnjena u priči o assembleru) u kojoj se postavljaju svi početni parametri sustava (pa tako i registara; općih i specijalne namjene).
Njegov se problem može riješiti na više načina, no najbolji je da resetira u početno stanje same registre ADC-a koje koristi.

Inače za reset MCU-a ne treba nikakv tranzistor jer su izlazi portova tog MCUa dovoljno dobri da direktno resetiraju MCU preko šant otpornika od 100-220 oma sprajanjem na reset ulaz i postavljanjem u logičku "0". Inače uvijek pali i fora s kontroliranim preopterećenjem kad se MCU sam resetira radi vlastite zaštite. Ima puno načina izazivanja reseta. Skok u nepostojeću rutinu MCU vraća na početak itd.
Jesam pisao u asembleru i to bas za taj procesor, ali davno. Sada Bogu fala to radim u C-u. Jedna je stvar incijalizacija varijabli/stacka prije izvrsavanja programa (to ti je ono kaj ti se u C-u desava prije ulaska u main funkciju), a druga je stvar stanje registara (ovjde mislim samo i iskljucivo na sfr-e) nakon reseta. Ako pogledas tablicu u datasheetu SPECIAL FUNCTION REGISTER SUMMARY (to je ime tablice, ne derem se), vidjet ces da neki sfr-i imaju odredjeno a neki neodredjeno stanje nakon reseta. Evo primjer, znam da TRISx registri nakon reseta sadrze sve 1 sto znaci svi pinovi su ulazni, pa necu sad pisat TRISx = 0xff; (moj/tvoj kompajler ce jos manje to odraditi sam za mene/tebe u startup rutini) kad vec tak je. Dalje u svom programu odjednom stavim neki pin u izlazno stanje, a malo kasnije generiram "reset" s goto 0x000. Dal ce sad vrijednost u TRISx biti 0xff. Ja mislim da nece!
Skok u nepostojeću rutinu, a kaj ti to tocno dodje? Ne programirane lokacije pic-a imaju vrijednost 0x3FFF sto je addlw 0xff i nije mi jasno kak bi to trebalo resetirati pic. S druge strane PIC16F877 ima 8k flash-a i 13-bitni PC (ak ne uvidjas paralelu 2^13 = 8k). Ovo znaci da program counter nikako ne moze pokazati na nepostojecu lokaciju, sto se tice ram-a citanje nepostojece lokacije vraca sve 0, a upis u nepostojecu lokaciju je ignoriran. Inace pristup nepostojecoj lokaciji stvarno moze resetirati kontroler (PIC24, PIC32), ali PIC16 ne!
buco-1
Napredujem
Napredujem
Posts: 105
Joined: 24-10-2010, 21:22

Re: rutina za reset

Post by buco-1 »

mbruck wrote:Zar se nebi kompajler prije pobunio?
Kompajler možda i bi, ovisi koji koristiš no assembler nebi. Pogotovo upotrebom naredbi forsiranog skoka.
mbruck wrote:...po meni prije će CPU zaglaviti ili napraviti neko sranje na portovima, nego skočiti sam od sebe na početak...
Neće ništa "zaglaviti" iz jednostavnog razloga: skok napraviš kao forsirani skok na kraj programa, početak 0xFFFF "zone" (0x3FFF za PIC serije; 14-bitna naredba) e sad pošto računalo nastoji da se dokopa prve stvarne naredbe PC brojač se stalno uvečava idući naprijed (opisano je u primjeru kašnjenja oko rada bootloadera za ATmega seriju) pošto je nema dolazi na kraj i počinje sve iz početka postavljajući na prvu adresnu liniju i počinje iz početka; od adrese 0x0000. No daleko jednostavnije je skočiti direktno na početnu adresu.

Program se obično zaglavi u kompiliranom kodu zbog greške prilikom kompiliranja, iz bilo kog razloga, ili krivo postavljene povratne adrese u višestrukoj petlji. Kod assemblera je prva opcija nemoguća a ova druga zaista rijetka zbog same prirode assemblera kao načina programiranja.
_heX wrote:Dalje u svom programu odjednom stavim neki pin u izlazno stanje, a malo kasnije generiram "reset" s goto 0x000. Dal ce sad vrijednost u TRISx biti 0xff. Ja mislim da nece!
Znači to je na osnovu tvog mišljenja.
Inicijalizacijska rutina služi tome da se računalu, prije skoka u glavni program, postave svi parametri korištenih dijelova hardvera. To se čini, po pravilu, bez obzira na to dali sam MCU po prvom uključivanju postavlja dijelove istog na ovaj ili onaj način, u nule ili jedinice.
Today's scientists have substituted mathematics for experiments, and they wander off through equation after equation, and eventually build a structure which has no relation to reality.
- Nikola Tesla
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: rutina za reset

Post by InTheStillOfTheNight »

Hex moram ti priznati da nisi baš u potpunosti u pravu oko nekih stvari.
_heX wrote: TRISx registri nakon reseta sadrze sve 1 sto znaci svi pinovi su ulazni, pa necu sad pisat TRISx = 0xff; (moj/tvoj kompajler ce jos manje to odraditi sam za mene/tebe u startup rutini) kad vec tak je.
Ako to nećeš pisati onda znači da namjerno ne želiš napraviti inicijalizaciju, što bi značilo da štediš FLASH kako bi sutra mogao imati zanimljiv BUG. Svaka inicijalizacija, bila ona prije main-a na razini assemblera ili u main-u na razini C-a morala bi osigurati INIT za sve registre koji na neki način mogu biti iz bilo kojeg razloga postavljeni neispravno. Pa bi tako i u tvojem initu trebalo TRISx ponovno podići na 0xff (bez obzira na default) jer možeš doći u situaciju da ne uspiješ izvršiti software reset samo zbog toga što je TRIS poludio i init ne izvrši dobro inijijalizaciju, pa ti i sam program više ne radi, a niti jedan software reset ti neće pomoći. Svi dobri programi paze na tu stvar.
_heX wrote: Skok u nepostojeću rutinu, a kaj ti to tocno dodje?
Ne skaćeš ti u C-u u rutinu, niti na adresu izvan dosega PC-a, nego u rutinu na adresi samog FLASH-a. Nepostojeća rutina je ona na kojoj adresi nema ništa u FLASH-u, tj nema assemblerskog operacijskog koda. Ako ti imaš 8k FLASH-a i samo iskorišteno 2k, to znači da je 6 k memorije upravo ta nepostojeća rutina. Iz C-a vrlo lako možeš skočiti na adresu u FLASH-u na kojoj nije program ili metodom korištenja assemblerskih instrukcija ili skokom po pravilima C-a na određenu adresu. Što se događa kada tamo skočiš i buco je objasnio. CORE umjesto da radi koristan posao zapravo nema što raditi, ali kada jezgra nema operacijskog koda, ona uvijek podiše Program Counter i tako tjera program prema zadnjoj adresi FLASH-a i kad dojde do zadnje sljedeća je opet prva, a ona je upravo RESET_VECTOR iliti adresa 0000.
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: rutina za reset

Post by InTheStillOfTheNight »

InTheStillOfTheNight wrote:, a niti jedan software reset ti neće pomoći.
Pod logikom software reseta podrazumjevam ili izgubljen PC koji jezgra natjera u overflow, ili postavljanje PC-a na adresu 0 skokom... Čisto da se zna da ne mislim na WDT, jer on može biti i externi pa njega smatram više hardverskim nego softverskim.

Hex, a i tebe buco navuče na trik pitanje na koje ne znaš odgovor, pa kada napiše "nepostojeća rutina" ti pomisliš da je to na nepostojećoj adresi... :lol:
Mislim, ideja ti je doba oko pokušaja da uvjeriš bucu da ne zna što piše, no nažalost da bi ga i uvjerio najprije moraš biti u pravu...
InTheStillOfTheNight
_heX
Napredujem
Napredujem
Posts: 136
Joined: 29-10-2009, 20:09
Location: Republika Zagorje

Re: rutina za reset

Post by _heX »

@InTheStillOfTheNight
Čisto da se zna da ne mislim na WDT, jer on može biti i externi pa njega smatram više hardverskim nego softverskim
WDT je cisto hardverski, to mu je i bit, da se neovisno vrti od ostatka, mozes ga jedino brisat i eventualno mu postavit preskaler.
Pa bi tako i u tvojem initu trebalo TRISx ponovno podići na 0xff (bez obzira na default) jer možeš doći u situaciju da ne uspiješ izvršiti software reset samo zbog toga što je TRIS poludio i init ne izvrši dobro inijijalizaciju, pa ti i sam program više ne radi, a niti jedan software reset ti neće pomoći. Svi dobri programi paze na tu stvar.
Tko je rekao da uopce koristim softverski reset, samo sam ukazao zasto je bolje da to napravi hardverski, sto wdt i je.

[img]Ne%20programirane%20lokacije%20pic-a%20imaju%20vrijednost%200x3FFF%20sto%20je%20addlw%200xff%20i%20nije%20mi%20jasno%20kak%20bi%20to%20trebalo%20resetirati%20pic.[/img]0

Nisam vidovit i neznam na kaj je tocno buco-1 ciljao ali gornja linija me opravdava od:
Ne skaćeš ti u C-u u rutinu, niti na adresu izvan dosega PC-a, nego u rutinu na adresi samog FLASH-a. Nepostojeća rutina je ona na kojoj adresi nema ništa u FLASH-u, tj nema assemblerskog operacijskog koda. Ako ti imaš 8k FLASH-a i samo iskorišteno 2k, to znači da je 6 k memorije upravo ta nepostojeća rutina.
Hex, a i tebe buco navuče na trik pitanje na koje ne znaš odgovor, pa kada napiše "nepostojeća rutina" ti pomisliš da je to na nepostojećoj adresi... :lol:
Mislim, ideja ti je doba oko pokušaja da uvjeriš bucu da ne zna što piše, no nažalost da bi ga i uvjerio najprije moraš biti u pravu...
I konacno sto tocno ne stoji od ovog sto sam napisao. Probaj odspavat malo dobro je to za koncentraciju. Vise srece drugi put!
buco-1
Napredujem
Napredujem
Posts: 105
Joined: 24-10-2010, 21:22

Re: rutina za reset

Post by buco-1 »

@InTheStillOfTheNight

Nebih želio da ispadne kako jedan drugog tu nešto izvlačimo i opravdavamo. No jedno moram reći: pojašnjenje oko "nepostojeće rutine" i inicijalizacije je odrađeno bolje nego bih ja to napravio.

@_heX
Ako te moja terminologija navela na krivo razmišljanje, ili zaključke, ja se izvinjavam.

Istina, nikakav programski jezik nemože natjerati PC da skoči na nepostojeću adresu, pa ni asembler. To je čak i meni jasno, zbog logike samog HW-a jezgre. :wink:
Na početku priče o assembleru je nešto pisao o ponašanju i razlikama programskog brojača serije PIC16xxx i AVR/Mega. Dati su i primjeri.

Nema razloga za ljutnju. Nitko nije ovdje došao da ikoga omalovažava, bar se nadam, već da prenesemo neka svoja praktična iskustva i znanja drugima. Ja sam to pokušao kroz priču o asembleru.
Teorija i praksa se često ne poklapaju jer računalo nije savršen stroj, pogotovo ne onakav kakvim ga opisuju mnoge knjige o računalima ili programskim jezicima. Tamo je često dat primjer mašine koja u praksi ne postoji i zato, najvjerojatnije, dolazi do tih razlika.
Primjer reseta skokom na "nepostojeću rutinu" teško da ćeš nać u knjigama o programiranju što neznači da je nemoguć. Naveden je, između ostalih, čisto kao primjer, opcija, za one koji za to neznaju.
Today's scientists have substituted mathematics for experiments, and they wander off through equation after equation, and eventually build a structure which has no relation to reality.
- Nikola Tesla
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: rutina za reset

Post by InTheStillOfTheNight »

Il' si mrtav il' si nisi mrtav.
Upravo tako. Programeri bootloadera za AT90USB162 MCU su naprosto napravili grešku zbog ovog. Kada iz njihovog bootloadera izlaziš preko njihovog programa FLIP, svaka aplikacija koja ne gasi WDT ili ne udara po njemu će biti resetirana od strane WDT-a.

Razlog tome je jer su oni uključili WDT u bootloaderu i skočili na adresu 0, no WDT nitko neće isključiti sve do sljedećeg HARD RESET-a. To sigurno vredi za AT90USB162 i tvornički bootloader na tom mikrokontroleru.

U toj situaciji kada preko bootloadera staviš novi HEX koji ne ugasi WDT taj HEX neće raditi jer ga stalno resetira WDT i jedini način da resetiraš stvar je ekterni reset. Tako da ti teza svakako stoji oko toga: il' si mrtav, il' nisi mrtav.

U pravu si da je bolji WDT za taj tip reseta o kojemu govoris, jer ova rasprava je i pocela kada je buco napisao da će skok na adresu 0 dobro podesiti sve registre...

Ovaj primjer greške AVR programera samo govori o tome da se ponekad možeš naći na adresi 0, a da ti one default postavke nisu takve kakve bi očekivao na toj adresi i zato je bolje napraviti "pravi init".
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: rutina za reset

Post by InTheStillOfTheNight »

InTheStillOfTheNight wrote: U toj situaciji kada preko bootloadera staviš novi HEX koji ne ugasi WDT taj HEX neće raditi jer ga stalno resetira WDT i jedini način da resetiraš stvar je ekterni reset.
Ni ovo nije sasvim točno.
Danas na putu prema firmi neprestano me kompkala jedna nelogičnost:
"Ako WDR neće ugasiti sam sebe, onda niti externi reset ne bi trebao ugasiti WDT."

Tu tezu sam jednostavno morao staviti na TEST i došao do zaključka. Eksterni RESET neće ugasiti WDT kao niti bilo koji RESET na AVR-u. U gore opisanom BUG-u AVR bootloader-a svaki source koji ne gasi ili koristi WDT neće se pokrenuti sve dok se ne napravi fizičko isključivanje napona, tj naniži mogući hardverski RESET.

Tko je tu napravio BUG je također dvosmisleno, pošto BOOTLOADER smije raditi što hoće sa registrima, a svaki aplikativni program bi morao napraviti TRUE INIT.

Atmel je možda napravio BUG jer nije računao da će netko raditi init AVR-a koji ne posloži ponovno registre, a pogotovo ugasi WDT, a mi u programu možemo napraviti BUG jer nismo ugasili WDT u initu.

Ovo pišem samo da dokažem tvrdnju kako je prilikom bilo kojeg programa potrebno napraviti inicijalizaciju svih registara koji se na oko "default" čine ispravnima.
InTheStillOfTheNight
Post Reply