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 

Programiranje AVR v asemblerju
Pojdi na stran 1, 2, 3, 4, 5  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
VolkD
Član
Član



Pridružen-a: Pet 24 Sep 2004 21:58
Prispevkov: 14228
Aktiv.: 60.07
Kraj: Divača (Kačiče)

PrispevekObjavljeno: Ned Feb 03, 2008 9:58 pm    Naslov sporočila:   Odgovori s citatom

Popolnoma prav si razumel.

Citiram:
Darko, mogoče bi odprl novo temo na programiranje AVR v zbirniku?


Lahko, a dvomim, da bo kaj veliko pisanja na to temo. No kakorkoli imam kar nekaj stvaritev narejenih izključno v ASM.
A nebi šel več ponavljat. Je prezamudno.

_________________
Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Silvo
Moderator
Moderator



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

PrispevekObjavljeno: Ned Feb 03, 2008 9:58 pm    Naslov sporočila:   Odgovori s citatom

VolkD je napisal/a:

Zakaj se sploh mučit z assemblerjem že takoj na začetku?....


He, he zame Assembler ni bil nikoli mučenje Wink. Mislim, da je edini način, da spoznaš arhitekturo mikrokontrolerja do podrobnosti.

_________________
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: Ned Feb 03, 2008 11:11 pm    Naslov sporočila:   Odgovori s citatom

Evo sem se že malo igral. AVR studio je kar precej podoben MPLAB-u, tako , da glede tega vrjetno ne bo večjega problema. Simulacija lepo dela. Moram jutri sestavit eno testno ploščo.
Vprašanje:
- a omgogoča AVRStudio številčenje vrstic - če, kje se vključi
- kako razume assembler binarno vrednost? (pic recimo B'11111111')



atttiny.jpg
 Opis:
 Velikost datoteke:  165.95 KB
 Pogledana:  99 krat

atttiny.jpg



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



Pridružen-a: Sob 25 Jun 2005 13:45
Prispevkov: 541
Aktiv.: 2.28
Kraj: Črnomelj

PrispevekObjavljeno: Ned Feb 03, 2008 11:55 pm    Naslov sporočila:   Odgovori s citatom

Silvo, pusti asembler in se primi C-ja, pa boš videl koliko časa bi lahko v preteklosti prihranil na ta račun. Lahko si bi privoščil še kakšen dopust več vsako leto.
Twisted Evil
Preizkusi Codevision CVAVR compiler, ki je odlično orodje in boš kmalu pozabil na PIC-e in asembler. Wink
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: Pon Feb 04, 2008 12:52 pm    Naslov sporočila:   Odgovori s citatom

tonko je napisal/a:
Silvo, pusti asembler in se primi C-ja, pa boš videl koliko časa bi lahko v preteklosti prihranil na ta račun. Lahko si bi privoščil še kakšen dopust več vsako leto.
Twisted Evil
Preizkusi Codevision CVAVR compiler, ki je odlično orodje in boš kmalu pozabil na PIC-e in asembler. Wink


Na PIC-e vrjetno ne bom pozabil, ker čisto zadostujejo mojim potrebam. Wink

Tole mi je pravzaprav izziv, zato sem se zadeve lotil v assemblerju. Mislim pa, da je to edini način, ko si prisiljen, da dobro spoznaš arhitekturo mikrokontrolerja.

PS
Kako je s temi "čudežnimi" fuse biti pri AVR-jih. Dostikrat sem prebral da jih je nekdo postavil narobe, na kar ni bilo več mogoče serijsko programiranje.
Ravno si delam en vmesnik, da bom lahko ATTIY26L dal na testno ploščo. Imam ga namreč v SMD ohišju. Uporabil bom darkotov programator. Kako morajo biti postavljeni fuse biti?

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



Pridružen-a: Sob 06 Dec 2003 11:17
Prispevkov: 57
Aktiv.: 0.24
Kraj: Okolica MB

PrispevekObjavljeno: Tor Feb 05, 2008 2:21 am    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:

.... Rad bi nekaj literature o assemblerju, kak primer kode, skratka nekaj, da lahko sploh začnem pisati ter ob enem študirati arhitekturo. ...


http://www.mikrocontroller.net/articles/AVR-Tutorial

Na tej strani so primeri programov v assemblerju ( i/o, prekinitve, sklad, pulzno-širinska modulacija,LCD ...). Stran je v nemščini, je pa zanimiva za začetnike.
Na isti strani je tudi tutorial za programiranje v C-ju.

