'*******************************************************************************
'* *
'* Dies ist das Listing von Elektor, RFM12 ATM18, aus Elektor Januar 2009 *
'* Atmega 168 16MHz *
'* *
'* Ralf Neubert Dinslaken ralfneubert@online.de *
'* Logger auf www.AVR-Praxis.de *
'* Version vom 11.05.2012 *
'* *
'*******************************************************************************
'Das listing wurde von mir, auf meine Anwendungen angepasst.
'Sollten angaben nicht stimmen, bitte um eine kurze email ( ralfneubert@online.de ) dann kann ich es ändern.
'
' RFM12B 3,3V | Atmega 32 | 168
' ----------------+--------------------- ------------
' SDO | MISO PB6 | PB4 SDO -| - ___ |- nSEL
' nIRQ | INT0 PD2 | PD2 nIRQ -| | | | | |- SCK
' FSK/DATA/nFFS | VCC | FSK/DATA/nFFS -| | | | | |- SDI
' DCLK/CFIL/FFIT | - | DCLK/CFIL/FFIT -| | | --- |- nINT/VDI
' CLK | - | CLK -| | | |- GND
' nRES | - | nRES -| - |- VDD in diesem Fall 3,3V
' GND | GND | GND -| RFM12B 3,3V|- Antenne 86 mm
' ANT | - | ------------
' VDD +3,3V | VCC +5V |
' GND | GND |
' nINT/VDI | - |
' SDI | MOSI PB5 | PB3
' SCK | SCK PB7 | PB5
' nSEL | SS PB4 | PB2 Slave select pin defined below
'____________________________________________________________________________________________________________________________________________
'Antennen Länge
'Diese Antennen längen sind Berechnet für die vorhandenen Frequenzbänder
' Für 868 MHz
'433 1/4 Welle = 173.0mm | Berchnung der Korrekten Antennen länge = Lambda = C/f
'433 1/2 Welle = 346.1mm | C = Lichtgeschwindigkeit durch Luft = 299711000 m/s
'433 ganze Welle = 692.2mm | f = mittlere Frequenz =868 MHz = 868000000 Hz
' |
'868 1/4 Welle = 86.3mm | Lambda = 299711000 m/s / 868000000 Hz = 0.34528917 m = 345,289 mm
'868 1/2 Welle = 172.6mm | Lambda = 345,289 mm
'868 ganze Welle = 345.3mm | Lambda/2 = 172,645 mm
' | Lambda/4 = 86,322 mm
'915 1/4 Welle = 81.9mm |
'915 1/2 Welle = 163.8mm |
'915 ganze Welle = 327.6mm |
'-------------------------------------------------------------------------------------------------------------------------------------------
$regfile = "m168def.dat"
$hwstack = 32
$swstack = 10
$framesize = 40
$crystal = 16000000
$baud = 19200
Nsel Alias Portb.2
Sdi Alias Portb.3
Sdo Alias Pinb.4
Sck Alias Portb.5
Dim D As Word
Dim Data_in(10) As Byte
Dim Data_out(10) As Byte
Dim N As Byte
Dim Timeout As Word
Dim T As Word
Dim Tt As Word
Dim Freq As Single
Dim Checksumme As Byte
Dim Dat As Word
Dim Hi As Byte
Dim Lo As Byte
Declare Sub Init_rfm12
Declare Sub Send_rfm12
Declare Sub Receive_rfm12
Declare Sub Freq_rfm12
Declare Sub Wait_rfm12
Declare Function Spi16(byval Dout As Word) As Word
Config Nsel = Output
Config Sdi = Output
Config Sck = Output
Config Portd = Output
Config Adc = Single , Prescaler = 64 , Reference = Off ' Pre 8...32
Config Timer1 = Pwm , Prescale = 8 , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect
Config Portb.1 = Output
Start Timer1
Pwm1a = 500
Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
Config Portb.0 = Output
Portd.0 = 1 'pullup RXD
Portc = &HFF
Servo(1) = 150
Nsel = 1
Portb.4 = 1
Waitms 500
Init_rfm12
Freq = 868.3
Freq_rfm12
'Do 'Servo-Test
'For N = 100 To 200
' Servo(1) = N
' Waitms 100
'Next N
'Loop
Do
Data_out(1) = 27
Checksumme = 27
Data_out(2) = Pinc
Checksumme = Checksumme + Data_out(2)
Dat = Getadc(6)
Hi = High(dat)
Data_out(3) = Hi
Checksumme = Checksumme + Hi
Lo = Low(dat)
Checksumme = Checksumme + Lo
Data_out(4) = Lo
Dat = Getadc(7)
Hi = High(dat)
Data_out(5) = Hi
Checksumme = Checksumme + Hi
Lo = Low(dat)
Checksumme = Checksumme + Lo
Data_out(6) = Lo
Data_out(7) = Checksumme
Send_rfm12
Enable Interrupts 'Servo
Waitms 500
Disable Interrupts
For N = 1 To 10
Data_in(n) = 0
Next N
Timeout = 400 + Rnd(1000)
Receive_rfm12
If Data_in(1) = 27 Then
Checksumme = 27
For N = 2 To 6
Checksumme = Checksumme + Data_in(n)
Next N
If Data_in(7) = Checksumme Then
Checksumme = 27
Portd = Data_in(2)
'Print Data_in(2) 'no Print for 4 K using Bascom Demo
Dat = 256 * Data_in(3)
Dat = Dat + Data_in(4)
Pwm1a = Dat
'Print Dat
Dat = 256 * Data_in(5)
Dat = Dat + Data_in(6)
'Print Dat
Dat = Dat / 11
Dat = Dat + 100
Servo(1) = Dat
'Print
End If
End If
Enable Interrupts 'Servo
Waitms 700
Disable Interrupts
Loop
Sub Init_rfm12
Nsel = 1
Sck = 0
'D = Spi16(&H80d7) ' El , Ef , 11.5pf, 433 MHz band
D = Spi16(&H80e7) ' El , Ef , 11.5pf, 868 MHz band
D = Spi16(&H82d9) ' !er , !ebb , Et , Es , Ex , !eb , !ew , Dc
D = Spi16(&Ha67c) ' 434,15 MHz / 868,3 MHz
'D = Spi16(&Hc67f) ' 2.4kbps ok
D = Spi16(&Hc647) ' 4.8kbps ok
'D = Spi16(&Hc623) ' 9.6kbps ok
'D = Spi16(&Hc617) ' 14.4kbps ok
'D = Spi16(&Hc611) ' 19.2kbps ok
'D = Spi16(&Hc60b) ' 28.8kbps kein Daten Empfangen
'D = Spi16(&Hc608) ' 38.4kbps kein Daten Empfangen
'D = Spi16(&Hc602) ' 115.2kbps kein Daten Empfangen
D = Spi16(&H94a4) ' Vdi , Fast , 134 kHz , 0db , -79dbm
D = Spi16(&Hc2ac) ' Al , !ml , Dig , Dqd4
D = Spi16(&Hca81) ' Fifo8 , Sync , !ff , Dr
D = Spi16(&Hc483) ' @pwr , No Rstric , !st , !fi , Oe , En
D = Spi16(&H9850) ' 90 kHz , power - 0 dB
D = Spi16(&He000) '
D = Spi16(&Hc800) '
D = Spi16(&Hc000) ' 1 MHz , 2.2V
End Sub
Sub Freq_rfm12
If Freq < 800 Then Freq = Freq * 2 'für 434 MHz-Band
Freq = Freq - 860
D = Freq / 0.0050
If D < 96 Then D = 96
If D > 3903 Then D = 3903
D = D + &HA000
D = Spi16(d)
End Sub
Sub Send_rfm12
D = Spi16(&H8238)
' Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb82d)
Wait_rfm12
D = Spi16(&Hb8d4)
For N = 1 To 10
Wait_rfm12
D = &HB800 + Data_out(n)
D = Spi16(d)
Next N
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&Hb8aa)
Wait_rfm12
D = Spi16(&H8208)
End Sub
Sub Wait_rfm12
Nsel = 0
Waitus 10
Do
Loop Until Sdo = 1
End Sub
Sub Receive_rfm12
Tt = Timeout * 10
D = Spi16(&H82c8)
D = Spi16(&Hca83)
For N = 1 To 10
Nsel = 0
T = 0
Do
T = T + 1
Waitus 100
If T > Tt Then Goto Nosignal
Loop Until Sdo = 1
D = Spi16(&Hb000)
Data_in(n) = D
Next N
Nosignal:
D = Spi16(&H8208)
End Sub
Function Spi16(byval Dout As Word) As Word
Local Nspi As Integer
Local Dspi As Integer
Local Dsdo As Word
Nsel = 0
Dsdo = 0
For Nspi = 1 To 16
Dspi = Dout And &H8000
If Dspi = 0 Then
Sdi = 0
Else
Sdi = 1
End If
Dout = Dout * 2
Dsdo = Dsdo * 2
Dsdo = Dsdo + Sdo
Sck = 1
Waitus 5
Sck = 0
Next Nspi
Nsel = 1
Spi16 = Dsdo
End Function