RFM12B élesztés

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

RFM12B élesztés

Hozzászólás Szerző: Marvinn »

Sziasztok!
Olyan budapesti vállalkozó kedvű hobbistát keresek aki segít nekem feléleszteni egy Hope RFM12B típusú párost... Hardver elvileg jó.. innen letöltöttem a fájl csere-bere menüpontból a teszt programot bascomra de nem akar működni... Adó részt betöltöm egyik hárdverbe, szépen villognak is a ledek de ez még nem biztos hogy azt jelenti hogy él a modulom, vagy jól van konfigolva... a másik hárdverbe betöltöm a vevőt, de ez nem ad jelet hogy adat jött, egyébként fut a program. a vevőben ez:

Kód: Egész kijelölése

If Ffit_bit = 1 Then
nem teljesül... Arra gondoltam hogy kell egy olyan modul ami tuti megy és mellé tenni a vevőmet és kiderül előbb utóbb hol a hiba :) Ami időközben megváltozott az az ATMEGA sebessége, mindkettőnek 8MHz-re lett állítva, hogy ez se legyen különbség.

vevő:

Kód: Egész kijelölése

'********************************* konfig *********************************
$regfile = "m128def.dat"
$crystal = 14745600
$baud = 19200
'$baud1 = 115200

'LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , Db7 = Portc.6 , Rs = Portc.0 , E = Portc.1
Config Lcd = 20 * 4
Config Lcdmode = Port

Initlcd
Cls
Cursor Off

'sd kártyát kikapcsolni
Config Portd.7 = Output
Set Portd.7


'LCD világítás
Config Portc.2 = Output
Lcd_hatter Alias Portc.2
Lcd_hatter = 1

Config Portb.4 = Output
Config Portb.2 = Output
Config Portb.1 = Output
Config Portb.3 = Input

Config Portb.0 = Output
Config Portb.6 = Output
'Config Portb.5 = Output
'Config Portb.7 = Output

'max3002
Set Portb.4

'Ledek
Config Portf.3 = Output
Config Portf.1 = Output


'Led1
Error_led Alias Portf.3
Reset Error_led

'Led2
Tx_led Alias Portf.1
Reset Tx_led

'Led3
Rx_led Alias Portb.6
Reset Rx_led

'********************************* konfig *********************************

Mod_cs Alias Portc.7                                        ' A modul CS vezetéke
Set Mod_cs
Mod_sdi Alias Portb.2                                       ' A modul SDI vezetéke, ami a MOSI lábra csatlakozik
Mod_sdo Alias Pinb.3                                        ' A modul SDO vezetéke, ami a MISO lábra csatlakozik
Set Portb.3
Mod_sck Alias Portb.1



Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit

Print "SPI init megvolt"

Declare Sub Mod_spiwrite
Declare Sub Mod_tx(txdata As Byte)
Declare Sub Mod_rx(rxdata As Byte)
Declare Sub Mod_tx_ready
Declare Sub Mod_rx_wait
Declare Sub Mod_statusbit

Declare Sub Mod_clear_fifo
Declare Sub Mod_rx_on
Declare Sub Mod_init

Const Maxbyte = 14
Const Max2byte = Maxbyte + 1

Dim Tempbit As Bit
Dim Temp As Byte
Dim Tempw As Word

Dim Mod_txword As Word
Dim Mod_txword_lsb As Byte At Mod_txword Overlay
Dim Mod_txword_msb As Byte At Mod_txword + 1 Overlay
Dim Mod_rxword As Word
Dim Mod_rxword_lsb As Byte At Mod_rxword Overlay
Dim Mod_rxword_msb As Byte At Mod_rxword + 1 Overlay

Dim Ffit_bit As Bit
Dim Rxbuffer(max2byte) As Byte
Dim Rxstring As String * Maxbyte At Rxbuffer(1) Overlay
Rxbuffer(max2byte) = 0



Dim Txindex As Byte
Dim Txbuffer(max2byte) As Byte
Dim Txstring As String * Maxbyte At Txbuffer(1) Overlay
Txbuffer(max2byte) = 0

Dim Timeout As Word

Set Rx_led
Set Tx_led
Set Error_led
Waitms 500
Reset Rx_led
Reset Tx_led
Reset Error_led



Mod_init
'Print "sdfsdf"
Mod_rx_on

Print "foprogram indul"

