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







Zitieren

Lesezeichen