Search the web
Sign In
New User? Sign Up
AVRButterFly · AVR ButterFly & Beginners Group
? Already a member? Sign in to Yahoo!

Yahoo! Groups Tips

Did you know...
Want to share photos of your group with the world? Add a group photo to Flickr.

Best of Y! Groups

   Check them out and nominate your group.
Having problems with message search? Fill out this form to ensure your group is one of the first to be migrated to the new message search system.

Messages

  Messages Help
Advanced
Messages 66 - 991 of 996   Newest  |  < Newer  |  Older >  |  Oldest
Messages: Show Message Summaries   (Group by Topic) Sort by Date v  
#991 From: "retr0dan" <RetroDan@...>
Date: Mon Nov 2, 2009 2:56 am
Subject: RANDOM NUMBERS PRODUCE WHITE NOISE in ASM (90 Bytes)
retr0dan
Offline Offline
Send Email Send Email
 
This 90 byte program produces White Noise from the ButterFly Speaker.
I based my random number generator similar to the Linear Congruency Algorithm.
You can try your own; if you hear a tone or beating, then the numbers produced are no random. Its not as easy to produce randomness as most people think.



;--------------------------------------------------;
; WHITE_NOISE.ASM for AVR BUTTERFLY               ;
; AUTHOR: DANIEL J. DOREY (RETRODAN AT AVR FREAKS);
; CREATED: 01-NOV-09            UPDATED: 01-NOV-09;
;                                                 ;
; TEST RANDOM NUMBER GENERATOR - SHOULD SOUND LIKE;
; WHITE NOISE, IF A TONE OR BEATING OCCURS, THE   ;
; VALUES ARE NOT RANDOM.                          ;
;--------------------------------------------------;
.INCLUDE "M169DEF.INC";(BUTTERFLY DEFINITIONS)

;------------------------------;
; DEFINE SOME CONSTANTS TO USE;
;------------------------------;
.SET SPEED  = 4

;-------------------------;
; DEFINE REGISTERS TO USE;
;-------------------------;

.DEF A     = R16      ;GENERAL PURPOSE ACCUMULATOR
.DEF B     = R17
.DEF C     = R18
.DEF D     = R19
.DEF E     = R20
.DEF F     = R21

.ORG $0000           ;START-UP & REBOOT VECTOR
   RJMP ON_RESET                                      
.ORG $0014           ;TIMER0 OVERFLOW INTERUPT VECTOR
   RJMP ON_INTERUPT

;-----------------------------;
; FIRST WE SETUP A STACK AREA;
;-----------------------------;
ON_RESET:
   LDI A,LOW(RAMEND) ;SETUP STACK POINTER
   OUT SPL,A         ;SO CALLS TO SUBROUTINES
   LDI A,HIGH(RAMEND);WORK CORRECTLY
   OUT SPH,A

;--------------;
; MAIN ROUTINE;
;--------------;
MAIN: SBI DDRB,5       ;SET SPEAKER ON PORT B FOR OUTPUT
     LDI A,SPEED      ;TIMER MATCH (SETS SPEED/FREQENCY)
     OUT OCR0A,A
     LDI A,2          ;1=OVF, 2=OCF0A MATCH - SET TIMER MODE
     STS TIMSK0,A     ;SET TIMER INTO OVF (OVERFLOW) MODE
     LDI A,0b0011_1011;TIMER PRESCALE=128 & INTERUPT MODE
     OUT TCCR0A,A
     RCALL RND_INIT   ;INITIALIZA RANDOM GENERATOR
     SEI              ;ACTIVATE INTERUPTS
MAINL:
SKIPEM:
      RJMP MAINL      ;GO ROUND, ENDLESS LOOP
MESSAGE:
.DW 0

;------------------------;
;TIMER2 INTERUPT ROUTINE;
;------------------------;
ON_INTERUPT:
     PUSH A          ;SAVE FOR LATER RESTORE
     IN A,SREG       ;SAVE CPU STATUS
     PUSH A

     RCALL WHITE_OUT ;SEND OUT A RANDOM BIT

NOSEC:POP A
     OUT SREG,A      ;RESTORE CPU STATUS
     POP A           ;RESTORE CONTENTS OF A
      RETI

;-------------------------------------;
; MAKE WHITE NOISE FROM RANDOM NUMBER;
;-------------------------------------;
WHITE_OUT:
      RCALL RND_BYTE   ;GET RANDOM NUMBER
      SBRC A,0         ;LOOK AT A BIT AND...
       RJMP SKIPIT     ;SEND TO SPEAKER
      SBI PORTB,5
       RET
SKIPIT:CBI PORTB,5
       RET

;-------------------------------------;
; RANDOM: USING A SLIGHTLY MODIFIED  ;
;         LINEAR CONGRUENCY GENERATOR;
;-------------------------------------;
RND_INIT:
     LDI A,97    ;USE PRIME NUMBERS AS SEED
     LDI B,89
     LDI C,101
     LDI D,193
RND_BYTE:         ;MULTIPLY BY PRIMES
     MUL A,C
     MUL B,D
     MOVW A:B,R0:R1
     ADD A,E     ;ADD IN PRIMES
     ADC B,F
     MOVW E:F,C:D;MIXEM UP
     MOVW C:D,A:B
      RET

#990 From: "retr0dan" <RetroDan@...>
Date: Tue Oct 27, 2009 11:52 pm
Subject: 90 HR CLOCK II in ASM (462 BYTES) - More Accurate
retr0dan
Offline Offline
Send Email Send Email
 
This versions of the 90 Hour Clock uses the more accurate 32,768Hz on-board crystal. By using a prescaler/divider of 128 and waiting for the clock to overflow at 256 (32768/128/256 = 1 second) we can get a clock that ticks once per second more accurately.

[FONT=Courier]
[code]
;--------------------------------------------------;
; CLOCK2.ASM for AVR BUTTERFLY                     ;
; AUTHOR: DANIEL J. DOREY (RETRODAN AT AVR FREAKS) ;
; CREATED: 27-OCT-09            UPDATED: 27-OCT-09 ;
; MORE ACCURATE: USES THE 32.768KHz WATCH XTAL     ;
;--------------------------------------------------;
.INCLUDE "M169DEF.INC" ;(BUTTERFLY DEFINITIONS)

;-----------------------------;
; DEFINE SOME REGISTER TO USE ;
;-----------------------------;
.SET CHR6BUF = 2      ;R7:R2 USED FOR LCD DISPLAY
.DEF ZERO = R13
.DEF SIX  = R14
.DEF TEN  = R15
.DEF A    = R16       ;GENERAL PURPOSE ACCUMULATOR
.DEF B    = R17
.DEF C    = R18
.DEF I    = R20
.DEF N    = R21

.SET BLANK_CHAR=SPACE-LCD_TABLE ;DEFINE BLANK CHAR

.ORG $0000            ;START-UP & REBOOT VECTOR
    RJMP ON_RESET                                    
.ORG $000A            ;TIMER2 OVERFLOW INTERUPT VECTOR
    RJMP ON_INTERUPT

;-----------------------------;
; FIRST WE SETUP A STACK AREA ;
;-----------------------------;
ON_RESET:
    LDI A,LOW(RAMEND)  ;SETUP STACK POINTER
    OUT SPL,A          ;SO CALLS TO SUBROUTINES
    LDI A,HIGH(RAMEND) ;WORK CORRECTLY
    OUT SPH,A
    CLR ZERO           ;SETUP FEW CONSTANTS
    LDI A,6
    MOV SIX,A
    LDI A,10
    MOV TEN,A
    RCALL LCD_INIT     ;INITIALIZE LCD
    RCALL LCD_CLR      ;CLEAR LCD SEGMENTS
    RCALL CLZ_DISP_BUF ;CLEAR MY DISPLAY BUFFER R7:R2

;--------------;
; MAIN ROUTINE ;
;--------------;
MAIN: SBI DDRB,5        ;SET SPEAKER ON PORT B FOR OUTPUT
      LDI A,8           ;SWITCH TIMER2 CLOCK TO 32.768KHz
      STS ASSR,A   
      LDI A,1           ;1=OVF, 2=OCF0A MATCH - SET TIMER MODE
      STS TIMSK2,A      ;SET TIMER INTO OVF (OVERFLOW) MODE
      LDI A,0b0011_0101 ;TIMER PRESCALE=128 & INTERUPT MODE
      STS TCCR2A,A
      SEI               ;GLOBALLY ACTIVATE INTERUPTS
MAINL:CP R2,TEN         ;CASCADING BOUNDRY CHECKS
       BRNE SKIPEM      ;SECONDS
      CLR R2
      INC R3
      CP R3,SIX
       BRNE SKIPEM
      CLR R3
      INC R4            ;MINUTES
      CP R4,TEN
       BRNE SKIPEM   
      CLR R4
      INC R5
      CP R5,SIX
       BRNE SKIPEM
      CLR R5
      INC R6            ;HOURS
      CP R6,TEN
       BRNE SKIPEM
      CLR R6
      INC R7
      CP R7,TEN
       BRNE SKIPEM
      CLR R7
SKIPEM:
      RCALL DISPN        ;DISPLAY TIME
       RJMP MAINL        ;GO ROUND, ENDLESS LOOP

;-------------------------------------------------------;
;TIMER INTERUPT ROUTINE EVERY 32,768/128/256 = 1 SECOND ;
;-------------------------------------------------------;
ON_INTERUPT:
      PUSH A           ;SAVE FOR LATER RESTORE
      IN A,SREG        ;SAVE CPU STATUS
      PUSH A
      RCALL TICK       ;MAKE A TICK SOUND
NOSEC:POP A
      OUT SREG,A       ;RESTORE CPU STATUS
      POP A            ;RESTORE CONTENTS OF A
       RETI

;------------------;
;MAKE A TICK SOUND ;
;------------------;
TICK: INC R2
      SBI PORTB,5      ;ACTIVATE SPEAKER
      LDI A,$FF
ILUPE:DEC A            ;WAIT
       BRNE ILUPE
      CBI PORTB,5      ;TURN OFF SPEAKER
       RET

;-----------------------------------------------;
; DISPN - DISPLAY THE NUMBER IN R7:R2 REGISTERS ;
; NOTE CHR6BUF MUST BE POINTING 6 CHAR BUFFER   ;
; APR/06 VERSION II WITH ASCII XLATION          ;
;-----------------------------------------------;
DISPN:   LDI  XL,LOW(CHR6BUF)  ;POINTS BUFFER-6
         LDI  XH,HIGH(CHR6BUF)
;-------------------------;
; ENTER HERE IF XH:XL SET ;
;-------------------------;
LCD_DSP: LDI  N,6       ;SIX CHARS
         LDI  B,$F0     ;BITMASK

DSPNXT:  LD   A,X+      ;FETCH THE CHAR TO DISP
         CPI  A,' '     ;SPACE?
          BRNE NOSPC    ;SPACE XLATION
         LDI  A,BLANK_CHAR
NOSPC:
         CPI  A,97      ;CHARACTER XLATION
          BRLO NOSMLET  ;SMALL LETTERS?
         SUBI A,$20     ;FOLD#1 a=>A

NOSMLET: CPI  A,64      ;CAP LETTERS
          BRLO NOBGLET  ;
         SUBI A,$37     ;FOLD#2 A=>10

NOBGLET: CPI  A,47      ;ASCII NUMBERS
          BRLO NOANUM   ;
         SUBI A,$30     ;FOLD#3 "0"=>0
                   
NOANUM:  LSL  A         ;POINT Z INTO TABLE
         LDI  ZL,LOW(LCD_TABLE*2)  
         LDI  ZH,HIGH(LCD_TABLE*2)
         ADD  ZL,A      ;OFFSET INTO
         ADC  ZH,ZERO   ;CHARACTER TABLE

         LDI  YL,LOW(LCDDR1)-1 ;(=251)POINTS TO
         CLR  YH        ;LCD SEGMENTS
         MOV  A,N       ;USE COUNTER
         DEC  A
         LSR  A         ;AS OFFSET TO
         ADD  YL,A      ;SEGMENTS

         SET
         LDI  I,4
DISPLUP: CPI  YL,LOW(LCDDR8) ;PAST CHECK POINT?
         BRLO NOZINC    ;PAST 2ND READ?
         BRTC NOZINC    ;SHOULD WE INCZ?
         ADIW  ZH:ZL,1  ;INCZ AFTER 2ND READ
         CLT            ;STOP FURTHER INCZ
NOZINC:  LPM   A,Z      ;LOAD SEGMENT DATA
         SBRS  I,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN SEGS
         SBRC  N,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN DIGITS
POTRIP:  AND   A,B      ;MASK NEEDED INFO
         COM   B        ;INVERT MASK
         LD    C,Y      ;READ-IN SEGMENT
         AND   C,B      ;CLEAR A SPOT
         OR    A,C      ;SHOVE-IN NEW
         ST    Y,A      ;WRITE-BACK
         COM   B        ;RE-INVERT MASK
         ADIW  YH:YL,5  ;NEXT SEG
         DEC   I
         BRNE DISPLUP   ;DONE 4 SEGS?
SKPNUM:  COM  B         ;INVERT BIT-MASK
         DEC  N         ;DONE 6 DIGITS?
NOINC:    BRNE DSPNXT
           RET

;-------------------------------;
; CLEAR MY DISPLAY BUFFER R7:R2 ;
;-------------------------------;
CLZ_DISP_BUF:
           CLR R2
           CLR R3
           CLR R4
           CLR R5
           CLR R6
           CLR R7
            RET