_________________
Lep pozdrav,
Boštjan
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: Tor Feb 05, 2008 6:37 pm    Naslov sporočila:   Odgovori s citatom

Moji prvi koraki - "spustil" prvi program v attiny-ja Wink Programator dela Cool . Ledica tudi utripa.

Sedaj pa vprašanje:

Kako je s skladom?

Tole sem recimo napisal:

Koda:
rjmp GLAVNI

.org $0c

GLAVNI:
   ldi r16,0xff
   out DDRB,r16
ZANKA:
//   ser r16 set all bit
   ldi r16,0x40
   out PORTB,r16
//   rcall PAVZA
   rjmp PAVZA
   
Z2:
   clr r16
   out PORTB,r16

   rjmp PAVZA2




   PAVZA:
      
      ldi r16,0xff
      mov r1,r16
      mov r2,r16
   Z1:
      dec r1
      mov r16,r1
      cpi r16,0
      brne Z1
      ldi r16,0xff
      mov r1,r16
      dec r2
      mov r16,r2
      cpi r16,0
      brne Z1   
      rjmp Z2
      //ret

PAVZA2:   
      ldi r16,0xff
      mov r3,r16
      mov r4,r16
   Z1a:
      dec r3
      mov r16,r3
      cpi r16,0
      brne Z1a
      ldi r16,0xff
      mov r3,r16
      dec r4
      mov r16,r4
      cpi r16,0
      brne Z1a   
      rjmp ZANKA



Tukaj sta pravzaprav dve enaki zanki. Kako uporabiti instrukcijo RCALL ? (call attiny26 ne podpira)

Če recimo podrutino kličem z rcall PAVZA do nje sicer pridem a ret ne vrača pravilno.

Simulator tudi javlja:
Koda:
AVR Simulator: Uninitialized stack pointer used at 0x0010


Je potrebno PC pred klicem kako ročno shranit ? Če, kako?

_________________
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: Tor Feb 05, 2008 8:36 pm    Naslov sporočila:   Odgovori s citatom

Odgovarjam samemu sebi.

V reset rutini je potrebno določiti velikost sklada. V PDF-ju sem tudi zasledil, da se le ta v C-ju določi v linker file-tu.

Evo sem dobil veselje. Napisano malo drugače -"leteče luči" Wink

Koda:

include "tn26def.inc"
;moj prvi testni program atttiny26 & assembler


.org $000
   rjmp GLAVNI

.org $0c

GLAVNI:
   ldi r16,RAMEND
   out SP,r16
   ldi r16,0xff
   out DDRB,r16

ZANKA:
   ldi r16,0x8
   mov r3,r16
   out PORTB,r16
   rcall PAVZA
   clc
   rol r3
   mov r16,r3
   out PORTB,r16
   rcall PAVZA

   clc
   rol r3
   mov r16,r3
   out PORTB,r16
   rcall PAVZA

   clc
   rol r3
   mov r16,r3
   out PORTB,r16
   rcall PAVZA
   
   rjmp ZANKA



   PAVZA:
      
   ldi r16,0xff
   mov r1,r16
   mov r2,r16
Z1:
   dec r1
   mov r16,r1
   cpi r16,0
   brne Z1
   ldi r16,0xff
   mov r1,r16
   dec r2
   mov r16,r2
   cpi r16,0
   brne Z1   
   ret

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



Pridružen-a: Sre 06 Sep 2006 20:43
Prispevkov: 403
Aktiv.: 1.76
Kraj: Tržič

PrispevekObjavljeno: Tor Feb 05, 2008 10:39 pm    Naslov sporočila:   Odgovori s citatom

Silvo programira v AVRjih? Smile Bravo!! Kar tako dalje...

Asembler je dober začetek, da spoznaš "peš pot". Kasneje presedlaš na C, kjer se ne loviš več na trapastih napakah.

Sprosti se pri registrih - "working" registrov je tukaj od R0 do R31, ne samo r16. Splača se jih porabiti za bolj uporabljive spremenljivke, da ne mečeš stalno iz in v ram.

Stack se ti polni v ramu od zadaj, če se prav spomnim imajo pici ločen stack. Pri večjih programih pazi na globino, da ti stack ne povozi spremenljivk v ramu (na začetku).

Ena oblika zakasnilnih zank:

Koda:


pavza:  ldi r16,0xFF
        ldi r17,0xFF

zanka: dec r16
       brne zanka
       dec r17
       brne zanka
....
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.71
Kraj: Kranj - struževo

PrispevekObjavljeno: Sre Feb 06, 2008 2:49 pm    Naslov sporočila:   Odgovori s citatom

AVRji so super.
Sklad se nahaja na koncu pomnilnika in raste od konca proti začetku.
Fuse bitov pa se žal ne da shraniti v program Evil or Very Mad kot pri PICih.

Do sedaj sem vse projekte pisal v ASM. Čim gre za malo bolj kompliciran projekt, pa lahko zgubljaš dneve in tedne, če ne začneš s Cjem. Mene to še čaka Rolling Eyes

za vzpodbudo....

primer headerja programa:



Koda:
;==============================================================================
;
; FUSE BITS   
;   1 = UnProgrammed | |
;   0 =   Programmed |X|
;
;   CKSEL = 1010 (up, p, up, p)  ok = Crystal Oscillator, Slowly Rising Power
;       { 0000 (all programmed) ok   = Ext. Clock, Fast Rising Power }
;      { 0010  (default) = Int. RC Oscillator, Slowly Rising Power }
;
;   OCDEN    = 1
;   JTAGEN   = 1
;   BODLEVEL = 0
;   BODEN    = 0
;   EESAVE   = 1   (default)
;
;   BOOTxxx  = 1   (default)
;   xxLOCK   = 1   (default)
;   
;==============================================================================
;
;
;==============================================================================
; .DEVICE ATmega323  ; Use the ATmega 323 - definiran ze v .INCLUDE 323

.NOLIST
.INCLUDE "def_m323def.inc"   ; ATmega323 definicije
.LIST


;===== KONSTANTE ==============================================================

; skrajne vrednosti pri nastavitvi Meje v meniju
.EQU   MejaMinH = 0
.EQU   MejaMinL = 41   ; enaka ali večja od konstantne meje za ZeloDobre magnete

.EQU      RTI_cnt_load = 3         ; RTI izvede akcijo na vsakih NN interruptov.
.EQU      PavzaPWMVklopaMotorja = 10      ; delay vrednost za hitrost soft-start PWM zagona motorja


;===== DEFINICIJE REGISTROV =====

; .DEF je samo za registre

.DEF   Rdata = R00      ; prenos podatkov
.EQU   ramRdata = 0x00      ; dostop do registra 0 preko RAM-a

.DEF   WorkL = R06      ; splošni 16-bitni register
.DEF   WorkH = R07

; 16-bitni register za seštevanje do 64 meritev pri povprečenju
.DEF   MeritevAH = R8      ;16-bitni rezultat meritve na eni strani
.DEF   MeritevAL = R9

.DEF   MeritevBH = R10      ;16-bitni rezultat meritve na drugi strani
.DEF   MeritevBL = R11



.DEF   Rtemp = R16      ; večnamenski register
.DEF   Rtemp2= R17      ; večnamenski register

;===== I/O DEFINICIJE =====

; port a
.EQU   bLEDr = 0
.EQU   bLEDz = 1

.EQU   LED_byte = 0b00000011   ; pozicija obeh ledic na portu za toggle barv

.EQU   sIVZ = 5      ; izbiralni ventil zaprt - odmaknjen saržer
.EQU   sIVO = 4      ; izbiralni ventil odprt - saržer sklopljen

;===== spremenljivke v SRAM-u =================================================

.DSEG  ; podatkovni pomnilnik (SRAM)

ResetFlags:   .BYTE 1      ; izvor reseta: 000, J-Tag, Watchdog, Brown-out, External, Power-on

MeritevAH_direkt:   .BYTE 1      ;16-bitni rezultat iz ADC
MeritevAL_direkt:   .BYTE 1
MeritevBH_direkt:   .BYTE 1      ;16-bitni rezultat iz ADC
MeritevBL_direkt:   .BYTE 1


CifraPredznak: .BYTE 1
Cifra10000:   .BYTE 1
Cifra1000:   .BYTE 1
Cifra100:   .BYTE 1      ; pretvorba BIN -> ASCII
Cifra10:   .BYTE 1
Cifra1:   .BYTE 1

BlkCntH:      .BYTE 1
BlkCntL:      .BYTE 1
BlokMeritev:   .BYTE 1024

