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   57 / 1210
(#) Amjad válasza icserny hozzászólására (») Márc 15, 2010 /
 
Helo
Így is próbáltam.
void main( void )
{

ADCON1 = 0x0F;

while(1)

{
OpenXLCD( FOUR_BIT & LINES_5X7 );
putrsXLCD("abcdefgh");
}

}
(#) icserny válasza Amjad hozzászólására (») Márc 15, 2010 /
 
Az OpenXLCD szerintem maradhatna a cikluson kívül, a kiírás után meg kellene egy várakozás (1 - 5 másodperc).
(#) Amjad válasza icserny hozzászólására (») Márc 15, 2010 /
 
Helo
Így sokkal látványosabb lett!
Teleírja a kijelzőt.
ahgfdcbahgfdcb
ahgfdcbahgfdcb
(#) Amjad válasza Amjad hozzászólására (») Márc 16, 2010 /
 
Ha a kiírást is kiveszem a ciklusból, akkor meg csak az első karaktert írja ki.
(#) Amjad válasza Amjad hozzászólására (») Márc 16, 2010 /
 
Ó Anyám!
Jól megszívatott. Alapból balra léptette a betűket, így csak az első látszott.
Ez megoldotta a problémámat :
WriteCmdXLCD(SHIFT_DISP_LEFT);

Köszönöm a hozzászólásokat!
(#) zenetom hozzászólása Márc 21, 2010 /
 
Hali!
ADC-t akarok kezelni asm-ben, találtam is kódrészletet itt, átírtam 18F1320-ra, meg kicsit módosítottam, de proteusban szimulálva nem akar jól működni...
Idézet:
„START
CLRF PORTB
CLRF LATB
MOVLW b'1110000'
MOVWF ADCON1

MOVLW b'00000000'
MOVWF TRISB
analog
MOVF ADRESL,0
MOVWF LATB
goto analog
END”


AZ első kérdésem az hogy "MOVF ADRESL,0" -nél miért kell a 0? Így is úgyis a workbe rakja nem?
Egyébként ha nem rakok 0-át akkor a PORTB-n sehol sincs jel, hiába állítgatom a potit proteusban, ha rakok 0-át akkor se reagál a potira semmit, viszont az RB3 és RB5 kivételével az összes többin van jel.
Vagy ez így jó?
(#) icserny válasza zenetom hozzászólására (») Márc 21, 2010 /
 
ADCON1 beírása csak azt modja meg, hogy melyik láb legyen digitális I/O, melyik analóg bemenet. Ettőlaz ADC modul mág nem csinál semmit...
Idézet:
„"MOVF ADRESL,0" -nél miért kell a 0? Így is úgyis a workbe rakja nem?”
Hát nem! Az assembler tudtommal 1-nek veszi az alapértelmezett célregisztert...
(#) Hp41C válasza zenetom hozzászólására (») Márc 21, 2010 /
 
Szia!

- Írj inkább 'w' -t a 0 helyett és 'f' -et az 1 helyett, olvashatóbb lesz a forrásod:

MOVF ADRESL,w

vagy

decfsz Counter,f

- Az A/D átalakító paramétereit be kell állítani, a mérendő csatornát ki kell választani, egy kicsit várni kell, el kell indítani az átalakítást, meg kell várni a végét... Aztán lehet felhasználni a mérés eredményét. A továbbiakban a csatorna kiválasztásától elég ismételgetni...

Szia
(#) zenetom válasza Hp41C hozzászólására (») Márc 21, 2010 /
 
Miért is gondoltam hogy ez ilyen egyszerű lesz, de rájöttem és működik!
Mostmár értem miért van az ADCON0 és az ADCON2, az adatlapban meg is találtam melyik bit mire való, köszönöm icserny-nek is a segítséget!
szerk.: illetve lenne még kérdésem...
Idézet:
„bit 2-0 ADCS2:ADCS0: A/D Conversion Clock Select bits
000 = FOSC/2
001 = FOSC/8
010 = FOSC/32
011 = FRC (clock derived from A/D RC oscillator)(1)
100 = FOSC/4
101 = FOSC/16
110 = FOSC/64
111 = FRC (clock derived from A/D RC oscillator)(1)”

itt a mintavételezés sebességét lehet beállítani (ezek az ADCON2-ben vannak) ?
Lehet csak a proteus hibája, de csatoltam a képet hogy szerinte hamarabb elkezdődik a konverzió mint kéne...

ADC_PIC.JPG
    
(#) Hp41C válasza zenetom hozzászólására (») Márc 21, 2010 /
 
Szia!

Itt a belső A/D átalakítónak menő órajel ferekvenciáját lehet beállítani. Az adatlapban olvasható az A/D maximális órajel frekvenciája, itt olyan órajel forrást kell választani, ami nem haladja meg. Ahogy írtam, a csatorna kiválasztása és az átalakítás elindítása között min. 2 Tad időt kell várni...

Szia
(#) zenetom válasza Hp41C hozzászólására (») Márc 21, 2010 /
 
Akármennyit írok be, mindig sír a proteus.
(#) Hp41C válasza zenetom hozzászólására (») Márc 21, 2010 /
 
Szia!

A következő sorrendben állítsd be az A/D-t:

  1. CLRF PORTB
  2. CLRF LATB
  3. MOVLW b'10011110' ; Right justify, ACQT = 6Tad, ADC Fosc/64
  4. MOVWF ADCON2  
  5. MOVLW b'01110000' ; RA3..0 alanog
  6. MOVWF ADCON1
  7. MOVLW b'00000001' ; Vref: Vcc - Vss, Ch=0, A/D on
  8. MOVWF ADCON0

Szia
(#) zenetom válasza Hp41C hozzászólására (») Márc 21, 2010 /
 
Közben rájöttem én is hogy a sorrend nem mindegy, először nem árt beállítani a frekit
Köszi!
(#) zenetom válasza zenetom hozzászólására (») Márc 21, 2010 /
 
Írtam nokia 3310-re egy egyszerű programot, ami inicializálja, meg kiír egy bájtot, de természetesen nem jó.
Csak hogy tisztázva legyenek a dolgok:
A START és END közötti rész ugye csak egyszer hajtódik végre?
Szubrutinban lehet szubrutint hívni így:
Idézet:
„Command_egy ;parancs modban 1 az adatvonalon
CALL DELAY
BCF LATB,0
BSF LATB,1
BCF LATB,2
CALL DELAY
BSF LATB,0
RETURN”



Idézet:
„DELAY ;Delay labelje
MOVLW d'40'
MOVWF T2
DEL1
MOVLW d'10'
MOVWF T3
DEL2
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ T3,f
GOTO DEL2
DECFSZ T2,f
GOTO DEL1
RETURN”


Csak mert az egész program ismétlődik egymás után... a valóságban is, nem csak a proteusban
(#) zenetom válasza zenetom hozzászólására (») Márc 21, 2010 /
 
Közbe kiderült hogy akármilyen kis programot csinálok, az egész ismétlődni fog. Valamit a konfig biteknél kell beállítani, hogy a START és az END közötti részt csak egyszer hajtsa végre?
(#) El_Pinyo válasza zenetom hozzászólására (») Márc 21, 2010 /
 
Szia!
Varázsszó: végtelen ciklus (endless loop)
(#) zenetom válasza El_Pinyo hozzászólására (») Márc 21, 2010 /
 
Ezt eddig én is tudtam hogy egy véget nem érő ciklusnak a neve végtelen ciklus
(#) bbalazs_ válasza zenetom hozzászólására (») Márc 21, 2010 /
 
A kollega ugy ertette, hogy a vegere rakj be egy vegtelen ciklust.
vegevan:
bra vegevan

A tobbszoros vegrehajtas oka, hogy az utolso utasitas utan is van ertek az eeprom kovetkezo cimen, ami jellemzoen utasitaskent is felfoghato, igy szepen vegigcsorog a letezo memoria vegeig, majd ujbol a 0000-as cimrol kezdi a vegrehajtast, ahol pedig a te programod vektora van...
(#) zenetom válasza bbalazs_ hozzászólására (») Márc 21, 2010 /
 
Értem, elnézést El_Pinyo! Köszi a segítséget!
(#) zenetom hozzászólása Márc 25, 2010 /
 
Hali!
Azt hiszem nagy fejszébe vágtam a fejszét.
A 18F1320-as adatlapjában (ilyenem van) találtam egy "IMPLEMENTING A REAL-TIME CLOCK USING A TIMER1 INTERRUPT SERVICE" asm kódot:

RTCinit

MOVLW 0x80 ; Preload TMR1 register pair
MOVWF TMR1H ; for 1 second overflow
CLRF TMR1L
MOVLW b’00001111’ ; Configure for external clock,
MOVWF T1OSC ; Asynchronous operation, external oscillator
CLRF secs ; Initialize timekeeping registers
CLRF mins ;
MOVLW .12
MOVWF hours
BSF PIE1, TMR1IE ; Enable Timer1 interrupt

RETURN


RTCisr

BSF TMR1H, 7 ; Preload for 1 sec overflow
BCF PIR1, TMR1IF ; Clear interrupt flag
INCF secs, F ; Increment seconds
MOVLW .59 ; 60 seconds elapsed?
CPFSGT secs
RETURN ; No, done
CLRF secs ; Clear seconds
INCF mins, F ; Increment minutes
MOVLW .59 ; 60 minutes elapsed?
CPFSGT mins
RETURN ; No, done
CLRF mins ; clear minutes
INCF hours, F ; Increment hours
MOVLW .23 ; 24 hours elapsed?
CPFSGT hours
RETURN ; No, done
MOVLW .01 ; Reset hours to 1
MOVWF hours

RETURN ; Done

Fordításnál az MPLAB a T1OSC-nál kiabál hogy 'Symbol not previously defined ' és igaza is van, mert nincs is ilyen regiszter. Viszont van T1CON regiszter, ami a timer1 control register, nem azt kéne oda írni..?
Ráadásul mivel ez megszakítás lesz, nem kéne BANK-ot váltani? Egyelőre elég lenne a "secs" változót kiküldeni pl. PORTB (LATB) -re.
(#) vilmosd válasza zenetom hozzászólására (») Márc 25, 2010 /
 
Hali
Probald meg ugy hatha mukodik. A bankvaltas nem szukseges mert Access RAM-ot hasznal a program ( doksi 5.10 bekezdes). A program- es az adat-memoria kezelese nem azonos. A programmemoria cimzest a BSR nem befolyasolja es vica-versa. Tehat az ISR fut a a sajat cimen.
Udv Vili
(#) zenetom válasza vilmosd hozzászólására (») Márc 25, 2010 /
 
Értem, viszont a T1CON-nal már nem visít.
Az RTCinit-et elég a főmenüben egyszer meghívni?
Az RTCisr-t pedig egy végtelen ciklusba rakni, mellé a 'secs' kiküldését...? Viszont így nemjó, mert a proteusban túl gyors (ráadásul a proci se tudja szimulálni 100% használat mellett se)...
(#) zenetom válasza zenetom hozzászólására (») Márc 25, 2010 /
 
Illetve még előtte az OSCCON regisztert állítottam be.
(#) vilmosd válasza zenetom hozzászólására (») Márc 25, 2010 /
 
Hali
Az RTCinit-et a main elejen egyszer kell meghivni, ezzel elintezed az inicializalast. A RTCisr-t pedig be kellene tenni interrupt cimre es neked semmi dolgod nincs vele utana. Automatikusan dolgozik. Nagyon vigyazni kell: a RETURN a subrutin vege, RETFIE az ISR vege! Tehat a RETisr rutinban ki kell cserelni a RETURN-okat RETFIE-re. Mellette meg nem art elmenteni a w, status regisztereket.
  1. ORG     0x0018
  2.  
  3.                 movff   STATUS,STATUS_TEMP      ;save STATUS register
  4.                 movff   WREG,WREG_TEMP          ;save working register
  5.                 movff   BSR,BSR_TEMP            ;save BSR register
  6.  
  7. ;       *** low priority interrupt code goes here ***
  8.  
  9.  
  10.                 movff   BSR_TEMP,BSR            ;restore BSR register
  11.                 movff   WREG_TEMP,WREG          ;restore working register
  12.                 movff   STATUS_TEMP,STATUS      ;restore STATUS register
  13.                 retfie

A proteust nem ismerem (probaltam mar), de a MPLAB szimulatoraban nincsenek problemak a STEP uzemmodban. Probald meg azzal. Ott jol lathatod a regisztereket, memoriat, es szepen lepked vegig az ASM utasitasokon. A WATCH ablakba berakod a valtozojaidat es maris latsz mindent. En szinte csak azt hasznalom sok eve es meg nem tertem at mas szimulatorra.
Udv Vili
(#) zenetom válasza vilmosd hozzászólására (») Márc 25, 2010 /
 
Egyébként csak pár hete kezdtem el PIC-ezni .
Akkor az OSCCON-nal nem kell foglalkozni, a RTCinit állítja be a timert?
Nagyjábból értem a megszakítást, az RTCisr-t így kell berakni az interrupt címre? :
...
ORG 000H
GOTO START
ORG 0008H
GOTO RTCisr
START ;itt kezdödik a main
...

A START (vagyis a main) részben beállítom az adcont meg a tris-t ezután meghívom az RTCinit-et, aztán márcsak a 'secs'-et kell küldeni LATB-re egy végtelen ciklusban?
Köszönöm az eddigi válaszokat!
Elnézést a sok kérdésért, csak annyira izgalmas

szerk.: a regiszterek mentését így kell elhelyezni? :

ORG 000H
GOTO START
ORG 0008H
GOTO RTCisr

ORG 0x0018
movff STATUS,STATUS_TEMP ;save STATUS register
movff WREG,WREG_TEMP ;save working register
movff BSR,BSR_TEMP ;save BSR register

; *** low priority interrupt code goes here ***

movff BSR_TEMP,BSR ;restore BSR register
movff WREG_TEMP,WREG ;restore working register
movff STATUS_TEMP,STATUS ;restore STATUS register
retfie
(#) icserny válasza zenetom hozzászólására (») Márc 25, 2010 /
 
A rövid programrészleteket a Kód gombbal szúrd be! Így olvashatatlan. A kód típusát C-ről írd át benne asm-ra így:

{code=asm}program ide{/code}

(Csak a kapcsos helyett szögletes legyen a zárójel, de azt úgy nem írhattam ide...
(#) zenetom válasza icserny hozzászólására (») Márc 25, 2010 /
 
Egy darabig nem írok, megbolondult az MPLAB (vagy a proteus). Hogyan lehet futtatni MPLAB-ban a progit? Figyelni a változókat.. stb? Leépítettem a programot olyan alacsonyra hogy csak egy változó van benne amit kiírok PORTB-re és nem azt írja ki. Le merném fogadni hogy ilyen is csak velem történik meg
(#) Hp41C válasza zenetom hozzászólására (») Márc 25, 2010 /
 
Szia!

Debugger / Select tool - válaszd a Mplab Sim-et.
Fordítsd újra és máris indíthatod (lépésenként) ...

View / Watch megnyitja a változókat megjelenítő ablakot. A "Symbol name" mezőre kattintva beírhatod a pic előre definiált és a saját szimbólumaid nevét. A "Value" mezőbe klikkentve át lehet írni a változó értékét....

Szia
(#) zenetom válasza Hp41C hozzászólására (») Márc 25, 2010 /
 
Köszi.
  1. CBLOCK  0x20                    ;A 0x20 egy szabad memória rész kezdő címe
  2.         D1
  3.         ENDC
  4.  
  5.         ORG     0
  6.  
  7. START  
  8.         CLRF PORTB
  9.         CLRF LATB      
  10.         MOVLW b'00000000'
  11.         MOVWF TRISB
  12.         MOVLW b'01111111'
  13.         MOVWF ADCON1
  14.         MOVLW b'00000001'
  15.         MOVWF D1
  16. CIMKE
  17.         MOVLW D1
  18.         MOVWF LATB
  19.         GOTO CIMKE
  20.  
  21.         END


Tehát elvileg a LATB 0. bitjén (vagyis az RB0-án) kéne csak 1-nek lennie, ehelyett a watch is mutatja hogy nem ott van az 1-es ahol lennie kéne...

nemjo.JPG
    
(#) potyo válasza zenetom hozzászólására (») Márc 25, 2010 /
 
MOVLW=Move LITERAL to Work, vagyis töltsd be a konstanst a W-be.

MOVF= Move File to, vagyis töltsd be a fájl tartalmát a valahová. Itt a fájl a memória egy rekeszét jelenti.
Következő: »»   57 / 1210
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