;-----------------------------------;
; RETRO (SYNTHETIC) DIVISION BY 10  ;
; ANSWER IN R1, R0=REM, A:PRESERVED ;
;-----------------------------------;
DIV10:  PUSH B
        LDI  B,26   ;MUL BY 26
        MUL  A,B    ;DIV10 DONE: R1=A/10
        PUSH R1     ;NOW CALC REMAINDER      
        LDI  B,10   ;CALC REM
        MUL  R1,B   ;R0=10xR1(QUOT)
        POP  R1     ;RESTORE QUOT
        SUB  R0,A   ;SUBTRACT REMx10
        NEG  R0     ;MAKE POSITIVE
         BRPL NODJ  ;REM STILL NEG?
        ADD  R0,B   ;ADD 10 TO REM
        DEC  R1     ;DEC QUOT
NODJ:   POP B
        RET

;---------------------------;
; CLEAR ALL SEGMENTS ON LCD ;
;---------------------------;
LCD_CLR: LDI YL,LOW(LCDDR0)
         CLR YH     
CLRLUPE: ST  Y+,ZERO
         CPI YL,LCDDR18+1
          BRNE CLRLUPE
           RET

;-------------------------------;
; INITIALIZE LCD DISP REGISTERS ;
;-------------------------------;
LCD_INIT: PUSH A
          LDI A,$B7          ;183 (1<<LCDCS) | (3<<LCDMUX0) | (7<<LCDPM0)
          STS LCDCRB, A      ;ENABLE ALL SEGEMENTS
          LDI A,7            ;(0<<LCDPS0) | (7<<LCDCD0)
          STS LCDFRR, A      ;SET PRESCALER TO 32KHz
          LDI A,$0E          ;14 (1<<LCDCC3) | (1<<LCDCC2) | (1<<LCDCC1)
          STS LCDCCR, A      ;SET THE CONTRAST
          LDI A,$C0          ;192(1<<LCDEN)  | (1<<LCDAB)
          STS LCDCRA, A      ;ENABLE THE LCD
          POP A
           RET

;--------------------------;
; NO RESTORE CHIRP ROUTINE ;
; 13 STEPS, ONE REGISTER   ;
; USES THE R0 REGISTER     ;
;--------------------------;
CHIRP:  SBI  DDRB,5         ;SET PORTB-BIT5 FOR OUTPUT
BLUPE:  SBI PORTB,5         ;SET PORTB-BIT5
        RCALL BPAUSE        ;WAIT
        CBI PORTB,5         ;CLEAR BORTB-BIT5
        RCALL BPAUSE        ;WAIT
        DEC R0
         BRNE BLUPE         ;LOOP AROUND
        RET
BPAUSE: PUSH R0             ;PAUSE TWEEN PULSES
BPLUPE: INC R0              ;IE DETERMINS FREQ
         BRNE BPLUPE
        POP R0
        RET

;--------------------------------------------------;
;    RETRO DAN'S IMPROVED LCD CHARACTER TABLE V1.2 ;
;--------------------------------------------------;
LCD_TABLE:
;    --mpndlegcjfhbk--a <------> LCD SEGMENTS   
 .DW 0b0001010101010001 ;ZERO
 .DW 0b0010000010000000 ;1
 .DW 0b0001111000010001 ;2
 .DW 0b0001101100010001 ;3
 .DW 0b0000101101010000 ;4
 .DW 0b0001101101000001 ;5
 .DW 0b0001111101000001 ;6
 .DW 0b0000000101010001 ;7
 .DW 0b0001111101010001 ;8
 .DW 0b0001101101010001 ;9
 .DW 0b0000111101010001 ;A
 .DW 0b0011100110010001 ;B        -----a-----
 .DW 0b0001010001000001 ;C       | \   |   / |
 .DW 0b0011000110010001 ;D       f  h  j  k  b
 .DW 0b0001111001000001 ;E       |   \ | /   |
 .DW 0b0000111001000001 ;F        --g-- --l--
 .DW 0b0001110101000001 ;G       |   / | \   |
 .DW 0b0000111101010000 ;H       e  p  n  m  c
 .DW 0b0010000010000000 ;I       | /   |   \ |
 .DW 0b0001010100010000 ;J        -----d-----
 .DW 0b1000011001001000 ;K
 .DW 0b0001010001000000 ;L
 .DW 0b0000010101111000 ;M
 .DW 0b1000010101110000 ;N
 .DW 0b0001010101010001 ;0
 .DW 0b0000111001010001 ;P
 .DW 0b1001010101010001 ;Q
 .DW 0b1000111001010001 ;R
 .DW 0b0001101101000001 ;S
 .DW 0b0010000010000001 ;T
 .DW 0b0001010101010000 ;U
 .DW 0b1000000100110000 ;V
 .DW 0b1100010101010000 ;W
 .DW 0b1100000000101000 ;X
 .DW 0b0010000000101000 ;Y
 .DW 0b0101000000001001 ;Z
 .DW 0b0001010001000001 ;[
 .DW 0b1000000000100000 ;\
 .DW 0b0001000100010001 ;]
 .DW 0b0000000001100000 ;^
 .DW 0b0001000000000000 ;_
 .DW 0b0000000000001000 ;'
 .DW 0b1110101010101000 ;*
 .DW 0b0010101010000000 ;+
 SPACE:.DW 0 ;(SPACE)   ;,
 .DW 0b0000101000000000 ;-
 .DW 0b0100000000000000 ;.
 .DW 0b0100000000001000 ;/
 .DW 0b1000000000001000 ;<
 .DW 0b0001101000000000 ;=
 .DW 0b0100000000100000 ;>

[/code]

#989 From: "retr0dan" <RetroDan@...>
Date: Tue Oct 27, 2009 1:10 am
Subject: 90 HR CLOCK Iin ASM (462 BYTES)
retr0dan
Offline Offline
Send Email Send Email
 
[FONT=Courier]
Show time on 6 character LCD screen upto 90 hrs.
[code]
;--------------------------------------------------;
; CLOCK.ASM for AVR BUTTERFLY                      ;
; AUTHOR: DANIEL J. DOREY (RETRODAN AT AVR FREAKS) ;
; CREATED: 26-OCT-09            UPDATED: 26-OCT-09 ;
;--------------------------------------------------;
.INCLUDE "M169DEF.INC" ;(BUTTERFLY DEFINITIONS)

;-----------------------------;
; DEFINE SOME REGISTER TO USE ;
;-----------------------------;
.SET CHR6BUF = 2      ;R7:R2 USED FOR LCD DISPLAY
.DEF ZERO = R13
.DEF SIX  = R14
.DEF TEN  = R15
.DEF A    = R16       ;GENERAL PURPOSE ACCUMULATOR
.DEF B    = R17
.DEF C    = R18
.DEF SECR = R19       ;COUNTER FOR SECONDS
.DEF I    = R20
.DEF N    = R21

.SET BLANK_CHAR=SPACE-LCD_TABLE ;DEFINE BLANK CHAR

.ORG $0000            ;START-UP & REBOOT VECTOR
    RJMP ON_RESET                                                                                                                                                                                                                                                                                                                   
.ORG $0016            ;TIMER0 OVERFLOW INTERUPT VECTOR
    RJMP ON_INTERUPT

;---------------------------------------------------;
; FIRST WE SETUP A STACK AREA & SET SYS CLOCK SPEED ;
;---------------------------------------------------;
ON_RESET:
    LDI A,LOW(RAMEND)  ;SETUP STACK POINTER
    OUT SPL,A          ;SO CALLS TO SUBROUTINES
    LDI A,HIGH(RAMEND) ;WORK CORRECTLY
    OUT SPH,A
    CLR ZERO           ;SETUP FEW CONSTANTS
    LDI A,6
    MOV SIX,A
    LDI A,10
    MOV TEN,A
    LDI A,128          ;SET SYS CLOCK SPEED
    STS CLKPR,A
    LDI A,2            ;0=8MHz 1=4MHz 2=2MHz 3=1MHz
    STS CLKPR,A        ;BUTTERFLY @ 2MHZ AS SHIPPED
    RCALL LCD_INIT     ;INITIALIZE LCD
    RCALL LCD_CLR      ;CLEAR LCD SEGMENTS
    RCALL CLZ_DISP_BUF ;CLEAR MY DISPLAY BUFFER R7:R2

;--------------;
; MAIN ROUTINE ;
;--------------;
MAIN: SBI DDRB,5        ;SET SPEAKER ON PORT B FOR OUTPUT  
      LDI A,1           ;1=OVF, 2=OCF0A MATCH
      STS TIMSK0,A      ;SET TIMER INTO OVF MODE
      LDI A,0b0011_0011 ;TIMER PRESCALE=64 & INTERUPT MODE
      OUT TCCR0A,A
      SEI               ;GLOBALLY ACTIVATE INTERUPTS
MAINL:CP R2,TEN         ;CASCADING BOUNDRY CHECKS
       BRNE SKIPEM
      CLR R2
      INC R3
      CP R3,SIX
       BRNE SKIPEM
      CLR R3
      INC R4
      CP R4,TEN
       BRNE SKIPEM
      CLR R4
      INC R5
      CP R5,SIX
       BRNE SKIPEM
      CLR R5
      INC R6
      CP R6,TEN
       BRNE SKIPEM
      CLR R6
      INC R7
      CP R7,TEN
       BRNE SKIPEM
      CLR R7
SKIPEM:
      RCALL DISPN        ;DISPLAY TIME
       RJMP MAINL        ;GO ROUND, ENDLESS LOOP

;-------------------------------------------------------;
;TIMER INPERUPT ROUTINE EVERY 2MHz/64/256=122.07/SECOND ;
;-------------------------------------------------------;
ON_INTERUPT:
      PUSH A           ;SAVE FOR LATER RESTORE
      IN A,SREG        ;SAVE CPU STATUS
      PUSH A
      DEC SECR         ;COUNTER STARTS AT 122
       BRNE NOSEC      ;WHEN @ ZERO = 1 SEC
      LDI SECR,122     ;RESET OUR COUNTER
      RCALL TICK       ;MAKE A TICK SOUND
NOSEC:POP A
      OUT SREG,A       ;RESTORE CPU STATUS
      POP A            ;RESTORE CONTENTS OF A
       RETI
      SBI PORTB,5      ;ACTIVATE SPEAKER (TICK)

;------------------;
;MAKE A TICK SOUND ;
;------------------;
TICK: INC R2
      SBI PORTB,5      ;ACTIVATE SPEAKER
      LDI A,$FF
ILUPE:DEC A            ;WAIT
       BRNE ILUPE
      CBI PORTB,5      ;TURN OFF SPEAKER
       RET

;-----------------------------------------------;
; DISPN - DISPLAY THE NUMBER IN R7:R2 REGISTERS ;
; NOTE CHR6BUF MUST BE POINTING 6 CHAR BUFFER   ;
; APR/06 VERSION II WITH ASCII XLATION          ;
;-----------------------------------------------;
DISPN:   LDI  XL,LOW(CHR6BUF)  ;POINTS BUFFER-6
         LDI  XH,HIGH(CHR6BUF)
;-------------------------;
; ENTER HERE IF XH:XL SET ;
;-------------------------;
LCD_DSP: LDI  N,6       ;SIX CHARS
         LDI  B,$F0     ;BITMASK

DSPNXT:  LD   A,X+      ;FETCH THE CHAR TO DISP
         CPI  A,' '     ;SPACE?
          BRNE NOSPC    ;SPACE XLATION
         LDI  A,BLANK_CHAR
NOSPC:
         CPI  A,97      ;CHARACTER XLATION
          BRLO NOSMLET  ;SMALL LETTERS?
         SUBI A,$20     ;FOLD#1 a=>A

NOSMLET: CPI  A,64      ;CAP LETTERS
          BRLO NOBGLET  ;
         SUBI A,$37     ;FOLD#2 A=>10

NOBGLET: CPI  A,47      ;ASCII NUMBERS
          BRLO NOANUM   ;
         SUBI A,$30     ;FOLD#3 "0"=>0
                   
NOANUM:  LSL  A         ;POINT Z INTO TABLE
         LDI  ZL,LOW(LCD_TABLE*2)  
         LDI  ZH,HIGH(LCD_TABLE*2)
         ADD  ZL,A      ;OFFSET INTO
         ADC  ZH,ZERO   ;CHARACTER TABLE

         LDI  YL,LOW(LCDDR1)-1 ;(=251)POINTS TO
         CLR  YH        ;LCD SEGMENTS
         MOV  A,N       ;USE COUNTER
         DEC  A
         LSR  A         ;AS OFFSET TO
         ADD  YL,A      ;SEGMENTS

         SET
         LDI  I,4
DISPLUP: CPI  YL,LOW(LCDDR8) ;PAST CHECK POINT?
         BRLO NOZINC    ;PAST 2ND READ?
         BRTC NOZINC    ;SHOULD WE INCZ?
         ADIW  ZH:ZL,1  ;INCZ AFTER 2ND READ
         CLT            ;STOP FURTHER INCZ
NOZINC:  LPM   A,Z      ;LOAD SEGMENT DATA
         SBRS  I,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN SEGS
         SBRC  N,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN DIGITS
POTRIP:  AND   A,B      ;MASK NEEDED INFO
         COM   B        ;INVERT MASK
         LD    C,Y      ;READ-IN SEGMENT
         AND   C,B      ;CLEAR A SPOT
         OR    A,C      ;SHOVE-IN NEW
         ST    Y,A      ;WRITE-BACK
         COM   B        ;RE-INVERT MASK
         ADIW  YH:YL,5  ;NEXT SEG
         DEC   I
         BRNE DISPLUP   ;DONE 4 SEGS?