;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
;EEEEE  konstante procesa v EEprom-u   EEEEEE
;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

; te vrednosti tukaj so že prej definirane kot konstante (EQU)
.ESEG
EEzacetek:

EEchecksum:
.DB      128      ; Check-sum   (XOR) vseh sledečih podatkov

EEzacetekParametrov:
EEmejaDH:          ; (mejaH:mejaL)
.DB      dcMejaDH      ; meja med dobrimi in slabimi magneti
EEmejaDL:
.DB      dcMejaDL

EEpavzaADC:         ; (CasSample)
.DB      dcPavzaADC      ; pavza med vzorci ADC pri meritvah

;==============================================================================

.CSEG  ; programski pomnilnik
; ===== DEFINICIJE INTERRUPT VEKTORJEV ========================================
; pogoji: BOOTRST = 0, IVSEL = 0

;   Address
;      Code   Label      Comment
   .ORG 0x000
       jmp iRESET    ; Reset Handler
   .ORG INT0addr
       jmp iEXT_INT0    ; IRQ0 Handler
   .ORG INT1addr
       jmp iEXT_INT1    ; IRQ1 Handler
   .ORG INT2addr
       jmp iEXT_INT2    ; IRQ2 Handler
   .ORG OC2addr
       jmp iTIM2_COMP   ; Timer2 Compare Handler
   .ORG OVF2addr
       jmp iTIM2_OVF    ; Timer2 Overflow Handler
   .ORG ICP1addr
       jmp iTIM1_CAPT    ; Timer1 Capture Handler
   .ORG OC1Aaddr
       jmp iTIM1_COMPA    ; Timer1 CompareA Handler
   .ORG OC1Baddr
       jmp iTIM1_COMPB    ; Timer1 CompareB Handler
   .ORG OVF1addr
       jmp iTIM1_OVF    ; Timer1 Overflow Handler
   .ORG OC0addr
       jmp iTIM0_COMP    ; Timer0 Compare Handler
   .ORG OVF0addr
       jmp iTIM0_OVF    ; Timer0 Overflow Handler
   .ORG SPIaddr
       jmp iSPI_STC   ; SPI Transfer Complete Handler
   .ORG URXCaddr
       jmp iUSART_RXC    ; USART RX Complete Handler
   .ORG UDREaddr
       jmp iUSART_UDRE    ; UDR Empty Handler
   .ORG UTXCaddr
       jmp iUSART_TXC    ; USART TX Complete Handler
   .ORG ADCCaddr
       jmp iADC_CC    ; ADC Conversion Complete Interrupt Handler
   .ORG ERDYaddr
       jmp iEE_RDY    ; EEPROM Ready Handler
   .ORG ACIaddr
       jmp iANA_COMP    ; Analog Comparator Handler
   .ORG TWSIaddr
       jmp iTWSI       ; Two-wire Serial Interface Interrupt Handler


; ===== PROGRAM ===============================================================
   .ORG 0x02A

; ===== INTERRUPT RUTINE ======================================================

iRESET:      jmp PROGRAM_START    ; Reset Handler

; ===== INICIALIZACIJA ========================================================
PROGRAM_START:

   ldi   Rtemp,high(RAMEND)   ; Main program start
   out   SPH,Rtemp         ; Set Stack Pointer to end of RAM
   ldi   Rtemp,low(RAMEND)
   out   SPL,Rtemp


; globalni izklop interruptov
   cli

; nastavitev IO portov A, B, C, D

   clr   Rtemp            ; brisanje izhodov
   out   PORTA, Rtemp
   out   PORTB, Rtemp
   out   PORTC, Rtemp
   out   PORTD, Rtemp





Moja podporna knjižnica za premetavanje in izpis številk:

Koda:
; *************************************************************************************************
; * Konverzija BIN 0-255 => DEC    potrebuje registra Cnt, Rtemp in 3 lokacije v RAM-u
; * vhod = Rtemp
; * izhod = Cifra100, Cifra10, Cifra1
; *************************************************************************************************
BIN2ASCII:   

      clr   Cnt
      sts   Cifra100, Cnt
      sts   Cifra10 , Cnt
      sts   Cifra1  , Cnt


