mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM 12, Bascom und Interrupts


Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich sitze hier nun schon seit Wochen an diesem Problem. Das einzige was 
ich versuche ist den Empfang des RFM12-Moduls mit Bascom über einen 
Interrupt zu steuern. Vorweg mal meinen Code:
$regfile "m32def.dat"

$crystal = 8000000

$hwstack = 100                                              ' default use 32 for the hardware stack
$swstack = 100                                              'default use 10 for the SW stack
$framesize = 100

$baud = 19200
Baud = 19200

Print "Start..."

Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2                                         
Cursor Off

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

Spiinit


Config Int0 = Rising
Enable Int0
On Int0 Isr_von_int0

Config Timer2 = Timer , Prescale = 8                        'Zum erkennen von Fehlern während der Funkübertragung: Evtl. endlosschleife --> vermeiden
On Ovf2 On_ovf0
Enable Ovf2

Stop Timer2

'#################################################
'Ports
'#################################################
Rck Alias Porta.3                                           
Sck Alias Portc.0                                           
Si Alias Porta.2

Config Portb.0 = Input
Config Portb.2 = Input
Config Portb.3 = Input
Config Portd.3 = Input
Config Portd.2 = Input
Config Portb.1 = Input
Config Portd.7 = Output
Config Portd.5 = Output


Portb.0 = 1
Portb.2 = 1
Portb.3 = 1
Portd.3 = 1
Portd.2 = 0
Portb.1 = 1


Schalter2 Alias Pinb.0
Taster1 Alias Pinb.1
Taster2 Alias Pinb.3
Taster3 Alias Pinb.2
Beleuchtung Alias Portd.5

Led1 Alias Portd.7

'---Funkboard---
Spi_cs Alias Portb.4                                        ' SS-Pin
Spi_sdo Alias Pinb.6

Config Spi_cs = Output

Set Spi_cs

'#################################################
'Variablen
'#################################################

Const Rf12freq = 433.92
Const Rf12baud = 19200
Const Maxchar = 32

Dim Temps(9) As Byte
Dim Led(9) As Byte
Dim Wert As Byte

Dim Temp As Word

Dim Gedruckt(3) As Byte

'Funkmodul:
Dim I As Word
Dim Count As Byte
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay

Dim S As String * 10

Dim Tmr_zahler As Word
Dim Abbrechen As Bit

Dim Empf_flag As Bit

'#################################################
'Declares
'#################################################


Declare Sub Rf12_init
Declare Function Rf12_trans(byval Wert As Word) As Word
Declare Sub Rf12_setfreq(byval Freq As Single)
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
Declare Sub Rf12_setbaud(byval Rfbaud As Long)
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
Declare Sub Rf12_ready
Declare Sub Rf12_readys
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata_s(byval Maxchar As Byte)


Declare Sub Empfang_starten
Declare Sub Empfang_abbrechen

'#################################################
'Main-Loop
'#################################################



Waitms 100

Beleuchtung = 1

Cls


Locate 1 , 1
Lcd "Herzlich"
Locate 2 , 1
Lcd "Willkommen!"

Waitms 100

Cls

Locate 1 , 1
Lcd "Booting.."
Locate 2 , 1

Waitms 200

Config Watchdog = 2048
Start Watchdog

Locate 2 , 1
Lcd "1/5"
Call Rf12_init                                              ' ein paar Register setzen (z.B. CLK auf 10MHz)
Waitms 50

Locate 2 , 1
Lcd "2/5"
Call Rf12_setfreq(rf12freq)

Locate 2 , 1                                                '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
Lcd "3/5"
Call Rf12_setbandwith(4 , 1 , 4)                            '  200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm

Locate 2 , 1
Lcd "4/5"

Locate 2 , 1
Call Rf12_setbaud(rf12baud)                                 '  19200 baud
Lcd "5/5"
Call Rf12_setpower(0 , 6)                                   '  1mW Ausgangangsleistung, 120kHz Frequenzshift

Stop Watchdog

Cls


Print "Vor 1. Empfangen"

Call Rf12_rxdata_s(maxchar) 'ohne diese Zeile geht irgendwie gar nichts

Print "Empfangen!"

Enable Interrupts



Main:
Do

If Empf_flag = 1 Then

   Empf_flag = 0
   Call Rf12_rxdata(maxchar)
   For Count = 1 To Maxchar
      Print Chr(rfdata(count)) ; "-";
   Next Count
   Toggle Led1

End If

Loop
'-------------------------------------------------


'--------------------------------------
'---Funkmodul---
'--------------------------------------

Sub Rf12_init:
  Temp = Rf12_trans(&Hc0e0)
  Temp = Rf12_trans(&H80d7)
  Temp = Rf12_trans(&Hc2ab)
  Temp = Rf12_trans(&Hca81)
  Temp = Rf12_trans(&He000)
  Temp = Rf12_trans(&Hc800)
  Temp = Rf12_trans(&Hc4f7)
End Sub


Sub Rf12_setfreq(byval Freq As Single)

  Freq = Freq - 430.00
  Temp = Freq / 0.0025
  If Temp < 96 Then
    Temp = 96
  Elseif Temp > 3903 Then
    Temp = 3903
  End If
  Temp = Temp + &HA000
  Temp = Rf12_trans(temp)
