Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Problém s PIC 16F876
Jdi na stránku 1, 2  Další
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Dike



Založen: Jun 13, 2006
Příspěvky: 25

PříspěvekZaslal: po listopad 08 2010, 19:57    Předmět: Problém s PIC 16F876 Citovat

Ahojte pofíci, prosím vás o radu.

Už strácam nervy pri jednom vlastnom projekte, kde pomocou PIC16F876 ovládam LCD display, I2C zbernicu /pomocou vlastnej rutiny, nie pomocou intrených I2C/ atď.
Celý projekt mi funguje, akurát som sa rozhodol, že posielanie sériových dát z RB7 /funkčné pomocou vlastných rutín/ vyriešim pomocou prerušení.
A tu mi vznikol problém.
Keď som nakonfiguroval TMR0 /nikde nieje využívaný, len ako počítadlo na prerušenie/ a následne povolil prerušenie, celý program mi zblbne a stratí "niť". Mám pocit že PIC je rušený z portu B, pretože keď som dal 20nF kondík na RB4 -je to E signál do LCD tak sa to zlepšilo, ale aj tak sa program časom zauzlí.
Dokonca mi program zblbne aj keď do prerušenia nenapíšem nič.
To znamená len toto:

;prerušenie
prerus
bcf INTCON,T0IF
retfie

Aj napriek nič nevykonávajúcemu prerušeniu procesor blbne.
Keď prerušenie od TMR0 zakážem, všetko ide perfektne.
Myslím tým BCF INCON,T0IE.

Neexistuje na to nejaká finta? Už som pár vlastných projektov urobil, ale toto ma teda dostalo.
Ďakujem vám za akúkoľvek radu.

Celá chyba sa prejavuje ako problém zo stránkovaním pamäte, alebo zlým nastavením PCLATH. Jednoducho... zrazu to skočí úplne mimo.

David
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: po listopad 08 2010, 20:16    Předmět: Citovat

isr je jedna vec.
Ako máš riešené uloženie a návrat programových charakteristík
kód:
;

;
itvector   ORG     0x004              ; interrupt vector location
      movwf   w_temp              ; save off current W register
      swapf   STATUS,W      ; STATUS save to W   
      clrf   STATUS              ; banky do 0
      movwf   status_temp        ; save off contents of STATUS register
      movfw   PCLATH
      movwf   pclath_temp
      clrf   PCLATH
....


a ešte je dobré w_temp a status_temp ukladať na adresy do RAM od 0x70....0x7F
a návrat z isr
kód:
RetItRout100
      movfw   pclath_temp
      movwf   PCLATH
      swapf   status_temp,w
      movwf   STATUS
      swapf   w_temp,f
      swapf   w_temp,w          ; restore pre-isr W register contents
      return
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dike



Založen: Jun 13, 2006
Příspěvky: 25

PříspěvekZaslal: po listopad 08 2010, 20:31    Předmět: Citovat

Takto:
org 0x0000
. goto Init ; skočí na nastavenie procesoru

org 0x0004
. goto prerus ; skočí na prerušenie


A teraz prerušenie - pôvodné:

prerus
. movwf W_temp ;adresa je 0x72 - prístupná zo všetkých BANK
. swapf STATUS,w
. clrf STATUS
. movwf ST_temp ;adresa RAM je 0x70 - prístupná zo všetkých Bank
. movf PCLATH,w
. movwf PCL_temp ;adresa RAM 0x71 - prístupná zo všetkých BANK
;;;;;
;rutina prerušenia
;;;;;
end_prerus
. movf PCL_temp,w
. movwf PCLATH
. swapf ST_temp,w
. movwf STATUS
. swapf W_temp,f
. swapf W_temp,w
. retfie
;*********************************************************

Po laborovaní som zálohovanie odstránil a celé prerušenie zmenil na:
prerus
. BCF INTCON,T0IF
. retfie

Tie bodky som doložil aby boli dodržané odstavce tak ako v zdrojáku.

Keď prerušenie vypnem, všetko funguje ako má.
Neviem si vysvetliť ako môže bezvýznamné prerušenie ktoré nič neobsahuje ovplyvniť niečo v registroch.
Ale neviem samozrejme urobiť ďalšie veci na ktoré to prerušenie potrebujem. Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dike



Založen: Jun 13, 2006
Příspěvky: 25

PříspěvekZaslal: po listopad 08 2010, 20:45    Předmět: Citovat

Ešte ma niečo napadlo.

Keďže adresujem aj PCLATH, asi som urobil chybu v tomto:

org 0x0004
. goto prerus!!!!

Ak nie je PCLATH v nule, tak to asi zblbne tam!
Že ano?


Viem to urobiť aj takto?

org 0x0004
.. movf PCLATH,w
.. movwf PCL_temp ;0x71RAM
.. CLRF PCLATH
.. goto prerus

asi to by malo byť takto že?

A potom návrat registra pri ukončovaní prerušenia tak ako to bolo v predošlom príspevku...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: po listopad 08 2010, 20:51    Předmět: Citovat

retfie nesmieš použiť v tom nič nerobiacom isr. Jednak tam máš 2x return, takže paráda, a kým sa neobnovia pr.charakteristiky nie je dobré povoliť GIE.
Bežne sa zobídem bez inštrukcie retfie. Keď je vhodný čas na povolenie prerušení robím to cez bcf INTCON,7
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dike



