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í 

PIC16F648A - preruseni pri seriove komunikaci

 
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
mbrazdil



Založen: May 20, 2012
Příspěvky: 39

PříspěvekZaslal: ne květen 20 2012, 21:50    Předmět: PIC16F648A - preruseni pri seriove komunikaci Citovat

Zdravim Vas,

pokousim se rozchodit seriovou komunikaci mezi dvema MCU PIC16F648A. K programovani pouzivam Hi-Tech C a MPLAB. V podstate jsem se dostal do faze, kdy jsem si v datasheetu nasel informaci jak nastavit synchronni master TX mod. Zkusil jsem to podle navodu na strane 84, ale bez uspechu. Tak jsem zacal od zacatku. Kdyz chci vyvolat jednoduche preruseni tak staci mit:

kód:

void main(void) {
 GIE = 1;
 T0IE = 1;
 T0IF = 1;
}



Toto je jasne, ale kdyz udelam toto preruseni:

kód:

void main(void) {
 GIE = 1;
 TXIE = 1;
 TXIF = 1;
}



Tak se preruseni nevyvola. Nevite cim to muze byt?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Chenzee



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

PříspěvekZaslal: po květen 21 2012, 5:23    Předmět: Citovat

Ahoj, podívej se na stranu 20 a 21 v DS (tabulka "special registers summary" a koukni se, kde se nachází povolení a flag přerušení časovače a kde přerušení od ser. linky. Pak si projdi příslušné pasáže v DS.
_________________
Žádnej učenej z nebe nespadl ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: po květen 21 2012, 6:42    Předmět: Citovat

kód:
PEIE=1; // enable peripherals interrupt
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mbrazdil



Založen: May 20, 2012
Příspěvky: 39

PříspěvekZaslal: po květen 21 2012, 8:28    Předmět: Citovat

Ahoj, tak jsem se do toho dival, ale nejak nechapu proc by to takto nemelo fungovat Sad Proste nastavim povoleni a flag a melo by to fungovat. Zkousel jsem i nastavit PEIE, ale je to stejne. Navic jsem se dival do DS na ten USARTu jeste jednou a tam nic napsaneho nebylo o nastavovani PEIE.

kód:

void main(void) {
 GIE = 1;
 PEIE = 1;
 TXIE = 1;
 TXIF = 1;
}



Toto proste preruseni nevyvola Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mikollar



Založen: Dec 26, 2004
Příspěvky: 1430
Bydliště: Košice - okolie

PříspěvekZaslal: po květen 21 2012, 8:49    Předmět: Citovat

to PEIE je spominane vsebocene pri popise preruseni v kat. liste.

Mas spravne nastaveny seriovy port?( registre)

EDIT: spravne nastavenie overis tak ze budes v slucke testovat FLAG prerusenia, on sa nastavuje aj ked mas zakazane prerusenia, samorejme nezabudaj nulovat
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Chenzee



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

PříspěvekZaslal: po květen 21 2012, 10:51    Předmět: Citovat

... a ty nastavuješ ten flag ručně nebo čekáš, až jej nastaví uC?
-------------------------------------------------
Jinak tedy:
1) musí být povolené globální přerušení
2) musí být povolené přerušení periferií
3) musí být povolené přerušení ser. linky
4) flag ser. linky musí být 0

Pak při změně flagu 0 --> 1 musí být vyvoláno přerušení (skok na 0x4).
Alespoň mě to tedy zatím vždy takto fungovalo. To, jestli musí dojít k přečtení nějakých dat, to nevím ale bylo by to napsané v DS (momentálně nemám čas to číst Sad

_________________
Žádnej učenej z nebe nespadl ...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mikollar



Založen: Dec 26, 2004
Příspěvky: 1430
Bydliště: Košice - okolie

PříspěvekZaslal: po květen 21 2012, 11:06    Předmět: Citovat

Este sa moze stat, ak mas zarusenu komunikaciu ze sa ti nastavia chybove bity a pokial ich neznulujes tak ti dalsi prijem nepojde, ale aspon raz by ti to preslo.

Postup pre povolenie preruseni je presne ako pise Chenzee.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mbrazdil



Založen: May 20, 2012
Příspěvky: 39

PříspěvekZaslal: po květen 21 2012, 12:50    Předmět: Citovat

Asi si uplne nerozumime. Uplne na zacatku jsem daval 2 priklady jednoducheho kodu, kde rucne nastavuji flagy preruseni, abych jej vyvolal. V prvnim pripade to se tyka preteceni casovace mi to funguje, ale pokud to dam pro seriovy synchronni prenos tak ne. Nedalo mi to a zkusil jsem zapsat nejaka data do EEPROMky, mel jsem nasledujici kod:

kód:

// PIC16F648A

#include <htc.h>

#define _XTAL_FREQ 4000000

// Fuse bity
__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & CP_OFF);