SKPNUM:  COM  B         ;INVERT BIT-MASK
         DEC  N         ;DONE 6 DIGITS?
NOINC:    BRNE DSPNXT
           RET

;-------------------------------;
; CLEAR MY DISPLAY BUFFER R7:R2 ;
;-------------------------------;
CLZ_DISP_BUF:
           CLR R2
           CLR R3
           CLR R4
           CLR R5
           CLR R6
           CLR R7
            RET

;-----------------------------------;
; RETRO (SYNTHETIC) DIVISION BY 10  ;
; ANSWER IN R1, R0=REM, A:PRESERVED ;
;-----------------------------------;
DIV10:  PUSH B
        LDI  B,26   ;MUL BY 26
        MUL  A,B    ;DIV10 DONE: R1=A/10
        PUSH R1     ;NOW CALC REMAINDER      
        LDI  B,10   ;CALC REM
        MUL  R1,B   ;R0=10xR1(QUOT)
        POP  R1     ;RESTORE QUOT
        SUB  R0,A   ;SUBTRACT REMx10
        NEG  R0     ;MAKE POSITIVE
         BRPL NODJ  ;REM STILL NEG?
        ADD  R0,B   ;ADD 10 TO REM
        DEC  R1     ;DEC QUOT
NODJ:   POP B
        RET

;---------------------------;
; CLEAR ALL SEGMENTS ON LCD ;
;---------------------------;
LCD_CLR: LDI YL,LOW(LCDDR0)
         CLR YH     
CLRLUPE: ST  Y+,ZERO
         CPI YL,LCDDR18+1
          BRNE CLRLUPE
           RET

;-------------------------------;
; INITIALIZE LCD DISP REGISTERS ;
;-------------------------------;
LCD_INIT: PUSH A
          LDI A,$B7          ;183 (1<<LCDCS) | (3<<LCDMUX0) | (7<<LCDPM0)
          STS LCDCRB, A      ;ENABLE ALL SEGEMENTS
          LDI A,7            ;(0<<LCDPS0) | (7<<LCDCD0)
          STS LCDFRR, A      ;SET PRESCALER TO 32KHz
          LDI A,$0E          ;14 (1<<LCDCC3) | (1<<LCDCC2) | (1<<LCDCC1)
          STS LCDCCR, A      ;SET THE CONTRAST
          LDI A,$C0          ;192(1<<LCDEN)  | (1<<LCDAB)
          STS LCDCRA, A      ;ENABLE THE LCD
          POP A
           RET

;--------------------------;
; NO RESTORE CHIRP ROUTINE ;
; 13 STEPS, ONE REGISTER   ;
; USES THE R0 REGISTER     ;
;--------------------------;
CHIRP:  SBI  DDRB,5         ;SET PORTB-BIT5 FOR OUTPUT
BLUPE:  SBI PORTB,5         ;SET PORTB-BIT5
        RCALL BPAUSE        ;WAIT
        CBI PORTB,5         ;CLEAR BORTB-BIT5
        RCALL BPAUSE        ;WAIT
        DEC R0
         BRNE BLUPE         ;LOOP AROUND
        RET
BPAUSE: PUSH R0             ;PAUSE TWEEN PULSES
BPLUPE: INC R0              ;IE DETERMINS FREQ
         BRNE BPLUPE
        POP R0
        RET

;--------------------------------------------------;
;    RETRO DAN'S IMPROVED LCD CHARACTER TABLE V1.2 ;
;--------------------------------------------------;
LCD_TABLE:
;    --mpndlegcjfhbk--a <------> LCD SEGMENTS   
 .DW 0b0001010101010001 ;ZERO
;.DW 0b0101010101011001 ;0/       -----a-----
 .DW 0b0010000010000000 ;1       | \   |   / |
;.DW 0b0000000100011000 ;1       f  h  j  k  b
 .DW 0b0001111000010001 ;2       |   \ | /   |
 .DW 0b0001101100010001 ;3        --g-- --l--
 .DW 0b0000101101010000 ;4       |   / | \   |
 .DW 0b0001101101000001 ;5       e  p  n  m  c
 .DW 0b0001111101000001 ;6       | /   |   \ |
 .DW 0b0000000101010001 ;7        -----d-----
 .DW 0b0001111101010001 ;8
 .DW 0b0001101101010001 ;9
 .DW 0b0000111101010001 ;A
 .DW 0b0011100110010001 ;B        -----a-----
 .DW 0b0001010001000001 ;C       | \   |   / |
 .DW 0b0011000110010001 ;D       f  h  j  k  b
 .DW 0b0001111001000001 ;E       |   \ | /   |
 .DW 0b0000111001000001 ;F        --g-- --l--
 .DW 0b0001110101000001 ;G       |   / | \   |
 .DW 0b0000111101010000 ;H       e  p  n  m  c
 .DW 0b0010000010000000 ;I       | /   |   \ |
 .DW 0b0001010100010000 ;J        -----d-----
 .DW 0b1000011001001000 ;K
 .DW 0b0001010001000000 ;L
 .DW 0b0000010101111000 ;M
 .DW 0b1000010101110000 ;N
 .DW 0b0001010101010001 ;0
 .DW 0b0000111001010001 ;P
 .DW 0b1001010101010001 ;Q
 .DW 0b1000111001010001 ;R
 .DW 0b0001101101000001 ;S        -----a-----
;.DW 0b1001000000100001 ;S       | \   |   / |
 .DW 0b0010000010000001 ;T       f  h  j  k  b
 .DW 0b0001010101010000 ;U       |   \ | /   |
 .DW 0b1000000100110000 ;V        --g-- --l--
 .DW 0b1100010101010000 ;W       |   / | \   |
 .DW 0b1100000000101000 ;X       e  p  n  m  c
 .DW 0b0010000000101000 ;Y       | /   |   \ |
 .DW 0b0101000000001001 ;Z        -----d-----
 .DW 0b0001010001000001 ;[
 .DW 0b1000000000100000 ;\
 .DW 0b0001000100010001 ;]
 .DW 0b0000000001100000 ;^
 .DW 0b0001000000000000 ;_
 .DW 0b0000000000001000 ;'
 .DW 0b1110101010101000 ;*
 .DW 0b0010101010000000 ;+
 SPACE:.DW 0 ;(SPACE)   ;,
 .DW 0b0000101000000000 ;-
 .DW 0b0100000000000000 ;.
 .DW 0b0100000000001000 ;/
 .DW 0b1000000000001000 ;<
 .DW 0b0001101000000000 ;=
 .DW 0b0100000000100000 ;>
[/code]

#988 From: "retr0dan" <RetroDan@...>
Date: Mon Oct 26, 2009 11:02 pm
Subject: TICK OFF THE SECONDS PROGRAM in ASM (76 bytes)
retr0dan
Offline Offline
Send Email Send Email
 

We set the system clock to 2MHz (the speed Butterflys are as shipped).
If we set the timer0 prescaller to /1024 then use the overflow mode,
that will give us 2,000,000/1024/256=122.07. So we use the interupt
to count down from 122 to get one second.



[code]
;--------------------------------------------------;
; SECONDS.ASM for AVR BUTTERFLY                    ;
; AUTHOR: DANIEL J. DOREY (RETRODAN AT AVR FREAKS) ;
; CREATED: 26-OCT-09            UPDATED: 26-OCT-09 ;
; MAKES A TICK SOUND ONCE PER SECOND               ;
;--------------------------------------------------;
.INCLUDE "M169DEF.INC" ;(BUTTERFLY DEFINITIONS)

;-----------------------------;
; DEFINE SOME REGISTER TO USE ;
;-----------------------------;
.DEF A    = R16       ;GENERAL PURPOSE ACCUMULATOR
.DEF SECR = R17       ;COUNTER FOR SECONDS

.ORG $0000            ;START-UP & REBOOT VECTOR
    RJMP ON_RESET                                                                                                                                                                                                                                                                                                                  
.ORG $0016            ;TIMER0 OVERFLOW INTERUPT VECTOR
    RJMP ON_INTERUPT

;---------------------------------------------------;
; FIRST WE SETUP A STACK AREA & SET SYS CLOCK SPEED ;
;---------------------------------------------------;
ON_RESET:
    LDI A,LOW(RAMEND)   ;SETUP STACK POINTER
    OUT SPL,A           ;SO CALLS TO SUBROUTINES
    LDI A,HIGH(RAMEND)  ;WORK CORRECTLY
    OUT SPH,A
    LDI A,128            ;SET SYS CLOCK SPEED
    STS CLKPR,A
    LDI A,2              ;0=8MHz 1=4MHz 2=2MHz 3=1MHz
    STS CLKPR,A          ;BUTTERFLY @ 2MHZ AS SHIPPED

;--------------;
; MAIN ROUTINE ;
;--------------;
MAIN: SBI DDRB,5        ;SET SPEAKER ON PORT B FOR OUTPUT 
      LDI A,1           ;1=OVF, 2=OCF0A MATCH
      STS TIMSK0,A      ;SET TIMER INTO OVF MODE
      LDI A,0b0011_0011 ;TIMER PRESCALE=64 & INTERUPT MODE
      OUT TCCR0A,A
      SEI               ;GLOBALLY ACTIVATE INTERUPTS
MAINL:RJMP MAINL        ;GO ROUND, ENDLESS LOOP

;-------------------------------------------------------;
;TIMER INPERUPT ROUTINE EVERY 2MHz/64/256=122.07/SECOND ;
;-------------------------------------------------------;
ON_INTERUPT:
      PUSH A           ;SAVE FOR LATER RESTORE
      IN A,SREG        ;SAVE CPU STATUS
      PUSH A
      DEC SECR         ;COUNTER STARTS AT 122
       BRNE NOSEC      ;WHEN @ ZERO = 1 SEC
      LDI SECR,122     ;RESET OUR COUNTER
      RCALL TICK       ;MAKE A TICK SOUND
NOSEC:POP A
      OUT SREG,A       ;RESTORE CPU STATUS
      POP A            ;RESTORE CONTENTS OF A
       RETI
      SBI PORTB,5      ;ACTIVATE SPEAKER (TICK)

;------------------;
;MAKE A TICK SOUND ;
;------------------;
TICK: SBI PORTB,5      ;ACTIVATE SPEAKER
      LDI A,$FF
ILUPE:DEC A            ;WAIT
       BRNE ILUPE
      CBI PORTB,5      ;TURN OFF SPEAKER
       RET
[/code]


#987 From: "retr0dan" <RetroDan@...>
Date: Mon Oct 26, 2009 1:18 am
Subject: 8 BIT TIMER CTC INTERUPT IN ASM (56 BYTES)
retr0dan
Offline Offline
Send Email Send Email
 
;--------------------------------------------------;
; INTERUPT_TIMER.ASM for AVR BUTTERFLY             ;
; AUTHOR: DANIEL J. DOREY (RETRODAN AT AVR FREAKS) ;
; CREATED: 24-OCT-09            UPDATED: 25-OCT-09 ;
; PROGRAM DEMONSTRATES USE OF 8-BIT INTERUPT TIMER ;
;--------------------------------------------------;

.INCLUDE "M169DEF.INC" ;(BUTTERFLY DEFINITIONS)

;-----------------------------;
; DEFINE SOME REGISTER TO USE ;
;-----------------------------;
.DEF A = R16          ;GENERAL PURPOSE ACCUMULATOR

.ORG $0000            ;START-UP & REBOOT VECTOR
    RJMP ON_RESET                                                                                                                                                                                                                                                                                                                   
.ORG $0014            ;TIMER0 COMPARE INTERUPT VECTOR
    RJMP ON_INTERUPT

;-----------------------------------------;
; WE START HERE ON ALL RESEST AND REBOOTS ;
; FIRST WE SETUP A STACK AREA AT HIGH RAM ;
;-----------------------------------------;
ON_RESET:
    LDI A,LOW(RAMEND)   ;SETUP STACK POINTER
    OUT SPL,A           ;SO CALLS TO SUBROUTINES
    LDI A,HIGH(RAMEND)  ;WORK CORRECTLY
    OUT SPH,A

;--------------;
; MAIN ROUTINE ;
;--------------;
MAIN: SBI DDRB,5        ;SET SPEAKER ON PORT B FOR OUTPUT
      LDI A,50 ;<========CHANGE THIS TO CHANGE FREQUENCY OF INTERUPT
      OUT OCR0A,A       ;SET CLOCK COMPARE TO 50  
      LDI A,2
      STS TIMSK0,A      ;SET TIMER INTO CTC MODE
      LDI A,0b0011_1101 ;SET TIMER PRESCALE TO 1024 & INTERUPT MODE
      OUT TCCR0A,A
      SEI               ;GLOBALLY ACTIVATE INTERUPTS

MAINL:RJMP MAINL       ;GO ROUND, ENDLESS LOOP

;-----------------------;
;TIMER INPERUPT ROUTINE ;
;-----------------------;
ON_INTERUPT:
      PUSH A           ;SAVE FOR LATER RESTORE
      IN A,SREG        ;SAVE CPU STATUS
      PUSH A      
      SBI PORTB,5      ;ACTIVATE SPEAKER
      LDI A,255
ILUPE:DEC A            ;WAIT
       BRNE ILUPE
      CBI PORTB,5      ;SHUT OFF SPEAKER
      POP A
      OUT SREG,A       ;RESTORE CPU STATUS
      POP A            ;RESTORE CONTENTS OF A
       RETI

#984 From: "retr0dan" <RetroDan@...>
Date: Thu Oct 22, 2009 2:41 am
Subject: WAIT-FOR TIMER2 SOUND DEMO (42 Bytes)
retr0dan
Offline Offline
Send Email Send Email
 