Do
     Mod_statusbit
      If Ffit_bit = 1 Then
         Print "adat jott"
         Mod_rx Rxbuffer(1)
         Print Rxstring
      End If
Loop

Sub Mod_init
   Local A As Byte
   Restore Init_data
   For A = 1 To 14
      Read Mod_txword
        Call Mod_spiwrite
        Print "mod_spiwrite utan"
   Next A
End Sub

'868.175 MHz
Init_data:
Data &H80E7% , &H8298% , &HA663% , &HC67F% , &H94A0% , &HC2AC% , &HCA81%
Data &HCED4% , &HC483% , &H9850% , &HCC17% , &HE000% , &HC800% , &HC040%


Sub Mod_clear_fifo
   Mod_txword = &HCA81
   Mod_spiwrite
   Mod_txword = &HCA83
   Mod_spiwrite
   Print "Mod_clear_fifo vege"
End Sub


Sub Mod_rx_on
   Mod_txword = &H8299
   Mod_spiwrite
   Mod_clear_fifo
   Print "Mod_rx_on vege"
   Waitus 80
End Sub

Sub Mod_rx(rxdata As Byte)
   Local I As Byte
   Timeout = 1
   Toggle Rx_led
   Mod_txword = &HB000
   For I = 1 To Maxbyte
      Mod_rx_wait
      If Timeout = 0 Then
         Toggle Rx_led
         Toggle Error_led
         Exit For
      End If
      Mod_spiwrite
      Rxdata(i) = Mod_rxword_lsb
   Next I
   Rxdata(i) = 0
   Mod_clear_fifo
   Toggle Rx_led
   Print "Mod_rx(rxdata As Byte) vege"
End Sub

Sub Mod_rx_wait
   Timeout = 35500
   Do
      Mod_statusbit
      Decr Timeout
      If Timeout = 0 Then
         Toggle Error_led
         Exit Do
      End If
   Loop Until Ffit_bit = 0
End Sub


Sub Mod_statusbit
   Reset Mod_sdi                                            ' A modul SDI vezetéke, ami a MOSI lábra csatlakozik
   Reset Mod_cs                                             ' A modul CS vezetéke
   Set Mod_sck
   Ffit_bit = Mod_sdo                                       ' A modul SDO vezetéke, ami a MISO lábra csatlakozik
   Reset Mod_sck
   Set Mod_cs
End Sub


Sub Mod_spiwrite
   Reset Mod_cs
   Mod_rxword_msb = Spimove(mod_txword_msb)
   Mod_rxword_lsb = Spimove(mod_txword_lsb)
   Set Mod_cs
End Sub
Adó:

Kód: Egész kijelölése

'********************************* konfig *********************************
$regfile = "m128def.dat"
$crystal = 8000000
$baud = 19200

'sd kártyát kikapcsolni
Config Portd.7 = Output
Set Portd.7


'LCD világítás
Config Portc.2 = Output
Lcd_hatter Alias Portc.2
Lcd_hatter = 0


Config Portb.4 = Output
Config Portb.2 = Output
Config Portb.1 = Output
Config Portb.3 = Input

Config Portb.0 = Output
Config Portb.6 = Output
'Config Portb.5 = Output
'Config Portb.7 = Output

'max3002
Set Portb.4

'Ledek
Config Portf.3 = Output
Config Portf.1 = Output

'Led1
Rx_led Alias Portf.3
Reset Rx_led

'Led2
Tx_led Alias Portf.1
Reset Tx_led

'Led3
Standby_led Alias Portb.6
Reset Standby_led

'********************************* konfig *********************************

Mod_cs Alias Portc.7                                        ' A modul CS vezetéke
Set Mod_cs
Mod_sdi Alias Portb.2                                       ' A modul SDI vezetéke, ami a MOSI lábra csatlakozik
Mod_sdo Alias Pinb.3                                        ' A modul SDO vezetéke, ami a MISO lábra csatlakozik
Set Portb.3
Mod_sck Alias Portb.1

'SPI busz konfigurálása, inicializálása
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit

'Szubrutinok deklarálása

Declare Sub Mod_spiwrite
Declare Sub Mod_tx
Declare Sub Mod_tx_ready
Declare Sub Mod_init

'A Maxbyte-ban az egyszerre elküldhető legtöbb adatbyte számát lehet megadni.
'A Max2byte segédérték, mindig egyel több, mint a Maxbyte.
'A Maxbyte-ot legalább kettővel többre állítsuk, mint a ténylegesen küldendő adatbájtok száma!

