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 

PIC16F88 <>ATTiny26
Pojdi na stran 1, 2, 3, 4  Naslednja
 
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: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jul 26, 2008 3:06 pm    Naslov sporočila:  PIC16F88 <>ATTiny26 Odgovori s citatom

Citiram:
Na kratko, z PICi je en velik križ, raje razmislite o AVRjih in jih tudi uporabite.


Glede na take ter podobne izjave sem sklenil narediti primerjalni test. Edinega AVR-ja , ki sem ga imel doma in je po periferiji podoben kakemu PIC-ju je Attiny26 - podoben je PIC16F88.

Nekaj osnovnih podatkov:(copy/paste PDF)
Tiny26
Features
• High-performance, Low-power AVR® 8-bit Microcontroller
• RISC Architecture
– 118 Powerful Instructions – Most Single Clock Cycle Execution
– 32 x 8 General Purpose Working Registers
– Fully Static Operation
– Up to 16 MIPS Throughput at 16 MHz
• Data and Non-volatile Program Memory
– 2K Bytes of In-System Programmable Program Memory Flash
Endurance: 10,000 Write/Erase Cycles
– 128 Bytes of In-System Programmable EEPROM
Endurance: 100,000 Write/Erase Cycles
– 128 Bytes Internal SRAM
– Programming Lock for Flash Program and EEPROM Data Security
• Peripheral Features
– 8-bit Timer/Counter with Separate Prescaler
– 8-bit High-speed Timer with Separate Prescaler
2 High Frequency PWM Outputs with Separate Output Compare Registers
Non-overlapping Inverted PWM Output Pins
– Universal Serial Interface with Start Condition Detector
– 10-bit ADC
11 Single Ended Channels
8 Differential ADC Channels
7 Differential ADC Channel Pairs with Programmable Gain (1x, 20x)
– On-chip Analog Comparator
– External Interrupt
– Pin Change Interrupt on 11 Pins
– Programmable Watchdog Timer with Separate On-chip Oscillator
• Special Microcontroller Features
– Low Power Idle, Noise Reduction, and Power-down Modes
– Power-on Reset and Programmable Brown-out Detection
– External and Internal Interrupt Sources
– In-System Programmable via SPI Port
– Internal Calibrated RC Oscillator
• I/O and Packages
– 20-lead PDIP/SOIC: 16 Programmable I/O Lines
– 32-lead QFN/MLF: 16 programmable I/O Lines
• Operating Voltages
– 2.7V - 5.5V for ATtiny26L
– 4.5V - 5.5V for ATtiny26
• Speed Grades
– 0 - 8 MHz for ATtiny26L
– 0 - 16 MHz for ATtiny26
• Power Consumption at 1 MHz, 3V and 25°C for ATtiny26L
– Active 16 MHz, 5V and 25°C: Typ 15 mA
– Active 1 MHz, 3V and 25°C: 0.70 mA
– Idle Mode 1 MHz, 3V and 25°C: 0.18 mA
– Power-down Mode: < 1 μA
8-bit
Microcontroller
with 2K Bytes
Flash
ATtiny26
ATtiny26L


16F88

• Power-Managed modes:
- Primary Run: RC oscillator, 76 µA, 1 MHz, 2V
- RC_RUN: 7 µA, 31.25 kHz, 2V
- SEC_RUN: 9 µA, 32 kHz, 2V
- Sleep: 0.1 µA, 2V
• Timer1 Oscillator: 1.8 µA, 32 kHz, 2V
• Watchdog Timer: 2.2 µA, 2V
• Two-Speed Oscillator Start-up
Oscillators:
• Three Crystal modes:
- LP, XT, HS: up to 20 MHz
• Two External RC modes
• One External Clock mode:
- ECIO: up to 20 MHz
• Internal oscillator block:
- 8 user selectable frequencies: 31 kHz,
125 kHz, 250 kHz, 500 kHz, 1 MHz, 2 MHz,
4MHz, 8MHz
Peripheral Features:
• Capture, Compare, PWM (CCP) module:
- Capture is 16-bit, max. resolution is 12.5 ns
- Compare is 16-bit, max. resolution is 200 ns
- PWM max. resolution is 10-bit
• 10-bit, 7-channel Analog-to-Digital Converter
• Synchronous Serial Port (SSP) with SPI™
(Master/Slave) and I
2C™ (Slave)
• Addressable Universal Synchronous
Asynchronous Receiver Transmitter
(AUSART/SCI) with 9-bit address detection:
- RS-232 operation using internal oscillator
(no external crystal required)
• Dual Analog Comparator module:
- Programmable on-chip voltage reference
- Programmable input multiplexing from device
inputs and internal voltage reference
- Comparator outputs are externally accessible



Po periferiji sta si zelo podobna. Pic ima sicer malo več pomnilnika a to v danem primeru ne igra vloge.
Obe primerjalni aplikaciji bosta pisani v assemblerju. Za attiny-a bom vzel tole, ki sem jo napisal nekaj dni nazaj.
***klik***
Za pic-a jo bom pisal ter "lepil" sproti. (ter koščke kode skušal komentirati na forumu)
Nadaljevanje 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: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jul 26, 2008 3:16 pm    Naslov sporočila:   Odgovori s citatom

