www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC (ASM) delčki uporabne kode na enem mestu

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Avg 15, 2006 11:26 pm    Naslov sporočila:  PIC (ASM) delčki uporabne kode na enem mestu Odgovori s citatom

Ravno si pripravljam "teren" za neko zadevo. Uporabil bom PIC16F877, ker jih imam še par na zalogi. Na tem mestu bom pripenjal delčke "univerzalne" kode. Mogoče zna komu priti kdaj prav. Seveda vabim vse assembler-jaše, da se mi priduržijo.

Pri zadevi bom uporabil LCD - torej najprej nekaj osnovnih rutin za LCD. Inicializacija, generiranje šumnikov. (komunikacija bo 4 bitna oscilator 4Mhz)
(Vse kar bom pripenjal bom predhodno testiral v praksi)

Najprej inciializacija ter generiranje šumnikov v CGRAM:


Koda:

;-------------------------------------------
;lcd
#define RS PORTD,2
#define EN PORTD,3
#define LCD_PORT PORTD
;---------------------------------------------------
;procedura pripravi porte ter inicializira LCD
;---------------------------------------------------
LCD_INC   
   clrf LCD_PORT
   bsf STATUS,RP0
   clrf LCD_PORT      ;vsi pini so izhodi
   bcf STATUS,RP0
   call P_40mS      ;pavza 40mS
   bcf RS
   movlw b'00100000'
   movwf LCD_PORT
   bsf EN         ;4 bit mode
   bcf EN
   bsf EN         ;2 vrstici
   bcf EN         
   movlw b'10000000'
   movwf LCD_PORT
   bsf EN         ;5x8 font
   bcf EN
   call P_40uS
   clrf LCD_PORT
   bsf EN         
   bcf EN
   movlw b'11110000'
   movwf LCD_PORT
   bsf EN         ;displej on, cursor on, blink on
   bcf EN
   call P_40uS
   clrf LCD_PORT
   bsf EN
   bcf EN
   movlw b'00010000'
   movwf LCD_PORT
   bsf EN         ;brisanje displeja
   bcf EN
   call P_1600uS
   clrf LCD_PORT
   bsf EN
   bcf EN
   movlw b'01100000'
   movwf LCD_PORT
   bsf EN
   bcf EN
   call P_40mS
   call P_40mS
   movlw high POSEBNI_ZNAKI   ;rutina je na strani3
   movwf PCLATH         ;zato nastavim PCLATH
   call POSEBNI_ZNAKI      ;rutina v CGRAM nalozi posebne znake (sumnike)
   return
   
   
   
;--------------------------------------
;pavza 40mS
;--------------------------------------      
P_40mS
   movlw   .52
   movwf   T1
   movlw   .241
   movwf   T2
dloop1   
   decfsz T2,f
   goto dloop1
   decfsz T1,f
   goto dloop1
   return

;-------------------------------------
;pavza 40uS
;-------------------------------------   
P_40uS
   movlw .11
   movwf T1

dloop2
   decfsz T1,f
   goto dloop2
   nop
   return   

;-------------------------------------
;pavza 1.6mS
;-------------------------------------
P_1600uS
   movlw .3
   movwf T1
   movlw .17
   movwf T2
dloop3   
   decfsz T2,f
   goto dloop3
   decfsz T1,f
   goto dloop3
   return




Za napise bom koristil zadnji del programskega pomnilnika, zato je koda pisana malo drugače. (Potrebno je pazit na PCLATH. Če se bodo uporabljale prekinitve, ga je treba pred prekinitvijo obvezno shranit!)
Koda:

   org 0x1F00
;-----------------------------------------------
;
;
; Kljukasti znaki (sumniki)
;
;-----------------------------------------------
SUMNIKI
   addwf PCL,f
   retlw b'00001100'
   retlw b'00001110'
   retlw b'00010001'
   retlw b'00010000'
   retlw b'00010000'
   retlw b'00010001'
   retlw b'00001110'
   retlw b'10000000'

   retlw b'00001100'
   retlw b'00001110'
   retlw b'00010000'
   retlw b'00001110'
   retlw b'00000001'
   retlw b'00010001'
   retlw b'00001110'
   retlw b'10000000'   
   
   retlw b'00001100'
   retlw b'00011111'
   retlw b'00000010'
   retlw b'00000100'
   retlw b'00001000'
   retlw b'00010000'
   retlw b'00011111'
   retlw b'10000000'
   
   retlw b'10000000'
   retlw b'00001100'
   retlw b'00001110'
   retlw b'00010000'
   retlw b'00010000'
   retlw b'00010001'
   retlw b'00001110'
   retlw b'10000000'

   retlw b'10000000'
   retlw b'00001100'
   retlw b'00001110'
   retlw b'00010000'
   retlw b'00001110'
   retlw b'00000001'
   retlw b'00001110'
   retlw b'10000000'

   retlw b'10000000'
   retlw b'00001100'
   retlw b'00011111'
   retlw b'00000010'
   retlw b'00000100'
   retlw b'00001000'
   retlw b'00011111'
   retlw b'10000000'   
   retlw .0               ;prazen vnos smatra procedura kot konec tabele   
   

