Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1085 / 1318
(#) Zsora válasza Hp41C hozzászólására (») Júl 22, 2012 /
 
Ezzel a módszerrel akkor 1 ciklusnyi magas kimenetet, ill. X ciklusnyi alacsony kimenetet lehet elérni? (Vagyis az alacsony idő a magas idő egész számú többszöröse?)
(#) kissi válasza Zsora hozzászólására (») Júl 22, 2012 /
 
Szia!

A növekmény értékének megfelelő darabszámú 1-es lesz egy 256-os egységben.
Ez azt jelenti, hogy a növekmény értékével tudod az impulzus szélességét állítani 0-255-ig, de az impulzus az nem "egybefüggő" ( a mellékletben ki tudod próbálni, a "Van-e átvitel oszlopban láthatod, hogy mikor lesz '1' a kimenet, az '1'-esek száma oszlopban pedig, hogy hány darab impulzusból áll össze a tényleges magas szint a kimeneten )!

Steve
(#) Attila86 válasza proli007 hozzászólására (») Júl 22, 2012 /
 
Szia!
Na ná hogy! Ellenőrzöm hogy az LCD kijelző rá van-e kötve a PIC-re vagy sem és aszerint fut tovább a program.
(#) cross51 hozzászólása Júl 25, 2012 /
 
Sziasztok !
Segítséget szeretnék kérni nem tudom hogy jó e ez az áramkör a PIC-hez nem e zárlatos vagy valami ilyesmi nem szeretném tönkre tenni a gépemet. Köszi a segítséget.
Üdv: CRoSS
(#) Hp41C válasza cross51 hozzászólására (») Júl 25, 2012 /
 
Szia!
A PIC kezdőknek topik fejécéből:
Idézet:
„- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.”
(#) cross51 hozzászólása Júl 25, 2012 /
 
Igen igen szeretném ha pickit 2 lenne mert azzal nem tehetem tönkre a gépet, de sajnos nincs rá pénz így ezért döntöttem a házi barkácsolás mellet, de mondjuk még a hestorban van az avr usb programozó de nem tudom PIC meg AVR között mi a különbség. Szóval erét döntöttem ez az áramkör mellet de ahogy nézegetem egy két dologot nem értek
(#) potyo válasza cross51 hozzászólására (») Júl 25, 2012 /
 
Ne vegyél te még egyelőre semmit, úgyse mennél sokra vele, ez látszik a hozzászólásodból. Inkább olvasgass még 1-2-3 hónapig, pénzedet meg gyűjtsd és majd ráérsz akkor venni vagy építeni egy Pickit2-t.
(#) Hp41C válasza cross51 hozzászólására (») Júl 25, 2012 /
 
Szia!
Keress egy jó régi PC -t. Azzal talán fel tudod ezzel az áramkörrel programozni a PCIKit2 -be való 18F2550 -et a firmware -vel. Aztán indíthatod a PICKit2 klón építését...
(#) Stefan hozzászólása Júl 27, 2012 /
 
Sziasztok!
PIC24 Output compare modullal szenvedek.
3 különböző frekvenciát kellene előállítani, ezért arra gondoltam, hogy ezt a modult használom, toggle módban.
A probléma, hogy a megszakítás után újra beugrik a megszakításba(legalábbis szimulátorban). Valaki találkozott már ezzel a problémával?
Az OC1 modul inicializálása a "Section 13. Output Compare" doksi szerint van.
  1. OC1CONbits.OCM = 0b000;     // Disable Output Compare Module
  2.     OC1CONbits.OCM = 0b010;     // Define Initial State for OC1 Pin (High if OCM=0b010)
  3.     OC1CONbits.OCM = 0b000;     // Disable Output Compare Module
  4.     OC1CONbits.OCTSEL = 0;      // Select Timer2 as output compare time base
  5.    
  6.     IPC0bits.OC1IP = 0x01;      // Set Output Compare 1 Interrupt Priority Level
  7.     IFS0bits.OC1IF = 0;         // Clear Output Compare 1 Interrupt Flag
  8.     IEC0bits.OC1IE = 1;         // Enable Output Compare 1 interrupt
  9.     OC1CONbits.OCM = 0b011;     // Select the Output Compare mode
  10.    
  11.     TMR2 = 0;
  12.     PR2 = 0xFFFF;               // max period
  13.     T2CONbits.TCKPS = 0b10;     //1:64
  14.     T2CONbits.TCS = 0;          //internal osc / 2
  15.     T2CONbits.TON = TRUE;      //stop
  16.  
  17.  
  18. void __attribute__((__interrupt__)) _OC1Interrupt( void )
  19. {
  20.     IFS0bits.OC1IF = 0;
  21.     OC1R +=200;
  22. }


A dissassembly szerint a megszakítás végén a "pop.w 0x0034" hatására a flag visszabillen.

003EC 781F80 mov.w 0x0000,[0x001e++]
003EE F80034 push.w 0x0034
003F0 200000 mov.w #0x0,0x0000
003F2 8801A0 mov.w 0x0000,0x0034
003F4 FA0000 lnk #0x0
199: IFS0bits.OC1IF = 0;
003F6 A94084 bclr.b 0x0084,#2
200: OC1R +=200;
003F8 800C10 mov.w 0x0182,0x0000
003FA B00C80 add.w #0xc8,0x0000
003FC 880C10 mov.w 0x0000,0x0182
219: }
003FE FA8000 ulnk
00400 F90034 pop.w 0x0034
00402 78004F mov.w [--0x001e],0x0000
00404 064000 retfie
(#) _vl_ válasza Stefan hozzászólására (») Júl 27, 2012 /
 
Próbáld ki fordítva: előbb változtatni az OC1R-t, aztán törölni az interrupt flaget (plusz még közéjük berakni egy valami másik utasítást is, esetleg egy nop-ot).
(#) Stefan válasza _vl_ hozzászólására (») Júl 27, 2012 /
 
Próbáltam azt is, eredetileg a végén is volt flagtörlés, hosszabb volt a rutin, a megszakítást is próbáltam tiltani és visszaengedélyezni a végén, de mindig újragenerálja a flaget...:S
(#) icserny válasza Stefan hozzászólására (») Júl 27, 2012 /
 
Idézet:
„A probléma, hogy a megszakítás után újra beugrik a megszakításba(legalábbis szimulátorban).”
A szimulátorért én nem tenném tűzbe a kezem, tehát azt ne tekintsük mérvadónak.

Azt érdemes inkább ellenőrizni, hogy amikor újra belép a megszakításba, jogosan lép-e be, azaz eltelt-e (a szimulátor szerint) az az idő, amit beállítottál?

A honlapomon az általam átvett és felerészben lefordított/átdolgozott tankönyvi mintaprogramok között találsz output compare mintapéldákat is (bár én még nem jutottam odáig hogy behatóbban foglalkozzam velük).
(#) Stefan válasza icserny hozzászólására (») Júl 27, 2012 /
 
Nem jogosan ugrik be, gyakorlatilag annyira rövid a megszakítás, hogy a még a timer értéke se nő a rutin alatt... még az is lehet, hogy ezért szimulál baromságot. Amúgy az MPLABX szimulátorral is kipróbáltam, ott ha tiltottam a megszakítást OCnR írásának idejére, akkor nem ugrott újra bele, viszont ott meg OC2R compare match esetén az OC1 megszakításra ugrott
Vicc az egész:S
(#) _vl_ válasza Stefan hozzászólására (») Júl 27, 2012 /
 
Várjál, szimulátorban látod csak a dolgot, vagy elésben is? A szimulátornak nem kell mindig hinni...
(#) Stefan válasza _vl_ hozzászólására (») Júl 27, 2012 /
 
Élesben még nem próbáltam, majd lecsekkolom.
(#) Hp41C válasza Stefan hozzászólására (») Júl 27, 2012 /
 
Szia!
Nézd meg az alkalmazott MpSim verzió release note -jét. Vannak 24F OC hibák benne.
(#) AccessDenied hozzászólása Júl 29, 2012 /
 
Már vagy 4-5 órája próbálok rájönni, hogy a programom miért nem veszi a vref állítást...

Hőmérsékletet szeretnék mérni dióda nyitófeszültséggel, amit ugye elég nagy pontossággal kellene mérni, ezért nem a teljes tápfeszt szeretném használni, mert úgy 4,88mV-onként tudok mérni, hanem elvileg a VREF_LOW|4-et, amivel elvileg 0,8V/1024=0,78mV-okat tudnék mérni 5V-os tápfesznél...

set_tris_a(0b00000100);
setup_adc(ADC_CLOCK_INTERNAL);
setup_vref(VREF_LOW|4);
setup_adc_ports(sAN2|VSS_VREF);
set_adc_channel(2);
delay_us(10);
valueADC=read_adc();

Teljesen mindegy mit adok meg setup_vref()-nek, ugyan úgy VDD-t használja Így most az adc 139-et olvas, azaz 0,678V-ot.

16F690-esen próbálnék tanulgatni...
(#) _vl_ válasza AccessDenied hozzászólására (») Júl 29, 2012 /
 
Ez nem CCS véletlenül? Mert arra van külön topik...

Viszont nekem a 690-es úgy tűnik, hogy össz-vissz két választást kínál fel a Vref+ számára: vagy Vdd, vagy RA1/AN1/Vref bemenet.
Ez a VREF_LOW|4 nem tudom, hogy mit szeretne csinálni, de ebben a PIC-ben nincs belső fix referencia a A/D számára.
(#) AccessDenied válasza _vl_ hozzászólására (») Júl 29, 2012 /
 
Köszi a választ! Igen, ez az a program lesz! Lehet igazad van, de akkor nem értem, hogy a program 16f690.h headerjében miért van ez a rész:

// Constants used in setup_vref() are:
//
#define VREF_LOW 0x20
#define VREF_HIGH 0x00
// Or (with |) the above with a number 0-15
#define VREF_6th 0x10 // Turn on .6V ref
#define VREF_COMP1 0x80
#define VREF_COMP2 0x40

plusz ez:

// Constants used in SETUP_ADC_PORTS() are:
#define sAN0 1 //| A0 \\!"K50"
#define sAN1 2 //| A1 \\!"K50"
#define sAN2 4 //| A2 \\!"K50"
#define sAN3 8 //| A4
#define sAN4 16 //| C0
#define sAN5 32 //| C1
#define sAN6 64 //| C2
#define sAN7 128 //| C3
#define sAN8 0x10000 //| C6
#define sAN9 0x20000 //| C7
#define sAN10 0x40000 //| B4
#define sAN11 0x80000 //| B5
#define NO_ANALOGS 0 // None
#define ALL_ANALOG 0xF00FF // A0 A1 A2 A4 C0 C1 C2 C3 C6 C7 B4 B5

// One of the following may be OR'ed in with the above using |
#define VSS_VDD 0x0000 //| Range 0-Vdd
#define VSS_VREF 0x4000 //| Range 0-Vref

A VREF_LOW|4 pedig azt csinálná, hogy így számolja a referencia feszültséget (most 4 a value):

VREF_LOW for VDD*VALUE/24

VREF_HIGH for VDD*VALUE/32 + VDD/4
(#) _vl_ válasza AccessDenied hozzászólására (») Júl 29, 2012 /
 
Szerintem a dokumentációt kéne inkább olvasgatni...
A gyártó oldalán a CPU data sheet leírja, hogy mit tud a chip.
A CCS-hez is - gondolom - van dokumentáció arról, hogy melyik függvényük melyik paraméterrel mit fog csinálni.
A chipben van komparátor is, annak másfajta Vref állítási opciói vannak, mint az A/D-nek.
(#) AccessDenied válasza _vl_ hozzászólására (») Júl 29, 2012 /
 
Olvastam én dokumentációt is, CCS helpet is, googliztam is, de nem tudtam belőle rájönni, ezért kérdeztem meg. Lehet hogy ADC-hez nem állítható a vref
(#) Stefan válasza Hp41C hozzászólására (») Júl 29, 2012 /
 
Köszi a tippeket mindenkinek, a kontrolleren tökéletesen fut a dolog. A readme tesz említést bizonyos típusokon a OC modul hibás működéséről, de erről nem találtam megjegyzést.
"A Michrochip szimulátorától ments meg Uram minket"
(#) watt válasza AccessDenied hozzászólására (») Júl 29, 2012 /
 
Szia! Ha nem vagy biztos a fordító függvényeinek működésében, akkor állítsd be direktben a regisztereket, sok bosszúságtól mented meg magad néhány sor plussz munkáért cserében.
Jelen esetben az ADCON0,VCFG bitet kell beállítanod az adatlap szerint, hogy a Vdd, vagy a Vref legyen a referencia. Negatív referencia nincs kivezetve, az csak a Vss lehet.
CCS kérdések ügyében van egy topic itt: CCS topic
(#) AccessDenied válasza watt hozzászólására (») Júl 29, 2012 /
 
Köszi a segítséget, lehet megpróbálkozom az assemblyvel, meg átmegyek abba a topikba! Bár most áramot akarok mérni söntön eső feszültséggel, 50mV-ra lövöm be, meg műveleti erősítővel erősítem 0-5V közé, és így nem lesz gond
(#) watt válasza AccessDenied hozzászólására (») Júl 29, 2012 /
 
Nem kimondottan az assemblyre gondoltam, C-ben is meg lehet adni simán egy regiszter, vagy egy bit értékét... (ADCON0=??;, vagy ADCONbits.VCFG=1 (ez C18 szintaktika, biztosan tudod CCS-ben mi a megfelelője))
Hi-Tech C-ben, amit jobban ajánlhatok, mint a CCS-t, annyi lenne, hogy VCFG=1;
(#) geizol hozzászólása Aug 1, 2012 /
 
Sziasztok!

Olyan problémám lenne, hogy van egy radarom, aminek rs-422 kommunikációs portja van csak, és szerintem én vagyok a tudatlan, mert végignéztem az sok oldalt, ahol PIC-ek portjait írják, és sehol sem találtam olyat ami rendelkezne.
Az radar rövid kábellel kapcsolódna a vezérléshez, valamint megnéztem alaposan a két szabványt, és arra gondoltam, hogy meglehetne oldani hogy csak a kimeneteit kötöm rá egy rs-232-es mikrovezérlőre? Mondjuk kellene átvitelvezérlés is mert a radar sebességértéket ad át folyamatosan BCD kódolásban.
Ha valamit nem jól írtam, vagy kihagytam szóljatok majd próbálom kiegészíteni
Köszi a segítséget előre is!
(#) kissi válasza geizol hozzászólására (») Aug 1, 2012 /
 
Szia!

Hát .. le kellene írni a kérdést !

Amit én ki tudtam hámozni: van egy radarod, ami RS232-n kommunikál, de nem vagy biztos a protokollban és nem találtál PIC-et, amiben RS232 van !?

Válasz: a radar kommunikációját át kell nézned, mert lehet, hogy csak "löki" az adatokat folyamatosan pl. 0,1 másodpercenként 4 karakter (ABC,D km/h, a vesszőre és a mértékegységre nincs szükség, ha az alapértelmezett! ), de lehet ( sőt szerintem valószínű!), hogy bizonyos adatokat a mérés előtt be kell állítanod: átviteli sebesség, paritás, a mérés pontossága, mértékegysége, azaz inicializálni kell a radart ( ez a leírásból derül ki!).
A PIC-el kapcsolatban: USART-ot keres és annak az RX-TX lábait ( ez nagyon sok PIC-ben van ). Az RS232 fizikai jelszintjeit viszont külön kell biztosítanod, mert a PIC maximum TTL jelszinttel kommunikál alapból!

Jó munkát!

Steve
(#) geizol hozzászólása Aug 1, 2012 /
 
De egy sorban van az rs422 (nem rs232) a radar szóval...
A kérdést valóban nem tettem fel:
Milyen mikrovezérlőre kössem rá, illetve ha rs232 szabvánnyal tud csak kommunikálni a mikrovezérlő, akkor milyen átakalító áramkör megépítése szükséges az RS422 kimenettel rendelkező Radarhoz?

Vagy csak lehet hogy én gondolom úgy, hogy rs422-t nem lehet összekötni egy mikrovezérlővel?

Köszönöm a válaszokat előre is!
(#) kissi válasza geizol hozzászólására (») Aug 1, 2012 /
 
Szia!

Bocs, nem figyeltem eléggé ...

Az RS422 szintén soros átvitel, csak differenciális jelátvitelt használ, ezáltal sokkal nagyobb távolságokat tud áthidalni. Az adás és vétel során átalakítókat használnak pl.: Bővebben: Link, ami az asszimetrikus/szimmetrikus jelátalakítást csinálja. A kérdés, mint az előző válaszomban írtam a protokoll és a sebesség!
Ha protokollként a Start-Stop elven működő ( vagy más, a mikrovezérlőben hardveresen rendelkezésre álló ), 8/9 bites átvitelt használják nem túl nagy sebességgel, akkor használható a USART, ha nem akkor is megoldható mikrovezérlővel, legfeljebb meg kell írni a bejövő adatok lekezelését!

Steve
(#) geizol válasza kissi hozzászólására (») Aug 1, 2012 /
 
Szia

Értem,majd a gyártótól még meg kell egy két dolgot kérdeznem ez ügyben, mert papíron csak annyi van (ami a radarra vonatkozik), hogy
Baud Rate: 115200;
Data bits: 8
Parity: None
Stop bits: 1
Flow control: none

A fentieket értem, a radaron van négy kivezetés, Rx+, Rx-, Tx+, Tx-
Kijelölök a mikrovezérlőn ennek megfelelően 4 db lábat és úgy kötöm hozzá, vagy kell akkor valamilyen átalakítás amit belinkeltél az előző válaszodban.
Bocsánat ha értetlen vagyok
Vagy ha az UARTot használom (TX RX port) akkor melyiket kell rákötni az +-t mindkettőből vagy a - -t?
18F452 mikrovezérlőt néztem, hogy az UART max sebessége pont annyi (115kbs)

Köszönöm!

Zoli
Következő: »»   1085 / 1318
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem