Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   1174 / 1203
(#) eSDi válasza Laja1 hozzászólására (») Feb 5, 2022 /
 
A szimulációt ne vedd tutira soha! Ha megjelent mindkét sorban, akkor még mindig rossz az init.
Nekem igy néz ki a 4bit-es (alsó 4bit) módú 2soros:

  1. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  2. DISPLAY_DATA_TRIS = DISPLAY_DATA_TRIS & 0xf0;
  3. DISPLAY_RW_PIN = 0;
  4. DISPLAY_RS_PIN = 0;
  5. DISPLAY_E_PIN = 0;
  6. DISPLAY_TRIS_RW = 0;
  7. DISPLAY_TRIS_RS = 0;
  8. DISPLAY_TRIS_E = 0;
  9. //POWER UP DELAY
  10. __delay_ms(100);
  11. //INIT SEQUENCE
  12. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  13. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x03;
  14. displayPulseEN();
  15. __delay_ms(1);
  16. displayPulseEN();
  17. __delay_ms(1);
  18. displayPulseEN();
  19. __delay_ms(1);
  20. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  21. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x02;
  22. displayPulseEN();
  23. __delay_ms(1);
  24. //FUNCTION SET
  25. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  26. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x02;
  27. displayPulseEN();
  28. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  29. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x08;
  30. displayPulseEN();
  31. __delay_ms(1);
  32. //DISPLAY OFF
  33. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  34. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x00;
  35. displayPulseEN();
  36. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  37. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x08;
  38. displayPulseEN();
  39. __delay_ms(1);
  40. //DISPLAY CLEAR
  41. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  42. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x00;
  43. displayPulseEN();
  44. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  45. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x01;
  46. displayPulseEN();
  47. __delay_ms(5);
  48. //ENTRY MODE
  49. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  50. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x00;
  51. displayPulseEN();
  52. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  53. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x06;
  54. displayPulseEN();
  55. __delay_ms(1);
  56. //DISPLAY ON
  57. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  58. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x00;
  59. displayPulseEN();
  60. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT & 0xf0;
  61. DISPLAY_DATA_LAT = DISPLAY_DATA_LAT | 0x0c;
  62. displayPulseEN();
  63. __delay_ms(1);


Ezt sem mondom 100%-ra, mivel nem találtam számomra megfelelőt, így elkezdtem írni magamnak egy LCD library-t és ez abból van. Élesben ezt nem teszteltem azt hiszem, csak az elődjét. Ha kell, akkor összedobom a kapcsolást holnap és letesztelem.
(#) Laja1 válasza eSDi hozzászólására (») Feb 6, 2022 /
 
Köszönöm! Úgy tudom, hogy a PIC16F628 -en nincsenek LAT regiszterek. Bármilyen típusú LCD kijelzőhöz ezt használod? Gyakorlatilag mindet ugyanúgy kellene inicializalni? Vagy az adatlapok alapján kell módosítani?
(#) eSDi válasza Laja1 hozzászólására (») Feb 6, 2022 /
 
Igen az F628-nak nincs LAT regisztere, de a program szempontjából az nem lényeges. PORT regisztert is ugyan így kell használni.
Igen elvileg minden HD44780 kompatibilisnek nevezett LCD kijelzőt így kell inicializálni.
(#) eSDi válasza Laja1 hozzászólására (») Feb 6, 2022 /
 
Közben sikerült letesztelnem a saját programom. Szépen működik. Ha ez alapján írsz egy új init()-et magadnak, akkor nálad is kell működjön, ha minden jól van bekötve.
(#) Laja1 válasza eSDi hozzászólására (») Feb 6, 2022 /
 
Köszönöm szépen a segítséget! Ki fogom próbálni!
(#) Laja1 hozzászólása Feb 7, 2022 /
 
Sziasztok!

Tudnátok segíteni, hogy ez a hibaüzenet mit jelent, mi nem tetszik neki?
Köszönöm!!

CLEAN SUCCESSFUL (total time: 5ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'F:/OneDrive - Korm�nyzati Informatikai Fejleszt�si �gyn�ks�g/C�ges mappa/Elektronika/Elektronika/MPLABXProjects/ujhoki.X'
make -f nbproject/Makefile-default.mk dist/default/production/ujhoki.X.production.hex
make[2]: Entering directory 'F:/OneDrive - Korm�nyzati Informatikai Fejleszt�si �gyn�ks�g/C�ges mappa/Elektronika/Elektronika/MPLABXProjects/ujhoki.X'
"C:\Program Files\Microchip\xc8\v2.32\bin\xc8-cc.exe" -mcpu=16F628A -c -mdfp="C:/Program Files/Microchip/MPLABX/v5.50/packs/Microchip/PIC16Fxxx_DFP/1.2.33/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/ujhoki.p1 ujhoki.c
::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries
ujhoki.c:446:38: warning: implicit conversion changes signedness: 'int' to 'char' [-Wsign-conversion]
LCD_PutC((ora/10)+0x30);
~~~~~~~~ ~~~~~~~~^~~~~
ujhoki.c:451:38: warning: implicit conversion changes signedness: 'int' to 'char' [-Wsign-conversion]
LCD_PutC((min/10)+0x30);
~~~~~~~~ ~~~~~~~~^~~~~
ujhoki.c:456:38: warning: implicit conversion changes signedness: 'int' to 'char' [-Wsign-conversion]
LCD_PutC((sec/10)+0x30);
~~~~~~~~ ~~~~~~~~^~~~~
ujhoki.c:548:38: warning: implicit conversion changes signedness: 'int' to 'char' [-Wsign-conversion]
LCD_PutC((ora/10)+0x30);
~~~~~~~~ ~~~~~~~~^~~~~
ujhoki.c:553:38: warning: implicit conversion changes signedness: 'int' to 'char' [-Wsign-conversion]
LCD_PutC((min/10)+0x30);
~~~~~~~~ ~~~~~~~~^~~~~
ujhoki.c:558:38: warning: implicit conversion changes signedness: 'int' to 'char' [-Wsign-conversion]
LCD_PutC((sec/10)+0x30);
~~~~~~~~ ~~~~~~~~^~~~~
ujhoki.c:600:38: warning: implicit conversion changes signedness: 'int' to 'char' [-Wsign-conversion]
LCD_PutC((ora/10)+0x30);
~~~~~~~~ ~~~~~~~~^~~~~
ujhoki.c:627:38: warning: implicit conversion changes signedness: 'int' to 'char' [-Wsign-conversion]
LCD_PutC((min/10)+0x30);
~~~~~~~~ ~~~~~~~~^~~~~
ujhoki.c:653:38: warning: implicit conversion changes signedness: 'int' to 'char' [-Wsign-conversion]
LCD_PutC((sec/10)+0x30);
~~~~~~~~ ~~~~~~~~^~~~~
9 warnings generated.
"C:\Program Files\Microchip\xc8\v2.32\bin\xc8-cc.exe" -mcpu=16F628A -Wl,-Map=dist/default/production/ujhoki.X.production.map -DXPRJ_default=default -Wl,--defsym=__MPLAB_BUILD=1 -mdfp="C:/Program Files/Microchip/MPLABX/v5.50/packs/Microchip/PIC16Fxxx_DFP/1.2.33/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -Wl,--memorysummary,dist/default/production/memoryfile.xml -o dist/default/production/ujhoki.X.production.elf build/default/production/ujhoki.p1
::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries
:0:: error: (1347) can't find 0x26 words (0x26 withtotal) for psect "text5" in class "CODE" (largest unused contiguous range 0x1E)
Non line specific message::: advisory: (1493) updated 32-bit floating-point routines might trigger "can't find space" messages appearing after updating to this release; consider using the smaller 24-bit floating-point types
:0:: error: (1347) can't find 0x25 words (0x25 withtotal) for psect "text11" in class "CODE" (largest unused contiguous range 0x1E)
:0:: error: (1347) can't find 0x11 words (0x11 withtotal) for psect "text9" in class "CODE" (largest unused contiguous range 0xD)
(908) exit status = 1
nbproject/Makefile-default.mk:138: recipe for target 'dist/default/production/ujhoki.X.production.hex' failed
make[2]: Leaving directory 'F:/OneDrive - Korm�nyzati Informatikai Fejleszt�si �gyn�ks�g/C�ges mappa/Elektronika/Elektronika/MPLABXProjects/ujhoki.X'
nbproject/Makefile-default.mk:91: recipe for target '.build-conf' failed
make[1]: Leaving directory 'F:/OneDrive - Korm�nyzati Informatikai Fejleszt�si �gyn�ks�g/C�ges mappa/Elektronika/Elektronika/MPLABXProjects/ujhoki.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make[2]: *** [dist/default/production/ujhoki.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 4s)
(#) pipi válasza Laja1 hozzászólására (») Feb 7, 2022 /
 
Mármint ezekre gondolsz: can't find xxx words? Kinőtted a pic-et, elfogyott a memória.
(#) Laja1 válasza pipi hozzászólására (») Feb 8, 2022 /
 
Köszi!
(#) Hp41C válasza Laja1 hozzászólására (») Feb 9, 2022 / 2
 
Az MpLab jobban szereti a rövid és ékezetes karakterek nélküli mappa és állomány neveket.
16F648A -ban a program memória 4k szó.
A hozzászólás módosítva: Feb 9, 2022
(#) KBal76 hozzászólása Feb 15, 2022 /
 
Sziasztok, van egy fura jelenség, PIC16 mcu, MPASM. Találkozott-e már valaki ezzel: digi lábon néznék egy potit, szög egyszerûen:
Idézet:

VDD|───[2K]───[47K_POT]─┐
                               ▲─────┘
                               │
RA1|───[200R]────┴─────|100n|────|GND”
●elôször lehúzom a kimenetre állított lábat 0-ra, várok (sokat)
●majd bemenetre állítom és számolok felfelé (1 byte-on), és figyelek:
●amikor láb szintet vált, kiugrok számolásból (vagy ha számláló túlcsordul)
Indításkori "setup" lenne, nem hajszálpontos értéket akarok, csak hogy legyen némi hangolási mozgástér (ott is ahol nincs beépített A/D).
Namármost Proteus szimulációban ugrálást mutat a mért érték, nem korrelál a poti állásával. Gondoltam a szimuláció hibája. De valóságban is ugyanaz van, tehát elôször nôl az érték, de némely állásban visszaesik akár töredék értékére, majd továbbfordítva (helipot) az érték az elôzô nagyobb értéktôl következetesen nagyobbat (jót) mutat. Tehát vannak állások ahol felborul a logika. Próbáltam más lábra, másik portra is (TTL vagy ST bemenet), nincs eltérés.
Leginkább a miértje érdekel.
(#) KBal76 válasza KBal76 hozzászólására (») Feb 15, 2022 /
 
Érdekes plussz, hogy ha fordítva csinálom, tehát a PIC tölti, majd a feltöltött kondit húzza nullára a poti, akkor teljesen jó. Program szintjén alig van eltérés, a figyelésben BTFSS helyett BTFSC van, meg a kisütés helyett töltés van.
(#) Bakman hozzászólása Feb 15, 2022 /
 
Estét!

PIC18F16Q40. A jelzett megszakítás tulajdonképpen mikor jelentkezik? Semmit nem találtam róla az adatlapban, csak az összesítő táblázatokban szerepel. Más kontrollerek adalapjában is ennyi van róla.

U1IE.png
    
(#) Saggitarius válasza Bakman hozzászólására (») Feb 16, 2022 /
 
151. oldalon van a lenyeg, a 137. oldalon a PIE4 reg csak az engedelyezes-letiltas:
A hozzászólás módosítva: Feb 16, 2022

UART INT.PNG
    
(#) Saggitarius válasza KBal76 hozzászólására (») Feb 16, 2022 /
 
Nem lesz igazan pontos, mert nem linearis a jeled ha csak ellenallason keresztul toltod. Viszont ha aramgeneratorrol toltod, akkor linaris lesz.
(#) Bakman válasza Saggitarius hozzászólására (») Feb 16, 2022 /
 
Valóban, megvan. UxUIR regiszter gyűjtője.
(#) Saggitarius válasza KBal76 hozzászólására (») Feb 16, 2022 /
 
Mas, mivel TTL es ST bemeneten probaltad ami nem szigoruan szintrogzitett, valoban tortenhet "barmi", hasznalj komparator bemenetet ahol meghatarozott(meghatarozhato) a valtasi szint.
(#) vatti65 hozzászólása Feb 20, 2022 /
 
Sziasztok,

Valaki meg tudja mondani mit jelent a (hova lép ezután??)
goto $+1
utasítás 16F84 esetén.
Provtmr btfss INTCON, T0IF
goto Paus
movlw 0xFF
bcf STATUS, Z ; TimerH=0xFF
subwf TimerH, W
btfss STATUS, Z
goto No
incf TimerHH, F
clrf TimerH
bcf INTCON, T0IF
goto Ret
No incf TimerH, F
bcf INTCON, T0IF
nop
goto Ret
Paus nop
goto $+1
goto $+1
goto $+1
goto $+1
Ret return

Egy frekvenciamérőben van, nem jövök rá hova lép?

Kösz: Attila
A hozzászólás módosítva: Feb 20, 2022
(#) Hp41C válasza vatti65 hozzászólására (») Feb 20, 2022 / 1
 
Szia!
Rövid válasz: Igen.
Hosszabb válasz:
A $ jel a fordítónak azt a címet jelenti, ahova az adott utasítás kerül.
A 10F, 12F, 16F -eken egy utasítás mindig 1 szó, így a következő utasítás címe $+1.

16F: GOTO $+1

A GOTO $+1 egyszerűen a következő utasítással folytatja a programot.

De akkor mi az értelme?

A GOTO végrehajtása két utasítás ciklus alatt történik meg, de csak egy szó a tárigénye.

A 18F -eken vannak egyszavas (2 byte-os), kétszavas (4 byte-os) és háromszavas (6 byte-os) utasítások. Egy egyszavas utasítást követő utasítás címe $+2, egy kétszavas utasítást követő utasítás címe $+4, egy háromszavas utasítást követő utasítás címe $+6,

18F Példák:
BR $+2
GOTO $+4
(#) vatti65 válasza Hp41C hozzászólására (») Feb 20, 2022 /
 
Köszönöm,
Valami ilyesmire gobdoltam.
Tehát csak "időhúzás". Annyiban jobb a NOP-tól, hogy 2 ciklusig tart, és egy helyet foglal,
ugyan ennyi időhúzást 2 NOP-al tudok elérni ami 2 helyet foglal.

Köszönöm.
(#) foxi63 válasza vatti65 hozzászólására (») Feb 21, 2022 /
 
Szia!
Nem időhúzás, hanem ugrási címke megspórolása . A $ jel relatív ugrást jelent, lehet előre ,de hátra is lehet ugrani fordító függő általában +/- 127 byte-ot. Semmi köze NOP -hoz, vagy időhöz, viszont tudni kell hogy ahol használod, mekkora helyet foglal el az adott utasítás ,és hogy hova szeretnél ugrani , hogy a $ jel utáni szám jó legyen. Ezért nem nagyon szokás használni, mert körülményes.
A hozzászólás módosítva: Feb 21, 2022
(#) nedudgi válasza foxi63 hozzászólására (») Feb 21, 2022 /
 
Félreérted. Az "időhúzás" kifejezés alatt rövid késleltetést. Ilyesmire sokszor szükség van, az általános milliszekundum nagységrendű késleltetések nem elég pontosak, hiszen gyakran csak mikroszekundomokra van szükség.
(#) moltam válasza foxi63 hozzászólására (») Feb 21, 2022 /
 
Ok hogy relatív ugrás, de szerintem konkértan a +1 re gondolt.
(#) fotomen32 hozzászólása Feb 26, 2022 /
 
Sziasztok
Esetleg tudna nekem valaki segíteni?
Terveztem egy külső belső hőmérőt meg is építettem de sajnos a picbe való programot nem tudom megírni.16f684 pic van benne és 2dbMCP9700 hőérzékelő ami analóg jelet ad ki tehát 2 ad konverterre megy a kijelzés 4digites nixie cső multiplexelve.
(#) Bakman válasza fotomen32 hozzászólására (») Feb 26, 2022 /
 
Melyik részen akadtál el? Milyen fejlesztőkörnyezetben írod a programot?
(#) fotomen32 válasza Bakman hozzászólására (») Feb 26, 2022 /
 
Sajnos el sem kezdtem.
Mikor elkészült a panel akkor szembesültem vele hogy még sosem irtam progit és fogalmam sincs hogyan kezdjek hozzá.Eddig csak kész hex-eket égettem a pic be.
(#) bitmixer válasza fotomen32 hozzászólására (») Feb 26, 2022 /
 
Nagyon bátor ember vagy
Ha elküldöd nekem a kapcsolási rajzot és a kívánalmakat (mérési tartomány / elvárt pontosság, stb), talán tudok segíteni. Sokat dolgoztam 16F684 procival, szeretem is
(#) Laja1 hozzászólása Feb 27, 2022 /
 
Sziasztok!

Készítettem egy stoppert. Abban tudnátok segíteni, hogy az óra miért siet? 1 óra alatt 11 másodpercet siet.
Ha a PR2-t 249-ről 250-re állítom, akkor meg késik, óránként 7 másodpercet.
PIC16F628A. Belső 4 Mhz órával.
Én így állítottam be:
(Részlet a programból)

void __interrupt() megszak (void)
{
if(PIR1bits.TMR2IF)
{

if(mpcount==100){mpcount=0;mpflag = 1;} // lejárt az 1 sec
PIR1bits.TMR2IF=0;
}
}


void main (void)
{






PCONbits.OSCF=1; // a bels? oszc. 4 Mhz



OPTION_REG = 0x55; // Set TMR0 configuration and enable PORTB pullups
INTCON = 0b11000000; // ' Enable global interrupts, Disables all peripheral interrupts, disable timer0 interrupt
CMCON = 0x07 ; // analóg komparátorok kikapcsolva, RA0-1 digitális port!
PORTB = 0b00000111;
PORTA = 0;
TRISA = 0b00100000; // RA0, RA7 port bemenet, relé vagy LED
TRISB = 0b00001111; // RB2 és RB3 bemenet, a többi kimenet

// timer2 beállítása
PR2=249; //timer2 250órajel után ujrakezdi a számolást
T2CON= 0b01001101 ; //4 el?osztó modul on 10 utóosztó
PIE1bits.TMR2IE=1; // tmr2 irq enable


Köszönöm szépen!
(#) Bakman válasza Laja1 hozzászólására (») Feb 27, 2022 /
 
A kérdésben benne van a válasz is. Azért nem elég pontos, mert a belső órajelet használod. Vagy kompenzálod időnként a tapasztalati értékkel vgay használsz külső, pontosabb órajelet, pl. kvarcot.
(#) Laja1 válasza Bakman hozzászólására (») Feb 28, 2022 /
 
Köszönöm szépen, kiegészítem kvarccal.
(#) Laja1 hozzászólása Márc 10, 2022 /
 
Sziasztok! Szeretném mérni egy PIC16F627A betápjáért felelős elem feszültségét és ha egy bizonyos szint alá csökken, akkor egy LED jelzi, hogy elemcsere szükséges. Mivel nincs analóg bemeneti lehetőség, arra gondoltam, hogy a komparátor referenciafeszültségéhez mérem a tápot. Csak elbizonytalanodtam, mert a referenciafeszültséget egy függvénnyel lehet megadni, amiben szerepel a VDD is. Tehát, ha a betáp csökken, akkor a VDD is változik és a referenciafeszültség is csökken? Ha ez így van, akkor ez nem alkalmas erre a feladatra. Igaz, vagy valamit rosszul gondolok?
Köszönöm!
Következő: »»   1174 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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