This demonstrates the use of timer-0 in CTC mode that polls a flag when timer reaches a pre-determined amount over-and-over to produce different sounds.

;-----------------------------------------------------;
; WAIT_TIMER2.ASM for AVR BUTTERFLY                   ;
; AUTHOR: DANIEL J. DOREY (RETRODAN AT AVR FREAKS)    ;
; CREATED: 21-OCT-09               UPDATED: 21-OCT-09 ;
;                                                     ;
; PROGRAM DEMONSTRATES USE OF 8-BIT WAIT-FOR TIMER    ;
; USING CTC AND FLAG MODE. USES SOUND                 ;
;-----------------------------------------------------;

.INCLUDE "M169DEF.INC" ;(BUTTERFLY DEFINITIONS)

;----------------------------------------;
; FIRST I'LL DEFINE SOME REGISTER TO USE ;
;----------------------------------------;
.DEF A = R16   ;GENERAL PURPOSE ACCUMULATOR
.DEF I = R21   ;INDEXES FOR LOOP CONTROL
.DEF J = R22

.ORG 0000
    RJMP ON_RESET  ;START-UP VECTOR TO OUR PROGRAM

;-----------------------------------------;
; WE START HERE ON ALL RESEST AND REBOOTS ;
; FIRST WE SETUP A STACK AREA AT HIGH RAM ;
;-----------------------------------------;
START:
ON_RESET:
    LDI A,LOW(RAMEND)   ;SETUP STACK POINTER
    OUT SPL,A           ;SO CALLS TO SUBROUTINES
    LDI A,HIGH(RAMEND)  ;WORK CORRECTLY
    OUT SPH,A           ;

;--------------;
; MAIN ROUTINE ;
;--------------;
MAIN: SBI DDRB,5        ;SET FOR SPEAKER OUTPUT ON PORT B
      LDI A,0b0000_1011 ;SET PRESCALE TO 64,
      OUT TCCR0A,A     
      LDI A,50;<======= CHANGE THIS TO CHANGE TONES
      OUT OCR0A,A
MAINL:SBI PORTB,5       ;TURN SPEAKER ON
      RCALL WAITER      ;WAIT
      CBI PORTB,5       ;TURN SPEAKER OFF
      RCALL WAITER      ;WAIT
       RJMP MAINL       ;GO ROUND

;-----------------------------;
; WAITS FOR CLOCK TO HIT ZERO ;
;-----------------------------;              
WAITER:
WLOOP: IN A,TIFR0
       SBRS A,OCF0A     ;TOV0=0,OCF0A=1
        RJMP WLOOP
       LDI A,3          ;RESET FLAGS
       OUT TIFR0,A
        RET

#983 From: "retr0dan" <RetroDan@...>
Date: Tue Oct 20, 2009 9:57 pm
Subject: WAIT-FOR TIMER SOUND DEMO (34 Bytes)
retr0dan
Offline Offline
Send Email Send Email
 
Program shows use of timer 0 as a wait-for timer in Assembler for the AVR Butterfly/Atmega169 to emit a tone on the speaker. (approx 35 bytes)


;--------------------------------------------------;
; WAIT_TIMER.ASM for AVR BUTTERFLY                 ;
; AUTHOR: DANIEL J. DOREY (RETRODAN AT AVR FREAKS) ;
; CREATED: 20-OCT-09            UPDATED: 20-OCT-09 ;
;                                                  ;
; PROGRAM DEMONSTRATES USE OF 8-BIT WAIT-FOR TIMER ;
;--------------------------------------------------;

.INCLUDE "M169DEF.INC" ;(BUTTERFLY DEFINITIONS)

;----------------------------------------;
; FIRST I'LL DEFINE SOME REGISTER TO USE ;
;----------------------------------------;
.DEF A = R16   ;GENERAL PURPOSE ACCUMULATOR
.DEF I = R21   ;INDEXES FOR LOOP CONTROL
.DEF J = R22

.ORG 0000
    RJMP ON_RESET  ;REBOOT/START-UP VECTOR   
                   ;INTO OUR PROGRAM

;-----------------------------------------;
; WE START HERE ON ALL RESEST AND REBOOTS ;
; FIRST WE SETUP A STACK AREA AT HIGH RAM ;
;-----------------------------------------;
START:
ON_RESET:
    LDI A,LOW(RAMEND)   ;SETUP STACK POINTER
    OUT SPL,A           ;SO CALLS TO SUBROUTINES
    LDI A,HIGH(RAMEND)  ;WORK CORRECTLY
    OUT SPH,A           ;

;--------------;
; MAIN ROUTINE ;
;--------------;
MAIN: SBI DDRB,5        ;SET FOR SPEAKER OUTPUT ON PORT B
      LDI A,3           ;SET PRESCALE TO 64,
      OUT TCCR0A,A      ;~=2,000,000Hz/64/2 ~= 15KHz
MAINL:SBI PORTB,5       ;TURN SPEAKER ON
      RCALL WAITER      ;WAIT
      CBI PORTB,5       ;TURN SPEAKER OFF
      RCALL WAITER      ;WAIT
       RJMP MAINL       ;GO ROUND

;-----------------------------;
; WAITS FOR CLOCK TO HIT ZERO ;
;-----------------------------;              
WAITER:
WLOOP:IN A,TCNT0        ;READ THE CLOCK
      CPI A,0           ;CHECK IF ZERO YET
       BRNE WLOOP       ;WAIT FOR ZERO
        RET









#982 From: "retr0dan" <RetroDan@...>
Date: Tue Oct 20, 2009 4:35 pm
Subject: SCROLL LONG MESSAGE ACROSS LCD SCREEN in ASM (442 Bytes)
retr0dan
Offline Offline
Send Email Send Email
 
Scroll a long message defined by a .db "Message." terminated with a period across the LCD screen on the Butterfly. Approx 440 bytes.

;------------------------------------------;
;         HELLO WORLD #3 (SCROLLING)       ;
;         =============================    ;
;                                          ;
; AUTHOR: DANIEL J, DOREY AKA RETRODAN     ;
; 05-OCT-09: CREATED LAST UPDATE:20-OCT-09 ;
;                                          ;
; SCROLLS LONG MESSAGES ACROSS LCD SCREEN  ;
; MESSAGE TERMINATED WITH A PERIOD (.)     ;
;------------------------------------------;
.NOLIST
.INCLUDE "M169DEF.INC"    ;BUTTERFLY DEFS
.LIST

;---------------------------------:
; RENAME/DEFINE WORKING REGISTERS ;
;---------------------------------;

.SET CHR6BUF = 2      ;6 CHAR BUFFER IS [R2,R3,R4,R5,R6,R7]

.DEF ZERO    = R8
.DEF T1      = R11
.DEF T2      = R12

.DEF A       = R16    ;R16:R31 CAN BE LOADED IMMEDIATE (LDI)
.DEF AH      = R17
.DEF B       = R18
.DEF C       = R19
.DEF D       = R20
.DEF I       = R21
.DEF J       = R22
.DEF K       = R23
.DEF N       = R24

.SET BLANK_CHAR=SPACE-LCD_TABLE

.ORG $0000
       RJMP RESET

;-----------------;
; INITIALIZATIONS ;
;-----------------;
RESET: CLR ZERO
       LDI A,HIGH(RAMEND) ;SETUP THE STACK POINTER
       OUT SPH,A          ;AT TOP OF MEMORY AND
       LDI A,LOW(RAMEND)  ;GROW DOWNWARDS
       OUT SPL,A
       RCALL LCD_INIT     ;INITIALIZE LCD
       RCALL LCD_CLR      ;CLEAR LCD SEGMENTS

;-----------;
; MAIN LOOP ;
;-----------;                      
MAIN:
LOOP:  LDI YL,LOW(MESSAGE*2) ;SET A POINTER TO MESSAGE
       LDI YH,HIGH(MESSAGE*2)
       RCALL SCROLL          ;SCROLL MESSAGE
       RCALL DELAY           ;WAIT
       RCALL DELAY
       RCALL DELAY
DONE:    RJMP LOOP
MESSAGE: .DB "     HELLO TO THE WORLD FROM INSIDE THE AVR168 BUTTERFLY USING ASSEMBLY LANGUAGE     ."

;---------------------;
; SCROLL MESSAGE LOOP ;
;---------------------;
SCROLL: MOVW Z,Y                  ;MOVE FROM 1ST POINTER TO 2ND
        PUSH YL                   ;SAVE 1ST POINTER
        PUSH YH
        RCALL SHOWBUF             ;DISPLAY WHAT Z POINTS AT
        RCALL DELAY               ;WAIT
        POP YH                    ;RESTORE 1ST POINTER
        POP YL
        ADIW YH:YL,1              ;INCREMENT POINTER
        CPI A,'.'                 ;STOP AT PERIOD '.'
         BRNE SCROLL
          RET

;-------------------------------;
; COPIES TEXT TO DISPLAY BUFFER ;
; MUST LOAD (Z) FIRST           ;
;-------------------------------;
SHOWBUF:LPM  A,Z+
        MOV  R7,A
        LPM  A,Z+
        MOV  R6,A
        LPM  A,Z+
        MOV  R5,A
        LPM  A,Z+
        MOV  R4,A
        LPM  A,Z+
        MOV  R3,A
        LPM  A,Z+
        MOV  R2,A
        PUSH A
        RCALL DISPN
        POP A
         RET
;-----------------------------------------------;
; DISPN - DISPLAY THE NUMBER IN R7:R2 REGISTERS ;
; NOTE CHR6BUF MUST BE POINTING 6 CHAR BUFFER   ;
; APR/06 VERSION II WITH ASCII XLATION          ;
;-----------------------------------------------;
DISPN:   LDI  XL,LOW(CHR6BUF)  ;POINTS BUFFER-6
         LDI  XH,HIGH(CHR6BUF)
;-------------------------;
; ENTER HERE IF XH:XL SET ;
;-------------------------;
LCD_DSP: LDI  N,6       ;SIX CHARS
         LDI  B,$F0     ;BITMASK

DSPNXT:  LD   A,X+      ;FETCH THE CHAR TO DISP
         CPI  A,' '     ;SPACE?
          BRNE NOSPC    ;SPACE XLATION
         LDI  A,BLANK_CHAR
NOSPC:
         CPI  A,97      ;CHARACTER XLATION
          BRLO NOSMLET  ;SMALL LETTERS?
         SUBI A,$20     ;FOLD#1 a=>A

NOSMLET: CPI  A,64      ;CAP LETTERS
          BRLO NOBGLET  ;
         SUBI A,$37     ;FOLD#2 A=>10

NOBGLET: CPI  A,47      ;ASCII NUMBERS
          BRLO NOANUM   ;
         SUBI A,$30     ;FOLD#3 "0"=>0
                   
NOANUM:  LSL  A         ;POINT Z INTO TABLE
         LDI  ZL,LOW(LCD_TABLE*2)  
         LDI  ZH,HIGH(LCD_TABLE*2)
         ADD  ZL,A      ;OFFSET INTO
         ADC  ZH,ZERO   ;CHARACTER TABLE

         LDI  YL,LOW(LCDDR1)-1 ;(=251)POINTS TO
         CLR  YH        ;LCD SEGMENTS
         MOV  A,N       ;USE COUNTER
         DEC  A
         LSR  A         ;AS OFFSET TO
         ADD  YL,A      ;SEGMENTS

         SET
         LDI  I,4
DISPLUP: CPI  YL,LOW(LCDDR8) ;PAST CHECK POINT?
          BRLO NOZINC   ;PAST 2ND READ?
           BRTC NOZINC  ;SHOULD WE INCZ?
         ADIW  ZH:ZL,1  ;INCZ AFTER 2ND READ
         CLT            ;STOP FURTHER INCZ
NOZINC:  LPM   A,Z      ;LOAD SEGMENT DATA
         SBRS  I,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN SEGS
         SBRC  N,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN DIGITS
POTRIP:  AND   A,B      ;MASK NEEDED INFO
         COM   B        ;INVERT MASK
         LD    C,Y      ;READ-IN SEGMENT
         AND   C,B      ;CLEAR A SPOT
         OR    A,C      ;SHOVE-IN NEW
         ST    Y,A      ;WRITE-BACK
         COM   B        ;RE-INVERT MASK
         ADIW  YH:YL,5  ;NEXT SEG
         DEC   I
          BRNE DISPLUP  ;DONE 4 SEGS?
SKPNUM:  COM  B         ;INVERT BIT-MASK
         DEC  N         ;DONE 6 DIGITS?
NOINC:    BRNE DSPNXT
           RET

;---------------------------;
; CLEAR ALL SEGMENTS ON LCD ;
;---------------------------;
LCD_CLR: LDI YL,LOW(LCDDR0)
         CLR YH     
CLRLUPE: ST  Y+,ZERO
         CPI YL,LCDDR18+1
          BRNE CLRLUPE
           RET

;-------------------------------;
; INITIALIZE LCD DISP REGISTERS ;
;-------------------------------;
LCD_INIT: PUSH A
          LDI A,$B7          ;183 (1<<LCDCS) | (3<<LCDMUX0) | (7<<LCDPM0)
          STS LCDCRB, A      ;ENABLE ALL SEGEMENTS
          LDI A,7            ;(0<<LCDPS0) | (7<<LCDCD0)
          STS LCDFRR, A      ;SET PRESCALER TO 32KHz
          LDI A,$0E          ;14 (1<<LCDCC3) | (1<<LCDCC2) | (1<<LCDCC1)
          STS LCDCCR, A      ;SET THE CONTRAST
          LDI A,$C0          ;192(1<<LCDEN)  | (1<<LCDAB)
          STS LCDCRA, A      ;ENABLE THE LCD
          POP A
           RET