V nadaljevanju koščki kode, katero bom skušal komentirati.
Za pisanje je uporabljeno free orodje. AVR Studio za Tiniy-a ter MPLAB za PIC-a.
Orodja sta si se presenetljivo podobna, tako da poznavalcem enega drugo ne bo delalo preglavic.

"Glavi" programa sta si za oba mikrokontrolerja zelo podobni.

Tiny26

Koda:
;----------------------------------------
;testni program tiny26
;dvokanalni analogni instument z LCD
;prikazovalnikom
;----------------------------------------

.include "tn26def.inc"
.def tmp =r16
.def tmp1 =r17
.def tmp2 =r18
;----------------------------------------
;displej definicija pinov
.equ E = 4
.equ RS = 5
;-----------------------------------------
.def DTTICA =r22
.def TTICA =r23
.def STICA =r24
.def DTICA =r25
.def ENICA =r26
.def ADC_TMP = r27
.def H_BITI = r2               //pomozni register
.def L_BITI = r3
.def H_BITI2 = r4            
.def L_BITI2 = r5
.def KONTROLNI = r6


16F88
Koda:
;//////////////////////////////////////////////////

;-------------------------------------
;vlotmeter P16f88
;Ekvilalentni program kot za Attiny26
;-------------------------------------


;Program Configuration Register 1
   __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF &       _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _INTRC_IO

;Program Configuration Register 2
   __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF
   
   cblock 0x20
   TMP,TMP1,t1,t2,t3,H_BITI,L_BITI,H_TMP,L_TMP,ENICA,DTICA,STICA,TTICA,DTTICA
  L_TMP1,H_TMP1
   endc   
   
   list P=16F88
#include "p16f88.inc"

#define E PORTB,4
#define RS PORTB,5



V obeh v "glavi" določimo include datoteko,
Pic omogoča tudi definiranje fuse bitov česar tiniy nima. (tole recimo pogrešam pri avr-ju)


Nadaljevanje 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: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jul 26, 2008 3:23 pm    Naslov sporočila:   Odgovori s citatom

Reset vektor:

ATTiny26
Koda:

org $000
    rjmp Glavni      ;skok na glavni program

.org $009


16F88

Citiram:
org 0x0
goto Glavni

org 0x5


Oba imata reset vektor na lokaciji 0
pri picu je na lokaciji 0x04 prekinitveni vektor za vse prekinitve. AVR ima za vsako prekinitev svojo lokacijo ter sledijo po vrsti za reset vektorjem. Bistvene razlike ni. Pri picu je potrebno po prekinitvi ugotavljati za katero vrsto prekinitve je šlo tega pri AVR ni potrebno.


Nadaljevanje 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: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jul 26, 2008 3:42 pm    Naslov sporočila:   Odgovori s citatom

"Telo" programa:
Atiny26

Koda:
Glavni:
   ldi tmp,low(ramend)
   out SP,tmp
   ldi tmp,0b100
   out DDRA,tmp
   clr tmp
   out PORTB,tmp
   ldi tmp,0b00111111
   out DDRB,tmp         ;pini na katere je priključen displej so izhodi





//   ldi ZL,low(OSC_CAL*2)               ;kalibracija
//   ldi ZH,high(OSC_CAL*2)
//   lpm
   mov r16,r0
   ldi tmp,0
   out OSCCAL,r16
   
;//////////////////////////////////////////////////////////////////   
;pozdravni napis
   rcall LCD_INIC      ;inicializacija LC
   ldi tmp,0b00001100
   rcall POSLJI_ZNAK      ;izklop cursorja

   ldi ZL,low(NAPIS*2)
   ldi ZH,high(NAPIS*2)   
   rcall LCD_TXT               ;pozdravni napis 1/2 displeja
   cbi PORTB,RS
   ldi tmp,0b11000000      ;premik na drugo polovico
   rcall POSLJI_ZNAK
      
   ldi ZL,low(NAPIS1*2)   
   ldi ZH,high(NAPIS1*2)
   rcall LCD_TXT               ;pozdravni napis 2/2 displeja
   rcall PAVZA1s
   cbi PORTB,RS
   ldi tmp,0b00000001      ;birsanje displeja
   rcall POSLJI_ZNAK
;////////////////////////////////////////////////////////////////


   ldi tmp,0b10000000      ;izbira AD kanala, referenčne napetosti, poravnava desno   
   out ADMUX,tmp
   ldi tmp,0b11100011   
   out ADCSR,tmp
   sbi ADCSR,ADSC
      

ZANKA:
   sbis ADCSR,ADIF
   rjmp zanka               ;cakam na konec prekinitve
   cbi ADCSR,ADIF
   
   in L_BITI2,ADCL         ;preberem rezultat meritve v registre za nadaljno obdelavo
   in H_BITI2,ADCH
   rcall PREKORACITEV   ;kontrola prekoracitve
   sbrs KONTROLNI,0
   rcall B16toBNC         ;10 bitnega rezultata za prikaz

   sbic ADMUX,0            ;na katerem kanalu je bila izvedena meritev
   rjmp KANAL1
   rjmp KANAL0

