Fórum témák
» Több friss téma |
Helo
Így is próbáltam. void main( void ) { ADCON1 = 0x0F; while(1) { OpenXLCD( FOUR_BIT & LINES_5X7 ); putrsXLCD("abcdefgh"); } }
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).
Helo
Így sokkal látványosabb lett! ![]() Teleírja a kijelzőt. ahgfdcbahgfdcb ahgfdcbahgfdcb
Ha a kiírást is kiveszem a ciklusból, akkor meg csak az első karaktert írja ki.
Ó 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!
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ó?
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: Hát nem! Az assembler tudtommal 1-nek veszi az alapértelmezett célregisztert... „"MOVF ADRESL,0" -nél miért kell a 0? Így is úgyis a workbe rakja nem?”
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
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... ![]()
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
Akármennyit írok be, mindig sír a proteus.
Szia!
A következő sorrendben állítsd be az A/D-t:
Szia
Közben rájöttem én is hogy a sorrend nem mindegy, először nem árt beállítani a frekit
![]() Köszi!
Í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 ![]()
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?
Szia!
Varázsszó: végtelen ciklus (endless loop)
Ezt eddig én is tudtam hogy egy véget nem érő ciklusnak a neve végtelen ciklus
![]()
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...
Értem, elnézést El_Pinyo! Köszi a segítséget!
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.
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
É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)...
Illetve még előtte az OSCCON regisztert állítottam be.
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.
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
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
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...
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
![]()
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
Köszi.
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... |
Bejelentkezés
Hirdetés |