;-----------------------------------;
; PAUSE/DELAY ROUTINE               ;
; USES R0:R1 - NOT RESTORED         ;
; WARNING R0:R1 ARE NOT INITIALIZED ;
; USES A - RESTORED                 ;
;-----------------------------------;
PAUSE:
DELAY: PUSH A
       LDI A,8
DLUPE: DEC R0
        BRNE DLUPE
         DEC R1
          BRNE DLUPE
           DEC A
            BRNE DLUPE
             POP A
              RET

;-----------------------------------------------------------;
;    RETRO DAN'S IMPROVED LCD CHARACTER TABLE V1.2          ;                                                          ;
;    ALTERATIONS FROM ORIGINAL CHAR SET FOUND IN APP NOTES  ;
; 1. CONVERTED TO BINARY FROM HEX FOR LEGIBITIY             ;
; 2. REPLACED SOME CHARS                                    ;
; 3. PLACED ALPHABET RIGHT AFTER NUMBERS EASES TABLE        ;
;    LOOKUPS WHEN USING HEX: 10 OVERFLOWS INTO A, 11=>B ETC ;
; 4. ZERO MOVED TO FIRST ENTRY TO EASE TABLE LOOKUPS        ;
;-----------------------------------------------------------;
LCD_TABLE:
;    --mpndlegcjfhbk--a <------> LCD SEGMENTS   
 .DW 0b0001010101010001 ;ZERO
 .DW 0b0010000010000000 ;1
 .DW 0b0001111000010001 ;2
 .DW 0b0001101100010001 ;3
 .DW 0b0000101101010000 ;4
 .DW 0b0001101101000001 ;5
 .DW 0b0001111101000001 ;6
 .DW 0b0000000101010001 ;7
 .DW 0b0001111101010001 ;8
 .DW 0b0001101101010001 ;9
 .DW 0b0000111101010001 ;A
 .DW 0b0011100110010001 ;B        -----a-----
 .DW 0b0001010001000001 ;C       | \   |   / |
 .DW 0b0011000110010001 ;D       f  h  j  k  b
 .DW 0b0001111001000001 ;E       |   \ | /   |
 .DW 0b0000111001000001 ;F        --g-- --l--
 .DW 0b0001110101000001 ;G       |   / | \   |
 .DW 0b0000111101010000 ;H       e  p  n  m  c
 .DW 0b0010000010000000 ;I       | /   |   \ |
 .DW 0b0001010100010000 ;J        -----d-----
 .DW 0b1000011001001000 ;K
 .DW 0b0001010001000000 ;L
 .DW 0b0000010101111000 ;M
 .DW 0b1000010101110000 ;N
 .DW 0b0001010101010001 ;0
 .DW 0b0000111001010001 ;P
 .DW 0b1001010101010001 ;Q
 .DW 0b1000111001010001 ;R
 .DW 0b0001101101000001 ;S
 .DW 0b0010000010000001 ;T
 .DW 0b0001010101010000 ;U
 .DW 0b1000000100110000 ;V
 .DW 0b1100010101010000 ;W
 .DW 0b1100000000101000 ;X
 .DW 0b0010000000101000 ;Y
 .DW 0b0101000000001001 ;Z
 .DW 0b0001010001000001 ;[
 .DW 0b1000000000100000 ;\
 .DW 0b0001000100010001 ;]
 .DW 0b0000000001100000 ;^
 .DW 0b0001000000000000 ;_
 .DW 0b0000000000001000 ;'
 .DW 0b1110101010101000 ;*
 .DW 0b0010101010000000 ;+
 SPACE:.DW 0 ;(SPACE)   ;
 .DW 0b0000101000000000 ;-
 .DW 0b0100000000000000 ;.
 .DW 0b0100000000001000 ;/
 .DW 0b1000000000001000 ;<
 .DW 0b0001101000000000 ;=
 .DW 0b0100000000100000 ;>


#981 From: "retr0dan" <RetroDan@...>
Date: Tue Oct 20, 2009 4:29 pm
Subject: HELLO WORLD (REVISITED) in ASM for BUTTERFLY
retr0dan
Offline Offline
Send Email Send Email
 
This Assembler program will display a message using 6 character chunks on the Butterfly 6 character LCD Screen. Program is approx 430 bytes.


;------------------------------------------;
;         HELLO WORLD (REVISITED)          ;
;         =======================          ;
;                                          ;
; AUTHOR: DANIEL J, DOREY AKA RETRODAN     ;
; 05-OCT-09: CREATED LAST UPDATE:20-OCT-09 ;
;                                          ;
; DISPLAYS 6-CHAR STRINGS ON LCD SCREEN    ;
;------------------------------------------;
.NOLIST
.INCLUDE "M169DEF.INC"    ;BUTTERFLY DEFS
.LIST

;---------------------------------:
; RENAME/DEFINE WORKING REGISTERS ;
;---------------------------------;

.SET CHR6BUF = 2      ;6 CHAR BUFFER IS [R2,R3,R4,R5,R6,R7]

.DEF ZERO    = R8
.DEF THREE   = R10
.DEF T1      = R11
.DEF T2      = R12

.DEF A       = R16    ;R16:R31 CAN BE LOADED IMMEDIATE (LDI)
.DEF AH      = R17
.DEF B       = R18
.DEF C       = R19
.DEF D       = R20
.DEF I       = R21
.DEF J       = R22
.DEF K       = R23
.DEF N       = R24

                       ;R26:R31 ARE 3x16 BIT POINTERS

.SET BLANK_CHAR=SPACE-LCD_TABLE

.ORG $0000
       RJMP RESET
RESET: CLR ZERO
       LDI A,3
       MOV THREE,A
       LDI A,HIGH(RAMEND) ;SETUP THE STACK POINTER
       OUT SPH,A          ;AT TOP OF MEMORY AND
       LDI A,LOW(RAMEND)  ;GROW DOWNWARDS
       OUT SPL,A

       RCALL LCD_INIT     ;INITIALIZE LCD
       RCALL LCD_CLR      ;CLEAR LCD SEGMENTS
                      
SAYHELLO:
       LDI  A,0
LOOP:  PUSH A              ;SAVE CONTENTS OF A
       RCALL HELLO         ;WAIT
       RCALL DELAY
       RCALL WORLD
       RCALL DELAY         ;WAIT
       RCALL FROM
       RCALL DELAY
       RCALL AVR
       RCALL DELAY
       RCALL ASM
       RCALL DELAY
       RCALL LCD_CLR       ;CLEAR LCD
       RCALL DELAY         ;WAIT

       POP A               ;RESTORE A
       INC A
       CPI A,255
        BRNE LOOP
DONE:    RJMP SAYHELLO

;---------------;
; HELLO & WORLD ;
;---------------;
HELLO:  LDI ZL,LOW(HELLO_DAT*2)
        LDI ZH,HIGH(HELLO_DAT*2)
        RCALL SHOWBUF
         RET
HELLO_DAT: .DB "HELLO "

WORLD:  LDI  ZL,LOW(WORLD_DAT*2)
        LDI  ZH,HIGH(WORLD_DAT*2)
        RCALL SHOWBUF
         RET
WORLD_DAT:.DB " WORLD"

FROM:  LDI ZL,LOW(FROM_DAT*2)
       LDI ZH,HIGH(FROM_DAT*2)
       RCALL SHOWBUF
        RET
FROM_DAT: .DB " FROM "

AVR:   LDI ZL,LOW(AVR_DAT*2)
       LDI ZH,HIGH(AVR_DAT*2)
       RCALL SHOWBUF
        RET
AVR_DAT: .DB " AVR  "

ASM:   LDI ZL,LOW(ASM_DAT*2)
       LDI ZH,HIGH(ASM_DAT*2)
       RCALL SHOWBUF
        RET
ASM_DAT: .DB "  ASM "

;-------------------------------;
; COPIES TEXT TO DISPLAY BUFFER ;
; MUST LOAD (Z) FIRST           ;
;-------------------------------;
SHOWBUF:PUSH A
        LPM  A,Z+
        MOV  R7,A
        LPM  A,Z+
        MOV  R6,A
        LPM  A,Z+
        MOV  R5,A
        LPM  A,Z+
        MOV  R4,A
        LPM  A,Z+
        MOV  R3,A
        LPM  A,Z+
        MOV  R2,A
        RCALL DISPN
        POP A
        RET
;-----------------------------------------------;
; DISPN - DISPLAY THE NUMBER IN R7:R2 REGISTERS ;
; NOTE CHR6BUF MUST BE POINTING 6 CHAR BUFFER   ;
; APR/06 VERSION II WITH ASCII XLATION          ;
;-----------------------------------------------;
DISPN:   LDI  XL,LOW(CHR6BUF)  ;POINTS BUFFER-6
         LDI  XH,HIGH(CHR6BUF)
;-------------------------;
; ENTER HERE IF XH:XL SET ;
;-------------------------;
LCD_DSP: LDI  N,6       ;SIX CHARS
         LDI  B,$F0     ;BITMASK

DSPNXT:  LD   A,X+      ;FETCH THE CHAR TO DISP
         CPI  A,' '     ;SPACE?
          BRNE NOSPC    ;SPACE XLATION
         LDI  A,BLANK_CHAR
NOSPC:
         CPI  A,97      ;CHARACTER XLATION
          BRLO NOSMLET  ;SMALL LETTERS?
         SUBI A,$20     ;FOLD#1 a=>A

NOSMLET: CPI  A,64      ;CAP LETTERS
          BRLO NOBGLET  ;
         SUBI A,$37     ;FOLD#2 A=>10

NOBGLET: CPI  A,47      ;ASCII NUMBERS
          BRLO NOANUM   ;
         SUBI A,$30     ;FOLD#3 "0"=>0
                   
NOANUM:  LSL  A         ;POINT Z INTO TABLE
         LDI  ZL,LOW(LCD_TABLE*2)  
         LDI  ZH,HIGH(LCD_TABLE*2)
         ADD  ZL,A      ;OFFSET INTO
         ADC  ZH,ZERO   ;CHARACTER TABLE

         LDI  YL,LOW(LCDDR1)-1 ;(=251)POINTS TO
         CLR  YH        ;LCD SEGMENTS
         MOV  A,N       ;USE COUNTER
         DEC  A
         LSR  A         ;AS OFFSET TO
         ADD  YL,A      ;SEGMENTS

         SET
         LDI  I,4
DISPLUP: CPI  YL,LOW(LCDDR8) ;PAST CHECK POINT?
          BRLO NOZINC   ;PAST 2ND READ?
           BRTC NOZINC  ;SHOULD WE INCZ?
         ADIW  ZH:ZL,1  ;INCZ AFTER 2ND READ
         CLT            ;STOP FURTHER INCZ
NOZINC:  LPM   A,Z      ;LOAD SEGMENT DATA
         SBRS  I,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN SEGS
         SBRC  N,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN DIGITS
POTRIP:  AND   A,B      ;MASK NEEDED INFO
         COM   B        ;INVERT MASK
         LD    C,Y      ;READ-IN SEGMENT
         AND   C,B      ;CLEAR A SPOT
         OR    A,C      ;SHOVE-IN NEW
         ST    Y,A      ;WRITE-BACK
         COM   B        ;RE-INVERT MASK
         ADIW  YH:YL,5  ;NEXT SEG
         DEC   I
          BRNE DISPLUP  ;DONE 4 SEGS?
SKPNUM:  COM  B         ;INVERT BIT-MASK
         DEC  N         ;DONE 6 DIGITS?
NOINC:    BRNE DSPNXT
           RET

;---------------------------;
; CLEAR ALL SEGMENTS ON LCD ;
;---------------------------;
LCD_CLR: LDI YL,LOW(LCDDR0)
         CLR YH     
CLRLUPE: ST  Y+,ZERO
         CPI YL,LCDDR18+1
          BRNE CLRLUPE
           RET

;-------------------------------;
; INITIALIZE LCD DISP REGISTERS ;
;-------------------------------;
LCD_INIT: PUSH A
          LDI A,$B7          ;183 (1<<LCDCS) | (3<<LCDMUX0) | (7<<LCDPM0)
          STS LCDCRB, A      ;ENABLE ALL SEGEMENTS
          LDI A,7            ;(0<<LCDPS0) | (7<<LCDCD0)
          STS LCDFRR, A      ;SET PRESCALER TO 32KHz
          LDI A,$0E          ;14 (1<<LCDCC3) | (1<<LCDCC2) | (1<<LCDCC1)
          STS LCDCCR, A      ;SET THE CONTRAST
          LDI A,$C0          ;192(1<<LCDEN)  | (1<<LCDAB)
          STS LCDCRA, A      ;ENABLE THE LCD
          POP A
           RET

;-----------------------------------;
; PAUSE/DELAY ROUTINE               ;
; USES R0:R1 - NOT RESTORED         ;
; WARNING R0:R1 ARE NOT INITIALIZED ;
; USES A - RESTORED                 ;
;-----------------------------------;
PAUSE:
DELAY: PUSH A
       LDI A,32
DLUPE: DEC R0
        BRNE DLUPE
         DEC R1
          BRNE DLUPE
           DEC A
            BRNE DLUPE
             POP A
              RET