KANAL0:                        // meritev napetosti
   rcall VRSTA1            ;priprava mesta za vpis na LCD
   sbi ADMUX,0               ;preklop na drugi kanal
   tst TTICA                  ;je prikaz na tisocici 0
   brne NI_NIC               ;ne
   cp TTICA,STICA         ;je tudi prikaz na stotici 0
   ldi TTICA,10            ;tisočice ne kazem na 10 mestu je prazen znak
   brne NI_NIC
   ldi STICA,10            ;tudi na stotici je prikaz nic

NI_NIC:
   mov tmp,TTICA
   rcall LCD_CIFRA
   mov tmp,STICA
   rcall LCD_CIFRA
   mov tmp,DTICA
   rcall LCD_CIFRA
   ldi tmp,'.'
   rcall POSLJI_ZNAK
   mov tmp,ENICA
   rcall LCD_CIFRA
   ldi tmp,'V'
   rcall POSLJI_ZNAK
   rjmp ZANKA2   

KANAL1:                        // meritev toka
   rcall VRSTA2            ;priprava mesta za vpis na LCD
   cbi ADMUX,0               ;preklop na drugi kanal

   tst TTICA
   brne NI_NIC1
   ldi TTICA,10
NI_NIC1:
   mov tmp,TTICA
   rcall LCD_CIFRA
   mov tmp,STICA
   rcall LCD_CIFRA
   ldi tmp,'.'
   rcall POSLJI_ZNAK
   mov tmp,DTICA
   rcall LCD_CIFRA
   mov tmp,ENICA
   rcall LCD_CIFRA
   ldi tmp,'A'
   rcall POSLJI_ZNAK
   
   
ZANKA2:
   rcall PAVZA200ms
   rjmp  ZANKA


16F88

Koda:
Glavni
   clrf PORTB
   banksel TRISB
   clrf TRISB         ;pini portab so izhodi
   movlw b'011000000'
   movwf OSCCON
   banksel PORTB

   call LCD_INIC         ;inicializacija LCD
   movlw b'1100'
   call POSLJI_ZNAK   ;izklop cursorja
   
;/////////////////////////////////
;pozdravni napis

   bsf RS                  ;omogocim pisanje
   clrf TMP1
TEKST1
   movf TMP1,w
   call NAPIS
   addlw .0
   btfsc STATUS,Z
   goto TEKST2
   call POSLJI_ZNAK
   call Pavza15mS
   incf TMP1,f
   goto TEKST1
TEKST2
   bcf RS
   movlw b'11000000'
   call POSLJI_ZNAK
   bsf RS                  ;omogocim pisanje
   clrf TMP1
TEKST21
   movf TMP1,w
   call NAPIS2
   addlw .0
   btfsc STATUS,Z
   goto KONEC_T
   call POSLJI_ZNAK
   call Pavza15mS
   incf TMP1,f
   goto TEKST21
KONEC_T
   bcf RS
   movlw .1
   call POSLJI_ZNAK    ;brisanje displeja
   call Pavza15mS
;///////////////////////////////////////////   
   
   banksel ANSEL
   movlw b'11'   
   movwf ANSEL         ;izbira AD kanalov
   movlw b'11000000'
   movwf ADCON1      ;desna poravnava rezultata referenca Vdd
   banksel ADCON0
   movlw b'1000001'
   movwf ADCON0         ;vklop AD modula Fosc 1/8 kanal0

;//////////////////////////////////////////////////////////

ZANKA
   bsf ADCON0,GO               ;vklop meritve
   btfsc ADCON0,NOT_DONE   ;cakam na konec meritve
   goto $-1
   banksel ADRESL            ;
   movf ADRESL,w               ;\
   banksel ADRESH            ;   >priprava za prikaz
   movwf L_TMP                  ;/
   movf ADRESH,w               ;
   movwf H_TMP
   call B16toBNC
   call PREKORACITEV
   btfsc ADCON0,CHS0         ;meritev na kanalu0?
   goto KANAL1                  ;ne
   bsf ADCON0,CHS0            ;da vklopim drugi kanal

   bcf RS
   movlw b'10000000'
   call POSLJI_ZNAK
   bsf RS
   call UREDI
   movlw ' '
   call POSLJI_ZNAK
   movf TTICA,w
   call CIFRE
   call POSLJI_ZNAK
   movf STICA,w
   call CIFRE
   call POSLJI_ZNAK
   movf DTICA,w
   call CIFRE
   call POSLJI_ZNAK
   movlw '.'
   call POSLJI_ZNAK
   movf ENICA,w
   call CIFRE
   call POSLJI_ZNAK
   movlw 'V'
   call POSLJI_ZNAK
   call Pavza200mS
   goto ZANKA
