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