;-----------------------------------------------------------;
;    RETRO DAN'S IMPROVED LCD CHARACTER TABLE V1.2          ;
;-----------------------------------------------------------;
LCD_TABLE:
;    --mpndlegcjfhbk--a <------> LCD SEGMENTS   
 .DW 0b0001010101010001 ;ZERO
 ;DW 0b0101010101011001 ;0/       -----a-----
 .DW 0b0010000010000000 ;1       | \   |   / |
 ;DW 0b0000000100011000 ;1       f  h  j  k  b
 .DW 0b0001111000010001 ;2       |   \ | /   |
 .DW 0b0001101100010001 ;3        --g-- --l--
 .DW 0b0000101101010000 ;4       |   / | \   |
 .DW 0b0001101101000001 ;5       e  p  n  m  c
 .DW 0b0001111101000001 ;6       | /   |   \ |
 .DW 0b0000000101010001 ;7        -----d-----
 .DW 0b0001111101010001 ;8
 .DW 0b0001101101010001 ;9
 .DW 0b0000111101010001 ;A
 .DW 0b0011100110010001 ;B        -----a-----
 .DW 0b0001010001000001 ;C       | \   |   / |
 .DW 0b0011000110010001 ;D       f  h  j  k  b
 .DW 0b0001111001000001 ;E       |   \ | /   |
 .DW 0b0000111001000001 ;F        --g-- --l--
 .DW 0b0001110101000001 ;G       |   / | \   |
 .DW 0b0000111101010000 ;H       e  p  n  m  c
 .DW 0b0010000010000000 ;I       | /   |   \ |
 .DW 0b0001010100010000 ;J        -----d-----
 .DW 0b1000011001001000 ;K
 .DW 0b0001010001000000 ;L
 .DW 0b0000010101111000 ;M
 .DW 0b1000010101110000 ;N
 .DW 0b0001010101010001 ;0
 .DW 0b0000111001010001 ;P
 .DW 0b1001010101010001 ;Q
 .DW 0b1000111001010001 ;R
 .DW 0b0001101101000001 ;S        -----a-----
 ;DW 0b1001000000100001 ;S       | \   |   / |
 .DW 0b0010000010000001 ;T       f  h  j  k  b
 .DW 0b0001010101010000 ;U       |   \ | /   |
 .DW 0b1000000100110000 ;V        --g-- --l--
 .DW 0b1100010101010000 ;W       |   / | \   |
 .DW 0b1100000000101000 ;X       e  p  n  m  c
 .DW 0b0010000000101000 ;Y       | /   |   \ |
 .DW 0b0101000000001001 ;Z        -----d-----
 .DW 0b0001010001000001 ;[
 .DW 0b1000000000100000 ;\
 .DW 0b0001000100010001 ;]
 .DW 0b0000000001100000 ;^
 .DW 0b0001000000000000 ;_
 .DW 0b0000000000001000 ;'
 .DW 0b1110101010101000 ;*
 .DW 0b0010101010000000 ;+
 SPACE:.DW 0 ;(SPACE)   ;
 .DW 0b0000101000000000 ;-
 .DW 0b0100000000000000 ;.
 .DW 0b0100000000001000 ;/
 .DW 0b1000000000001000 ;<
 .DW 0b0001101000000000 ;=
 .DW 0b0100000000100000 ;>


#980 From: "retr0dan" <RetroDan@...>
Date: Tue Oct 20, 2009 3:34 am
Subject: SOUND EFFECTS for Butterfly in ASM (210 bytes)
retr0dan
Offline Offline
Send Email Send Email
 
Small collection of sound effects for the AVR Butterfly using assembler. Program is approx 210 bytes.


;----------------------------------------------------------;
; SOUNDZ - SMALL COLLECTION OF SOUND EFFECTS FOR BUTTERFLY ;
; DJ DOREY (RETRODAN) 09-OCT-09                            ;
;----------------------------------------------------------;

.NOLIST
.INCLUDE "M169DEF.INC"    ;BUTTERFLY DEFS
.LIST

;---------------------------------:
; RENAME/DEFINE WORKING REGISTERS ;
;---------------------------------;

.DEF A       = R16    ;R16:R31 CAN BE LOADED IMMEDIATE (LDI)
.DEF AH      = R17
.DEF B       = R18
.DEF C       = R19
.DEF D       = R20
.DEF I       = R21
.DEF J       = R22
.DEF K       = R23
.DEF L       = R24
.DEF N       = R25

.ORG $0000
       RJMP RESET

RESET: JMP INIT

MAIN:
MLUPE: RCALL CHIRP    ;A BIRD CHIRP
       RCALL PAUSE
       RCALL WHIT     ;A WHISTLE SOUND
       RCALL PAUSE
       RCALL DEWEDO   ;A DEW-EE-DEW SOUND
       RCALL PAUSE
       RCALL WOLFW    ;A WOLF WISTLE
       RCALL PAUSE
       RCALL RAY1     ;A RAYGUN SOUND
       RCALL PAUSE
       RCALL RAY2     ;A RAYGUN SOUND
       RCALL PAUSE
       RCALL ALARM    ;AN ALARM SOUND
       RCALL PAUSE
       RCALL PAUSE
        RJMP MLUPE

;================= SUBROUTINES =====================

;-----------------;
; INITIALIZATIONS ;
;-----------------;
INIT:  LDI A,HIGH(RAMEND)   ;SETUP THE STACK POINTER
       OUT SPH,A            ;AT TOP OF MEMORY AND
       LDI A,LOW(RAMEND)    ;GROW DOWNWARDS
       OUT SPL,A
       LDI A,128            ;SET CLOCK SPEED
       STS CLKPR,A
       LDI A,2              ;0=8MHz 1=4MHz 2=2MHz 3=1MHz
       STS CLKPR,A          ;BUTTERFLY RUNS AT 2MHZ OUT-OF-THE-BOX
        JMP MAIN

;---------------;
; SOUND EFFECTS ;
;---------------;
ALARM:   PUSH N
         LDI N,16
ALARML:  RCALL WEEOH
         DEC N
          BRNE ALARML
         POP N
          RET

RAY1:    PUSH N
         LDI N,16
RAY1L:   RCALL CHIRP
         DEC N
          BRNE RAY1L
         POP N
          RET

RAY2:    PUSH N
         LDI N,16
RAY2L:   RCALL WHIT
         DEC N
          BRNE RAY2L
         POP N
          RET

WOLFW:   RCALL WEEOH
         RCALL DEWIT
          RET

DEWEDO:   RCALL DEWIT
         RCALL WEEOH
          RET

WEEOH:   RCALL WHIT
         RCALL CHIRP
          RET

DEWIT:   RCALL CHIRP
         RCALL WHIT
          RET

;------------------------------------------------;
; NO RESTORE CHIRP ROUTINE, USES THE R0 REGISTER ;
;------------------------------------------------;
CHIRP:  CLR  R0
        SBI  DDRB,5         ;SET PORTB-BIT5 FOR OUTPUT
CLUPE:  SBI  PORTB,5        ;SET PORTB-BIT5
        RCALL CPAUSE        ;WAIT
        CBI PORTB,5         ;CLEAR BORTB-BIT5
        RCALL CPAUSE        ;WAIT
        DEC R0
         BRNE CLUPE         ;LOOP AROUND
          RET
CPAUSE: PUSH R0             ;PAUSE TWEEN PULSES
CPLUPE: INC R0              ;IE DETERMINS FREQ
         BRNE CPLUPE
        POP R0
         RET

;-----------------------------------------------;
; NO RESTORE WHIT ROUTINE, USES THE R0 REGISTER ;
;-----------------------------------------------;
WHIT:   CLR  R0
        SBI  DDRB,5         ;SET PORTB-BIT5 FOR OUTPUT
WHLUPE: SBI  PORTB,5        ;SET PORTB-BIT5
        RCALL WPAUSE        ;WAIT
        CBI PORTB,5         ;CLEAR BORTB-BIT5
        RCALL WPAUSE        ;WAIT
        DEC R0
         BRNE WHLUPE        ;LOOP AROUND
          RET
WPAUSE: PUSH R0             ;PAUSE TWEEN PULSES
WPLUPE: DEC R0              ;IE DETERMINS FREQ
         BRNE WPLUPE
        POP R0
         RET

;-----------------------------------;
; PAUSE/DELAY ROUTINE               ;
; USES R0:R1 - NOT RESTORED         ;
; WARNING R0:R1 ARE NOT INITIALIZED ;
; USES A - RESTORED                 ;
;-----------------------------------;
PAUSE:
DELAY: CLR R0
       CLR R1
       PUSH A
       LDI A,24
DLUPE: DEC R0
        BRNE DLUPE
         DEC R1
          BRNE DLUPE
           DEC A
            BRNE DLUPE
             POP A
              RET


#979 From: "retr0dan" <RetroDan@...>
Date: Tue Oct 20, 2009 3:30 am
Subject: JOYSTICK TESTER in ASM for BUTTERFLY (460 bytes)
retr0dan
Offline Offline
Send Email Send Email
 
Waits for joystick to move, then beeps and displays the direction the joystick was moved on the LCD Display.


;------------------------------------------;
;                   JOY_TESTER             ;
;                   ==========             ;
;                                          ;
; TEST THE JOYSTICK                        ;                                         ;
; AUTHOR: DANIEL J, DOREY AKA RETRODAN     ;
; 19-OCT-09: CREATED LAST UPDATE:19-OCT-09 ;
;------------------------------------------;
.NOLIST
.INCLUDE "M169DEF.INC"    ;BUTTERFLY DEFS
.LIST

;---------------------------------:
; RENAME/DEFINE WORKING REGISTERS ;
;---------------------------------;

.SET CHR6BUF = 2      ;6 CHAR BUFFER IS [R2,R3,R4,R5,R6,R7]

.DEF ZERO    = R8
.DEF T1      = R11
.DEF T2      = R12

.DEF A       = R16    ;R16:R31 CAN BE LOADED IMMEDIATE (LDI)
.DEF AH      = R17
.DEF B       = R18
.DEF C       = R19
.DEF D       = R20
.DEF I       = R21
.DEF J       = R22
.DEF K       = R23
.DEF N       = R24

.SET BLANK_CHAR=SPACE-LCD_TABLE

.ORG $0000
       RJMP ON_RESET

;-----------------;
; INITIALIZATIONS ;
;-----------------;
ON_RESET:
       CLR ZERO
       LDI A,HIGH(RAMEND) ;SETUP THE STACK POINTER
       OUT SPH,A          ;AT TOP OF MEMORY AND
       LDI A,LOW(RAMEND)  ;GROW DOWNWARDS
       OUT SPL,A
       SER  A             ;INIT PORTS B&E FOR INPUT
        OUT    PORTB,A
       OUT    PORTE,A
       RCALL LCD_INIT     ;INITIALIZE LCD
       RCALL LCD_CLR      ;CLEAR LCD SEGMENTS

;-----------;
; MAIN LOOP ;
;-----------;                      
MAIN:
LOOP:  SBIS   PINB,4
         RJMP  JOYMID  
         SBIS    PINB,6       ;JOYSTICK UP
           RJMP   JOYUP        
           SBIS    PINB,7       ;JOYSTICK DOWN
            RJMP   JOYDOWN            
             SBIS    PINE,2       ;JOYSTICK LEFT
              RJMP   JOYLEFT
               SBIS    PINE,3       ;JOYSTICK RIGHT
                RJMP   JOYRIGHT

NOJOY: LDI ZL,LOW(MESWAIT*2) ;SET A POINTER TO MESSAGE
       LDI ZH,HIGH(MESWAIT*2)
        RJMP SHOWMESS

JOYMID: LDI ZL,LOW(MESMID*2) ;SET A POINTER TO MESSAGE
       LDI ZH,HIGH(MESMID*2)
        RJMP BPMESS

JOYUP:LDI ZL,LOW(MESUP*2) ;SET A POINTER TO MESSAGE
       LDI ZH,HIGH(MESUP*2)
        RJMP BPMESS

JOYDOWN:LDI ZL,LOW(MESDOWN*2) ;SET A POINTER TO MESSAGE
       LDI ZH,HIGH(MESDOWN*2)
        RJMP BPMESS

JOYLEFT:LDI ZL,LOW(MESLEFT*2) ;SET A POINTER TO MESSAGE
       LDI ZH,HIGH(MESLEFT*2)
        RJMP BPMESS

JOYRIGHT:
       LDI ZL,LOW(MESRIGHT*2) ;SET A POINTER TO MESSAGE
       LDI ZH,HIGH(MESRIGHT*2)
BPMESS:RCALL WHIT       
SHOWMESS:
       RCALL SHOWBUF         ;SHOW MESSAGE
       RCALL DELAY           ;WAIT

DONE:    RJMP LOOP
MESWAIT:.DB "PRESS "
MESMID: .DB "CENTRE"
MESUP:  .DB "  UP  "
MESDOWN:.DB " DOWN "
MESLEFT:.DB " LEFT "
MESRIGHT:.DB "RIGHT "

;=====================[ SUBROUTINES ]=========================

;-----------------------------------------------;
; NO RESTORE WHIT ROUTINE, USES THE R0 REGISTER ;
;-----------------------------------------------;
WHIT:   CLR  R0
        SBI  DDRB,5         ;SET PORTB-BIT5 FOR OUTPUT
WHLUPE: SBI  PORTB,5        ;SET PORTB-BIT5
        RCALL WPAUSE        ;WAIT
        CBI PORTB,5         ;CLEAR BORTB-BIT5
        RCALL WPAUSE        ;WAIT
        DEC R0
         BRNE WHLUPE        ;LOOP AROUND
          RET
WPAUSE: PUSH R0             ;PAUSE TWEEN PULSES
WPLUPE: DEC R0              ;IE DETERMINS FREQ
         BRNE WPLUPE
        POP R0
         RET