KANAL1
   bcf ADCON0,CHS0
   bcf RS
   movlw b'11000000'
   call POSLJI_ZNAK
   movlw .10
   movf TTICA,f
   btfsc STATUS,Z
   movwf TTICA
   bsf RS
   movlw ' '
   call POSLJI_ZNAK
   movf TTICA,w
   call CIFRE
   call POSLJI_ZNAK
   movf STICA,w
   call CIFRE
   call POSLJI_ZNAK
   movlw '.'
   call POSLJI_ZNAK
   movf DTICA,w
   call CIFRE
   call POSLJI_ZNAK
   movf ENICA,w
   call CIFRE
   call POSLJI_ZNAK
   movlw 'A'
   call POSLJI_ZNAK
   call Pavza200mS
      
   goto ZANKA



Tukaj pa je že razvidna razlika v načinu programiranja.
Pic ima registre razporejene v več bankah, kar lahko kar zagreni programiranje, če se ne izbere prava banka. Pic ima le en W (delovni register). Sicer ima 368 SNR razporejenih po več bankah. Assembler pozna le 36 instrukcij. Pri pic-u je sklad 8 nivojski hardverski.

Avr nima bank. Tiny premore 32 splošno namenskih registrov. Od tega je zgornjih 16 delovnih. Assembler pozna 118 instrukcij. Zaradi tega je malo bolj "okreten" kot pic. Sklad pri AVR-ju je omejen s pomnilnikom, katerega določimo na začetku programa.

Nadaljevanje 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: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jul 26, 2008 4:00 pm    Naslov sporočila:   Odgovori s citatom

Tabele:

Attiny26
Koda:

NAPIS:
   .db " Elektro",0
NAPIS1:
   .db"nik.si",0


CIFRE:
   .db "0123456789 -ABCD"


16F84

Koda:
                  
   org 0x5
NAPIS
   addwf PCL,f
      dt " Elektro",0
      
NAPIS2
   addwf PCL,f
      dt "nik.si",0      

CIFRE
   addwf PCL,f
      dt "0123456789 -ABCD",0



Oba assemblerja omogočata branje tabel, ki je nazven zelo podoben. Hardwersko pa deluje drugače.
PIC-ova tabela je grajena kot seznam instukcij "retlw" vrednost.
Pri AVR-ju pa "je na lokaciji tabele vpisana konkretna vrednost katero čitamo s pomočjo instrukcije LPM ter Z ter r0 registra.


nadaljevanje 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: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jul 26, 2008 6:42 pm    Naslov sporočila:   Odgovori s citatom

Uporabljene procedure:
Attiny26

;
Koda:
-------------------------------------------------------
;klic procedure premakne mesto vpisa
;v prvo ali drugo vrstico
;-------------------------------------------------------
VRSTA2:
   ldi tmp,0b11000001
   rjmp VRSTA1a
VRSTA1:
   ldi tmp,0b10000000
VRSTA1a:
   cbi PORTB,RS
   rcall POSLJI_ZNAK
   rcall PAVZA15mS
   ret



;------------------------------------------------------
;procedura ob prekoracitivi izpolni na displej
;napise "- - - -"
;postavljem bo tudi bit 0 registra kontrolni
;------------------------------------------------------
PREKORACITEV:
   mov tmp,KONTROLNI
   cbr tmp,0b1
   mov KONTROLNI,tmp      ;predposavljam da ni prekoracitve
   ldi tmp,high(1001)
   cp H_BITI2,tmp         ;primerjava gornjih bitiov (če je prikaz 1000)
   breq   SPODNJI                     
   ret
SPODNJI:
   ldi tmp,low(1001)
   cp tmp,L_BITI2
   brcs PREVEC
   ret
PREVEC:
   mov tmp,KONTROLNI
   sbr tmp,0b1
   mov KONTROLNI,tmp      ;oznacim prekoracitev
   ldi tmp,11
   mov ENICA,tmp
   mov DTICA,tmp
   mov STICA,tmp
   mov TTICA,tmp
   ret
   
      



;------------------------------------------------------
;procedura pretvori 16 bitno stevilko v
;rezultat je v 5-tih registrih z začetkom v registru
;na lokaciji določeni v ZL. Uproablja se indirektno
;naslavljanje. Vrednost za pretvorbo pa predhodno
;vpišemo v register L_BITI2 (nizki biti) ter H_BITI
;visoki biti
;------------------------------------------------------
B16toBNC:
   clr ZH
   ldi ZL,22
   ldi tmp,low(10000)
   mov L_BITI,tmp
   ldi tmp,high(10000)
   mov H_BITI,tmp
   rcall RACUNAJ_BNC

   ldi tmp,low(1000)
   mov L_BITI,tmp
   ldi tmp,high(1000)
   mov H_BITI,tmp
   rcall RACUNAJ_BNC

   ldi tmp,low(100)
   mov L_BITI,tmp
   ldi tmp,high(100)
   mov H_BITI,tmp
   rcall RACUNAJ_BNC

   ldi tmp,low(10)
   mov L_BITI,tmp
   ldi tmp,high(10)
   mov H_BITI,tmp
   rcall RACUNAJ_BNC
   st Z+,L_BITI2
   ret