b2a_re100:   inc   Cnt
      subi   Rtemp, 100
      brcc   b2a_re100   ; C=1 ... pozitiven rezultat -> ponovimo odštevanje 100 (ni overflow)
               ; C=0 ... negativen rezultat -> popravimo in nadaljujemo z odštev. 10
      dec   Cnt
      sts   Cifra100, Cnt
      ldi   Rtemp2, 100
      add   Rtemp, Rtemp2   ; korekcija: Rtemp + 100 -> Rtemp
      
      clr   Cnt
b2a_re10:   inc   Cnt
      subi   Rtemp, 10
      brcc   b2a_re10   ; C=1 ... pozitiven rezultat -> ponovimo odštevanje 100 (ni overflow)
               ; C=0 ... negativen rezultat -> popravimo in nadaljujemo z odštev. 10
      dec   Cnt
      sts   Cifra10, Cnt
      ldi   Rtemp2, 10
      add   Rtemp, Rtemp2   ; korekcija: Rtemp + 10 -> Rtemp
; enice
      ldi   Rtemp2, 48      ; offset cifer v ASCII tabeli
      add   Rtemp, Rtemp2
      sts   Cifra1, Rtemp


      lds   Rtemp, Cifra10
      add   Rtemp, Rtemp2   ; offset cifer v ASCII tabeli
      sts   Cifra10, Rtemp

      lds   Rtemp, Cifra100
      add   Rtemp, Rtemp2   ; offset cifer v ASCII tabeli
      sts   Cifra100, Rtemp

      RET

; *************************************************************************************************

BIN2ASCII_Wsig:
      push   WorkH
      push   WorkL

      ldi   Rtemp, '+'
      sts   CifraPredznak, Rtemp


      tst   WorkH
      brpl   B2A_continue   ; pozitivna številka
      ; negativna številka

      ldi   Rtemp, '-'
      sts   CifraPredznak, Rtemp


      ldi   Rtemp, 0x00      ; negacija spodnjih 8 bitov
      sub   Rtemp, WorkL
      mov   WorkL, Rtemp

      ldi   Rtemp, 0x00      ; negacija zgornjih 8 bitov
      sbc   Rtemp, WorkH
      mov   WorkH, Rtemp

      rjmp   B2A_continue


;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$$  16-bitna konverzija BIN 0-65535 => DEC    potrebuje registra Cnt, WorkH,L in 5 lokacij v RAM-u
;$$  vhod = WorkH:WorkL
;$$  izhod = Cifra10000, Cifra1000, Cifra100, Cifra10, Cifra1
;$$                                                                 ohrani WORKH:WORKL
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

BIN2ASCII_W:

      push   WorkH
      push   WorkL

B2A_continue: ; iz predznačenega dela tukaj nadaljuje

      clr   Cnt
      sts   Cifra10000   , Cnt
      sts   Cifra1000   , Cnt
      sts   Cifra100   , Cnt
      sts   Cifra10    , Cnt
      sts   Cifra1     , Cnt

;   10000   = 27h 10h
;   1000   = 03h E8h
;   100   =
;   10   = 10
;   1   = 1

      clr   Cnt
      ldi   Rtemp, 0x10      ;   low(10.000)
      ldi   Rtemp2,0x27      ;  high(10.000)
b2aw_re5:
      inc   Cnt

      sub   WorkL, Rtemp   ;  low(10.000)
      sbc   WorkH, Rtemp2   ; high(10.000)

      brcc   b2aw_re5   ; C=1 ... pozitiven rezultat -> ponovimo odštevanje (ni overflow)
               ; C=0 ... negativen rezultat -> popravimo in nadaljujemo z nasl. odštev.
      dec   Cnt
      sts   Cifra10000, Cnt

      ; korekcija: Rtemp + 10.000 -> Rtemp
      add   WorkL, Rtemp
      adc   WorkH, Rtemp2


      clr   Cnt
      ldi   Rtemp, 0xE8      ;   low(1.000)
      ldi   Rtemp2,0x03      ;  high(1.000)
b2aw_re4:
      inc   Cnt
      sub   WorkL, Rtemp
      sbc   WorkH, Rtemp2

      brcc   b2aw_re4   ; C=1 ... pozitiven rezultat -> ponovimo odštevanje (ni overflow)
               ; C=0 ... negativen rezultat -> popravimo in nadaljujemo z nasl. odštev.
      dec   Cnt
      sts   Cifra1000, Cnt

      ; korekcija: Rtemp + 1.000 -> Rtemp
      add   WorkL, Rtemp
      adc   WorkH, Rtemp2



      clr   Cnt
      ldi   Rtemp,  100      ;  low(100)
      ldi   Rtemp2, 0      ; high(100)