Const Maxbyte = 14
Const Max2byte = 15                                         'maxbyte+1

Dim Txdata(maxbyte) As Byte

'Segédváltozók

Dim Tempbit As Bit
Dim Temp As Byte
Dim Tempw As Word

'Modulkezelő változók
'A modult 16 bites változókkal kezeljük, így szükség volt ezekre a változókra is (MSB, LSB)

Dim Mod_txword As Word
Dim Mod_txword_lsb As Byte At Mod_txword Overlay
Dim Mod_txword_msb As Byte At Mod_txword + 1 Overlay
Dim Mod_rxword As Word
Dim Mod_rxword_lsb As Byte At Mod_txword Overlay
Dim Mod_rxword_msb As Byte At Mod_txword + 1 Overlay

'Túlcsordulás változója

Dim Timeout As Word

'----------------------------------------------------------------------------------------

'Bekapcs után felkapcsoljuk a két ledet, hogy lássuk, elindult-e a proci

Reset Tx_led
Reset Standby_led
Wait 1
Set Tx_led
Set Standby_led

'A ledek kialszanak, inicializáljuk a modult.

Mod_init

'Elkezdődik a tesztadatok küldése a vevő felé

Do

Mod_tx

' A küldendő adatokat a Mod_tx szubrutinban adjuk meg.
' A Txdata nevű tömbben elemenként megadjuk az adatokat a küldés sorrendjének megfelelően.


Wait 2

Loop                                                        ' és ismételjük mindezt kikapcsolásig!


'***************

' Szubrutinok

'***************


'Modul inicializálása, a regisztereket az adatsorból olvassuk ki (Init_data), és
'MSB/LSB-re bontva küldjük a modulnak.

Sub Mod_init

   Local A As Byte

   Restore Init_data

   For A = 1 To 14
      Read Mod_txword
            Mod_spiwrite
   Next A

End Sub

'*************************************************************************
Init_data:

Data &H80E7% , &H8298% , &HA663% , &HC67F% , &H94A0% , &HC2AC% , &HCA81%
Data &HCED4% , &HC483% , &H9850% , &HCC17% , &HE000% , &HC800% , &HC040%


'A konfigurációs regiszterekről az adatlapból tájékozódhatsz. A működési
'frekvencia 868,100 MHz-re van beállítva.

'*************************************************************************

'Adatbyte küldése

Sub Mod_tx

   Local A As Byte

   Set Standby_led
   Reset Tx_led                                             'Adásled bekapcs

   Mod_txword = &H8239                                      'Adásra kapcsolunk
   Mod_spiwrite
   Waitus 150


   Restore Sync_pattern                                     ' A szinkronbyte-okat küldjük először
   For A = 1 To 5                                           ' 3 db #AA, majd a 2D-D4 azonosító
      Read Mod_txword
      Mod_tx_ready
      If Timeout = 0 Then Exit For
      Mod_spiwrite
   Next A

'Csak ezután küldjük a tényleges adatokat!

Txdata(1) = 65
Txdata(2) = 66
Txdata(3) = 67
Txdata(4) = 68
Txdata(5) = 35
Txdata(6) = 36
Txdata(7) = 37
Txdata(8) = 38
Txdata(9) = 49
Txdata(10) = 50
Txdata(11) = 51
Txdata(12) = 52

   For A = 1 To Maxbyte
      Mod_tx_ready
      If Timeout = 0 Then Exit For
      Mod_txword = &HB800 + Txdata(a)
      Mod_spiwrite
   Next A
   Mod_tx_ready
  Set Tx_led                                                'led kikapcs

  Reset Standby_led
  Mod_txword = &H8298                                       'Vételre kapcsolunk
  Mod_spiwrite
  Waitus 300

End Sub

'Itt vannak a szinkronbyte-ok

Sync_pattern:
Data &HB8AA% , &HB8AA% , &HB8AA% , &HB82D% , &HB8D4%

'A status regiszter nem csak vételkor, hanem adáskor is jelzi, hogy a modul elvégezte-e
'az adatküldést. Ezt is ellenőrizni kell. Amíg az SDO nem vált 1-re, addig az adás folyamatban van.
'Ha 0-ra váltott, akkor mehet csak a következő adatbyte!