;-------------------------------;
; COPIES TEXT TO DISPLAY BUFFER ;
; MUST LOAD (Z) FIRST           ;
;-------------------------------;
SHOWBUF:LPM  A,Z+
        MOV  R7,A
        LPM  A,Z+
        MOV  R6,A
        LPM  A,Z+
        MOV  R5,A
        LPM  A,Z+
        MOV  R4,A
        LPM  A,Z+
        MOV  R3,A
        LPM  A,Z+
        MOV  R2,A
        PUSH A
        RCALL DISPN
        POP A
         RET
;-----------------------------------------------;
; DISPN - DISPLAY THE NUMBER IN R7:R2 REGISTERS ;
; NOTE CHR6BUF MUST BE POINTING 6 CHAR BUFFER   ;
; APR/06 VERSION II WITH ASCII XLATION          ;
;-----------------------------------------------;
DISPN:   LDI  XL,LOW(CHR6BUF)  ;POINTS BUFFER-6
         LDI  XH,HIGH(CHR6BUF)
;-------------------------;
; ENTER HERE IF XH:XL SET ;
;-------------------------;
LCD_DSP: LDI  N,6       ;SIX CHARS
         LDI  B,$F0     ;BITMASK

DSPNXT:  LD   A,X+      ;FETCH THE CHAR TO DISP
         CPI  A,' '     ;SPACE?
          BRNE NOSPC    ;SPACE XLATION
         LDI  A,BLANK_CHAR
NOSPC:
         CPI  A,97      ;CHARACTER XLATION
          BRLO NOSMLET  ;SMALL LETTERS?
         SUBI A,$20     ;FOLD#1 a=>A

NOSMLET: CPI  A,64      ;CAP LETTERS
          BRLO NOBGLET  ;
         SUBI A,$37     ;FOLD#2 A=>10

NOBGLET: CPI  A,47      ;ASCII NUMBERS
          BRLO NOANUM   ;
         SUBI A,$30     ;FOLD#3 "0"=>0
                   
NOANUM:  LSL  A         ;POINT Z INTO TABLE
         LDI  ZL,LOW(LCD_TABLE*2)  
         LDI  ZH,HIGH(LCD_TABLE*2)
         ADD  ZL,A      ;OFFSET INTO
         ADC  ZH,ZERO   ;CHARACTER TABLE

         LDI  YL,LOW(LCDDR1)-1 ;(=251)POINTS TO
         CLR  YH        ;LCD SEGMENTS
         MOV  A,N       ;USE COUNTER
         DEC  A
         LSR  A         ;AS OFFSET TO
         ADD  YL,A      ;SEGMENTS

         SET
         LDI  I,4
DISPLUP: CPI  YL,LOW(LCDDR8) ;PAST CHECK POINT?
          BRLO NOZINC   ;PAST 2ND READ?
           BRTC NOZINC  ;SHOULD WE INCZ?
         ADIW  ZH:ZL,1  ;INCZ AFTER 2ND READ
         CLT            ;STOP FURTHER INCZ
NOZINC:  LPM   A,Z      ;LOAD SEGMENT DATA
         SBRS  I,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN SEGS
         SBRC  N,0      ;USE BIT0
         SWAP  A        ;SWAP ON EVEN DIGITS
POTRIP:  AND   A,B      ;MASK NEEDED INFO
         COM   B        ;INVERT MASK
         LD    C,Y      ;READ-IN SEGMENT
         AND   C,B      ;CLEAR A SPOT
         OR    A,C      ;SHOVE-IN NEW
         ST    Y,A      ;WRITE-BACK
         COM   B        ;RE-INVERT MASK
         ADIW  YH:YL,5  ;NEXT SEG
         DEC   I
          BRNE DISPLUP  ;DONE 4 SEGS?
SKPNUM:  COM  B         ;INVERT BIT-MASK
         DEC  N         ;DONE 6 DIGITS?
NOINC:    BRNE DSPNXT
           RET

;---------------------------;
; CLEAR ALL SEGMENTS ON LCD ;
;---------------------------;
LCD_CLR: LDI YL,LOW(LCDDR0)
         CLR YH     
CLRLUPE: ST  Y+,ZERO
         CPI YL,LCDDR18+1
          BRNE CLRLUPE
           RET

;-------------------------------;
; INITIALIZE LCD DISP REGISTERS ;
;-------------------------------;
LCD_INIT: PUSH A
          LDI A,$B7          ;183 (1<<LCDCS) | (3<<LCDMUX0) | (7<<LCDPM0)
          STS LCDCRB, A      ;ENABLE ALL SEGEMENTS
          LDI A,7            ;(0<<LCDPS0) | (7<<LCDCD0)
          STS LCDFRR, A      ;SET PRESCALER TO 32KHz
          LDI A,$0E          ;14 (1<<LCDCC3) | (1<<LCDCC2) | (1<<LCDCC1)
          STS LCDCCR, A      ;SET THE CONTRAST
          LDI A,$C0          ;192(1<<LCDEN)  | (1<<LCDAB)
          STS LCDCRA, A      ;ENABLE THE LCD
          POP A
           RET

;-----------------------------------;
; PAUSE/DELAY ROUTINE               ;
; USES R0:R1 - NOT RESTORED         ;
; WARNING R0:R1 ARE NOT INITIALIZED ;
; USES A - RESTORED                 ;
;-----------------------------------;
PAUSE:
DELAY: PUSH A
       LDI A,8
DLUPE: DEC R0
        BRNE DLUPE
         DEC R1
          BRNE DLUPE
           DEC A
            BRNE DLUPE
             POP A
              RET

;-----------------------------------------------------------;
;    RETRO DAN'S IMPROVED LCD CHARACTER TABLE V1.2          ;                                                          ;
;-----------------------------------------------------------;
LCD_TABLE:
;    --mpndlegcjfhbk--a <------> LCD SEGMENTS   
 .DW 0b0001010101010001 ;ZERO
 .DW 0b0010000010000000 ;1
 .DW 0b0001111000010001 ;2
 .DW 0b0001101100010001 ;3
 .DW 0b0000101101010000 ;4
 .DW 0b0001101101000001 ;5
 .DW 0b0001111101000001 ;6
 .DW 0b0000000101010001 ;7
 .DW 0b0001111101010001 ;8
 .DW 0b0001101101010001 ;9
 .DW 0b0000111101010001 ;A
 .DW 0b0011100110010001 ;B        -----a-----
 .DW 0b0001010001000001 ;C       | \   |   / |
 .DW 0b0011000110010001 ;D       f  h  j  k  b
 .DW 0b0001111001000001 ;E       |   \ | /   |
 .DW 0b0000111001000001 ;F        --g-- --l--
 .DW 0b0001110101000001 ;G       |   / | \   |
 .DW 0b0000111101010000 ;H       e  p  n  m  c
 .DW 0b0010000010000000 ;I       | /   |   \ |
 .DW 0b0001010100010000 ;J        -----d-----
 .DW 0b1000011001001000 ;K
 .DW 0b0001010001000000 ;L
 .DW 0b0000010101111000 ;M
 .DW 0b1000010101110000 ;N
 .DW 0b0001010101010001 ;0
 .DW 0b0000111001010001 ;P
 .DW 0b1001010101010001 ;Q
 .DW 0b1000111001010001 ;R
 .DW 0b0001101101000001 ;S
 .DW 0b0010000010000001 ;T
 .DW 0b0001010101010000 ;U
 .DW 0b1000000100110000 ;V
 .DW 0b1100010101010000 ;W
 .DW 0b1100000000101000 ;X
 .DW 0b0010000000101000 ;Y
 .DW 0b0101000000001001 ;Z
 .DW 0b0001010001000001 ;[
 .DW 0b1000000000100000 ;\
 .DW 0b0001000100010001 ;]
 .DW 0b0000000001100000 ;^
 .DW 0b0001000000000000 ;_
 .DW 0b0000000000001000 ;'
 .DW 0b1110101010101000 ;*
 .DW 0b0010101010000000 ;+
 SPACE:.DW 0 ;(SPACE)   ;
 .DW 0b0000101000000000 ;-
 .DW 0b0100000000000000 ;.
 .DW 0b0100000000001000 ;/
 .DW 0b1000000000001000 ;<
 .DW 0b0001101000000000 ;=
 .DW 0b0100000000100000 ;>


#977 From: "retr0dan" <RetroDan@...>
Date: Mon Oct 19, 2009 9:15 pm
Subject: THEREMIN AEROPHONE - Makes Music Based on PhotoResistor (In Assembler)
retr0dan
Offline Offline
Send Email Send Email
 
This is a simple assembly language program (approx 90 bytes) that plays the
classic music used in classic horror and sci-fi films.
The frequency is based on the amount of light hitting the LDR-CDS cell, which
you can vary by waving your hand over the LDR.

[code]
;-------------------------------------;
; A BASIC THEREMIN AETHERPHONE        ;
; PLAYS NOTES ACCORDING TO THE LIGHT  ;
; SENSITIVE ON-BOARD CDS CELL         ;
; BY RETRODAN 7-OCT-09                ;
;-------------------------------------;

.include "m169def.inc"

.DEF A       = R16
.DEF AH      = R17
.DEF B       = R18
.DEF C       = R19
.DEF D       = R20
.DEF I       = R21
.DEF J       = R22
.DEF K       = R23
.DEF N       = R24

.ORG $0000
        RJMP RESET

RESET: LDI   A,HIGH(RAMEND) ;SETUP THE STACK POINTER
        OUT   SPH,A          ;AT TOP OF MEMORY AND
        LDI   A,LOW(RAMEND)  ;GROW DOWNWARDS
        OUT   SPL,A
        LDI   A,128          ;SET CLOCK SPEED
        STS   CLKPR,A
        LDI   A,3            ;0=8MHz 1=4MHz 2=2MHz 3=1MHz
        STS   CLKPR,A        ;BUTTERFLY RUNS AT 2MHZ OUT-OF-THE-BOX

        LDI    A,2           ;SELECT INPUT 0=TEMP,2=LIGHT
        STS   ADMUX,A

        LDI   A,0x83         ;(1<<ADEN) | (1<<ADPS1) | (1<<ADPS0)   ;set ADC
prescaler to , 1MHz / 8 = 125kHz
        STS   ADCSRA,A

        SBI   PORTF,PORTF3   ;INTIALIZE PORT F
        SBI   DDRF,PORTF3    ;

READEM:
        LDI   A,0xC3          ;(1<<ADSC) | (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0)  
;set ADC prescaler to , 1MHz / 8 = 125kHz
        STS   ADCSRA,A........;START ANALOG TO DIGITAL CONVERSION
DISPLAY:
        LDS   A,ADCSRA        ;WAIT FOR ADC CONVERSION
        ANDI  A,(1<<ADIF)
         BREQ DISPLAY

        LDS   A, ADCL         ;MUST READ ADCL BEFORE ADCH
        LDS   AH, ADCH
        RCALL SOUNDER         ;MAKE MUSIC
         RJMP READEM

;================= SUBROUTINES ===================

;----------------------------------------------------;
; SOUNDS A FREQUENCY BASED ON CONTENTS OF A REGISTER ;
;----------------------------------------------------;
SOUNDER:SBI  DDRB,5         ;SET PORTB-BIT5 FOR OUTPUT
BLUPE:  SBI PORTB,5         ;SET PORTB-BIT5
         RCALL BPAUSE        ;WAIT
         CBI PORTB,5         ;CLEAR BORTB-BIT5
         RCALL BPAUSE        ;WAIT
         RET

BPAUSE: PUSH A             ;PAUSE TWEEN PULSES
BPLUPE: INC  A              ;IE DETERMINS FREQ
          BRNE BPLUPE
         POP  A
          RET
[/code]

#961 From: "eng_hossam123" <eng_hossam123@...>
Date: Thu Aug 20, 2009 8:24 pm
Subject: photoresistor
eng_hossam123
Offline Offline
Send Email Send Email
 

what do you know about photoresistor element?

information about this element in this link

http://electronics1000.blogspot.com/


#959 From: "eng_hossam123" <eng_hossam123@...>
Date: Thu Aug 20, 2009 4:38 am
Subject: memristor
eng_hossam123
Offline Offline
Send Email Send Email
 

what do you know about memristor element?

information about this element in this link

http://electronics1000.blogspot.com/


#954 From: "mahsa_smart2003" <mahsa_smart2003@...>
Date: Sun Aug 16, 2009 11:05 pm
Subject: heeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeelp
mahsa_smart2003
Offline Offline
Send Email Send Email
 
hi,i started avr with C couple of days ago.now i need easy projects,to right
them down in codevision & stimulate in proteus.iam a beginner,please help
me,mail me some easy projects....or wat ever.thank u

#951 From: "eng_hossam123" <eng_hossam123@...>
Date: Sat Aug 15, 2009 7:54 am
Subject: electronic elements
eng_hossam123
Offline Offline
Send Email Send Email
 

what do you know about electronic elements?

memristor,transistors,capacitors,resistors,inductors,zener diodes....and more electronic elements

http://electronics1000.blogspot.com/


#811 From: "eng_hossam123" <eng_hossam123@...>
Date: Fri Jan 2, 2009 2:59 am
Subject: please help
eng_hossam123
Offline Offline
Send Email Send Email
 
Dear members,

i need this book in english version

the book is :

embedded c programming and the atmel avr

i am waiting for yours reply

regards,
  hossam

#151 From: "gw4evj" <gw4evj@...>
Date: Wed Nov 28, 2007 6:17 pm
Subject: DDS-60
gw4evj@...
Send Email Send Email
 
Trying to use the Butterfly to control a DDS-60 VFO.
Although it seems to accept programming and the display indcates all
is well the data output is not correct.
A second Butterfly works OK in the same situation so wonder do I have
faulty Butterfly?
Comments would be appreciated as I am not a programmer.
George Watson