RACUNAJ_BNC:
   clr tmp                     //register uporabljam za stevec
RACUNAJ_BNC1:
   cp H_BITI2,H_BITI      //primerjava zgornjih visokih bitov z decimalnimi biti
   brcs BNC_KONEC         //visoki biti so nizji
   brne BNC_ODSTEJ         //visoki biti so višji - bom odstel
   cp L_BITI2,L_BITI      // primerjava spodnjih bitov
   brcs BNC_KONEC

BNC_ODSTEJ:
   sub L_BITI2,L_BITI   //odstejem decimalno od spodnjih bitov
   sbc H_BITI2,H_BITI
   inc tmp
   rjmp RACUNAJ_BNC1

BNC_KONEC:
   st Z+,tmp
   ret



;---------------------------------------------
;Procedura pretvori 10 bitno AD vredost
;v 4 registre za prikaz
;enica,dtica,stica,ttica
;---------------------------------------------
HEX_DEC:
   clr ENICA
   clr DTICA
   clr STICA
   clr TTICA
   mov ENICA,tmp
CIFRA100:
   subi ENICA,100
   brcs CIFRA10
   inc STICA
   rjmp CIFRA100
CIFRA10:
   ldi tmp,100
   add ENICA,tmp
CIFRA10a:
   subi ENICA,10
   brcs CIFRA1
   inc DTICA
   rjmp CIFRA10a
CIFRA1:
   ldi tmp,10
   add ENICA,tmp
   ret
   


;---------------------------------------------
;procedura poslje stevilko dobljeno v register
;tmp na displej
;---------------------------------------------
LCD_CIFRA:
   ldi ZL,low(CIFRE*2)
   ldi ZH, high(CIFRE*2)      ;v Z register vpisem zacetek tabele
   add ZL,tmp                     ;povecam nizek stevec za vrednost za prikaz
   brvc NA_PRIKAZ               ;register ZL ni prekoracen
   inc ZH                           ;prekoracitev registra ZL zato povecam ZH
NA_PRIKAZ:
   lpm                                 ;branje lokacije
   mov tmp,r0                     ;prepis v register tmp
   sbi PORTB,RS                  ;vpis v podatkovni ram
   rcall POSLJI_ZNAK            ;procedura izvede vpis
   ret




;-------------------------------------------
;procedura pošlje vsebino tabele na displej
;-------------------------------------------
LCD_TXT:
   sbi PORTB,RS
   lpm
   tst R0
   brne ZNAK_OK
   ret
ZNAK_OK:
   mov tmp,r0
   rcall Pavza200mS            ;znake pisem z zamikom 200mS
   rcall POSLJI_ZNAK
   inc ZL
   brne LCD_TXT
   inc ZH

   rjmp LCD_TXT
   
   



;-----------------------------------------------------------
;procedura inicializira LCD
;lcd je priključen na portb
;uporabljena je 4 bitna komunikacija
;PB0-PB3 - data linije
;PB4-RS PB5-E
;-----------------------------------------------------------
LCD_INIC:
   rcall Pavza15mS         ;pavza 15mS
   ldi tmp,0b11
   out PORTB,tmp   
   rcall VPISI
   rcall Pavza4100uS      ;pavza 4.1mS
   rcall VPISI
   rcall Pavza100uS      ;pavza 100uS
   rcall VPISI
   rcall Pavza4100uS
   cbi PORTB,0
   rcall VPISI
   rcall Pavza40uS         ;4bitino
   rcall VPISI               ;1
   ldi tmp,0b1100
   out PORTB,tmp
   rcall VPISI               ;2
   rcall PAVZA40uS
   clr tmp
   out PORTB,tmp
   rcall VPISI               ;1
   ldi tmp,0b1000
   out PORTB,tmp            ;2
   rcall VPISI
   rcall PAVZA40uS         ;displjej off cursor off blink off
   clr tmp
   out PORTB,tmp
   rcall VPISI               ;1
   ldi tmp,0b1111
   out PORTB,tmp            ;2
   rcall VPISI
   rcall PAVZA1700uS         ;displjej on cursor on blink on
   clr tmp
   out PORTB,tmp
   rcall VPISI               ;1
   ldi tmp,0b100
   out PORTB,tmp            ;2 Displej stoji cursor se pomika desno (insert izkljucen)
   rcall VPISI
   rcall PAVZA40uS         ;
   clr tmp
   out PORTB,tmp
   rcall VPISI
   ldi tmp,1
   out PORTB,tmp
   rcall VPISI
   rcall PAVZA15mS         ;brisanje displeja
   ret


   
;-----------------------------------------------------------
;Pavza 1700uS   Oscilator 4Mhz
;-----------------------------------------------------------
Pavza1700uS:
  ldi r20,210
  ldi r21,9
P_zanka5:
  dec r20
  brne P_zanka5
  dec r21
  brne P_zanka5
 ret


;-----------------------------------------------------------
;Pavza 40uS   Oscilator 4Mhz
;-----------------------------------------------------------
Pavza40uS:
  ldi r20,51
