Fórum témák
- • Szobatermosztát bekötése
- • TV hiba, mi a megoldás?
- • Villanyszerelés
- • Felajánlás, azaz ingyen elvihető
- • V-FET és SIT erősítő kapcsolások
- • Szárítógép problémák
- • Frekvenciaváltó
- • Kazettás magnó (deck) javítása
- • Sprint-Layout NYÁK-tervező
- • Aktív USB kábel készítése
- • Műhelyünk felszerelése, szerszámai
- • Li-Po - Li-ion akkumulátor és töltője
- • Mosogatógép hiba
- • Sztereó erősítő olcsón
- • Forrasztási 1×1 forrasztástechnikai miértek
- • Toroid transzformátor
- • Áramlökés határoló lágyindító
- • Muzeális készülékek-alkatrészek restaurálása
- • Érdekességek
- • Eredményjelző
- • Elfogadnám, ha ingyen elvihető
- • Hibrid erősítő
- • Elektromos távirányítós kapunyitó
- • Klíma szervizelés, javítás
- • Borhűtő vezérlő panel
- • Hegesztő inverter javítás
- • Mosógép vezérlők és általános problémáik
- • Li-Ion saját akkucsomag készítése
- • Kombikazán működési hiba
- • Rádióamatőrök topikja
- • Erősítő mindig és mindig
- • Oszcilloszkóp vétel, mit gondoltok?
- • Elektronikai témájú könyvek újságok
- • Lézer érzékelő
- • Logikai analizátor
- • VF2 végerősítő
- • Autós fejegységek kapcsolási rajza
- • Számítógép hiba, de mi a probléma?
- • Rádió javítás
- • Boombox javítás
- • Porszívó javítás
- • Fejhallgató erősítő
- • Autórádió építés, szerelés
- • Transzformátor készítés, méretezés
- • Elektromos sütő
- • MIka 6E kazán paraméter lista
- • Mobiltelefon hiba
- • ESR mérő
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Arduino
- • Hangszóró készítése
- • FET vezérlése
- • Napelem alkalmazása a lakás energia ellátásában
- • Általános antennás kérdések, válaszok
- • Kapcsolóüzemű táp 230V-ról
» Több friss téma
|
- 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.
Pic Simulátor IDE
ezeknek utánanézek.
A pickit 3-al ugyanúgy küldöm át a a programot, mint korábban: PGD/PGC/MCLR kombóval (ICSP)
Akkor az kilőve..
Már csak az a kérdés hogy a klon mennyire klon....?
Használható e vagy sem...
Sziasztok! Regiszter értékét tudok decimális változóval megadni?
Ezzel a szimulátorral figyelj oda, mert nem mindent úgy csinál mint a fizkai PIC. Az sem érdekli, hogy a quartzot, hogy konfigolod. Simán lefut a neki beállított frekivel. Más gondom is volt vele de részletekre már nem emlékszem.
Tudsz, a fordító minden számrendszert átfordít binárisra, csak azt értik a digitális eszközök.
Bocsánat, valóban szűkszavú voltam. MPlab C. Egy 8 bites regiszter utolsó 4 bitjét szeretném függvény alapján változtatni, csak decimális környezetben otthonosabban mozgok. A hozzászólás módosítva: Márc 8, 2017
A hardver kvarc beállítása jó (4MHz), másik progi fut rajta. A Simulátor beállítása is ugyan az, mint működő változatnál, tehát ez sem okozhatja a gondot.
Ha logikai hiba lenne (rossz cím, hivatkozás, stb., akkor a szimulátor azt kihozná (annyira gagyi nem lehet), gondolom.
Én inkább valami időzítési dologra gondolok, ebben vannak mindenféle késleltetések, hogy az LCD jól működhessen. Ezeknek az ütemezése lehet a gond - érzésem szerint, de ehhez már kevés vagyok, ezért kértem tanácsot.
A C alapértelmezett számrendszere a tizes.
unsigned char munka;
munka = 241; // 0xF1
munka ^= (munka ^ 12) & 0x0F; // Csak az alsó 4 bit fog megváltozni
A két sor lefuttatása után a munka tartalma 252 = 0xFC.
Idézet a PIC16F87xA adatlapjából (DS39582B-page 45):
Idézet: „Low-Voltage ICSP Programming (LVP) is enabled by default which disables the RB3 I/O function. LVP must be disabled to enable RB3 as an I/O pin and allow maximum compatibility to the other 28-pin and 40-pin mid-range devices.”
Ha LVP engedélyezett és az RB3 az LCD modul D7 kivezetésére magy (4 bites mód), a láb lebeghet illetve a modulban levő felhúzó ellenállás magas szintre viheti. Ha magas szint előfordulhat rajta akárcsk rövid ideig, a kontroller programozási módba léphet...
Már írtál majdnem egy oldalt, hoyg miért nem fut a 16F84 -re írt program a 16F877A -n, nem kellenhe kipróbálni a javasoltakat?
Pokoli szerencséd van:
- A del változóba betöltött érték maximális értéke 15, azaz nem érinti a 4. és 5. bitet. Mi történne, ha a programot kiegészítenéd megszakítás kezeléssel. A PIR1 gegiszter írása azonnal kiváltja a megszakítást azokon a biteken, ahol 1 érték íródik be és a hozzá tartozó megszakítás engedélyezett.
- A cmd azaz PIR2 regisztert valamiért nem használja a program... Szerintem valaki rájött, hogy hiányoznak a nem megvalósított bitek...
Teszteld le a szimulátort:
Miután a cmd változót nem használja a program, töröljük ki.
; data segment
CBLOCK 0x00C
del, ; variables for passing the parameters
temp, i ; local variables
ENDC
Működik a szimulátorban így is??? A hozzászólás módosítva: Márc 9, 2017
Természetesen magam is próbálkozok folyamatosan. Egyenlőre kevesebb, mint több sikerrel.
Nem azt várom, hogy megcsinálja valaki helyettem, csak ötleteket, amit köszönök.
Üdv!
Nagy valószínűséggel időzítési probléma lesz, ahogy írtad. A valós eltelt idő számlálója 200ms-ot mutat, ebből 100ms-nak kellene lennie minimum az LCD inicializálásnak és ehhez jön hozzá még a többi. De ha már használod ezt a programot, miért nem írod meg BASIC-ben? Főleg, ha csak ennyi lenne a kiírási feladat. Nem lenne egy egetverően nagy feladat, főleg úgy hogy a példák között van ilyen, azt hiszem pont 16F877A-ra.
Nem jó új vágányra terelni a tapasztalatlan programozót.
Idézet: „Értelemszerűen a hardver ugyan az (ami a 84a-val ment), csak PIC van cserélve és átdugdosva az eltérő lábkiosztás (és szám) miatt.”
Ha abból indulok ki, amit az idézetben állít, akkor a fenti hibákat kijavítva, az összekötéseket újra megvizsgálva, az esetleg hiányzó szűrőkondenzátorokat beépítve (az összehuzalozás megnöveli az induktivitásokat, így a kondenzátorokat közvetlenül a 16F877A táp és föld lábaihoz) és az eredetileg használt 4MHz -es kristállyal működnie kellene. 4MHz -nél egy utasítás 1us a 16F87xA -n is...
A szűrőkondi közvetlenül a foglalat lábára forrasztva (100nF kerámia, 2x a 877-nél mert két helyen kap tápot), 10KOhm-os felhúzóellenállás az MCLR lábra, kontrasztpoti, mind ok.
És ahogy írom és mutatom  84a-val megy a led villogtatás (3-as kép), és a kiíratás is.
Az angol az eredeti, a magyar már az enyém - 2-es, 1-es kép.
877-el is megy a fénysor, tehát a panel, PIC, oszcillátor jó.
A szimulátoron mindkét típus azonosan fut le, kijelzéssel.
A panelon viszont csak a 84-el.
Lehet, hogy nem túl jó a program, de a 84-en megy.
Próbálom tovább..
A cmd törlése a programból a panelon eredménytelen, a szimulátor csak a felső sort írja ki, azt is hibásan:
Nos akkor mégiscsak kezeli a kontroller sajátosságait a szimulátor. A cmd törlésével a temp került a PIR2 (a 7., 5., 2., 1. bit nem létezik, mindig 0) regiszterbe, de ezen a változón keresztül küldi a programod az adatokat az LCD -nek. Azt csinálja, amit vártam: Elrontja az adatokat...
Ha megfogadod a tanácsokat és
- a cblock 0x00C -t kijavítod végre cblock 0x020 -ra,
- a konfigurációs sor megadását kiegészíted az _LVP_OFF -fal,
működni fog....
No, átírtam a programot, hogy ne a B portot, hanem a D-t használja, így nincs "érdekütközés".
A fordítás és feltöltés lefut, de kijelzés az LCD-n nincs.
A szimulátor szerint ez is jó:
Hát, kivettem a cmd-t, átírtam a cblock-ot és kikapcsoltam az LVP-t is a konfigban.
Eredmény: szimulátor ok, nem ír be fals karaktereket, de a kijelző továbbra is kuka.
Több ötletem nincs, elkezdem az időzítést piszkálni. Az az érzésem, ott a baj.
TITLE "lcd4.asm" ; working with an LCD in the 4-bit mode
List P=16F877a, R=DEC
INCLUDE "p16F877a.inc"
; data segment
CBLOCK 0x020
del ; variables for passing the parameters
temp, i ; local variables
ENDC
; code segment
PAGE
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF
org 0 ; start program at the beginning of mem
goto start
msg1 ; first message to display
addwf PCL, f
dt " Welcome to", 0
msg2 ; second message to display
addwf PCL, f
dt "PIC programming", 0
start
bsf STATUS, RP0 ; change to BANK 1
clrf TRISB ^ 0x80 ; enable RB1-RB7 for output
movlw 0x7F ; enable internal Pull-Ups
movwf OPTION_REG ^ 0x80
bcf STATUS, RP0 ; back to BANK 0
call initLCD ; initialize LCD display
; output of the top row (msg1)
clrf i
L1 movf i, w
call msg1 ; get the next char
iorlw 0 ; end of string?
btfsc STATUS, Z
goto L2 ; YES - jump out of the loop
call writeDATA ; NO - send it to LCD
incf i, f ; update the char index
goto L1
L2 movlw 0xC0
call writeCMD ; move the cursor to the second line
clrf i ; clear the index of the second string
; output the bottom row (msg2)
L3 movf i, w
call msg2 ; get the next char
iorlw 0 ; end of string?
btfsc STATUS, Z
goto L4 ; YES - jump out of the loop
call writeDATA ; NO - send it to LCD
incf i, f ; update the char index
goto L3
L4 goto $ ; endless loop
; procedures
initLCD ; initialize LCD right after power up
movlw 15
movwf del
call delay ; a 15 msec delay after power is on
movlw 3
movwf PORTB ; start LCD init process
movlw 5
movwf del
call delay ; wait for 5 msec
movlw 3
movwf PORTB ; start LCD init process
bsf PORTB, 4 ; toggle the LCD Enable pin
bcf PORTB, 4
movlw 5
movwf del
call delay ; wait for 5 msec
bsf PORTB, 4 ; repeat the reset command (2nd time)
bcf PORTB, 4
movlw 40 ; wait for 200 usec
sublw 1
sublw 0
btfss STATUS, Z
goto $-3
bsf PORTB, 4 ; repeat the reset command (3rd time)
bcf PORTB, 4
movlw 40 ; wait for 200 usec
sublw 1
sublw 0
btfss STATUS, Z
goto $-3
movlw 2 ; initialize LCD 4-bit mode
movwf PORTB
bsf PORTB, 4 ; toggle the LCD Enable pin
bcf PORTB, 4
movlw 0x28 ; 2-line mode
call writeCMD
movlw 1
call writeCMD ; clear display
movlw 5 ; wait for 5 msec after clearing
movwf del
call delay
movlw 0x06 ; cursor move after each char
call writeCMD
movlw 0x0E ; turn on LCD and enable cursor
call writeCMD
return
writeCMD ; write to LCD a 1-byte command in W
movwf temp
swapf temp, w
andlw 0x0F ; leave only the high 4 bits in W
movwf PORTB
bsf PORTB, 4 ; toggle the E bit
bcf PORTB, 4
movfw temp ; proceed with the low bit
andlw 0x0F
movwf PORTB
bsf PORTB, 4 ; toggle the bit
bcf PORTB, 4
movlw 40 ; wait for 200 usec
sublw 1
sublw 0
btfss STATUS, Z
goto $-3
return
writeDATA ; write to LCD a 1-byte data in W
movwf temp
swapf temp, w
andlw 0x0F ; leave only the lower 4 bits in W
movwf PORTB
bsf PORTB, 5 ; sending data
bsf PORTB, 4 ; toggle the E bit
bcf PORTB, 4
movfw temp ; proceed with the low bit
andlw 0x0F
movwf PORTB
bsf PORTB, 5 ; sending data
bsf PORTB, 4 ; toggle the bit
bcf PORTB, 4
movlw 5 ; wait for 5 msec
movwf del
call delay
return
delay ; a delay for del milliseconds
movlw 200
sublw 1 ; this loop takes 5us*200 = 1ms
btfss STATUS, Z
goto $-3
decfsz del,f
goto delay
return
end
A hozzászólás módosítva: Márc 9, 2017
Az a szimulátor nem sok mindenre jó, mint ahogy Te is tapasztalod.
Van jobb (letölthető szabadon)?
Köszi, próbálom.
De előre szólok, hogy sikítok, ha azzal is jó - és nem megy a kijlző
Az a probléma, hogy egy BASIC-re kifejlesztett IDE szimulátorát használja az MPLAB-ban írt programjához. Így szerintem csak saját magával szúr ki, mert sok funkciótól elesik. Példának okáért a program követéstől, amit gondolom az MPLAB szimulátorában is megtalálni. Én csak arra akartam rávilágítani, hogy ha assembly nyelven szeretne megtanulni programozni, akkor arra koncentráljon és használja az MPLAB IDE-t, ha BASIC-ben, akkor pedig ezt. Nem jó keverni a dolgokat, mert abból ilyen problémák származnak.
Ha újabb verziót használsz, akkor a c:\Documents and settings\"sajátnév"\AppData\Roaming\OshonSoft\PIC Simulator IDE\ helyen találod meg.
Ha régebbit, akkor a program telepítési mappájában. Vagy az oshonsoft.com címen.
Nem tudom miért lenne Basicra fejlesztve? A hex fájlt kell betallózni, azt futtatja. Hogy mivel hoztad létre nem mindegy?
Maga a szimulátor gépközeli környezet, munkaregiszterrel, gépi kódokkal, stb.
Épp ezért csak egyszerűbb pgm-et lehet igazán követni (nekem), a bonyolultabb fordítmányok már nem láthatók át (vissza) se assembly-be, pláne nem Basic.re.
Szerintem..
A másikat még nem volt időm nézni - de fogom.
Szia Hp41C
A másodszorra küldött fájlok közül én is lefordítottam az .ASM -et Mplab 8.9 el. Ugyan az a HEX
lett min amit küldtél. Ezt beégetve már müködik a frekimérő. Na nem egyből lett jó.
--Gerjedt az MB506 előosztó. Ezt sikerült megoldani.
--Alacsony fr bemenetről átkapcsolva előosztós bemenetre és nagy bemenő jelszint esetén
a kijelzőről eltünt minden. Ilyenkor leállt az oszcillátor egy rövid időre. Később hiába indult
ujra, nem jelzett ki semmit. A hiba a tápellátásban volt. Ezekben az esetekben a +5V-on
negatív és pozitív ugrások jelentek meg. 9V-os elemmel táplálva ezek megszüntek.
Még a pontos 10 MHz-et kell beállítani h pontosan mérjen.
Összefoglalva: Köszi a sgítséget a program átírásával. Minden elismerésem.
ramok A hozzászólás módosítva: Márc 10, 2017
No, megy...
Kombináltam a te javaslatod a portcserével és lőn fényesség a kijelzőn!
Valamiért a portB-vel nem megy, hiába az LVP_OFF. Átírva portD-re jó.
Nem teljesen értem, de megy. A cmd maradt.
TITLE "lcd4.asm" ; working with an LCD in the 4-bit mode
List P=16F877a, R=DEC
INCLUDE "p16F877a.inc"
; data segment
CBLOCK 0x020
del, cmd ; variables for passing the parameters
temp, i ; local variables
ENDC
; code segment
PAGE
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF
org 0 ; start program at the beginning of mem
goto start
msg1 ; first message to display
addwf PCL, f
dt "Hello Nagyfiam!!", 0
msg2 ; second message to display
addwf PCL, f
start
bsf STATUS, RP0 ; change to BANK 1
clrf TRISD ^ 0x80 ; enable RD(B)1-RD(B)7 for output
movlw 0x7F ; enable internal Pull-Ups
movwf OPTION_REG ^ 0x80
bcf STATUS, RP0 ; back to BANK 0
call initLCD ; initialize LCD display
; output of the top row (msg1)
clrf i
L1 movf i, w
call msg1 ; get the next char
iorlw 0 ; end of string?
btfsc STATUS, Z
goto L2 ; YES - jump out of the loop
call writeDATA ; NO - send it to LCD
incf i, f ; update the char index
goto L1
L2 movlw 0xC0
call writeCMD ; move the cursor to the second line
clrf i ; clear the index of the second string
; output the bottom row (msg2)
L3 movf i, w
call msg2 ; get the next char
iorlw 0 ; end of string?
btfsc STATUS, Z
goto L4 ; YES - jump out of the loop
call writeDATA ; NO - send it to LCD
incf i, f ; update the char index
goto L3
L4 goto $ ; endless loop
; procedures
initLCD ; initialize LCD right after power up
movlw 15
movwf del
call delay ; a 15 msec delay after power is on
movlw 3
movwf PORTD ; (B)start LCD init process
movlw 5
movwf del
call delay ; wait for 5 msec
movlw 3
movwf PORTD ; (B)start LCD init process
bsf PORTD, 4 ; (B)toggle the LCD Enable pin
bcf PORTD, 4 ; (B)
movlw 5
movwf del
call delay ; wait for 5 msec
bsf PORTD, 4 ; (B)repeat the reset command (2nd time)
bcf PORTD, 4 ; (B)
movlw 40 ; wait for 200 usec
sublw 1
sublw 0
btfss STATUS, Z
goto $-3
bsf PORTD, 4 ; (B)repeat the reset command (3rd time)
bcf PORTD, 4 ; (B)
movlw 40 ; wait for 200 usec
sublw 1
sublw 0
btfss STATUS, Z
goto $-3
movlw 2 ; initialize LCD 4-bit mode
movwf PORTD ; (B)
bsf PORTD, 4 ; (B)toggle the LCD Enable pin
bcf PORTD, 4 ; (B)
movlw 0x28 ; 2-line mode
call writeCMD
movlw 1
call writeCMD ; clear display
movlw 5 ; wait for 5 msec after clearing
movwf del
call delay
movlw 0x06 ; cursor move after each char
call writeCMD
movlw 0x0E ; turn on LCD and enable cursor
call writeCMD
return
writeCMD ; write to LCD a 1-byte command in W
movwf temp
swapf temp, w
andlw 0x0F ; leave only the high 4 bits in W
movwf PORTD ; (B)
bsf PORTD, 4 ; (B)toggle the E bit
bcf PORTD, 4 ; (B)
movfw temp ; proceed with the low bit
andlw 0x0F
movwf PORTD ; (B)
bsf PORTD, 4 ; (B)toggle the bit
bcf PORTD, 4 ; (B)
movlw 40 ; wait for 200 usec
sublw 1
sublw 0
btfss STATUS, Z
goto $-3
return
writeDATA ; write to LCD a 1-byte data in W
movwf temp
swapf temp, w
andlw 0x0F ; leave only the lower 4 bits in W
movwf PORTD ; (B)
bsf PORTD, 5 ; (B)sending data
bsf PORTD, 4 ; (B)toggle the E bit
bcf PORTD, 4 ; (B)
movfw temp ; proceed with the low bit
andlw 0x0F
movwf PORTD ; (B)
bsf PORTD, 5 ; (B)sending data
bsf PORTD, 4 ; (B)toggle the bit
bcf PORTD, 4 ; (B)
movlw 5 ; wait for 5 msec
movwf del
call delay
return
delay ; a delay for del milliseconds
movlw 200
sublw 1 ; this loop takes 5us*200 = 1ms
btfss STATUS, Z
goto $-3
decfsz del,f
goto delay
return
end
Erről jut eszembe a kérdés:
az ICSP-n keresztüli felprogramozásnál hogy szokták megoldani, hogy az RB6/PGD RB7/PGC lábakon keresztül menjen a feltöltés, aztán a program viszont adat kimenetként (bemenetként) használja?
Amúgy nem ez volt itt is gond? A kijelzőhöz csak az alsó 4-bit van használva RB0-3, és a RB6-7 szabad volt, de az RB3-is többfunkciós (LVP).
Köszi az eddigieket
|
|