// obsluha preruseni
void interrupt gi() {
   GIE = 0;

   if (EEIF) {
      EEIF = 0;
   }

   GIE = 1;
}

// Hlavni program
void main() {

   GIE = 1;
   PEIE = 1;
   EEIE = 1;
   EEADR = 0;
   EEDATA = 0b11110000;
   WREN = 1;
   WR = 1;

   
   while (1) {
   }

}



Tento jednoduchy kod by mel fungovat a mel by zapsat do EEPROMky na adrese 0x01 hodnotu 0XF0. Po kompletnim zapsani by se melo vyvolat peruseni, ktere se ale opet nevyvola. Rekl bych, ze to to bude mit stejnou pricinu jako v pripade te seriove linky. Jsem z toho uz nejaky zmateny, ale opravdu uz nevim cim by to mohlo byt. Testoval jsem tento kod jak v realu a vypisoval hlasky na display, tak i v SIMu a nic. Ani data se do EEPROMky nezapisi. Uz pomaly premyslim, zda neni chyba nekde ve fuzi bitech, ale ty s tim primo nesouvisi, aspon podle me.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frpr666



Založen: Dec 28, 2009
Příspěvky: 1051

PříspěvekZaslal: po květen 21 2012, 13:35    Předmět: Citovat

U PIC se každá periferie chová specificky. Nlp. když se podíváš přímo na hotové příklady např. na [url]piclist.com[/url] a do datasheetu a pak odzkoušet v MPLAB SIM. Někde je třeba v int. handleru mazat flag explicitně, jindy se maže sám implicitně. Ve tvém posledním příkladu není potřeba v int. handleru mazat a nastavovat GIE (nested-interrupt u téhle PIC myslím není).
Sériová komunikace se dá dobře v MPLAB SIM simulovat. Podívej se do helpu k MPLAB SIM.
edit1: při zápisu do EEPROM se dává magická sekvence 0x55, 0xAA do EECON2. Kdo zná Atmel, ten se diví Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mbrazdil



Založen: May 20, 2012
Příspěvky: 39

PříspěvekZaslal: po květen 21 2012, 16:32    Předmět: Citovat

Tak s tou EEPROMkou je to vzresene a uy to faka, jen mi porad nejake nejede ten seriovz prenos.
V DS na strane 84 je pro zprovozneni synchronniho master modu:

citace:

1. TRISB<1> and TRISB<2> should both be set to ‘1’ to configure the RB1/RX/DT and RB2/TX/CK pins as inputs. Output drive, when required, is controlled by the peripheral circuitry.
2. Initialize the SPBRG register for the appropriate baud rate (Section 12.1 “USART Baud Rate Generator (BRG)”).
3. Enable the synchronous master serial port by setting bits SYNC, SPEN and CSRC.
4. If interrupts are desired, then set enable bit TXIE.
5. If 9-bit transmission is desired, then set bit TX9.
6. Enable the transmission by setting bit TXEN.
7. If 9-bit transmission is selected, the ninth bit should be loaded in bit TX9D.
8. Start each transmission by loading data to the TXREG register.



Takze kod by mel vypadat asi takto:

kód:

void  main() {
 GIE = 1;
 PEIE = 1;

 TRISB1 = 1; // 1. bod
 TRISB2 = 1; // 1. bod
 SPBRG = 103; // 2. bod
 SYNC = 1; // 3. bod
 SPEN = 1; // 3. bod
 CSRC = 1; // 3 bod
 TXIE = 1; // 4. bod
 // 5. bod preskakuji
 TXEN = 1; // 6. bod
 // 7. bod preskakuji
 TXREG = 255; // 8. bod
}



Je to spravne?
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
Strana 1 z 1

 
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.21 sekund