RFM12-Artikel im Elektor - jemand Erfahrung damit???
Hallo Leute!
Kennt jemand den Artikel über BASCOM und die RFM12-Module aus dem ELEKTOR???
Ist sehr anschaulich erklärt. Nur ist mir nicht so richtig klar, wie ich die Empfangsroutine in eigenen Code einfügen kann, ohne das Programm komplett mit dem wait_rfm12 lahmzulegen...
Im Speziellen: würde gern meiner DCF77-Uhr so'n Modul verpassen (Empfänger). Diese soll dann auf Anfrage von anderen AVR's die aktuelle Uhrzeit via RFM12 senden...
Bin da momentan etwas ratlos...
Jemand 'ne Idee??
MfG, dl1akp
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
ich habe mich mal rumgespielt mit den Modulen und ein Programm mit Interrupt geschrieben.
2 x Atmega8 , 2x RFM12 , Modul sendet nach 1 min einen Text an das andere, Befehle von der Com werden gesendet, SPi Befehle von der Com werden in das Modul geschrieben.
Beispiel:
Com1: >TXD_Hallo + CHR13 sendet Hallo ans andere Modul und dieses gibt es mit Print aus.
Com1: >SPI_47274 + Chr(13) schreibt B8AA ans Modul
Com1: >INI_0 + Chr(13) Modul wird nochmal Init
Com1: >STA_0000 + CHr(13) liest Statusregister vom Modul und gibt es aus.
Viel Spaß
Mfg
Code:
'######################## RFM12 sende/empfang Test mit Interrupt made by Tomi0815 ######################################
'
'Test 2x ATMega8 und 2x Rfm12
'
'
'
' M8 / PB5 --> RFM12 / SCK
' M8 / PB4 --> RFM12 / SDO
' M8 / PB3 --> RFM12 / SDI
' M8 / PB2 --> RFM12 / nSEL --> Wiederstand (10K) nach VCC (Pullup nSEL = High beim Programmieren des M8)
' M8 / PD2(INT0) --> RFM12 / nIRQ
'
'
' M8 / PD7 --> Taster nach GND ( Starte Teststring schleife )
' M8 / PB0 --> LED K -|<|- A --> Wiederstand --> VCC ( Kontrolle )
'
' RFM12 / FSK-Data --> Wiederstand(1K) nach VCC
' RFM12 VDD / GMD / Antenne
'
' OSCCAL für Print an ATMEGA8 anpassen
'
'
''####################################################################################################################
$regfile = "m8def.dat"
$hwstack = 64
$swstack = 20
$framesize = 40
$crystal = 8000000
$baud = 19200
Baud = 19200
Osccal = 195
'################################################################################################################## dim,conf
Const Sync_byte = 62
Dim Sek_timer As Long : Sek_timer = 0
'------------------------------------------------------------------------------- für TX/RX
Dim Buffer As String * 32
Dim Buffer_len As Byte
Dim Buffer_wert As Word
Dim Startbit As Bit
Dim Split_buffer_1 As String * 15
Dim Split_buffer_2 As String * 15
Dim Rxd_byte As Byte
Dim Rxd_buffer_len As Byte
Dim Rxd_in_counter As Byte
Dim Rxd_buffer As String * 32
Dim Txd_buffer As String * 32
Dim Txd_len As Byte
Dim Txd_byte_counter As Byte
Dim Txd_byte As Byte
Dim Txd_string As String * 1
'------------------------------------------------------------------------------- für rfm12
Dim Daten_empfangen As Bit : Daten_empfangen = 0
Dim Rfm12_rxd_len As Byte
Dim Rfm12_txd_string As String * 50
Dim Rfm12_rxd_string As String * 50
Dim Rfm12_rxd_bit_counter As Byte
Dim Rfm12_rxd_bit_counter2 As Byte
Dim Rfm12_rxd_data_counter As Byte
Dim Rfm12_rxd_byte As Byte
Dim Rfm12_txd_bit_counter As Byte
Dim Rfm12_txd_byte_len As Byte
Dim Rfm12_txd_byte As Byte
Dim Rfm12_txd_string_1x As String * 1
Dim Bit_counter As Byte
Dim Init_counter As Byte
Dim Bit_out As Integer
Dim Spi_out As Word
Dim Spi_in As Word
Dim Tx_rfm12_ready As Bit : Tx_rfm12_ready = 0
Dim Rgit_ffit As Bit
Dim Por As Bit
Dim Rug_ffov As Bit
Dim Wkup As Bit
Dim Ext As Bit
Dim Lbd As Bit
Dim Empfang_status As Byte : Empfang_status = 0
Dim Sende_status As Byte : Sende_status = 0
'-------------------------------------------------------------------------------------------------- config
Config Int0 = Falling
Config Timer1 = Timer , Prescale = 256
'-------------------------------------------------------------------------------------------------- output
Led Alias Portb.0 : Ddrb.0 = 1 : Portb.0 = 1
Rfm12_cs Alias Portb.2 : Ddrb.2 = 1 : Portb.2 = 1
Sdi Alias Portb.3 : Ddrb.3 = 1 : Portb.3 = 1
Sck Alias Portb.5 : Ddrb.5 = 1 : Portb.5 = 0
'-------------------------------------------------------------------------------------------------- input
Sdo Alias Pinb.4 : Ddrb.4 = 0 : Portb.4 = 1
Taster Alias Pind.7 : Ddrd.7 = 0 : Portd.7 = 1 'pullup portd.7
Ddrd.2 = 0 : Portd.2 = 1
'-------------------------------------------------------------------------------------------------- Starteinstellungen
Print "Start"
Gosub Rfm12_init
On Urxc Usart_receive_complete_ir
On Utxc Usart_transmit_complete_ir
On Udre Usart_data_register_empty_ir
Enable Urxc
Enable Utxc
Disable Udre
On Int0 Isr_int0
Enable Int0
On Timer1 Timer1_isr
Enable Timer1
Timer1 = 34285
Enable Interrupts
Empfang_status = 0
Sende_status = 0
Rfm12_txd_string = "Ready" + Chr(13)
Rfm12_rxd_string = ""
Rfm12_txd_bit_counter = 0
Gosub Send_rfm12
Waitms 200
Empfang_status = 1
'################################################################################################################## Hauptschleife
Do
If Rfm12_txd_string <> "" Then
Rfm12_txd_bit_counter = 0
Gosub Send_rfm12
Waitms 200
Rfm12_txd_string = ""
Empfang_status = 1
End If
If Empfang_status = 1 Then ' Empfang freigegeben
Rfm12_rxd_bit_counter = 0
Spi_out = &H82C8
Gosub Spi_trans
Spi_out = &HCA83
Gosub Spi_trans
Empfang_status = 2
Enable Int0
End If
If Daten_empfangen = 1 Then ' Daten Empfangen
Spi_out = &H8208
Gosub Spi_trans
Print Rfm12_rxd_string;
Rfm12_rxd_string = ""
Rfm12_rxd_bit_counter = 0
Daten_empfangen = 0
Enable Int0
Empfang_status = 1
End If
If Buffer <> "" Then Gosub Rxd_input_auswerten:
Loop
'################################################################################################################## timer0_isr
Timer1_isr:
Timer1 = 34285
Incr Sek_timer
If Sek_timer = 60 Then
Rfm12_txd_string = "M1_M2_XXXX_XXXX" + Chr(13)
Toggle Led
Sek_timer = 0
End If
Return
'################################################################################################################## INT0
Isr_int0:
'------------------------------------------------------------------------------------------------------------------
'Statusregister lesen
Spi_out = &H0000
Gosub Spi_trans
Rgit_ffit = Spi_in.15
Por = Spi_in.14
Rug_ffov = Spi_in.13
Wkup = Spi_in.12
Ext = Spi_in.11
Lbd = Spi_in.10
'-----------------------------------------------------------------------------------------------------------------
If Rgit_ffit = 1 And Empfang_status = 2 Then
Incr Rfm12_rxd_bit_counter
Spi_out = &HB000
Gosub Spi_trans
If Rfm12_rxd_bit_counter < 50 Then
Rfm12_rxd_byte = Spi_in
Rfm12_rxd_string = Rfm12_rxd_string + Chr(rfm12_rxd_byte)
If Rfm12_rxd_byte = 13 Then
Daten_empfangen = 1
Disable Int0
End If
End If
End If
If Pind.2 = 0 Then Print Bin(spi_in)
Return
'################################################################################################################## rfm12_tx_ready
Rfm12_tx_ready:
Rfm12_cs = 0
Do
Loop Until Sdo = 1
Return
'################################################################################################################## Send_rfm12
Send_rfm12:
Rfm12_txd_byte_len = Len(rfm12_txd_string)
If Rfm12_txd_byte_len = 0 Then Return
Disable Int0
Spi_out = &H0000
Gosub Spi_trans
Spi_out = &HB8AA
Gosub Spi_trans
Spi_out = &HB8AA
Gosub Spi_trans
Spi_out = &H8239
Gosub Spi_trans
Gosub Rfm12_tx_ready
Spi_out = &HB82D
Gosub Spi_trans
Gosub Rfm12_tx_ready
Spi_out = &HB8D4
Gosub Spi_trans
Gosub Rfm12_tx_ready
For Rfm12_txd_bit_counter = 1 To Rfm12_txd_byte_len
Rfm12_txd_string_1x = Mid(rfm12_txd_string , Rfm12_txd_bit_counter , 1 )
Rfm12_txd_byte = Rfm12_txd_string_1x
Spi_out = &HB800 + Rfm12_txd_byte
Gosub Spi_trans
Gosub Rfm12_tx_ready
Next Rfm12_txd_bit_counter
Spi_out = &HB8AA
Gosub Spi_trans
Gosub Rfm12_tx_ready
Spi_out = &HB8AA
Gosub Spi_trans
Gosub Rfm12_tx_ready
Sende_status = 3
Spi_out = &H8208
Gosub Spi_trans
Spi_out = &HB8AA
Gosub Spi_trans
Spi_out = &H0000
Gosub Spi_trans
Return
'################################################################################################################## spi_trans
Spi_trans:
Rfm12_cs = 0
Spi_in = 0
For Bit_counter = 1 To 16
Bit_out = Spi_out And &H8000
If Bit_out = 0 Then
Sdi = 0
Else
Sdi = 1
End If
Spi_out = Spi_out * 2
Spi_in = Spi_in * 2
Spi_in = Spi_in + Sdo
Sck = 1
Waitus 5
Sck = 0
Next Bit_counter
Rfm12_cs = 1
Return
'################################################################################################################## rfm12_init
Rfm12_init:
Waitms 200
For Init_counter = 1 To 12
Select Case Init_counter
Case 1 :
'Spi_out = &H80E7 '868 mhz
Spi_out = &H80D7 '433 mhz
Case 2 : Spi_out = &H82D9
Case 3 : Spi_out = &HA67C
Case 4 : Spi_out = &HC6A4
Case 5 : Spi_out = &H94C0
Case 6 : Spi_out = &HC2AC
Case 7 : Spi_out = &HCA81
Case 8 : Spi_out = &HC483
Case 9 : Spi_out = &H9827
Case 10 : Spi_out = &HE000
Case 11 : Spi_out = &HC800
Case 12 : Spi_out = &HC000
End Select
Gosub Spi_trans
Waitms 100
Next Init_counter
Return
'################################################################################################################## Rxd_input_auswerten
Rxd_input_auswerten:
Buffer = Ucase(rxd_buffer)
Buffer_len = Len(buffer)
Split_buffer_1 = Mid(buffer , 2 , 3)
If Split_buffer_1 = "TXD" Then
Rfm12_txd_string = Buffer + Chr(13)
Spi_out = &H8208
Gosub Spi_trans
Txd_buffer = "sende :" + Buffer + Chr(13)
Rfm12_txd_bit_counter = 0
Gosub Send_rfm12
'Waitms 200
Empfang_status = 1
Rfm12_txd_string = ""
Else
Split_buffer_2 = Mid(buffer , 6 , Buffer_len)
Buffer_wert = Val(split_buffer_2)
End If
Select Case Split_buffer_1
Case "SPI" :
Spi_out = Buffer_wert
Gosub Spi_trans
Txd_buffer = "OK_" + Hex(buffer_wert) + Chr(13)
Case "STA" :
Spi_out = Buffer_wert
Gosub Spi_trans
Txd_buffer = Bin(spi_in) + Chr(13)
Case "INI" :
Gosub Rfm12_init
Txd_buffer = "INIT" + Chr(13)
End Select
If Txd_buffer = "" Then Txd_buffer = "<ERROR" + Chr(13)
Txd_len = Len(txd_buffer)
Txd_byte_counter = 0
Enable Udre
Buffer = ""
Return
'############################################################################### USART Receive Complete (Urxc)
Usart_receive_complete_ir:
push r12
push r13
push r14
push r15
Rxd_byte = Udr
If Rxd_byte = Sync_byte And Startbit = 0 Then
Startbit = 1
Rxd_buffer = ""
Rxd_in_counter = 0
End If
If Startbit = 1 Then
Incr Rxd_in_counter
If Rxd_byte <> 13 Then
If Rxd_in_counter < 30 Then
Rxd_buffer = Rxd_buffer + Chr(rxd_byte)
End If
Else
Buffer = Rxd_buffer
Disable Urxc
Startbit = 0
End If
End If
pop r15
pop r14
pop r13
pop r12
Return
'############################################################################### USART Data Register Empty (Udre)
Usart_data_register_empty_ir:
push r12
push r13
push r14
push r15
If Txd_byte_counter < Txd_len Then
Txd_byte_counter = Txd_byte_counter + 1
Txd_string = Mid(txd_buffer , Txd_byte_counter , 1)
Txd_byte = Txd_string
Udr = Txd_byte
Else
Txd_byte_counter = 0
Txd_len = 0
Txd_buffer = ""
Disable Udre
End If
pop r15
pop r14
pop r13
pop r12
Return
'############################################################################### Usart Transmit Complete (Utxc)
Usart_transmit_complete_ir:
Enable Urxc 'enable Empfang
Return