P_zanka4:
 dec r20
 brne P_zanka4
 ret


;-----------------------------------------------------------
;Pavza 100uS   Oscilator 4Mhz
;-----------------------------------------------------------
Pavza100uS:
  ldi r20,131
P_zanka3:
 dec r20
 brne P_zanka3
 ret


;-----------------------------------------------------------
;Pavza 4100uS   Oscilator 4Mhz
;-----------------------------------------------------------
Pavza4100uS:
  ldi r20,73
  ldi r21,22
P_zanka2:
  dec r20
  brne P_zanka2
  dec r21
  brne P_zanka2
  nop
  ret


;-----------------------------------------------------------
;Pavza 15mS   Oscilator 4Mhz
;-----------------------------------------------------------
Pavza15mS:
  ldi r20,233
  ldi r21,78
P_zanka1:
  dec r20
  brne P_zanka1
  dec r21
  brne P_zanka1
  nop
  ret


;-----------------------------------------------------------
;procedura izvede vpis na lcd
;-----------------------------------------------------------
VPISI:
   sbi PORTB,E
   nop
   nop
   cbi PORTB,E
   ret



;-----------------------------------------------------------
;Procedura pošlje karakter dobljen v tmp register na displje
;uporabljeni registri tmp,tmp1,tmp2
;-----------------------------------------------------------
POSLJI_ZNAK:
   mov tmp1,tmp
   swap tmp1
   andi tmp,0b1111
   andi tmp1,0b1111
   in tmp2,PORTB
   cbr tmp2,0b1111      ;brisem bite ki jih potrebuje lcd
   add   tmp1,tmp2
   out PORTB,tmp1
   rcall VPISI
   add tmp,tmp2
   out PORTB,tmp
   rcall VPISI
   rcall Pavza40us
   ret




;-----------------------------------------------------------
;Pavza 200mS   Oscilator 4Mhz
;-----------------------------------------------------------
Pavza200mS:
  ldi r20,239
  ldi r21,15
  ldi r22,5
P_zanka:
  dec r20
  brne P_zanka
  dec r21
  brne P_zanka
  dec r22
  brne P_zanka
  nop
  nop
  ret


;-----------------------------------------------------------
;Pavza 1S   Oscilator 4Mhz
;-----------------------------------------------------------
Pavza1S:
  ldi r20,189
  ldi r21,75
  ldi r22,21
P_zanka6:
  dec r20
  brne P_zanka6
  dec r21
  brne P_zanka6
  dec r22
  brne P_zanka6
 ret



16F88

Koda:

;-----------------------------------------------
;procedura kontrolira, da prikaz ne bo
;vecji od 1009 - v primeru prekoracitve
;bodo prikazane ----
;-----------------------------------------------
PREKORACITEV
   movf TTICA,f
   btfsc STATUS,Z
   return               ;na tisociti ni 0
   movlw .1
   subwf DTICA,w
   btfss STATUS,C
   return
   movlw .11
   movwf ENICA
   movwf DTICA
   movwf STICA
   movwf TTICA
   return
      
      
   
;-----------------------------------------------
;procedura uredi prikaz
;ne prikazuje začetnih 0
;----------------------------------------------
UREDI
   movf TTICA,f
   btfss STATUS,Z
   return
   movlw .10
   movwf TTICA
   movf STICA,f
   btfsc STATUS,Z
   movwf STICA
   return


   
   
   
;------------------------------------------------
;pretvorba 16 bitne vrednosti v 4 registre
;pripravljene za prikaz   
;16 bitno vrednost pred klicom procedure
;vpišemo v registre H_TMP ter L_TMP
;rezultat je v registrih ENICA,DTICA,STICA,TTICA
;DTTICA
;-----------------------------------------------
      
B16toBNC
   movlw high(.10000)
   movwf H_BITI
   movlw low(.10000)
   movwf L_BITI
   call ODSTEJ
   movf TMP1,w
   movwf DTTICA
   
   movlw high(.1000)
   movwf H_BITI
   movlw low(.1000)
   movwf L_BITI
   call ODSTEJ
   movf TMP1,w
   movwf TTICA
   
   movlw high(.100)
   movwf H_BITI
   movlw low(.100)
   movwf L_BITI
   call ODSTEJ
   movf TMP1,w
   movwf STICA
   
   movlw high(.10)
   movwf H_BITI
   movlw low(.10)
   movwf L_BITI
   call ODSTEJ
   movf TMP1,w
   movwf DTICA
   movf L_TMP,w
   movwf ENICA
   return
   
ODSTEJ
   clrf TMP1
PONOVI   
   movf H_BITI,w
   subwf H_TMP,w
   btfss STATUS,C
   return                  ;stevilo je manjse
   btfss STATUS,Z
   goto ODSTEJ1
   movf L_BITI,w
   subwf L_TMP,w
   btfss STATUS,C
   return               ;stevilo je  manjse   
ODSTEJ1
   movf L_BITI,w
   subwf L_TMP,f
   btfss STATUS,C
   decf H_TMP,f
   movf H_BITI,w
   subwf H_TMP,f
   incf TMP1,f
   goto PONOVI
   
   