End Sub


Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
  Drssi = Drssi And 7
  Gain = Gain And 3
  Temp = Bandwith And 7
  Shift Temp , Left , 2
  Temp = Temp + Gain
  Shift Temp , Left , 3
  Temp = Temp + Drssi
  Temp = Temp + &H9400
  Temp = Rf12_trans(temp)
End Sub


Sub Rf12_setbaud(byval Rfbaud As Long )
  Local Ltemp As Long

  If Rfbaud < 663 Then Exit Sub

  If Rfbaud < 5400 Then
    Temp = 43104 / Rfbaud
    Temp = Temp + &HC680
  Else
    Ltemp = 344828 / Rfbaud
    Temp = Ltemp
    Temp = Temp + &HC600
  End If
  Decr Temp
  Temp = Rf12_trans(temp)
End Sub


Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
  Outpower = Outpower And 7
  Temp = Fskmod And 15
  Shift Temp , Left , 4
  Temp = Temp + Outpower
  Temp = Temp + &H9800
  Temp = Rf12_trans(temp)
End Sub


Sub Rf12_txdata(byval Maxchar As Byte)
  Temp = Rf12_trans(&H8238)
  Rf12_ready
  Temp = Rf12_trans(&Hb8aa)
  Rf12_ready
  Temp = Rf12_trans(&Hb8aa)
  Rf12_ready
  Temp = Rf12_trans(&Hb8aa)
  Rf12_ready
  Temp = Rf12_trans(&Hb82d)
  Rf12_ready
  Temp = Rf12_trans(&Hb8d4)
  Rf12_ready
  For Count = 1 To Maxchar
    Rf12_ready
    Temp = &HB800 + Rfdata(count)
    Temp = Rf12_trans(temp)
  Next Count
  Rf12_ready
  Temp = Rf12_trans(&H8208)
End Sub


Sub Rf12_rxdata(byval Maxchar As Byte)

  Gosub Empfang_starten
  Temp = Rf12_trans(&H82c8)
  Temp = Rf12_trans(&Hca81)
  Temp = Rf12_trans(&Hca83)
  For Count = 1 To Maxchar

    Temp = Rf12_trans(&Hb000)
    Rfdata(count) = Temp
    Rf12_ready
  Next Count
  Temp = Rf12_trans(&H8208)
  Gosub Empfang_abbrechen

End Sub

Sub Rf12_rxdata_s(byval Maxchar As Byte)                    'Besonderes Empfangen: Nur am Anfang

  Temp = Rf12_trans(&H82c8)
  Temp = Rf12_trans(&Hca81)
  Temp = Rf12_trans(&Hca83)
  For Count = 1 To Maxchar
    Temp = Rf12_trans(&Hb000)
    Rfdata(count) = Temp
    Rf12_readys
  Next Count
  Temp = Rf12_trans(&H8208)

End Sub



Function Rf12_trans(byval Wert As Word) As Word
  Local Lowbyte As Byte
  Local Highbyte As Byte

  Lowbyte = Wert And 255
  Shift Wert , Right , 8
  Reset Spi_cs

  Highbyte = Spimove(wert)
  Lowbyte = Spimove(lowbyte)
  Set Spi_cs

  Temp = Highbyte * 256
  Temp = Temp + Lowbyte
  Rf12_trans = Temp
End Function

Sub Rf12_readys
   I = 0
  Reset Spi_cs
  While Spi_sdo = 0
  Incr I
  If I = 10000 Then
      I = 0
      Exit While
  End If
  Wend
End Sub


Sub Rf12_ready
  Reset Spi_cs
  While Spi_sdo = 0
  If Abbrechen = 1 Then
      Temp = Rf12_trans(&H8208)
      Abbrechen = 0
      Goto Main
      Enable Int0
  End If
  Wend
End Sub

Sub Empfang_starten
   Start Timer2
   Abbrechen = 0
   'Print "E"

End Sub

Sub Empfang_abbrechen

   Stop Timer2

End Sub



'-------------------------------------------------------------------------------
'---Empfangen-------------------------------------------------------------------
'-------------------------------------------------------------------------------


Isr_von_int0:
   'Disable Interrupts

   Empf_flag = 1
   Goto Main
   'Print "!"

   'Enable Interrupts
Return

On_ovf0:

   Incr Tmr_zahler

   If Tmr_zahler = 7000 Then

      Tmr_zahler = 0
      Abbrechen = 1
      Stop Timer2

      Print "AB"

   End If

Return


Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach jetzt hab ich schon abgesendet -.-

Naja das Problem besteht darin, dass es nur einmal zum Empfang kommt. Es 
liegt nahe das die Empfangsroutine nicht hinterherkommt, aber das 
Problem kann ich schlecht beheben, da der Sender nur im 2 Sekundentakt 
sendet..

Wenn man den Status des FFIT-Pins beobachtet, sieht man folgendes: Beim 
ersten Mal geht der Pin kurz hoch dann wieder runter dann bleibt er 
dauerhaft  auf High..

Ich hoffe ihr könnt den Code mal genauer untersuchen und vielleicht 
einen Fehler finden!

Wolfgang

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.