' Direct Digital Synthesis. (DDS)
' Frequency = r24/r25/r26* (xtal freq/cycles in loop)/16777216 (2^24)
$regfile = "m168def.DAT"
$crystal = 8000000
$hwstack = 32
$swstack = 16
$framesize = 32
'''$prog &HFF , &HC2 , &HFF , &HF9
'configure display on PORTC
Config Lcdpin = Pin,Db4=Portc.2,Db5=Portc.3,Db6=Portc.4,Db7=Portc.5,E=Portc.1,Rs=Portc.0
Config Lcd = 16 * 2
Cursor Off
' R2R ladder on PORTD
Config Portd = Output
'Enable Pin change interrupt on PB7,PB6,PB5,PB4
Pcmsk0 = &B11110000
'Set interrupt vector PCINT0 with NOSAVE
On Pcint0 Pcint0_isr Nosave
' 4x4 keypad port
Config Kbd = Portb , Debounce = 20 , Delay = 50
'Set data direction of PORTB
'INPUTS=PB7,PB6,PB5,PB4 / OUTPUTS=PB3,PB2,PB1,PB0
Ddrb = &B00001111
'OUTPUTS=PB3,PB2,PB1,PB0 set to 0
'Enable internal pull-up resistors on the inputs PB7,PB6,PB5,PB4.
Portb = &B11110000
Dim Add0 As Byte
Dim Add8 As Byte
Dim Add16 As Byte
Dim X As Byte
Dim Num As Byte
Dim Number As Long
Dim P As Long
'Wait that PORTB stabilizes
Waitms 10
'Clear Pcint0 flag set while the PORTB was stabilizing.
Set Pcifr.pcif0
' ===================================================================
Cls
Waitms 100
Lcd "Power on!"
Waitms 2000
Cls
Lcd "Main loop...."
Enable Pcint0
Enable Interrupts
'***************************************************
$asm
Main_loop:
add r28, r24 ' 1 cycle
adc r29, r25 ' 1 cycle
adc r30, r26 ' 1 cycle
lpm ' 3 cycles
Out Portd , R0 ' 1 cycle
rjmp Main_loop ' 2 cycles
$end Asm
End
'***************************************************
Pcint0_isr:
Disable Pcint0
Cls
Lcd "Interrupt!"
Waitms 1000
Cls
Locate 1 , 1
Lcd "Enter new value:"
Locate 2 , 1
Lcd "CLS=* Enter=#"
Waitms 1000
Number = 0
Do
X = Getkbd()
Num = Lookup(x , Dta)
If Num < 10 Then
Locate 1 , 1
Lcd " "
Number = Number * 10
Number = Number + Num
Locate 1 , 1
Lcd Number
End If
If Num = 35 Then
P = Number And &HFF0000
Shift P , Right , 16
Add16 = Low(p)
P = Number And &H00FF00
Shift P , Right , 8
Add8 = Low(p)
P = Number And &H0000FF
Add0 = Low(p)
Locate 2 , 1
Lcd "HEX = " ; Hex(add16) ; " " ; Hex(add8) ; " " ; Hex(add0)
Waitms 5000
Exit Do
End If
' * clear value
If Num = 42 Then
Locate 1 , 1
Lcd " "
Number = 0
End If
'keypad repetition speed 500 ms
Waitms 500
Loop
'**************************************
'Set data direction of PORTB
'INPUTS=PB7,PB6,PB5,PB4 / OUTPUTS=PB3,PB2,PB1,PB0
Ddrb = &B00001111
'OUTPUTS=PB3,PB2,PB1,PB0 set to 0
'Enable internal pull-up resistors on the inputs PB7,PB6,PB5,PB4.
Portb = &B11110000
'Wait that PORTB stabilizes
Waitms 10
Cls
Lcd "Exit Interrupt!"
Waitms 1000
Cls
Lcd "Main loop...."
' setup Z pointer hi
ldi ZH, high (Sine_table * 2)
' setup Z pointer lo
ldi ZL, low (Sine_table * 2)
' clear accumulator
ldi r29,$00
ldi r28,$00
'enable interrupt
Enable Pcint0
Loadadr Add0 , X 'LSB
ld r24, X
Loadadr Add8 , X
ld r25, X
Loadadr Add16 , X 'MSB
ld r26, X
'Clear Pcint0 flag
Set Pcifr.pcif0
' return to main loop.
' (Exit from interrupt routine, Bascom will generate a RETI).
Return
'***************************************************
'Keypad map
'A=65 B=66 C=67 D=68
'*=42 #=35
'No key pressed = 16
Dta:
Data 1 , 2 , 3 , 65
Data 4 , 5 , 6 , 66
Data 7 , 8 , 9 , 67
Data 42 , 0 , 35 , 68 , 16
'***************************************************
Dummy_data:
Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
'Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
'Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
'Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
'Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
'Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
'Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
'Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10
' In this program the tables MUST begin at 256 byte boundary and the previous
' dummy_data bytes are used to reach the boundary.
' The boundaries are at (DEC) : 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048.......
' The boundaries are at (HEX) : 0, 100, 200, 300, 400, 500, 600, 700, 800.......
' You can use any of these boundaries.
Sine_table:
'256 values
Data &H80 , &H83 , &H86 , &H89 , &H8C , &H8F , &H92 , &H95
Data &H98 , &H9C , &H9F , &HA2 , &HA5 , &HA8 , &HAB , &HAE
Data &HB0 , &HB3 , &HB6 , &HB9 , &HBC , &HBF , &HC1 , &HC4
Data &HC7 , &HC9 , &HCC , &HCE , &HD1 , &HD3 , &HD5 , &HD8
Data &HDA , &HDC , &HDE , &HE0 , &HE2 , &HE4 , &HE6 , &HE8
Data &HEA , &HEC , &HED , &HEF , &HF0 , &HF2 , &HF3 , &HF5
Data &HF6 , &HF7 , &HF8 , &HF9 , &HFA , &HFB , &HFC , &HFC
Data &HFD , &HFE , &HFE , &HFF , &HFF , &HFF , &HFF , &HFF
Data &HFF , &HFF , &HFF , &HFF , &HFF , &HFF , &HFE , &HFE
Data &HFD , &HFC , &HFC , &HFB , &HFA , &HF9 , &HF8 , &HF7
Data &HF6 , &HF5 , &HF3 , &HF2 , &HF0 , &HEF , &HED , &HEC
Data &HEA , &HE8 , &HE6 , &HE4 , &HE2 , &HE0 , &HDE , &HDC
Data &HDA , &HD8 , &HD5 , &HD3 , &HD1 , &HCE , &HCC , &HC9
Data &HC7 , &HC4 , &HC1 , &HBF , &HBC , &HB9 , &HB6 , &HB3
Data &HB0 , &HAE , &HAB , &HA8 , &HA5 , &HA2 , &H9F , &H9C
Data &H98 , &H95 , &H92 , &H8F , &H8C , &H89 , &H86 , &H83
Data &H80 , &H7C , &H79 , &H76 , &H73 , &H70 , &H6D , &H6A
Data &H67 , &H63 , &H60 , &H5D , &H5A , &H57 , &H54 , &H51
Data &H4F , &H4C , &H49 , &H46 , &H43 , &H40 , &H3E , &H3B
Data &H38 , &H36 , &H33 , &H31 , &H2E , &H2C , &H2A , &H27
Data &H25 , &H23 , &H21 , &H1F , &H1D , &H1B , &H19 , &H17
Data &H15 , &H13 , &H12 , &H10 , &H0F , &H0D , &H0C , &H0A
Data &H09 , &H08 , &H07 , &H06 , &H05 , &H04 , &H03 , &H03
Data &H02 , &H01 , &H01 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H01 , &H01
Data &H02 , &H03 , &H03 , &H04 , &H05 , &H06 , &H07 , &H08
Data &H09 , &H0A , &H0C , &H0D , &H0F , &H10 , &H12 , &H13
Data &H15 , &H17 , &H19 , &H1B , &H1D , &H1F , &H21 , &H23
Data &H25 , &H27 , &H2A , &H2C , &H2E , &H31 , &H33 , &H36
Data &H38 , &H3B , &H3E , &H40 , &H43 , &H46 , &H49 , &H4C
Data &H4F , &H51 , &H54 , &H57 , &H5A , &H5D , &H60 , &H63
Data &H67 , &H6A , &H6D , &H70 , &H73 , &H76 , &H79 , &H7C
|