Sub Mod_tx_ready

   Reset Mod_cs
   Timeout = 65500
   While Mod_sdo = 0
      Decr Timeout
      Waitus 6
      If Timeout = 0 Then
        Exit While
         End If
   Wend

End Sub

'A 16 bites parancsok küldése a modulnak

Sub Mod_spiwrite

   Reset Mod_cs

   Mod_rxword_msb = Spimove(mod_txword_msb)
   Mod_rxword_lsb = Spimove(mod_txword_lsb)

   Set Mod_cs

End Sub
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Azt írod, hogy az vevőd frekije = '868.175 MHz
Az adó pedig = A működési
'frekvencia 868,100 MHz-re van beállítva.

Ezeknek nem = -nek kellene lenni?
:?:
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

Egyenlő az.. 868,100 nem igaz, mert a frekvencia A663 adata az 868.175 MHz-et jelent... aki írta az eredetit nem jól kommentezte azt...

szerk.: forrás: RFM12B_EVA nevű program
kapu48 írta:Azt írod, hogy az vevőd frekije = '868.175 MHz
Az adó pedig = A működési
'frekvencia 868,100 MHz-re van beállítva.

Ezeknek nem = -nek kellene lenni?
:?:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Javitsdki!

Hagyd ki a vevőnél a Státus bitre várást!
Úgyis van még : Mod_rx_wait rutin ami szinkronizálja.
Nézzük legalább valami zajt vesz?

Kód: Egész kijelölése

Do
'     Mod_statusbit
'      If Ffit_bit = 1 Then
'         Print "adat jott"
         Mod_rx Rxbuffer(1)
         Print Rxstring
'      End If
Loop
:?:
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

kihagyva terminálba íródik:
Mod_clear_fifo vege
Mod_rx(rxdata As Byte) vege

Mod_clear_fifo vege
Mod_rx(rxdata As Byte) vege

Mod_clear_fifo vege
Mod_rx(rxdata As Byte) vege

ez megy folyamatosan.. az üres sor Print Rxstring lesz gyanúm szerint.

akkor is szalad a terminál ha nincs bekapcsolva az adó
kapu48 írta:Javitsdki!

Hagyd ki a vevőnél a Státus bitre várást!
Úgyis van még : Mod_rx_wait rutin ami szinkronizálja.
Nézzük legalább valami zajt vesz?

Kód: Egész kijelölése

Do
'     Mod_statusbit
'      If Ffit_bit = 1 Then
'         Print "adat jott"
         Mod_rx Rxbuffer(1)
         Print Rxstring
'      End If
Loop
:?:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Igen a közte levő üres sor lenne a : Print Rxstring
Vagyis nem kerül semmi az : Rxstring-be
:?
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

hazaérek teszek egy ledet a MOSI lábra és megnézem init-kor spi-re kerül-e az adat..
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Még ezt javítsd:
Print "Mod_rx(rxdata As Byte) vege I=" ; I
Hogy lássuk, hányszor fut le a ciklus?
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

I=15
kapu48 írta:Még ezt javítsd:
Print "Mod_rx(rxdata As Byte) vege I=" ; I
Hogy lássuk, hányszor fut le a ciklus?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Eredetileg használja az SPI SS-Pint is! Ezt mért nem kötődbe?

Kód: Egész kijelölése

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0

Spi_cs Alias Portb.0                                        ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.4                                        ' MISO-PIN
Set Spi_cs
Valószínű csak úgy működik a RF modul!
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

hát akkor bukta :) ez egy kész nyák, nem próbapanel :) adatlap azt mondja hogy fifo-nál nem használja
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

valami történik... spi-nél ez kimaradt:
Config Portc.7 = Output

így reagál az adó ledeire de üres a Print Rxstring
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Egy Prototípus még nem is lehet kész!
:o
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

RFM datarate-jét le és fel is próbáltam állítani, a ledek világításának ideje ennek megfelelően változott de a vevőnél Print Rxstring semmit sem ad vissza, akkor sem ha a buffert kikerülöm..
Avatar
Marvinn
Tranzisztorgyógyász
Hozzászólások: 153
Csatlakozott: 2008. július 24. csütörtök, 6:00

Hozzászólás Szerző: Marvinn »

A hiba a vevő programban van, még nem tudom mi, de van amivel működik...
adó:

Kód: Egész kijelölése