;----------------------------------------------------
;procedura generira posebne znake definirane v tabeli
;SUMNIKI
;----------------------------------------------------
POSEBNI_ZNAKI
   clrf STEJ
   movlw b'01001000'   ;CGRAM lokacija1
   clrf PCLATH      ;sledi skok na page0
   call UKAZ
ZANKA_PZ
   movlw HIGH SUMNIKI   ;tabela s tekstom se nahaja na strani3
   movwf PCLATH      ;zato ustrezno nastavim PCLTH
   movf STEJ,w
   call SUMNIKI
   clrf PCLATH      ;sem nazaj na strani0
   addlw .0
   btfsc STATUS,Z      ;je konec besedila
   return         ;da
   call NA_LCD
   incf STEJ,f      ;premik na sledec karakter
   movlw high POSEBNI_ZNAKI
   movwf PCLATH
   goto ZANKA_PZ


...več sledi

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14673
Aktiv.: 61.95
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sre Avg 16, 2006 3:54 pm    Naslov sporočila:   Odgovori s citatom

LCD nadaljevanje...

Procedurce pošljejo na lcd instrukcijo oz. posmezen karakter oz. celo tabelo

Koda:


;----------------------------------------------------
;procedura poslje tekst iz tabele na LCD
;kot W prejme 1. lokacijo tabele
;----------------------------------------------------      
TEKST
   movwf STEJ
Z_TEKST
   movlw HIGH TABELA   ;tabela s tekstom se nahaja na strani3
   movwf PCLATH      ;zato ustrezno nastavim PCLTH
   movf STEJ,w
   call TABELA
   clrf PCLATH      ;sem nazaj na strani0
   addlw .0
   btfsc STATUS,Z      ;je konec besedila
   return         ;da
   call NA_LCD
   incf STEJ,f      ;premik na sledec karakter
   goto Z_TEKST
   

;---------------------------------------------------
;procedura pošlje karakter doblejn v W na LCD
;---------------------------------------------------
NA_LCD
   bsf RS
UKAZ
   movwf LCD_TMP         ;shranem prejet karater
   movlw b'1111'
   andwf LCD_PORT,f      ;obrisem data linije za LCD
   movf LCD_TMP,w
   andlw b'11110000'
   iorwf LCD_PORT,f
   call VPIS_D
   movlw b'1111'
   andwf LCD_PORT,f      ;obrisem data linije za LCD
   swapf LCD_TMP,W
   andlw b'11110000'
   iorwf LCD_PORT,f
   call VPIS_D
   bcf RS
   call P_40uS
   return


;------------------------------------------------
;vpis podatka   
;------------------------------------------------   
VPIS_D         
   bsf EN
   bcf EN
   return
      


Tabelce na zadnji strani programskega pomnilnika:

Koda:


   org 0x1800      ;page3      
TABELA
   addwf PCL,f
   dt"0123456789",0   
NAPIS1
   dt "elektronik.si",0
   
NAPIS2
   dt 2,"umniki:",1,2,3,4,5,6,0   
   org 0x1F00



Ter primer rabe:


Koda:

#define VRSTA2 movlw b'10000000'+40
#define VRSTA1 movlw b'10000000'

   org 0X0
   goto GLAVNI
   
   org 0x5
CIFRE
   addwf PCL,f
   dt"0123456789",0   

   
   
GLAVNI
   call CLRRAM
   bsf STATUS,RP0
   movlw b'00000011'
   movwf OPTION_REG
   bcf STATUS,RP0

   clrf PORTB
   call LCD_INC   ;inicializacija LCD in nalaganje posebnih znakov v CGRAM
         ;1=C 2=S 3=Z 4=c 5=s 6=z (crke s klukicami)         
   VRSTA1
   call UKAZ   ;proceura poslje na LCD instrukcijo dobljeno v W
   movlw low NAPIS1-1   ;v prvo vrstico napisem vsebino tabele NAPIS1
   call TEKST
   VRSTA2
   call UKAZ
   movlw low NAPIS2-1   ;v drugo vrstico napisem vsebino tabele 2
   call TEKST   
   nop
   goto $-1   
   