;-----------------------------------------
;inicializacija displeja
;----------------------------------------
LCD_INIC
   call Pavza15mS
   movlw b'11'
   movwf PORTB
   call VPISI
   call Pavza4100uS
   call VPISI
   call Pavza100uS
   call VPISI
   call Pavza4100uS
   bcf PORTB,0
   call VPISI
   call Pavza40uS
   call VPISI
   movlw b'1100'
   movwf PORTB
   call VPISI
   call Pavza40uS
   clrf PORTB
   call VPISI
   movlw b'1000'
   movwf PORTB
   call VPISI
   call Pavza40uS

   clrf PORTB
   call VPISI
   movlw b'1111'
   movwf PORTB
   call VPISI
   call Pavza1700uS

   clrf PORTB
   call VPISI
   movlw b'100'
   movwf PORTB
   call VPISI
    call Pavza40uS
    clrf PORTB
    call VPISI
    bsf PORTB,0
    call VPISI
    call Pavza15mS
    return
   
      
;----------------------------------------
;procedura izvede vpis
;----------------------------------------
VPISI
   bsf E
   nop
   nop
   bcf E
   return   
   
   
   
;------ 15 mS Pavza 4 MHz
Pavza15mS
   movlw   .20
   movwf   t1
   movlw   .121
   movwf   t2
ZP1   
   decfsz t2,f
   goto   ZP1
   decfsz t1,f
   goto   ZP1
   return


;------ 4100 uS Pavza 4 MHz
Pavza4100uS
   movlw   .6
   movwf   t1
   movlw   .81
   movwf   t2
ZP2   
   decfsz t2,f
   goto   ZP2
   decfsz t1,f
   goto   ZP2
   return


;------ 100 uS Pavza 4 MHz
Pavza100uS
   movlw   .31
   movwf   t2
ZP3   
   decfsz t2,f
   goto   ZP3
   nop
   return


;------ 40 uS Pavza 4 MHz
Pavza40uS
   movlw   .11
   movwf   t2
ZP4   
   decfsz t2,f
   goto   ZP4
   nop
   return


;------ 1700 uS Pavza 4 MHz
Pavza1700uS
   movlw   .3
   movwf   t1
   movlw   .51
   movwf   t2
ZP5   
   decfsz t2,f
   goto   ZP5
   decfsz t1,f
   goto   ZP5
   return
   
   

;pavza 1s
Pavza1S
   movlw   .6
   movwf   t1
   movlw   .24
   movwf   t2
   movlw   .167
   movwf   t3
ZP6
   decfsz t3,f
   goto ZP6
   decfsz t2,f
   goto ZP6   
   decfsz t1,f
   goto ZP6
   return
   
   
   ;pavza 200ms
Pavza200mS
   movlw   .2
   movwf   t1
   movlw   .5
   movwf   t2
   movlw   .183
   movwf   t3
ZP7
   decfsz t3,f
   goto ZP7
   decfsz t2,f
   goto ZP7   
   decfsz t1,f
   goto ZP7
   return
   
   
   
;------------------------------------
;procedura poslje znak dobljen v
; W na LCD
;------------------------------------
POSLJI_ZNAK   
   movwf TMP         ;shranem W
   movlw b'11110000'
   andwf PORTB,f         ;brisanje pinov LCD
   swapf TMP,W
   andlw b'1111'
    iorwf PORTB,f
    call VPISI
    movlw b'11110000'
   andwf PORTB,f         ;brisanje pinov LCD
   movf TMP,w
   andlw b'1111'
   iorwf PORTB,f
   call VPISI
   call Pavza40uS
   return




Procedure zajemajo inicializacijo LCD, 4 bitno komunikacijo, "kracanje" po LCD-ju, nekaj pretvarjanja ter racunanja. S pomnilnikom nisem posebej varčeval. Marikaj se da napisat krajše in varčnejše. (recimo pavze) Ker sem pred časom napisal program za izračun pavz sem se ga poslužil. Zaradi tega so pavze tako napisane.


Nadaljevanje 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: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jul 26, 2008 7:09 pm    Naslov sporočila:   Odgovori s citatom

LCD živi.

Še nekaj mojih zaključnih misli.
V obeh primerih sem uporabil orodje, katero proizvajalca nudita free. AvrStudio ter MPLAB. Oba orodja sta zelo dobra. Imata dobra simulatorja. Prav tako je zelo dober help v AVR assemblerju. Za MPLAB ne vem - ga nisem nikoli uporabljal Embarassed V AVR Studio pogrešam številčenje vrstic levo zraven kode.
Za programiranje AVR sem uporabil darkotov programator, ki se je izkazal kot izredno zanseljiv. Programiranje je možno iz samega programskega vmesnika AVR studia. Programator je izredno hiter. Programiranje ne traje dlje kot kako sekundo.

Za programiranje PIC-a sem uporabil ICD2 clone. Gre za programator ter debuger narejen v samogradnji. Tudi tukaj je možno programiranje iz samega okolja MPLAB. Hitrost je podobna kot pri darkotovem programatorju.

