Sziasztok!
PIC16F676-al küzdök. A programot megírtam PIC16F627-re, gond nélkül megy. A feladat egyszerű, van egy lámpa és egy buzzer, mint kimenet, és egy digitális bemenet. Ha van bemenet, akkor a kimenetek nullák. Ha a bemenet megszűnik, és kb 5 másodpercig nincs, akkor a buzzer szól kb 3 másodpercig (a buzzernek csak táp kell, hogy fütyüljön) ezzel együtt felkapcsol a lámpa, és égve marad, míg meg nem jön a bemenet, innentől kezdődik elölről.
A konfig: Lámpa PORTC,5 a buzzer PORTC,4 a bemenet pedig PORTC,3. Belső oszcillátor, az MCLR pedig 10k-val tápra kötve. PORTA nem használt.
De még azt se tudtam megcsinálni, hogy a lámpa ki-be kapcsolgasson, ha a TMR0 túlcsordul, vagy nulla. A TMR0 pörög, mert ha kiíratom a PORtC-re, akkor szkóppal látszottak a különböző frekvenciájú jelek.
Mit szúrtam el?
Megoldás:
Hiába tiltottam le a WatchDogot a config-word-ben, a WDT még aktív maradt, és kb 3 másodpercenként resetelt. A megoldást a RESET rutin végére írt CLRWDT parancs oldotta meg, ami a SATATUS-ban 1-re állítja a T0 és PD biteket.
Az adatlap 33. oldalán is szerepel ez a figyelmeztetés.
Üdv: Jácint
;**************************************************************************
;* Hardw. Rev: P8048'1 Softw. Rev: 1.20 *
;* OSC.......: XT 4MHz Max. POWER.....: 12V DC *
;**************************************************************************
#include "p16F676.inc"
__config 0x3FEC
;==========================================================================
; Variable Definition
;==========================================================================
TIME1 EQU H'20' ;Used in delay routine
TIME2 EQU H'21' ; " " "
ORG 0 ;Reset vector address
GOTO RESET ;goto RESET routine when boot.
ORG 4
GOTO MEGSZAK
MEGSZAK
RETFIE
; *********************************************
; * Example of a delay routine *
; *********************************************
; **********************************
; ** RESET : main boot routine **
; **********************************
RESET
MOVLW B'00000111' ;Disable Comparator module's
MOVWF CMCON
CLRF TMR0
CLRF INTCON ; Disable interrupts and clear T0IF
BSF STATUS,RP0 ;Switch to register bank 1
CLRF ANSEL ; Analóg bemenet digitálisra
MOVLW B'11000111' ;Set PIC options (See datasheet).
MOVWF OPTION_REG ;Write the OPTION register.
MOVLW B'00000000'
MOVWF INTCON ;Disable interrupts
MOVLW B'11001111'
MOVWF TRISC ;RC input/output
MOVLW B'11111111' ;all RA ports are inputs
MOVWF TRISA
BCF STATUS,RP0 ;Switch Back to reg. Bank 0
CLRF PORTC
BSF STATUS, RP0 ; Bank1
CLRF PIE1 ; Disable peripheral interrupts
BCF STATUS, RP0 ; Bank0
CLRF PIR1 ; Clear peripheral interrupts Flags
BLABLA
BSF PORTC,5
WAIT1
movf TMR0,W
btfss STATUS,Z
GOTO WAIT1 ; if not zero yet, keep WAITing
BWAIT
movf TMR0,W
btfsc STATUS,Z
GOTO BWAIT
; Timer has overflowed
BCF PORTC,5
AWAIT2
movf TMR0,W
; subwf TMR0,W
btfss STATUS,Z
GOTO AWAIT2 ; if not zero yet, keep WAITing
CWAIT
movf TMR0,W
btfsc STATUS,Z
GOTO CWAIT
goto BLABLA
END
Kis komment a megoldáshoz:
Config bitek jelentése a 9.1/Config bits(pg.56) szerint
bitek helyiértéke felső sorban, alatta a bináris érték:
.......................87654 3 210
__config 0x3FEC = 1111111110 1 100
A 3. bit a WDTE értéke '1', tehát WDT enabled.
Nem tudom milyen programot használsz az égetéshez, de ha MPLab-al beimportálod a .hex fájlt, meg tudod nézni a config bitek értékét és elvileg azonnal kiugrik egy ilyen jellegű hiba.
Üdv, ty
0
Szia ty!
Épp ez volt a bosszantó, hogy tudtam, melyik a WDT bit, és hiába állítottam nullára, nem változott semmit. Viszont a hiba vélhetőleg pont ebből maradhatott. Először egy működő program configját másoltam be, ami használta a WDT-t, és akkor nullázódott ki a STATUS regiszterben a TO és PD bit. Utána hiába kapcsoltam ki a WDT-t, mivel a TO és PD biteket nem reseteltem, így a PIC azt hitte, még mindig fent áll a WatchDog-hiba. Azt még kipróbálom délután, hogy ha most kiveszem a CLRWDT parancsot a programból, akkor jó marad-e. Ha igaz az elméletem, akkor jó kis tanulság lett belőle. Bár érdekes, hogy a doksi szerint egy POR után mindkét bitnek 1-ben kellene lennie.
Üdv: Jácint
0
Sziasztok!
Mint fent is leírtam, hiába volt kivéve a config-ban a Watchdog, még a programba is törölni kellett egy CLRWDT paranccsal. Elég volt csak egyszer.
Üdv: Jácint
0
Szia!
Az adatlap 33. oldalán azt írja, hogy a váratlan reset elkerüléséhez használd a következő kódot az előosztó beállításához:
clrwdt
bsf status,rp0
movlw b'xxxx0xxx'
movwf option_reg
bcf status,rp0
Úgy látszik nem véletlenül kell így csinálni! Én is jártam így, egy Avr-el, nem ment a digitális kimenet, analóg funkciója nem volt , viszont ennek ellenére analóg módra lehetett kapcsolni sőt az volt az alapértelmezett. Az adatlapon egy félmondatban volt eldugva az infó.
Üdv,
Oszi
0
Szia Oszi!
Köszönöm. Apró buktatók, de jó időre megjegyeztem, mint azt is, ennél a PIC-nél (meg gondolom másikaknál is, ahol van analóg bemenet), hogy ha egy portot digitálisan akarok használni, akkor ki kell kapcsolni az analóg módot (ANSEL), mert az az alapértelmezett.
Üdv: Jácint
0
Szia !
Ezt az őrületesen bonyolult feladatot egy 74123 dual monoflop és egy 7474 D flip-flop egyik fele tökéletesen megoldja minden programozás nélkül 6 alkatrésszel. Na jó 1-2 szűrőtag talán még kell de nem több. A 74-es sorozat helyett választhatsz 74HC-t vagy bármit úri ízlésed szerint. A 6 alkatrészből kettő az időzítő ellenállás, melyek helyén potit/trimmert alkalmazva állíthatod az időket.
Üdv. laci
P.s. Sose értettem: Ilyen egyszerű feladatnhoz miért kell bohóckodni mikrovezérlővel.
0
Szia!
Igen, tényleg elég lett volna pár alkatrész, de ahhoz nyákot kellett volna csinálni, vagy joker-nyákon bedrótozni. Nekem viszont akadt olyan kész panelom több darab (mert 8 kell), amin rajta van az adott PIC, rajta van egy high side switch IC, ami bírja a lámpát, és rajta van még egy tranzisztor, ami tudja kapcsolni a buzzert, aztán rajta van az 5V-os stabilizátor IC is. Csupán csak program kellett rá. De más applikációt is ki lehet találni erre a panelra, ezzel az IC-vel.
Üdv: Jácint
0
Szia !
Ez így nem derült ki eddig. Így persze más a leányzó fekvése annak fényében különösen hogy 8 darab kell.
Az izzó kapcsolása egy külön téma mert számtalan megoldása lehet az áramnem, feszültség, teljesítmény, izzó, LED függvényében. Bár ezen áramköri rész nem szerves része az időzítő áramköri résznek. Ha nulláról kellene indulnom részemről maradnék az "analóg" megoldásnál az ennél a feladatnál meglévő egyszerűsége és mindenki hozzáértő általi átláthatóságával illetve javíthatóságával. Teszem azt kimész Londonba és elromlik a cucc dobhatják ki az egészet vagy visszajössz "megberhelni"?
Üdv. Laci
0
Szia Laci!
Maga a feladat mellékes. Lehetett volna annyi is, hogy megnyomok egy gombot, és x ideig bekapcsol egy kimenet. A kérdés arra vonatkozott, a PIC maga miért nem csinálja azt, amit szeretnék 3 nap után sem, holott ezzel a PIC-kel már dolgoztam. A másik része a dolognak, hogy ilyen egyszerű feladatok alapján lehet megismerni igazán a programozást, és eljutni egy-egy bonyolultabb programig, mikor már az "analóg" technika alkatrészköltsége hússzorosa egy ilyen kis 14-16 lábú IC-nek.
Üdv: Jácint
0
Sziasztok!
Érdekes. 3 másodpercenként reseteli magát. Mintha a WatchDog resetelné, hiába tiltom le.
Az egyik kimenetet a beállítások után 3-szor ki-be kapcsoltam, utána egy üres ciklusba kergettem. Szkópon látszik, hogy újraindulgat.
Ilyenkor mi van?
Üdv: Jácint
0
Szia!
Két megjegyzés:
1, konfigurációs bitek: Ellenőrizd újra, hogy ezt szeretnéd-e pl: pl az alsó 4 bit C-re van állítva ami belső oszcillátor dig io
Ami jó is lehet + WDT be ami meg nem jó mert nem kezeled le. Inkább kapcsold ki a wdt, mert szerintem ez reseteli a pic-et. datasheet 56. oldal 0x3fe4
2, Regiszter bankot mindig be kell állítani, mert okozhat meglepetést a RESET utáni részben is kezd ezzel, még ha a default értéke is van a biteknek.
Üdv,
Oszi
0
Szia Oszi!
Köszönöm az észrevételt, délután megnézem.
Üdv: Jácint
0
Szia Jaca!
Milyen környezetben dolgozol? MPLab? Annak van debuggere amivel sorról-sorra futtathatod a kódodat.
Változást érdemes összevetni, hogy mi a két proci között a különbség.
Ami biztos az a config bitek, esetleg timerek configja, memória címek, stb.
ha át akarod írni C-re abban szívesen segítek, bár tudom nem ez volt a kérdés...
Üdv, ty
0
Szia!
Notepad + + ban írom :) Az a legfurcsább, hogy olyan, mintha nem venné figyelembe a zero flag-t. A 627-nél TMR1-et használtam, és a megszakítás bitet figyeltem, ami túlcsordulásnál jött, hibátlanul működött, ennél az sem, azért próbáltam TMR0-val. Azért is írtam bele, hogy először várjon, amíg nulla, aztán várjon, amíg nem nulla. Már a sírba visz, hogy egy ilyen alap művelettel elbukok. Az MPLab elvileg fent van a benti gépemen, majd megdebuggolom, bár még nem használtam.
Üdv: Jácint
0
Soronkénti kommenttel talán átlátnám, de nem használok ilyet.
Timert hol inicializálod és kapcsolod be?
0
Szia!
Az OPTION_REG-ben.
http://ww1.microchip.com/downloads/en/DeviceDoc/40039F.pdf
14. oldal
Üdv: Jácint
0