b2aw_re3:
      inc   Cnt
      sub   WorkL, Rtemp
      sbc   WorkH, Rtemp2

      brcc   b2aw_re3   ; C=1 ... pozitiven rezultat -> ponovimo odštevanje (ni overflow)
               ; C=0 ... negativen rezultat -> popravimo in nadaljujemo z nasl. odštev.
      dec   Cnt
      sts   Cifra100, Cnt

      ; korekcija: Rtemp + 100 -> Rtemp
      add   WorkL, Rtemp
      adc   WorkH, Rtemp2



      clr   Cnt
      ldi   Rtemp,  10      ;  low(10)
      ldi   Rtemp2, 0      ; high(10)
b2aw_re10:
      inc   Cnt
      sub   WorkL, Rtemp
      sbc   WorkH, Rtemp2

      brcc   b2aw_re10   ; C=1 ... pozitiven rezultat -> ponovimo odštevanje 100 (ni overflow)
               ; C=0 ... negativen rezultat -> popravimo in nadaljujemo z odštev. 10
      dec   Cnt
      sts   Cifra10, Cnt

      ; korekcija: Rtemp + 10 -> Rtemp
      add   WorkL, Rtemp
      adc   WorkH, Rtemp2
; enice

      ldi   Rtemp2, 48      ; offset cifer v ASCII tabeli

      add   WorkL, Rtemp2
      sts   Cifra1, WorkL


      lds   Rtemp, Cifra10
      add   Rtemp, Rtemp2   ; offset cifer v ASCII tabeli
      sts   Cifra10, Rtemp

      lds   Rtemp, Cifra100
      add   Rtemp, Rtemp2   ; offset cifer v ASCII tabeli
      sts   Cifra100, Rtemp

      lds   Rtemp, Cifra1000
      add   Rtemp, Rtemp2   ; offset cifer v ASCII tabeli
      sts   Cifra1000, Rtemp

      lds   Rtemp, Cifra10000
      add   Rtemp, Rtemp2   ; offset cifer v ASCII tabeli
      sts   Cifra10000, Rtemp

      pop   WorkL
      pop   WorkH
      RET

;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

;==============================================================================
; izpis 8-bitne cifre na LCD


LCD_WR_NUM8:
      call   bin2ascii
      rjmp   LWN16_8
      RET


;==============================================================================
; izpis 16-bitne cifre na LCD


LCD_WR_NUM16:
      call   bin2ascii_W

      lds   I2C_dataIO, Cifra10000
      call   LCDPUTCHAR
      lds   I2C_dataIO, Cifra1000
      call   LCDPUTCHAR

LWN16_8:   lds   I2C_dataIO, Cifra100
      call   LCDPUTCHAR
      lds   I2C_dataIO, Cifra10
      call   LCDPUTCHAR
      lds   I2C_dataIO, Cifra1
      call   LCDPUTCHAR

      RET

;==============================================================================
; izpis 16-bitne predznačene cifre na LCD


LCD_WR_NUM16sig:
      call   bin2ascii_Wsig

      lds   I2C_dataIO, CifraPredznak
      call   LCDPUTCHAR

      lds   I2C_dataIO, Cifra10000
      call   LCDPUTCHAR
      lds   I2C_dataIO, Cifra1000
      call   LCDPUTCHAR

      lds   I2C_dataIO, Cifra100
      call   LCDPUTCHAR
      lds   I2C_dataIO, Cifra10
      call   LCDPUTCHAR
      lds   I2C_dataIO, Cifra1
      call   LCDPUTCHAR

      RET


;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
Silvo
Moderator
Moderator



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

PrispevekObjavljeno: Sre Feb 06, 2008 3:21 pm    Naslov sporočila:   Odgovori s citatom

spy je napisal/a:
Silvo programira v AVRjih? Smile Bravo!! Kar tako dalje...



Ja res... Wink

K temu je precej pripomogel Darko. (Njegov programator, ter nekaj primerkov mikrokontrolerjev, ki mi jih je podaril) Zelo težko namreč doma nekaj gledam, pa da to ne probam Wink
Nekako pa tudi sam želim spoznati in si ustvariti svoje menje glede PIC <->Avr.

Mikrokontroler sem šele dan ali dva nazaj dal na testno ploščo z namenom, da sprobam programator. Za pinout je bil potreben datashet, tako se je začelo... Dokumentacijo sem ravno iztiskal.

