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
;-----------------------------; ; 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
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
;-------------------------------------------------------; ;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
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
;-----------------------------------; ; 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
[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
;-------------------------------------------------------; ;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
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
;-----------------------------------; ; 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
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
;---------------------------------------------------; ; 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]
;--------------------------------------------------; ; 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
;-----------------------------------------; ; 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
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
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
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
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 ;>
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
;-------------------------------; ; 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
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
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 ; ;----------------------------------------------------------;
;---------------------------------: ; 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
;-----------------; ; 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
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 "
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
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]
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
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
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
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
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.
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 ?
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
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
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
--- 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
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
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
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.
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