'********************************* konfig *********************************
$regfile = "m128def.dat"
$crystal = 8000000
$baud = 19200

'sd kártyát kikapcsolni
Config Portd.7 = Output
Set Portd.7

'LCD világítás
Config Portc.2 = Output
Lcd_hatter Alias Portc.2
Lcd_hatter = 0

'MAX 3002 bekapcsoló
Config Portb.4 = Output
Portb.4 = 1
'ha nem muszaj ne menjen a max3002

'Led1
Config Portf.3 = Output
Tx_led Alias Portf.3
Reset Tx_led

'Led2
Config Portf.1 = Output
Rx_led Alias Portf.1
Reset Rx_led

'Led3
Config Portb.6 = Output
Standby_led Alias Portb.6
Reset Standby_led

'****************************** konfig vege *******************************

'**************************************************************************
'*********************************** SPI **********************************
'**************************************************************************
'RFM12B CS
Config Portc.7 = Output
Mod_cs Alias Portc.7
Set Mod_cs

'MOSI
Config Portb.2 = Output
Mod_sdi Alias Portb.2

'MISO
Config Portb.3 = Input
Mod_sdo Alias Pinb.3
Set Portb.3

'SCK
Config Portb.1 = Output
Mod_sck Alias Portb.1

'SS-nek meg kell mondani mi, különben nem fog menni az SPI.
Config Portb.0 = Output

'SPI busz konfigurálása, inicializálása
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit

'**************************************************************************
'******************************** SPI vege ********************************
'**************************************************************************

Print "SPI init kesz"

'Szubrutinok deklarálása
Declare Sub Mod_spiwrite
Declare Sub Mod_tx
Declare Sub Mod_tx_ready
Declare Sub Mod_init

'A Maxbyte-ban az egyszerre elküldhető legtöbb adatbyte számát lehet megadni.
'A Max2byte segédérték, mindig egyel több, mint a Maxbyte.
'A Maxbyte-ot legalább kettővel többre állítsuk, mint a ténylegesen küldendő adatbájtok száma!

Const Maxbyte = 30
Const Max2byte = 31                                         'maxbyte+1

Dim Txdata(maxbyte) As Byte

'Segédváltozók
Dim Tempbit As Bit
Dim Temp As Byte
Dim Tempw As Word

'Modulkezelő változók
'A modult 16 bites változókkal kezeljük, így szükség volt ezekre a változókra is (MSB, LSB)
Dim Mod_txword As Word
Dim Mod_txword_lsb As Byte At Mod_txword Overlay
Dim Mod_txword_msb As Byte At Mod_txword + 1 Overlay
Dim Mod_rxword As Word
Dim Mod_rxword_lsb As Byte At Mod_txword Overlay
Dim Mod_rxword_msb As Byte At Mod_txword + 1 Overlay

'Túlcsordulás változója
Dim Timeout As Word

'----------------------------------------------------------------------------------------

'Bekapcs után felkapcsoljuk a két ledet, hogy lássuk, elindult-e a proci

Reset Tx_led
Reset Standby_led
Wait 1
Set Tx_led
Set Standby_led

'A ledek kialszanak, inicializáljuk a modult.
Mod_init

'Elkezdődik a tesztadatok küldése a vevő felé
Do
Mod_tx
' A küldendő adatokat a Mod_tx szubrutinban adjuk meg.
' A Txdata nevű tömbben elemenként megadjuk az adatokat a küldés sorrendjének megfelelően.
Wait 1
Loop                                                        ' és ismételjük mindezt kikapcsolásig!

'***************

' Szubrutinok

'***************
'Modul inicializálása, a regisztereket az adatsorból olvassuk ki (Init_data), és
'MSB/LSB-re bontva küldjük a modulnak.

Sub Mod_init
   Local A As Byte
   Restore Init_data
   For A = 1 To 14
      Read Mod_txword
      Mod_spiwrite
   Next A
End Sub

'*************************************************************************
Init_data:
Data &H80E7% , &H8298% , &HA67C% , &HC61F% , &H9460% , &HC2AC% , &HCA81%
Data &HCED4% , &HC483% , &H9850% , &HCC67% , &HE000% , &HC800% , &HC040%
'A konfigurációs regiszterekről az adatlapból tájékozódhatsz.
'*************************************************************************

'Adatbyte küldése