Zmagovalca oz. poraženca po mojem mnenju ni.
PIC ima nekaj stvari, ki jih pri AVR-ju pogrešam. Recimo programsko definiranje fuse bitov. Pa mogoče "avtomatski sklad" katerga ni potrebno programsko določiti na začetku programa. Pic ima tudi nekaj stvari "preveč". Recimo BANKE, ki marsikomu zagrenijo programiranje. (ko se jih navadiš te sicer ne motijo več, pa jih pri AVR pogrešaš Wink ) PIC ima le en W (delovni register). Nič ne bi bilo narobe, če bi imel katerega več. AVR assembler ima bistveno več instrukcij. Mogoče to pripomore, da je napisana kaka programska vrstica manj. (vrstic sicer nisem štel) a potrebuješ več časa, da se jih naučiš, ali uporabiš "plonk ceglc" s spiskom kot jaz.
Pri obeh pogrešam recimo samodejno shranitev W ob vstopu v prekinitev. Dobro, AVR ima več registrov a PIC ima le enega. Tega bi lahko lepo hardversko "potisnili" v sklad ter ga po koncu prekinitve vrnili.



P7260050.JPG
 Opis:
 Velikost datoteke:  411.06 KB
 Pogledana:  18 krat

P7260050.JPG



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



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Sob Jul 26, 2008 9:05 pm    Naslov sporočila:   Odgovori s citatom

Tako da isto sranje isto pakovanje z vašim mnenju se strinjam in mislim prav tako večna tekmeca večno izenačena drug brez drugega pa ne bi mogla živet!
Pač tako kot pa če bi pogledal knjigo s tdim platnicam in pa knjigo z mehkim platnicam iste vsebine!!!

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
podboj
Član
Član



Pridružen-a: Sre 25 Maj 2005 11:48
Prispevkov: 1251
Aktiv.: 5.63
Kraj: Postojna, Sežana, Ljubljana

PrispevekObjavljeno: Sob Jul 26, 2008 10:00 pm    Naslov sporočila:   Odgovori s citatom

Silvo: morda ne bi bila slaba ideja če objaviš ta voltmeter s picem v zbirki projektov.
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: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Sob Jul 26, 2008 10:02 pm    Naslov sporočila:   Odgovori s citatom

podboj je napisal/a:
Silvo: morda ne bi bila slaba ideja če objaviš ta voltmeter s picem v zbirki projektov.


Ko bom pripravil dokumentacijo, bom vse pripel med projekte. Za AVR je načeloma končana. Moram le še narisat načrt.

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



Pridružen-a: Sob 08 Mar 2008 13:47
Prispevkov: 2173
Aktiv.: 11.12
Kraj: Maribor (Pohorje)

PrispevekObjavljeno: Sob Jul 26, 2008 10:29 pm    Naslov sporočila:   Odgovori s citatom

podboj je napisal/a:
Silvo: morda ne bi bila slaba ideja če objaviš ta voltmeter s picem v zbirki projektov.


Ja, pa voltmeter za Atmelom tudi, prosim. Laughing

_________________
Upanje ni del naše projektne strategije.
Member of Trisat - 1. Slovenian satellite running new fault tolerant aerospace processor.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.63
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Sob Jul 26, 2008 11:08 pm    Naslov sporočila:   Odgovori s citatom

Baje so AVRji cenejši od PICev. Uporabljam AVRje , in imam sam križ iz njimi.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Sob Jul 26, 2008 11:30 pm    Naslov sporočila:   Odgovori s citatom

PC_Master je napisal/a:
Baje so AVRji cenejši od PICev. Uporabljam AVRje , in imam sam križ iz njimi.


Aja, kako pa je z sampli pri AVR-ji ji lahko dobiš kot sample?

No če že jih dobiš kot sample imaš potem zelo obširna obzorja če pa ne pa so PIC-i v prednosti!

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Silvo
Moderator
Moderator



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

PrispevekObjavljeno: Sob Jul 26, 2008 11:32 pm    Naslov sporočila:   Odgovori s citatom

PC_Master je napisal/a:
Baje so AVRji cenejši od PICev.


Mislim, da so kar pribižno enake. Primerjalna cena cenika HTE za omenjena primerka
PIC 5,12 € Tiny26 4,46 €

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



Pridružen-a: Tor 01 Jan 2008 17:37
Prispevkov: 747
Aktiv.: 3.78
Kraj: Slovenj Gradec

PrispevekObjavljeno: Ned Jul 27, 2008 12:11 am    Naslov sporočila:   Odgovori s citatom

Moj odgovor k temu kaj je bolje PIC ali AVR.
Jaz mislim, da je tako: Bolši je tisti katerega znaš uporabljat oziroma poznaš programsko orodje za le-taga. Sam pa uporabljam AVR, ker smo imeli nekaj osnov v šoli.

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno 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
Pojdi na stran 1, 2, 3, 4  Naslednja
Stran 1 od 4

 
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group