#114 From: "jme_cd" <jme_cd@...>
Date: Tue Aug 21, 2007 12:40 pm
Subject: dataflash
jme_cd
Offline Offline
Send Email Send Email
 
has anybody got code or a tutorial with the easiest way to read a byte
from the butterfly dataflash and output to the serial to my screen?

#91 From: Bob Paddock <bob.paddock@...>
Date: Sat May 19, 2007 12:34 pm
Subject: Re: AVR melody
ka8bmt
Offline Offline
Send Email Send Email
 
On Saturday 19 May 2007 00:15, Ayla wrote:

> I am looking for a simple program & any help to generate a melody
> using avr.

Table 3-13 . Tone Table Proposal

http://www.atmel.com/dyn/resources/prod_documents/doc4381.pdf

http://www.atmel.com/dyn/resources/prod_documents/at90can_lib_3-1.zip

Demo plays "Tubular Bells Part II", better known as
Exorcist Theme Song.  Any message there from Atmel that they
choose that song as example for their CAN parts?  Did they watch the
movie "Christine" to many times?

There are also other examples at http://www.avrfreaks.net/ .

--
                 http://www.wearablesmartsensors.com/
  http://www.softwaresafety.net/ http://www.designer-iii.com/
                  http://www.unusualresearch.com/

#88 From: Mohd Fadli Abd Wahab <fadli_wahab@...>
Date: Fri May 25, 2007 12:12 am
Subject: Balasan: AVR melody
fadli_wahab
Offline Offline
Send Email Send Email
 
hi
i'm also working on avr and 8051 microcontroller,
i'm from malaysia and i have done a lot of projects using avr and 8051. Can I have the the detail of your project and waht kind of melody r u looking for.
please into yourself  a little bit. May be i can help u.
 
regards,
fadli

Ayla <aila_hasanalizadeh@...> wrote:
hi all
I am looking for a simple program & any help to generate a melody
using avr.(I am working with assambely.).I'd really become gratefull
if u can help me .
thanks in advance
Aila



Bosan dengan spam? Mel Yahoo! memiliki perlindungan spam yang terbaik
http://my.mail.yahoo.com/

#86 From: "Ayla" <aila_hasanalizadeh@...>
Date: Sat May 19, 2007 4:15 am
Subject: AVR melody
aila_hasanal...
Offline Offline
Send Email Send Email
 
hi all
I am looking for a simple program & any help to generate a melody
using avr.(I am working with assambely.).I'd really become gratefull
if u can help me .
thanks in advance
Aila

#82 From: "Dave McLaughlin" <dave@...>
Date: Sun Apr 29, 2007 2:58 pm
Subject: RE: avr studio
davepsion
Offline Offline
Send Email Send Email
 

HI Aila,

 

Have a look on www.avrfreaks.net as there are loads of projects written in assembly on there.

 

Personally I have never actually used AVR assembly since I started with the AVR and have always used C. My development time is much faster and I have never needed the requirements of speed, even with a recent project that read the stream of bits from an infra-red remote control. All worked perfectly under C on the Mega128.

 

Stick with Basic is you need to get your projects going quickly, but if you really want to learn assembly, good luck with it.

 

Sorry for the other questions, but I am not familiar with Bascom.

 

Dave...

---
Very funny Scotty, now beam down my clothes!!!
---
http://www.embeddedcomputer.co.uk
---

 

From: AVRButterFly@yahoogroups.com [mailto:AVRButterFly@yahoogroups.com] On Behalf Of Ayla
Sent: 27 April 2007 12:15
To: AVRButterFly@yahoogroups.com
Subject: [AVRButterFly] avr studio

 

HI all
I am pretty new with assambly in AVR. but I have lots of experience
with Bascom . I have some questions that I hope you can help me:
1.how I can define a reset vector & what is use of it?

2. in order to run timer1 is it enough that I change CS12-11-10 in
TCCR1B register?

3. I define some constants that some of them are 2bytes . how I can
access just low byte or just high byte of this constant?

4. where i can find good examples in assambly ?becouse most of the
examples in internet was written with c or basic ?

Thanks in advance
Aila

 


#80 From: "Ayla" <aila_hasanalizadeh@...>
Date: Fri Apr 27, 2007 5:14 am
Subject: avr studio
aila_hasanal...
Offline Offline
Send Email Send Email
 
HI all
I am pretty new with assambly in AVR. but I have lots of experience
with Bascom . I have some questions that I hope you can help me:
1.how I can define a reset vector & what is use of it?

2. in order to run timer1 is it enough that I change CS12-11-10 in
TCCR1B register?

3. I define some constants that some of them are 2bytes . how I can
access just low byte or just high byte of this constant?

4. where i can find good examples in assambly ?becouse most of the
examples in internet was written with c or basic ?

Thanks in advance
Aila

#75 From: "caesar_saad" <caesar_saad@...>
Date: Fri Apr 6, 2007 8:05 pm
Subject: need help urgently
caesar_saad
Offline Offline
Send Email Send Email
 
deer all

um so happy to join your group .

i need help from any one could help .

my problem is that i need to know about the thoery of the avr operatin
and what is the difference between the analog avr and the digital avr
in details please if you can help me as quickly as possible



best wishes

#72 From: "Syed Raza Rizvi" <razarizvi@...>
Date: Mon Mar 19, 2007 9:51 pm
Subject: RE: Looking for guidance with motors/servos
questforsals...
Offline Offline
Send Email Send Email
 
Hi All,

I've got a couple of questions about the butterfly microcontroller and would
appreciate if someone can provide info.

1. How many servos and sensors can be attached to the microcontroller
simultaneously?

2. Is there a limit on the operating voltage of the servo that the butterfly
can handle? I am planning to get 5 high torque servos shown in this link and
use it with the butterfly microcontroller:
http://www.basicx.com/Products/robotparts/Servo1.htm  Not sure if this will
be compatible.

Thanks again,
Raza



From: "Paul J. Lingane" <paul@...>
Reply-To: AVRButterFly@yahoogroups.com
To: <AVRButterFly@yahoogroups.com>
Subject: RE: [AVRButterFly] Looking for guidance with motors/servos
Date: Wed, 14 Mar 2007 21:31:23 -0800

Try www.allmotion.com . Good customer service - just call them.

_ _ _

Paul J. Lingane
Consulting Engineer
650-299-9390
fax  299-9391


-----Original Message-----
From: AVRButterFly@yahoogroups.com [mailto:AVRButterFly@yahoogroups.com] On
Behalf Of Syed Raza Rizvi
Sent: Wednesday, March 14, 2007 4:40 PM
To: AVRButterFly@yahoogroups.com
Subject: [AVRButterFly] Looking for guidance with motors/servos


Hi All,

I am a newbie to electronic chip programming. I am building a device that
requires motors to rotate for fixed segments of time and servos to rotate at

fixed angles. The AVR butterfly chip was recommended as a good place to
start. I am familiar with some C from college so hopefully I can manage
that. I need to program the AVR Butterfly chip to perform the following
tasks:

1. Run two 12v motors for 20 seconds and stop.
2. Rotate a small toy servo motor to 180 degrees, 270 degrees and back to 0
degrees for 10 seconds each.
3. Run another 12V motor for various segments of time based on feedback from

pressure sensors.

Can someone please help me with the following questions:

1. I would appreciate a recommendation on any online tutorial that can help
me get started with AVR butterfly and motors.
2. How many servos/motors does a single AVR butterfly microcontroller
support? I have a requirement to support 4 servos.
3. Can some one please point to a particular servo/motor controller that I
can use to achieve the results.

I'll greatly appreciate any help. Thanks in advance.

Raza
Houston, TX

_________________________________________________________________
The average US Credit Score is 675. The cost to see yours: $0 by Experian.
http://www.freecreditreport.com/pm/default.aspx?sc=660600&bcd=EMAILFOOTERAVE
RAGE





Yahoo! Groups Links

_________________________________________________________________
Exercise your brain! Try Flexicon.
http://games.msn.com/en/flexicon/default.htm?icid=flexicon_hmemailtaglinemarch07

#70 From: "Stefan Wimmer" <wswbln@...>
Date: Thu Mar 15, 2007 6:56 pm
Subject: Re: Looking for guidance with motors/servos
_wsw_
Offline Offline
Send Email Send Email
 
--- In AVRButterFly@yahoogroups.com, "Syed Raza Rizvi" <razarizvi@...>
wrote:
>
> Hi All,
>
> I am a newbie to electronic chip programming. I am building a device
that
> requires motors to rotate for fixed segments of time and servos to
rotate at
> fixed angles. The AVR butterfly chip was recommended as a good place
to
> start.  (...)
> I'll greatly appreciate any help. Thanks in advance.

"C Programming for Microcontrllers" from Joe Pardue
(www.SmileyMicros.com) comes to mind here...

HTH,
Stefan

#69 From: "Paul J. Lingane" <paul@...>
Date: Thu Mar 15, 2007 5:31 am
Subject: RE: Looking for guidance with motors/servos
plingane
Offline Offline
Send Email Send Email
 
Try www.allmotion.com . Good customer service - just call them.

_ _ _

Paul J. Lingane
Consulting Engineer
650-299-9390
fax  299-9391


-----Original Message-----
From: AVRButterFly@yahoogroups.com [mailto:AVRButterFly@yahoogroups.com] On
Behalf Of Syed Raza Rizvi
Sent: Wednesday, March 14, 2007 4:40 PM
To: AVRButterFly@yahoogroups.com
Subject: [AVRButterFly] Looking for guidance with motors/servos


Hi All,

I am a newbie to electronic chip programming. I am building a device that
requires motors to rotate for fixed segments of time and servos to rotate at

fixed angles. The AVR butterfly chip was recommended as a good place to
start. I am familiar with some C from college so hopefully I can manage
that. I need to program the AVR Butterfly chip to perform the following
tasks:

1. Run two 12v motors for 20 seconds and stop.
2. Rotate a small toy servo motor to 180 degrees, 270 degrees and back to 0
degrees for 10 seconds each.
3. Run another 12V motor for various segments of time based on feedback from

pressure sensors.

Can someone please help me with the following questions:

1. I would appreciate a recommendation on any online tutorial that can help
me get started with AVR butterfly and motors.
2. How many servos/motors does a single AVR butterfly microcontroller
support? I have a requirement to support 4 servos.
3. Can some one please point to a particular servo/motor controller that I
can use to achieve the results.

I'll greatly appreciate any help. Thanks in advance.

Raza
Houston, TX

_________________________________________________________________
The average US Credit Score is 675. The cost to see yours: $0 by Experian.
http://www.freecreditreport.com/pm/default.aspx?sc=660600&bcd=EMAILFOOTERAVE
RAGE





Yahoo! Groups Links

#68 From: "Syed Raza Rizvi" <razarizvi@...>
Date: Thu Mar 15, 2007 12:40 am
Subject: Looking for guidance with motors/servos
questforsals...
Offline Offline
Send Email Send Email
 
Hi All,

I am a newbie to electronic chip programming. I am building a device that
requires motors to rotate for fixed segments of time and servos to rotate at
fixed angles. The AVR butterfly chip was recommended as a good place to
start. I am familiar with some C from college so hopefully I can manage
that. I need to program the AVR Butterfly chip to perform the following
tasks:

1. Run two 12v motors for 20 seconds and stop.
2. Rotate a small toy servo motor to 180 degrees, 270 degrees and back to 0
degrees for 10 seconds each.
3. Run another 12V motor for various segments of time based on feedback from
pressure sensors.

Can someone please help me with the following questions:

1. I would appreciate a recommendation on any online tutorial that can help
me get started with AVR butterfly and motors.
2. How many servos/motors does a single AVR butterfly microcontroller
support? I have a requirement to support 4 servos.
3. Can some one please point to a particular servo/motor controller that I
can use to achieve the results.

I'll greatly appreciate any help. Thanks in advance.

Raza
Houston, TX

_________________________________________________________________
The average US Credit Score is 675. The cost to see yours: $0 by Experian.
http://www.freecreditreport.com/pm/default.aspx?sc=660600&bcd=EMAILFOOTERAVERAGE

#67 From: "Dave McLaughlin" <dave@...>
Date: Thu Mar 8, 2007 10:11 am
Subject: RE: pcb tester
davepsion
Offline Offline
Send Email Send Email
 
Hi Aila,
 
If you need a custom PCB with the AVR, then you will need PCB design software or if you only need a PCB with an AVR just to get started with the AVR, why not just buy a ready made development board?
 
If you have never done PCB design before, then I would try to find some software such as Eagle or Protel etc and have a go. Won't be easy if you have no electronics experience but for really simple stuff will be easy enough to learn if you can find a suitable schematic to get some design ideas from.
 
 
The above do some nice AVR boards.
 
Hope this helps?
 
Dave...
---
Very funny Scotty, now beam down my clothes!!!
---
http://www.embeddedcomputer.co.uk
---
 


From: AVRButterFly@yahoogroups.com [mailto:AVRButterFly@yahoogroups.com] On Behalf Of Ayla
Sent: 07 March 2007 13:48
To: AVRButterFly@yahoogroups.com
Subject: [AVRButterFly] pcb tester

hi everybody
I just joined this group & I need some clues for designing a pcb
tester with a microcontroller (AVR or PIC)
if you can help me I'd be thankful
thanks in advance
Aila

.


Messages 66 - 991 of 996   Newest  |  < Newer  |  Older >  |  Oldest
Advanced
Add to My Yahoo!      XML What's This?

Copyright © 2009 Yahoo! Inc. All rights reserved.
Privacy Policy - Terms of Service - Guidelines - Help