Sub Mod_tx
   Local A As Byte
   Set Standby_led
   Reset Tx_led                                             'Adásled bekapcs
   Mod_txword = &H8239                                      'Adásra kapcsolunk
   Mod_spiwrite
   Waitus 150

   Restore Sync_pattern                                     ' A szinkronbyte-okat küldjük először
   For A = 1 To 5                                           ' 3 db #AA, majd a 2D-D4 azonosító
      Read Mod_txword
      Mod_tx_ready
      If Timeout = 0 Then Exit For
      Mod_spiwrite
   Next A

'Csak ezután küldjük a tényleges adatokat!
Txdata(1) = 72                                              'H
Txdata(2) = 69                                              'E
Txdata(3) = 76                                              'L
Txdata(4) = 76                                              'L
Txdata(5) = 79                                              'O
Txdata(6) = 32                                              'space
Txdata(7) = 97                                              'a
Txdata(8) = 122                                             'z
Txdata(9) = 32                                              'Space
Txdata(10) = 65                                             'A
Txdata(11) = 108                                            'l
Txdata(12) = 97                                             'a
Txdata(13) = 112                                            'p
Txdata(14) = 108                                            'l
Txdata(15) = 97                                             'a
Txdata(16) = 112                                            'p
Txdata(17) = 32                                             'Space
Txdata(18) = 50                                             '2
Txdata(19) = 46                                             '.
Txdata(20) = 48                                             '0
Txdata(21) = 32                                             'Space
Txdata(22) = 118                                            'v
Txdata(23) = 97                                             'a
Txdata(24) = 103                                            'g
Txdata(25) = 121                                            'y
Txdata(26) = 111                                            'o
Txdata(27) = 107                                            'k
Txdata(28) = 33                                             '!

   For A = 1 To Maxbyte
      Mod_tx_ready
      If Timeout = 0 Then Exit For
      Mod_txword = &HB800 + Txdata(a)
      Mod_spiwrite
   Next A
   Mod_tx_ready
  Set Tx_led                                                'led kikapcs

  Reset Standby_led
  Mod_txword = &H8298                                       'Vételre kapcsolunk
  Mod_spiwrite
  Waitus 300
End Sub

'Itt vannak a szinkronbyte-ok
Sync_pattern:
Data &HB8AA% , &HB8AA% , &HB8AA% , &HB82D% , &HB8D4%

'A status regiszter nem csak vételkor, hanem adáskor is jelzi, hogy a modul elvégezte-e
'az adatküldést. Ezt is ellenőrizni kell. Amíg az SDO nem vált 1-re, addig az adás folyamatban van.
'Ha 0-ra váltott, akkor mehet csak a következő adatbyte!

Sub Mod_tx_ready
   Reset Mod_cs
   Timeout = 65500
   While Mod_sdo = 0
      Decr Timeout
      Waitus 6
      If Timeout = 0 Then
        Exit While
      End If
   Wend
End Sub

'A 16 bites parancsok küldése a modulnak
Sub Mod_spiwrite
   Reset Mod_cs
   Mod_rxword_msb = Spimove(mod_txword_msb)
   Mod_rxword_lsb = Spimove(mod_txword_lsb)
   Set Mod_cs
End Sub
vevő:

Kód: Egész kijelölése

'********************************* konfig *********************************
$regfile = "m128def.dat"
$crystal = 8000000
$baud = 19200

Open "coma.6:115200,8,n,1" For Output As #1
Open "coma.4:115200,8,n,1" For Input As #2

'sd kártyát kikapcsolni
Config Portd.7 = Output
Set Portd.7

'LCD világítás
Config Portc.2 = Output
Lcd_hatter Alias Portc.2
Lcd_hatter = 0

'MAX 3002 bekapcsoló
Config Portb.4 = Output
Portb.4 = 1
'ha nem muszaj ne menjen a max3002

'Led1
Config Portf.3 = Output
Led Alias Portf.3
Reset Led

'Led2
Config Portf.1 = Output
Led2 Alias Portf.1
Reset Led2

'Led3
'Config Portb.6 = Output
'Rx_led Alias Portb.6
'Reset Rx_led

'****************************** konfig vege *******************************

'**************************************************************************
'*********************************** SPI **********************************
'**************************************************************************

'RFM12B CS
Config Portc.7 = Output
Rfm12_cs Alias Portc.7
Set Rfm12_cs

'MOSI
Config Portb.2 = Output
Rfm12_sdi Alias Portb.2