CLRRAM
   movlw 0x20
   movwf FSR
BRISI
   clrf INDF
   incf FSR,F
   movlw 0x80
   subwf INDF,w
   btfss STATUS,C
   goto BRISI
   return


...nadaljevanje sledi...

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.42

PrispevekObjavljeno: Ned Maj 06, 2007 5:34 pm    Naslov sporočila:   Odgovori s citatom

par vrednosti za "P_40mS"

Koda:
 ms  T1  T2
0,5   1 164
  1   2  74
1,6   3  17
  5   7 124
 10  13 251
 20  26 247
 40  52 241
 50  65 237
 75  98 101
100 130 220
150 195 204
197   0   0


max zakasnitev je 197.127 ms, za kaj vec je treba dodat se tretjo zanko

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 18.42

PrispevekObjavljeno: Pon Maj 07, 2007 7:02 pm    Naslov sporočila:   Odgovori s citatom

malo matematike Wink
Koda:
   cblock 0x20     ; tule nastavi pravi naslov glede na PIC
   tempX:2
   tempY:2
   result:2
   idx:2
   tempYY
   endc


; 8-bit mul
; result=tempX*tempY
mul8
   clrf result
   movf tempX,w
   btfsc tempY,0
   addwf result,f
   bcf STATUS,C
   rrf tempY,f
   bcf STATUS,C
   rlf tempX,f
   movf tempY,f
   btfss STATUS,Z
   goto $-9
   return

; 16-bit add
; tempX=tempX+tempY
add16
   movf tempY,w
   addwf tempX,f
   btfsc STATUS,C
   incf tempX+1,f
   movf tempY+1,w
   addwf tempX+1,f
   return

; 16-bit add
; result=result+tempX
add16r
   movf tempX,w
   addwf result,f
   btfsc STATUS,C
   incf result,f
   movf tempX+1,w
   addwf result+1,f
   return

; 16-bit mul
; result=tempX*tempY
mul16
   clrf result
   clrf result+1
   btfsc tempY,0
   call add16r
   bcf STATUS,C
   rrf tempY+1,f
   rrf tempY,f
   bcf STATUS,C
   rlf tempX,f
   rlf tempX+1,f
   movf tempY,f
   btfss STATUS,Z
   goto $-.10 ;mul16_1
   movf tempY+1,f
   btfss STATUS,Z
   goto $-.13 ;mul16_1
   return

; 8-bit div
; result=tempX/tempY
; ostanek v tempX
div8
   movf tempY,f
   btfsc STATUS,Z
   return
   clrf  result
   movlw 1
   movwf idx
   bcf STATUS,C
   rlf idx,f
   bcf STATUS,C
   rlf tempY,f
   btfss tempY,7
   goto $-5
   movf tempY,w
   subwf tempX,f
   btfsc STATUS,C
   goto $+3
   addwf tempX,f
   goto $+3
   movf idx,w
   addwf result,f
   bcf STATUS,C
   rrf tempY,f
   bcf STATUS,C
   rrf idx,f
   btfss STATUS,C
   goto $-.13
   return

; 16-bit sub
; tempX=tempX-tempY
sub16
   movf tempY+1,w
   movwf tempYY
   movf tempY,w
   subwf tempX,f
   btfss STATUS,C
   incf tempYY,f
   movf tempYY,w
   subwf tempX+1,f
   return

; 16-bit div
; result=tempX/tempY
; ostanek v tempX
div16
   movf tempY,f
   btfss STATUS,Z
   goto $+4
   movf tempY+1,f
   btfsc STATUS,Z
   return
   movlw 1
   movwf idx
   clrf idx+1
   clrf result
   clrf result+1
   bcf STATUS,C
   rlf idx,f
   rlf idx+1,f
   bcf STATUS,C
   rlf tempY,f
   rlf tempY+1,f
   btfss tempY+1,7
   goto $-7
   call sub16
   btfsc STATUS,C
   goto $+3
   call add16
   goto $+7
   movf idx,w
   addwf result,f
   btfsc STATUS,C
   incf result+1,f
   movf idx+1,w
   addwf result+1,f
   bcf STATUS,C
   rrf tempY+1,f
   rrf tempY,f
   bcf STATUS,C
   rrf idx+1,f
   rrf idx,f
   btfss STATUS,C
   goto $-.18
   return


16-bitne vrednosti so v obliki LO-HI, torej 0x1234 pomeni 0x34 v tempX in 0x12 v tempX+1


edit: popravil bug v mul16

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja PIC-a v Assembler-ju Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 491 dni


Powered by phpBB © 2001, 2005 phpBB Group