Lahko pa napišem že nekaj občutkov.
AvrStudio je izredno dobro orodje. Ima tudi dober assemblerski help, tako da poleg datasheta mikrokontrolerja skoraj ne potrebuješ ničesar drugega. Ja seveda, programator. Tudi darkotov programator je odličen.
Začel sem z ATTINY26L (darkotovo darilo). Le tega bi lahko v grobem primerjal z PIC16F88. Razlike v arhitekturi so seveda očitne. (drugačna organizacija pomnilnika, rama.., več prekinitvenih vektorjev, drugačen sklad...) V načinu programiranja v sammem assemblerju pa ne vidim tako zelo veliko razlik. Instrukcij je sicer več imenujo se drugače, so pa funkcijsko podobne ali enake pic-ovim. Za enkrat ne pričakujem nekih velikih težav. V prihodnjih dneh gre na protobord še kak displej.

_________________
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 Feb 06, 2008 3:26 pm    Naslov sporočila:   Odgovori s citatom

Aly hvala za tale košček kode.

PS
Sem se že bal, da bom edini assemblerjaš. Wink

_________________
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: Sre Feb 06, 2008 4:37 pm    Naslov sporočila:   Odgovori s citatom

Silvo banke nič ne pogrešaš? Very Happy
_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-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 Feb 06, 2008 4:55 pm    Naslov sporočila:   Odgovori s citatom

gumby je napisal/a:
Silvo banke nič ne pogrešaš? Very Happy


Pogrešam, pogrešam Laughing

_________________
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 Feb 06, 2008 9:36 pm    Naslov sporočila:   Odgovori s citatom

Evo še se igram - usposobil sem en timer ter T0 prekinitev probal branje vhoda (tipka) Koda je sicer zmedena, ker gre pred vsem za testiranje instrukcij ter vgrajene periferije. Jutri že gre na testno ploščo nekaj 7-segmentih led displejev. Wink

PS
Na forumu vas je cel kup, ki ste nabavili darkotov programator. Se mi bo še kdo pridružil?

Koda:

include "tn26def.inc"

.def STEVEC=r10

.org $000
   rjmp GLAVNI
.org $006               ;prekinitveni vektor T0
rjmp PREKINITEV_T
   
.org $0c

GLAVNI:
   ldi r16,RAMEND
   out SP,r16
   ldi r16,0xff
   out DDRB,r16
   ldi r16,3
   out TCCR0,r16

   sbi DDRA,0            ;pin RA0 izhod
   sbi PORTA,0            ;pin RA0 visok
   sbi PORTA,1
   sei                        ;generalni vklop prekinitve (status register bit 7)

   ldi r16,0b00000010   ;vklop prekinitve T0
   out TIMSK,r16
   ldi r16,0b00000001   ;
   out TCCR0,r16
ZZ1:
   sbic PINA,1
   rjmp ZZ1
   ldi r16,25
   mov STEVEC,r16
   
   

   ;rcall PREKINITEV_T
ZANKA:
   ldi r16,0b0001000
   mov r3,r16
   out PORTB,r16
   rcall PAVZA
   clc
   rol r3
   mov r16,r3
   out PORTB,r16
   rcall PAVZA

   clc
   rol r3
   mov r16,r3
   out PORTB,r16
   rcall PAVZA

   clc
   rol r3
   mov r16,r3
   out PORTB,r16
   rcall PAVZA
//   rcall BLINK
   rjmp ZANKA



   PAVZA:
      
   ldi r16,0xff
   mov r1,r16
   mov r2,r16
Z1:
   dec r1
   mov r16,r1
   cpi r16,0
   brne Z1
   ldi r16,0xff
   mov r1,r16
   dec r2
   mov r16,r2
   cpi r16,0
   brne Z1   
   ret


PREKINITEV_T:

   dec STEVEC
   breq SEKUNDA
   reti
SEKUNDA:
   rcall BLINK
   ldi r16,250
   mov STEVEC,r16
   reti
   


BLINK:
   sbic PORTA,0
   rjmp LED_OFF
   sbi PORTA,0
   ret
LED_OFF:
   cbi PORTA,0
   ret

_________________
lp
Silvo
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 AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2, 3, 4, 5  Naslednja
Stran 1 od 5

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


Powered by phpBB © 2001, 2005 phpBB Group