Založen: Jun 13, 2006
Příspěvky: 25

PříspěvekZaslal: po listopad 08 2010, 21:02    Předmět: Citovat

Takže príznak prerušenia INTCON,7 vymazať až na koniec rutiny prerušenia...
Ďakujem

Len tomu retfie som nepochopil.
Ty nepoužívaš retfie na návrat z prerušenia?
Potom sa čím vraciaš?
Return-om?

Ešte niečo.
Pokiaľ v isr nemáš nič čo by ti pomiešalo registre STATUS, W a PCLATH, tak ich nemusíš zálohovať. Alebo sa mýlim?
Podľa mňa keď chceš vytvoriť nič nerobiace isr, tak stačí len

BCF INTCON,7
retfie

či....
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: po listopad 08 2010, 21:15    Předmět: Citovat

Hlavne použi miesto retfie.... goto end_prerus v časti prerus.
To je dôvodom toho zmätku v chode programu.
------------------------------------------------------
Do toho end_prerus to už nevojde a neobnoví sa to čo sa má obnoviť.


INTCON,7 je GIE (general interrupt enable bit)- stačí na to retfie.
Ten sa nahodí s tou poslednou inštrukciou v end_prerus....... retfie.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dike



Založen: Jun 13, 2006
Příspěvky: 25

PříspěvekZaslal: po listopad 08 2010, 21:19    Předmět: Citovat

No...asi sme sa nepochopili. Smile

retfie používam úplne na konci isr rutiny.
Na vrátenie sa do bežného programu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: po listopad 08 2010, 22:03    Předmět: Re: Problém s PIC 16F876 Citovat

Dike napsal(a):

;prerušenie
prerus
bcf INTCON,T0IF
retfie

TU NESMIE BYŤ retfie...... MUSÍ TAM BYŤ GOTO end_prerus,
preto ti to blbne
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
piitr



Založen: Oct 19, 2007
Příspěvky: 1003

PříspěvekZaslal: út listopad 09 2010, 8:40    Předmět: Citovat

Já myslím, že to retfie tam má dobře. Nevím, proč to blbne.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
piitr



Založen: Oct 19, 2007
Příspěvky: 1003

PříspěvekZaslal: út listopad 09 2010, 8:49    Předmět: Citovat

Teď koukám, že asi opravdu můžeš mít problém s tím "goto prerus".
Ten tvůj pic má totiž 8K paměti programu, ale pomocí instrukce goto lze adresovat pouze 2K, tedy 11 bitů. Zbylé dva bity se berou právě z PCLATH. Takže, pokud máš tu rutinu "prerus" hned na začátku, tak v PCLATH musí být opravdu nula. Pak je ale také možné, že ji máš až někde dál (přes 2K) a pak musíš do PCLATH dát tu správnou hodnotu, jinak to skočí jinam. Podle mě je nejlepší začít tu přerušovací rutinu rovnou na té adrese 4 a neskákat na ni tím goto.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Chenzee



Založen: Jun 26, 2007
Příspěvky: 464
Bydliště: Vysočina

PříspěvekZaslal: út listopad 09 2010, 9:18    Předmět: Citovat

Přesně tak si to myslím též. Minimálně zálohování W, STATUS a PCLATCH dej od 0x0004 a pokud skáčeš na část programu, vykonávajícího při přerušení, zkontroluj, zda je celý program ve stránce 0. S těma stránka je to na pendrek, ale už jsem si tak nějak zvyknul.
_________________
Žádnej učenej z nebe nespadl ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: út listopad 09 2010, 11:43    Předmět: Citovat

piitr napsal(a):
Já myslím, že to retfie tam má dobře. Nevím, proč to blbne.


Nesmie tam byť, a viem presne prečo lebo sa mu to vráti do main_program bez obnovenia programových charakteristík (t.j aj bez obnovenie PCLATH, w a STATUS).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
piitr



Založen: Oct 19, 2007
Příspěvky: 1003

PříspěvekZaslal: út listopad 09 2010, 13:11    Předmět: Citovat

Podle tebe tam má být co? Goto end_prerus? To návěští ale neexistuje, protože to je v té původní rutině, kterou nahradil tou jednoduchou. Po novu tam ani není co obnovovat, protože smazal i to ukládání stavu. Má tam jen instrukce goto, bcf, retfie. Stav netřeba ukládat, protože se nemění.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
procesor



Založen: Oct 02, 2009
Příspěvky: 5286
Bydliště: PO

PříspěvekZaslal: út listopad 09 2010, 14:24    Předmět: Citovat

Nuž nech je ako hovoríš.

kód:

0004  goto prerus
.
.
prerus
       bcf INTCON,T0IF
       retfie

Ako sa zaistí správne vykonanie toho GOTO?
Bez nastavenia PCLATH program BUDE POKRAĆOVAŤ v stránke kde sa program nachádzal v okamihu prerušenia.
V prípade, že program má vtesnaný v nultej stránke to bude fungovať. Inak sa to bude chovať nepredvidateľne.

Aj v tej časti, kde odkladá W,STATUS, PCLATH mu chýba nastavenie PCLATH do stránky, kde bude ISR. Samozrejme ak je celý program iba v stráke 0 to bude fungovať.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.16 sekund