|
Fórum » PIC programozás assemblyben
Az adatlap leirja, hogy az ANSEL regiszterek nem erhetok el access rambol. Tehat az adatlapban nezd meg, melyek azok a regiszterek, amik 05f alatt vannak es azoknal a BSR-t 0f-re kell allitani es BANKED modon kell rajuk hivatkozni.
szoval szurd be ezeket:
movlb 0f
clrf ANSELD, BANKED
movlb 0
Óriási köszönet! MŰKÖDIK!!!
Tisztelt fórumtársak!
Talán 1 hónapja láttam itt valamelyik topic-ban 1 csatolmányt?
PIC-es *.asm volt amiben az LCD lábait (2x16 kar) az elején definiálta a szerző, majd úgy használta fel. Arra még emlékszem, hogy 4 bites módban volt. Tudna valaki segíteni?
Szia!
Ilyesmire gondoltál?
;*-----------------------------------------------------------------------------*
;* Szöveg kiírása LCD kijelz?re 4 bites adatúttal *
;* Létrehozva:2014.11.22. *
;*-----------------------------------------------------------------------------*
INCLUDE <P18F14K22.INC> ; includde fájlok megadása
RADIX hex ; alapértelmezet számrendszer megadása
CONFIG FOSC = IRC ; bels? oszcillátor
CONFIG WDTEN = OFF ; watchdog bekapcsolása
CONFIG WDTPS = 1024 ; watchdog beállítása (kb 2 sec)
CONFIG LVP = OFF ; alacsony feszültség? programozás kikapcsolva
CONFIG MCLRE = OFF ; RA3 bemenetkénti használatra állítása
MI1 EQU 0xA
MI2 EQU 0xB
#define UTASITAS BCF LATA,2
#define ADAT BSF LATA,2
#define ENABLE LATA,1
DELAY MACRO SZAMLALO_INDUL
MOVLW SZAMLALO_INDUL
MOVWF MI1
DECFSZ MI1
GOTO $-2
ENDM
org 0x0000 ; program memória kezd? címe
nop ; ICD miatt
org 0x0028 ; kezd? cím
;--------------------------INICIALIZALAS----------------------------------
CLRF LATA ; kimeneti portok törlése
CLRF LATB ;
CLRF LATC ;
MOVLW B'00000000' ; bemenetek 1=analóg 0=digitális
MOVWF ANSEL ;
MOVLW B'00001000' ; A port
MOVWF TRISA
MOVLW B'00000000' ; B port kimenet
MOVWF TRISB
MOVLW B'01100000' ; C port kimenet
MOVWF TRISC
MOVLW B'01010010' ; oszcillátor frekvenciája <4:6>
MOVWF OSCCON ; 111 = 16, 110 = 8, 101 = 4, 100 = 2 MHz
MOVLW B'10000101' ; timer 0 beállítása, el?osztó <2:0>
MOVWF T0CON
;---------------------------------------------------------------------------*
;LCD kijelz? inicializálása
BCF ENABLE ;Beírás tiltása
DELAY D'250'
DELAY D'250'
DELAY D'250'
DELAY D'250'
DELAY D'250'
DELAY D'250'
UTASITAS ;Beállítjuk a kijelz? R/S bemenetét utasítás fogadására
MOVLW B'00110000' ;Ez az utasítás 4x végrehajtva reseteli az LCD-t
CALL KIIRAS0
CALL KIIRAS0
CALL KIIRAS0
CALL KIIRAS0
DELAY D'250'
DELAY D'250'
DELAY D'250' ;Némi kivárás után be kell állítani a kijelz?t.
DELAY D'250'
DELAY D'250'
DELAY D'250'
MOVLW B'00100000'
CALL KIIRAS0 ;Itt kapcsolunk át 4 bites üzemmódra
MOVLW B'00101000' ;Már 4 bites módban beállítjuk a
CALL KIIRAS ; kijelz?t kétsorsa
MOVLW B'00001100' ;Kijelz? engedélyezése
CALL KIIRAS
;-------------------------------------------------------------------------------
MAIN
MOVLW B'00000001' ;Kijelz? törlése
CALL KIIRAS
DELAY D'250'
DELAY D'250'
;MEGJEGYZÉS: Kijelz? törlése után mindig kell 2x "DELAY D'250'"
MOVLW B'10000000' ;Fels? sor kezd?címének meghatározása
CALL KIIRAS ;Ez a bal els? karakter.
; Szöveg kiírása
ADAT ;Beállítjuk a kijelz? R/S bemenetét adat fogadására
MOVLW H'' ;
CALL KIIRAS
MOVLW H'' ;40 db írható be. Egyszerre 16 jelenik meg
CALL KIIRAS
MOVLW H'' ;
CALL KIIRAS
MOVLW H'' ;
CALL KIIRAS
MOVLW H'' ;
CALL KIIRAS
UTASITAS ;Beállítjuk a kijelz? R/S bemenetét utasítás fogadására
DELAY D'250'
DELAY D'250'
MOVLW B'11000000' ;Alsó sor kezd?címének meghatározása
CALL KIIRAS ;Ez a bal els? karakter.
; Szöveg kiírása
ADAT ;Beállítjuk a kijelz? R/S bemenetét adat fogadására
MOVLW H'' ;
CALL KIIRAS
MOVLW H'' ;
CALL KIIRAS
MOVLW H'' ;40 db írható be. Egyszerre 16 jelenik meg
CALL KIIRAS
MOVLW H'' ;
CALL KIIRAS
MOVLW H'' ;
CALL KIIRAS
GOTO $-0
;-------------------------------------------------------------------------------
KIIRAS
MOVWF MI2 ;Wreg áttöltése MI2-be
MOVFF MI2,LATB ;MI2 LATB-be töltése(Csak a fels? 4 bit)
DELAY D'16' ;El? várakozás
BSF ENABLE ;Beírás indul
DELAY D'96' ;Kivárás
BCF ENABLE ;Beírás vége
DELAY D'5' ;Utó várakozás
RLNCF MI2 ;MI2 bitjeit 1-el balra léptetjük
RLNCF MI2 ;MI2 bitjeit 1-el balra léptetjük
RLNCF MI2 ;MI2 bitjeit 1-el balra léptetjük
RLNCF MI2 ;MI2 bitjeit 1-el balra léptetjük
MOVFF MI2,LATB ;MI2 LATB-be töltése(Csak a fels? 4 bit)
DELAY D'16' ;El? várakozás
BSF ENABLE ;Beírás indul
DELAY D'96' ;Kivárás
BCF ENABLE ;Beírás vége
DELAY D'6' ;Utó várakozás
RETURN
KIIRAS0 ;Kijelz? reszetelésekor használatos
MOVWF LATB ;Karakter b-be töltése
DELAY D'16' ;El? várakozás
BSF ENABLE ;Beírás indul
DELAY D'96' ;Kivárás
BCF ENABLE ;Beírás vége
DELAY D'6' ;Utó várakozás
RETURN
;Ezek az id?zítések 4 Mhz-es órajelhez vannak igazítva!
;-------------------------------------------------------------------------------
END
A hozzászólás módosítva: Nov 12, 2015
Nem, az volt a lényege, hogy minden LCD lábat oda lehet kötni bármelyik PIC lábra csak az elején ezt definiálni kell. Azért köszönöm, bár nekem is van néhány változatom, csak mindig adjusztálni kell valamit. Ha más nincs nekiállok....
Az elején ott a definíció, csak folytatni kell.
Ámbár az adatvonalat nem árt olyan portra tenni, ami eleve csak 4 bites.
#define UTASITAS BCF LATA,2
#define ADAT BSF LATA,2
#define ENABLE LATA,1
#define ADATOK LATB
Ez oké, de ha jól láttam ebben a bitek és a portlábak sorban vannak.
(egyébként összefuthatnánk valamikor, ha már ilyen messze vagyunk egymástól) A hozzászólás módosítva: Nov 12, 2015
Bitenként akarod meghatározni az adatlábakat? Nem macerás úgy egy kissé? Persze azt is lehet.
#define UTASITAS BCF LATA,2
#define ADAT BSF LATA,2
#define ENABLE LATA,1
#define BIT_4 LATB,2
#define BIT_5 LATB,5
#define BIT_6 LATC,3
#define BIT_7 LATA,4
Bár szerintem ez így morbid.
Éppen az volt a lényeg, és mégsem nem volt hosszabb a progi emlékeim szerint. Bár akkor csak átfutottam, de most éppen jól volna.
A dolog elegge egyszeru, de szerintem sincs semmi ertelme.
Mar ugy ertem, a negy adatbit kulon-kulon valo irasanak. De persze meg lehet oldani.
Mielott kikuldod az adatot, beallitod a labakat a negy adatbit szerint.
Az adat-ban van az also negy biten a beirando szam 0-15
adat0-3 tetszoleges portlabak
bcf adat0 ;toroljuk oket
bcf adat1
bcf adat2
bcf adat3
btfsc adat,0 ;az eredeti adatbitek szerint beallitjuk, ha magas
bsf adat0
btfsc adat,1
bsf adat,1
btfsc adat,2
bsf adat2
btfsc adat,3
bsf adat3
es mehet a beiras
Egyszer kellet ilyesmit hasznalnom, amikor elpukkantottam az egyik labat a PIC-nek, ami valami 8bites kijelzot hajtott meg es atvezettem az egyik szabad labat adatbitnek.
Ezt én nem nagyon értem... Pedig szeretném, mert tök jó lenne ha nem kéne egy port alsó vagy felső bitjeit lefoglalni a kijelzővel. Szóval, ezzel a megoldással, hogy tudod megvalósítani, hogy BÁRHOVÁ kötheted az adatvonalat?
Akkor inkabb a PIC programozas kezdoknek topicban kellene kerdezned.
De ha jobban megnezed (bar ez NAGYON alap....) akkor az adat nevu valtozonak a bitjeit (amiben a tenyleges, kiirando 4 bites szam van) feleltetem meg az adat0,adat1,adat2,adat3 labaknak, amik BARMIK lehetnek.
De az csak egy pelda volt, a valosagban ezek lehetnenek mondjuk:
bcf LATA,4
bcf LATB,3
bcf LATC,6
bcf LATD,0
btfsc adat,0 ;az eredeti adatbitek szerint beallitjuk, ha magas
bsf LATA,4
btfsc adat,1
bsf LATB,3
btfsc adat,2
bsf LATC,6
btfsc adat,3
bsf LATD,0
es mehet a beiras, ez azt jelenti, hogy a megfelelo lab (strobe, write, de ;mittudomen hogy hivjak) megfelelo szintre huzasaval ervenyesited a labakon kint levo adatot. Amig ez nem tortenik meg, a kijelzo mikroprocija nem foglalkozik azzal, hogy az adatlabakon mikor milyen szint van. Azt kijelzoje valogatja, hogy a strobe magasra allitasa vagy eppen lehuzasa ervenyesiti az adatot, ez a kijelzo adatlapjaban benne van.
Tehat a lenyeg, hogy a torles az elejen es a beallitas a felteteleknel ugyanarra a labra hivatkozzon. Ennel egyszerubben sajnos nem tudom elmagyarazni.
(Termeszetesen a hivatkozott labakat outputra kell allitani a megfelelo TRIS bitekkel.)
Az adat, amit tenylegesen be szeretnel irni, az adat nevu valtozoban van. A hozzászólás módosítva: Nov 13, 2015
Azért annyira nem vagyok kezdő már... Az előző példád szintaktikailag nem volt teljesen rendben és ez egy picit megzavart, vagyis nem láttam a légyeget benne, így már tisztább, már csak a bitcserét kell megírni hozzá és okés lesz. Ki is próbálom mindjárt.
Idézet: „Az előző példád szintaktikailag nem volt teljesen rendben”
Mire gondolsz ?!
Hiányoztak a vesszők.
Már honnan ?! Ha megnézed külön néven hivatkozik a bitre (adat0) valamint ha byte-ból akarja adat,0 ! De ezt írta is !
Én nem tudok róla, hogy a gyakorlatban lehet így egy bitet törölni: bcf adat0, csak így: bcf adat,0
#define adat0 adat,0
ezután már lehet !
Persze, de ez nem volt benne...
Csak ez Idézet: „adat0-3 tetszoleges portlabak”
Jóvanna! Én ilyen egyszerűen összezavarható vagyok.
Az assembly nem trefadolog.
Lehetne még finomítani, de működik!
LCD_Char
movwf templcd
bcf PORTD,2 ;töröljük az adatlábakat
bcf PORTD,3
bcf PORTC,4
bcf PORTC,5
swapf templcd,W
movwf templcd2
btfsc templcd2,0
bsf PORTD,2
btfsc templcd2,1
bsf PORTD,3
btfsc templcd2,2
bsf PORTC,4
btfsc templcd2,3
bsf PORTC,5
bsf LCD_PORT,LCD_RS
call Pulse_e ; Magas impulzust küld az Enable lábra.
movf templcd,w
movwf templcd2
bcf PORTD,2 ;töröljük az adatlábakat
bcf PORTD,3
bcf PORTC,4
bcf PORTC,5
btfsc templcd2,0
bsf PORTD,2
btfsc templcd2,1
bsf PORTD,3
btfsc templcd2,2
bsf PORTC,4
btfsc templcd2,3
bsf PORTC,5
bsf LCD_PORT,LCD_RS
call Pulse_e ; Magas impulzust küld az Enable lábra.
call Kesleltet5
retlw 0x00
Sziasztok!
Közben én is nekiláttam, és úgy tűnik működik. Még finomítok rajta. "bbalázs" bár csak most olvastam a javaslatodat, de eléggé hasonló amit összehoztam.
LCDBYTE: ;1 byte az LCD-re, 4 bites interface
; Be: LCDByte - nibble ki: HiByte, LoByte
;RS-t át kell engedni'''
movwf LCDByte
call LCD_nibleH
call LCD_nibleL
RETURN
LCD_nibleH:
bsf PORTLCD,LCDEnable
call vár_10u
bsf PORTADAT7
btfss LCDByte,7
bcf PORTADAT7
bsf PORTADAT6
btfss LCDByte,6
bcf PORTADAT6
bsf PORTADAT5
btfss LCDByte,5
bcf PORTADAT5
bsf PORTADAT4
btfss LCDByte,4
bcf PORTADAT4
call vár_10u
bcf PORTLCD,LCDEnable
call vár_10u
return
LCD_nibleL:
bsf PORTLCD,LCDEnable
call vár_10u
bsf PORTADAT7
btfss LCDByte,3
bcf PORTADAT7
bsf PORTADAT6
btfss LCDByte,2
bcf PORTADAT6
bsf PORTADAT5
btfss LCDByte,1
bcf PORTADAT5
bsf PORTADAT4
btfss LCDByte,0
bcf PORTADAT4
call vár_10u
bcf PORTLCD,LCDEnable
call vár_10u
return
Az LCD init még nagyon nem tetszik, de a mostani projeknél egyenlőre így marad..
Sziasztok!
Ismét a segítsségeteket szeretném kérni.
Egy PIC18F46K22-es nem azt csinálja, amit kellene.
2db analóg bemenetet használok. Teljesen mindegy, milyen jelet adok a bemenetekre, ADRESH értéke folyamatos 192.
A bemenetek RA3 és RA5.
Valamint szeretném használni az analóg kimenetet, de mindegy, hogy 0-tól 31-ig mit írok VREFCON2-be, RA2-őn nem jön semmi.
Igy van inicializálva:
INICIALIZALAS
CLRF LATA ; kimeneti portok törlése
CLRF LATB ;
CLRF LATC ;
CLRF LATD
CLRF LATE
MOVLW B'00111011' ; A port
MOVWF TRISA
MOVLW B'00101000'
MOVWF ANSELA
CLRF ADCON2
MOVLW B'10100000'
MOVWF VREFCON1
MOVLW B'00111100' ; B port kimenet
MOVWF TRISB
CLRF WPUB
MOVLW B'00000000' ; C port kimenet
MOVWF TRISC
MOVLW B'00011111' ; D port kimenet
MOVWF TRISD
MOVLB 0F
CLRF ANSELD,BANKED
MOVLB 0
MOVLW B'00001000' ; E port kimenet
MOVWF TRISE
MOVLW B'01010010' ; oszcillátor frekvenciája <4:6>
MOVWF OSCCON
MOVLW B'10000111' ; timer 0 beállítása, el?osztó <2:0>
MOVWF T0CON
Ez pedig az analóg beolvasás:
MOVLW B'00000011' ;\
MOVWF ADCON0 ; \
NOP ; \
BSF ADCON0,1 ; \
BTFSC ADCON0,1 ; \
GOTO $-2 ; \
MOVFF ADRESH,POTI ; A/D converziók
MOVLW B'00000100' ; /
MOVWF ADCON0 ; /
NOP ; /
BSF ADCON0,1 ; /
BTFSC ADCON0,1 ; /
GOTO $-2 ; /
MOVFF ADRESH,PEDAL ;/
Kérlek,segítssetek, hol rontottam el.
Ha jól emlékszem, Neked írták, hogy a 0xF60 alatti címen levő SFR -eket BANKED móddal lehet elérni.
Az inicializálás elejére egy movlb 0x0F utasítás kell a movwf ANSELA, BANKED elé.
Ezt már végképp nem értem.
Átírtam így:
MOVLW B'00111011' ; A port
MOVWF TRISA
CLRF ADCON2
MOVLW B'00101000'
MOVLB 0F
MOVWF ANSELA,BANKED
CLRF ANSELD,BANKED
CLRF VREFCON0,BANKED
MOVLW B'10100000'
MOVWF VREFCON1,BANKED
MOVLB 0
MOVLW B'00111100' ; B port kimenet
MOVWF TRISB
Az analóg kimenet most már működik, annak ellenére, hogy VREFCON2-be bankváltás és BANKED nélkül írom be az adatot, pedig fizikailag VREFCON1 alatt van. Viszont az AD converzió eredménye még mindíg 192, bármi legyen is a bemeneten.
MOVLW B'00000011' ;\
MOVWF ADCON0 ; \
NOP ; \
BSF ADCON0,1 ; \
BTFSC ADCON0,1 ; \
GOTO $-2 ; \
Melyik csatornát is méri? Az AN0 -t.
Az első utasítás bekapcsolja az A/D modult (1) és el is indítja(2). A BSF ADCON0,1 -nek már nem is marad feladat....
Az AN3 (RA3) méséréhez:
movlw (0x03 << ADCHS0) | (1 << ADON)
movwf ADCON0
utasítások kellenek.
MOVLW B'00000100' ; /
MOVWF ADCON0 ; /
NOP ; /
BSF ADCON0,1 ; /
BTFSC ADCON0,1 ; /
Ez az utasítássor azzal kezdi, hogy kikapcsolja az A/D -t...
Az AN4 (RA5) méséréhez:
movlw (0x04 << ADCHS0) | (1 << ADON)
movwf ADCON0
utasítások kellenek.
Milyen utasítással írod a VREFCON1 regisztert?
A movff utasítás kódja (2 szó) mindkét regiszter teljes 12 bites címét tartalmazza. A hozzászólás módosítva: Nov 14, 2015
Oké!
Pedig esküszöm,hogy se részeg, se narkós nem vagyok, ráadásul rengetegszer csináltam már A/D konfigolást. Nem az a szégyen, hogy elb...tam, hanem az, hogy több óra alatt sem jöttem rá!
Köszi!
|
|