gavrasm Gerd's AVR assembler version 1.0 (C)2004 by DG4FAC
----------------------------------------------------------
Source file: rnd_test1.asm
Hex file:    rnd_test1.hex
Eeprom file: rnd_test1.eep
Compiled:    20.12.2004, 21:25:08
Pass:        2
     1: ;***************************************************************************
     2: ; Application:  random light blinker.
     3: ; Author:       Dan Williams
     4: ; Date:         dec 2004
     5: ; Assembler:    
     6: ; Target:       Atmel ATtiny13.
     7: ;***************************************************************************
     8: ;
     9: ; notes:
    10: ;
    11: ;****************************************************************************
    12: 
    13: .device ATtiny13 
    14: 
    15: ; ------------- Memory locations ---------------
    16: ;
    17: ;  .def bar =r01 ; one byte ram location
    18: ;
    19: ; ----------------------------------------------
    20: 
    21: ; R 0 ->15 are gen. purp.
    22: 
    23: .def A          = r16    
    24: .def B          = r17   ;
    25: .def C          = r18
    26: .def D          = r19
    27: 
    28: .def rnd1       = r20   ; the random number.
    29: .def rnd2       = r21
    30: .def rnd3       = r22
    31: .def rnd4       = r23
    32: .def temp1      = r24
    33: .def count1     = r25
    34: .def count2     = r26
    35: .def count3     = r27
    36: .def kick1      = r28 ; timeout
    37: .def _Y         = r29
    38: .def _Z         = r30
    39: 
    40: 
    41: ;cant use r25 -> r31
    42: 
    43: ; ------------- Equates ------------------
    44: 
    45: .equ INPUT   = 0
    46: .equ OUTPUT  = 1
    47: 
    48: ; --- Port Directions ---
    49: .equ PB0DIR  = INPUT ; !!!???!!! changeme
    50: .equ PB1DIR  = OUTPUT
    51: .equ PB2DIR  = INPUT
    52: .equ PB3DIR  = INPUT
    53: .equ PB4DIR  = INPUT
    54: .equ PB5DIR  = INPUT
    55: 
    56: ; --- Initial port state ---
    57: .equ INPB0   = 0  ; !!!???!!! changeme
    58: .equ INPB1   = 0
    59: .equ INPB2   = 0
    60: .equ INPB3   = 0
    61: .equ INPB4   = 0
    62: .equ INPB5   = 0
    63: 
    64: ; --- Port Names ---
    65: .equ PORT1    = 0  ;
    66: .equ PORT2    = 1  ; !!!???!!! changeme's
    67: .equ PORT3    = 2  ; 
    68: .equ PORT4    = 3  ;
    69: .equ PORT5    = 4  ;
    70: .equ PORT6    = 5  ;
    71: 
    72: ; --- amalgimate ---
    73: 
    74: .equ INITDIR   = ((PB5DIR<<DDB5)|(PB4DIR<<DDB4)|(PB3DIR<<DDB3)|(PB2DIR<<DDB2)|(PB1DIR<<DDB1)|(PB0DIR<<DDB0))
    75: .equ INITSTATE = ((INPB5<<PORTB5)|(INPB4<<PORTB4)|(INPB3<<PORTB3)|(INPB2<<PORTB2)|(INPB1<<PORTB1)|(INPB0<<PORTB0))
    76: 
    77: .equ CH1  = 1
    78: .equ CH2  = 0  ; not used
    79: .equ CH3  = 2  ; not used
    80: 
    81: ;========================| SYSTEM VECTORS |===========================
    82: ;
    83: .cseg                                   ;CODE segment
    84: .org 0x0000
    85: 000000   C009  rjmp    init   ; RESET 
    86: 000001   9518  reti           ; EXT_INT0  
    87: 000002   9518  reti           ; PCINT0   (pin change)
    88: 000003   9518  reti           ; TIM0_OVF  
    89: 000004   9518  reti           ; EE_RDY  
    90: 000005   9518  reti           ; ANA_COMP  
    91: 000006   9518  reti           ; TIM0_COMPA  
    92: 000007   9518  reti           ; TIM0_COMPB  
    93: 000008   9518  reti           ; WATCHDOG  
    94: 000009   9518  reti           ; ADC  
    95: 
    96: ;=============================| MAIN |================================
    97: ;
    98: 
    99: 
   100: .org 0x000A
   101: init:   
   102:         ; Set up stack
   103: 00000A   E90F  ldi     A,   low(RAMEND)        ; load low address of ram to R16...
   104: 00000B   BF0D  out     SPL, A               ; Set Stack Pointer to top of RAM
   105: 
   106:         ; Disable interrupts
   107: 00000C   94F8  cli        
   108: 
   109:         ; Set up io ports
   110: 00000D   E000  ldi   A,    INITSTATE
   111: 00000E   BB08  out   PORTB, A
   112: 00000F   E002  ldi   A,    INITDIR
   113: 000010   BB07  out   DDRB,  A      
   114: 
   115: 
   116: 000011   ED4A  ldi rnd1, 0xDA   ; random seed
   117: 
   118: 000012   D02D  rcall adc_init
   119:  ;  rcall pwm_init
   120:    
   121:  
   122: 
   123: MainLoup:
   124:      
   125: 000013   D00A  rcall random
   126: 000014   364E  cpi   rnd1, 110
   127:         
   128: 000015   F030  brlo  skip
   129: 000016   99C1  sbic PORTB, CH1
   130: 000017   C002  rjmp on
   131:             ; kick it back on if off for <3
   132:           ;  inc kick1
   133:           ;  cpi kick1, 0x02
   134:           ;  brge on
   135:             ; kick            
   136: 000018   9AC1  sbi  PORTB, CH1
   137: 000019   C002  rjmp skip 
   138:             
   139: on:        
   140: 00001A   27CC  clr kick1
   141: 00001B   98C1  cbi PORTB, CH1
   142:  
   143: skip:
   144:         
   145: 00001C   D01C  rcall wait  
   146:         
   147:         
   148:      ;   IN  A, ADCH
   149:      ;   OUT OCR0A, A      
   150:      
   151: 00001D   CFF5  rjmp    MainLoup                ; go back and do it all over again
   152: 
   153: 
   154: ;========================| SUBROUTINES |==============================
   155: ;
   156: 
   157: random:    
   158: 00001E   2F07  mov   A,rnd4      ; BIT 25 TO CARRY
   159: 00001F   9507  ror   A    
   160: 000020   2F76  mov   rnd4,rnd3    
   161: 000021   2F65  mov   rnd3,rnd2    
   162: 000022   2F54  mov   rnd2,rnd1   ; SHIFT ALL BYTES LEFT
   163:     
   164: 000023   2F07  mov   A,rnd4      ; WAS rnd3
   165: 000024   9507  ror   A           ; GET BIT 25 (IN CARRY) INTO OLD rnd3
   166: 000025   2F80  mov   temp1,A     ; SAVE IT FOR LATER
   167:     
   168: 000026   2F04  mov   A,rnd1    
   169: 000027   1F00  rol   A           ; BIT 1 TO 7 IN POSITION
   170: 000028   2F40  mov   rnd1,A      ; PUT BACK
   171:     
   172: 000029   2F08  mov   A,temp1     ; RESTORE A
   173: 00002A   2704  eor   A,rnd1      ; MOD 2 SUM OF ALL BITS IN rnd1 AND THE CARRY BIT (exclusive or)
   174: 00002B   2F80  mov   temp1,A     ; SAVE IT
   175:     
   176: 00002C   2F07  mov   A,rnd4    
   177: 00002D   9507  ror   A    
   178: 00002E   2F70  mov   rnd4,A      ; ROTATE rnd4
   179:     
   180: 00002F   2F06  mov   A,rnd3    
   181: 000030   9507  ror   A    
   182: 000031   2F60  mov   rnd3,A      ; ROTATE rnd3
   183:     
   184: 000032   2F05  mov   A,rnd2    
   185: 000033   9507  ror   A    
   186: 000034   2F50  mov   rnd2,A      ; ROTATE rnd2
   187:     
   188: 000035   2F08  mov   A,temp1     ; RESTORE A
   189: 000036   1F00  rol   A    
   190: 000037   2F40  mov   rnd1,A      ; xor OVER-WRITES ALL 8 BITS, BUT DOESN'T MATTER
   191: 000038   9508  ret    
   192: 
   193: 
   194: ; ----------------------------
   195: ; wait subroutine 
   196: ; ----------------------------
   197: wait:  
   198: 000039   B1A5  IN      count2, ADCH  
   199:     ;  mov     count2, A              ; load count2 with decimal 200
   200: 
   201: d2:
   202: 00003A   E3B2  ldi	count3,50
   203: 
   204: d3:
   205: 00003B   95BA  dec	count3
   206: 00003C   F7F1  brne	d3
   207: 00003D   95AA  dec     count2                  ; decrement count2
   208: 00003E   F7D9  brne    d2                      ; loop if not zero              
   209: 00003F   9508  ret
   210:     
   211: 
   212: 
   213: adc_init:
   214:   ; set up adc1 as analog input
   215: 000040   E004  ldi A, 0x04
   216: 000041   BB04  out DIDR0, A
   217:   ; auto trigger to free running
   218: 000042   E000  ldi A, 0x00
   219: 000043   B903  out ADCSRB, A
   220:   ; set mux channel
   221: 000044   E203  ldi A, 0x23
   222: 000045   B907  out ADMUX, A
   223:   ; turn system on
   224: 000046   EE0E  ldi A, 0xEE
   225: 000047   B906  out ADCSRA, A
   226: 000048   9508  ret
   227: 
   228: 
   229: 
   230: pwm_init:
   231:   ; clear pwm levels
   232: 000049   E30F  ldi  A, 0x3F
   233: 00004A   BF06  out  OCR0A, A 
   234: 00004B   EB0F  ldi  A, 0xBF
   235: 00004C   BD09  out  OCR0B, A
   236:   ; set up TCCR0A
   237: 00004D   EA03  ldi  A, 0xA3
   238: 00004E   BD0F  out  TCCR0A, A
   239:   ; set up TCCROB
   240: 00004F   E002  ldi  A, 0x02
   241: 000050   BF03  out  TCCR0B, A
   242: 000051   9508  ret
   243: 
   244: 
   245: 
   246: 
   247: 
   248: 
   249: 
   250: 
   251: 
 -> Warning 001: 15 symbol(s) defined, but not used!

Program             :       82 words.
Constants           :        0 words.
Total program memory:       82 words.
Eeprom space        :        0 bytes.
Data segment        :        0 bytes.
Compilation completed, no errors.
Compilation endet 20.12.2004, 21:25:08