'MISO
Config Portb.3 = Input
Rfm12_sdo Alias Pinb.3
Set Portb.3

'SCK
Config Portb.1 = Output
Rfm12_sck Alias Portb.1

'SS-nek meg kell mondani mi, különben nem fog menni az SPI.
Config Portb.0 = Output

'SPI busz konfigurálása, inicializálása
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit

'**************************************************************************
'******************************** SPI vege ********************************
'**************************************************************************

Print #1 , "SPI init megvolt"
'word for SPI Tx
Dim Spi_tx_wrd As Word
Dim Spi_tx_l As Byte At Spi_tx_wrd Overlay
Dim Spi_tx_h As Byte At Spi_tx_wrd + 1 Overlay

'word for SPI Rx
Dim Spi_rx_wrd As Word
Dim Spi_rx_l As Byte At Spi_rx_wrd Overlay
Dim Spi_rx_h As Byte At Spi_rx_wrd + 1 Overlay

Dim Rxindex As Byte
Dim I As Byte

Dim Rxbuf(39) As Byte
Dim Rxmsg As String * 39 At Rxbuf(1) Overlay

Dim Rxmsgflg As Bit


Config Int6 = Falling
On Int6 Isr_int0
Enable Int6

'######################################################


'Los gehts
Gosub Rfm12_init
Gosub Rfm12_restart_synchron

Enable Interrupts
   Spi_tx_wrd = 0
   Gosub Rfm12_spi_wrt



'######################################################
'###              Hauptschleife                     ###
'######################################################

Do
   'If A Message Is Ready Then Print It Out.
   If Rxmsgflg = 1 Then
    Rxmsgflg = 0
    Set Led
    Print Rxmsg
    Print #1 , Rxmsg
    Rxmsg = ""
   End If

   Reset Led
   'Toggle Led
   'Waitms 200
   'Toggle Led2
   'Waitms 200
   'Toggle Led2
   'Waitms 800
   'Toggle Led2
   'Waitms 300
   'Toggle Led2
   'Print "hallo welt"

   'any user code can be added here.
Loop



'######################################################
'###                ISR und Subs                    ###
'######################################################

Isr_int0:
Toggle Led                                                  'Kontroll LED ein während empfang
   Spi_tx_wrd = 0                                           'get status word from RFM12.
   Gosub Rfm12_spi_wrt
   If Spi_rx_wrd.15 = 1 Then                                'check FFIT bit in status word.
      Spi_tx_wrd = &HB000                                   'get Rx byte. will be in SPI_Rx_L
      Gosub Rfm12_spi_wrt

      If Rxindex < 39 Then Incr Rxindex                     'save byte in RxBuf() , don't over run array bounds.
      Rxbuf(rxindex) = Spi_rx_l

      If Spi_rx_l = 0 Then                                  'if last byte is 0 (null).message is ready
         Rxindex = 0
         Rxmsgflg = 1                                       'set message ready flg.
         Gosub Rfm12_restart_synchron
      End If
   Else                                                     'for any other interrupt just print the status word for now.
      Print Hex(spi_rx_wrd)
   End If
Toggle Led                                                  'Kontroll LED aus nach empfang
Return

Rfm12_spi_wrt:                                              'Send word (SPI_Tx_wrd) to RFM12.Also receive word (SPI_Rx_wrd).
   Reset Rfm12_cs                                           'RFM12 Chip select
   Spi_rx_h = Spimove(spi_tx_h)                             'send hi byte.
   Spi_rx_l = Spimove(spi_tx_l)                             'send lo byte.
   Set Rfm12_cs                                             'deselect chip.
Return

Rfm12_restart_synchron:
   Spi_tx_wrd = &HCA81
   Gosub Rfm12_spi_wrt
   Spi_tx_wrd = &HCA83
   Gosub Rfm12_spi_wrt
Return

Rfm12_init:                                                 'Initialize RFM12
   Restore Init_data
   For I = 1 To 14
      Read Spi_tx_wrd
      Gosub Rfm12_spi_wrt                                   'send init data to RFM12.
      Waitms 30
   Next
Return

Init_data:
Data &H80E7% , &H8298% , &HA67C% , &HC61F% , &H9460% , &HC2AC% , &HCA81%
Data &HCED4% , &HC483% , &H9850% , &HCC67% , &HE000% , &HC800% , &HC040%
Válasz küldése