PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rfm12 ausgabestring verarbeiten



bastian07
18.09.2007, 13:17
Guten Morgen,
habe das Funkmodul rfm12 von Pollin und mit hilfe des Sourcecodes von Picht (http://home.arcor.de/dirk.milewski/RFM12/rf12Tranceiver.bas) erfolgreich eine Funkstrecke ans Laufen gebracht meine einzige abänderungen waren Maxchar, weil ich soviele Zeichen einfach nicht brauche, da ich hauptsächlich Befehle übertragen möchte und die Bindestriche in der Ausgabe habe ich entfernt.
Nun meine Frage auf dem Terminal erscheint halt der Text mit dem Befehel "Print Chr(rfdat(count)) ;" . Ich gehe also davon aus das der Character für Character an das Terminal übergibt oder? Nun mein Problem ich muss den String ja irgendwie so ändern das ich damit weiter arbeiten kann, sprich in If Bedingungen vergleichen kann etc.
Aber ich komm einfach nicht weiter. Aus den meisten String Funktionen wie mid usw. resultiert ja auch immer ein String und bringt mich nicht weiter.

Durch die Suche bin ich leider auch nciht zu einem Ergebniss gekommen.

Im Vorraus vielen Danke

Hier noch der Relevante Code:




Sub Empfangen
' Print "Empfange"
Call Rf12_rxdata(maxchar)
For Count = 1 To Maxchar
Print Chr(rfdata(count)) ;
Next Count
Print
Goto Zuruck
End Sub

bastian07
22.09.2007, 08:17
Kann mir denn keiner Helfen oder zumindest nen Tipp geben in welche richtung ich gehen muss. Komm sonst echt nicht weiter.
Bitte helft mir !

Picht
23.09.2007, 13:28
Hallo Bastian 07,

na gut ich antworte mal.

ich nehme mal an mein Master-Slave "Modell" hilft Dir auch nicht
weiter.

Welchen String willst Du denn vergleichen?

Wigbert

bastian07
23.09.2007, 14:12
Danke ! =)
Muss klar dazu sagen das ich kein Profi bin aber ich bin selber auf eine Lösungsansatz gestoßen.
(1):
Im endeffekt will ich ja nen Befehl über das rfm12 Modul vom Computer aus zu meinem Robotor senden und umgekehrt Infos vom Robotor zum Computer senden. Die Boards dafür hab ich alle fertig.
Das hier ist ja die Ausgabe Routine:


Sub Empfangen
' Print "Empfange"
Call Rf12_rxdata(maxchar)
For Count = 1 To Maxchar
' Print Chr(rfdata(count)) ;
A$ = Chr(rfdata(count)) ;
If A$ = "b" Then
Print "hallo"
End If

Normal gibt der ja zeichen für zeichen aus und da wusste ich nicht direkt weiter und wie man oben sehen kann hab ich als Lösung halt anstatt das ganze mit dem Print-befehl auszugeben einfach in einen String geschrieben den ich dann weiter verarbeitet. Funktioniert auch alles soweit sobald in dem gesendeten Wort ein "b" enthalten ist gibt der ans Terminal "hallo" aus. Das ganze soll dann noch ein kleines Protokoll kriegen, Sprich Startzeichen, Stopzeichen etc.
Scheint mir doch ne gute Lösung zu sein oder gibts da bessere?

(2):
Und ein weiteres Problem das eine Board (main_board_Robo) klappt in beide Richtungen nur das andere (schnitstelle_computer) kann nur emfganen und wenn ich senden will bleibt der immer in


Sub Rf12_readys 'ready Senden
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub

hängen und geht nicht weiter. Ich kann im Schaltplan, sowohl auf der Platine keinen Fehler sehen vielleicht sieht ja jemand anders den Fehler, manchmal sieht man ja den Wald vor lauter Bäumen nicht mehr.

Schönen Danke und schönen Gruß

Sebastian

Picht
23.09.2007, 14:36
Hi,
hast Du ein Oszi, der SS Pin muss auf Hi gehen,
(String im Buffer vorhanden)

Wigbert

bastian07
23.09.2007, 15:29
hatte eben vergessen die Schaltüläne anzuhängen.
Wenn ich das ans Oszi hänge und dem Board saft gebe hab ich kurz 5 V und dann nicht mehr weil der hier bei dem ersten print "stop1" hängen bleibt also kein print "Stop2" mehr ausgibt:


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

Daraus folger ich das das irgendwas mit der Routine:


Sub Rf12_readys 'ready Senden
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub

zu tuen haben muss sprich mit dem MISO pin, da wenn ich mit dem dipschalter(siehe schaltplan) die Leitung unterbreche, gibt der fortlaufend "Stop1" und "stop2" aus. der bleibt ja so lange in der schleife wie auf dem pin GND liegt. bei unterbrochener Leitung ist auf dem MISO pin allerdings +5V.
Bin am verzweifeln.

gruß Sebastian

Picht
23.09.2007, 20:42
Hi,

es würde hilfreich sein, den ganzen Code zu haben,
dann könnte ich ihn bei mir aufspielen, um Codeprobleme
auszuschliessen.
Die Schaltungen sehe ich mir an.

Wigbert

Picht
23.09.2007, 21:00
Ich noch mal,

bei mir geht es von Subd.2 nach Tout
und Subd.3 nach Rin am Max 232
oder benutzt Du ein "Spezialkabel"?
Die Jumper 6 ist doch gesetzt?

Wigbert

bastian07
23.09.2007, 21:00
Das ist der Code, am Computer läuft ein atmega 8 und auf dem Roboter ein atmega32. Der Code ist derseleb nur jeweils mit kleinen abwandlungen.



' generated. Take care that the chip supports all fuse bytes.' ################################################## ######################
' ### RF12-Test in Bascom
' ### Basiert auf Code von Benedikt K.
' ### Joachim Fossie Bär Reiter 04/2007
' ################################################## ######################


$regfile = "m8def.dat"
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40

'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.

$crystal = 11059200
$baud = 19200
Baud = 19200

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
Config Lcdbus = 4
Cursor Off Noblink
Cls




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_readys
Declare Sub Rf12_ready
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)

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

'config the SPI in master mode.The clock must be a quarter of the slave cpu
' Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1







' werden benötigt für rf12_ready
Spi_cs Alias Portb.2 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.4 ' MISO-PIN
Set Spi_cs

'init the spi pins
Spiinit

' was so gebraucht wird
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
Dim S As Byte
Dim A$ As String * 1
Dim A As Byte

Print "Init"
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Print "Set Frequenz"
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Print "Set Bandwith"
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Print "Set Baudrate"
Call Rf12_setbaud(rf12baud) ' 19200 baud
Print "Set Power"
Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift


' ################################################## ######################
' ###### Hauptproggi
' ################################################## ######################

Portd.7 = 1
Text = "bt"

' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
Do 'Ewigschleife



' Hier ist die Senderoutine
' Print "Sende"
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd Text


Call Rf12_txdata(maxchar) 'senden

Wait 1



' Hier ist die Empfangsroutine
' Print "Empfange"
' Call Rf12_rxdata(maxchar)
' For Count = 1 To Maxchar
' A$ = Chr(rfdata(count)) ;
' If A$ = "e" Then
' A$ = ""
' Print "a"
' End If
' Next Count
' Print
Schleife:

'Locate 2 , 1
'Lcd A$

Loop


End 'end program


' ################################################## ######################
' ###### Unterroutinen
' ################################################## ######################

Sub Rf12_init:
Waitms 150
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)
Print "stop1"
Rf12_readys
Print "stop2"
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb82d)
Rf12_readys
Temp = Rf12_trans(&Hb8d4)
Rf12_readys
For Count = 1 To Maxchar
Rf12_readys
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)

Next Count
Rf12_readys
Temp = Rf12_trans(&H8208)
End Sub


Sub Rf12_rxdata(byval Maxchar As Byte)
Temp = Rf12_trans(&H82c8)
Temp = Rf12_trans(&Hca81)
Temp = Rf12_trans(&Hca83)
For Count = 1 To Maxchar
Rf12_ready
Temp = Rf12_trans(&Hb000)
Rfdata(count) = Temp
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
Reset Spi_cs
nop
While Spi_sdo = 0
Wend
End Sub

Sub Rf12_ready 'ready Empfangen
Reset Spi_cs
While Spi_sdo = 0
If Len(s) > 0 Then 'Wenn ein string eingelesen
Temp = Rf12_trans(&Hca81) 'Fifo deaktivieren
Temp = Rf12_trans(&H8208) 'Empf. ausschalten
Goto Schleife 'Springe zum hauptprogramm
Else 'sonst warte weiter auf Empfangsdaten
Wend
End If
End Sub

bastian07
23.09.2007, 21:24
Zum max 232 da haste recht da hab ich dummerweise ein Fehler im Layout der platine habs aber wieder vertauscht, sodas es wieder standart ist. Die kommunikation max232-->Terminal programm funktioniert in beide richtungen einwanfrei. Der Jumper ist gesetzt ja hab ich auch schon kontrolliert.

Gruß
Sebastian

Picht
23.09.2007, 21:34
Bastian 07,
auf den ersten Blick fällt mir auf , das Du gar kein String einliest.
Das Prinzip war, das erst nach einlesen eines Strings durch den
Interrupt auf Senden gegangen wird. Den Interrupt vermisse ich.

' ################################################## ###############
' ######## String einlesen durch Interrupt
' ################################################## ###############

Onrxd:
S = S + Chr(udr) + Chr(170)
Return

Wigbert

bastian07
23.09.2007, 21:53
Das wär dann der nächste schritt. Momentan möchte ich erstmal die grundlegende funktionalität sicherstellen.
Also das Board sollte mit dem Code unabhängikeit vom Computer immer wieder "bt" senden. Der nächste Scjritt ist dann die übergabe des Sendestrings durch den Computer.

sebastian

Picht
23.09.2007, 22:00
Bastian 07,

in der Sim läuft der Code ordentlich.
Habe Maxchar testweise auf 4 reduziert und lasse das Display am Ende der Schleife löschen.

Software sieht gut aus.

Werde morgen den Code auf mein m8 aufspielen.

Brauche die Position der Jumper noch.

Wigbert

bastian07
23.09.2007, 22:05
Das wär natürlich klasse
J5 und J6 sind gesetzt.

schönen Abend noch
Sebastian

Picht
24.09.2007, 19:35
Hallo Bastian 07,

der Code läuft auf mein m8 anstandslos.
Anbei mal mit meinen Veränderungen



$regfile = "m8def.dat"
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40

'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.

$crystal = 11059200 'wurde mit 10 MHz von rfm12 getestet
$baud = 19200
Baud = 19200

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
Config Lcdbus = 4
Cursor Off Noblink
Cls




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_readys
Declare Sub Rf12_ready
Declare Sub Rf12_txdata(byval Maxchar As Byte)
Declare Sub Rf12_rxdata(byval Maxchar As Byte)

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

'config the SPI in master mode.The clock must be a quarter of the slave cpu
' Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1







' werden benötigt für rf12_ready
Spi_cs Alias Portb.2 ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.4 ' MISO-PIN
Set Spi_cs

'init the spi pins
Spiinit

' was so gebraucht wird
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay
Dim S As Byte
Dim A$ As String * 1
Dim A As Byte

Print "Init"
Call Rf12_init ' ein paar Register setzen (z.B. CLK auf 10MHz)
Print "Set Frequenz"
Call Rf12_setfreq(rf12freq) ' Sende/Empfangsfrequenz auf 433,92MHz einstellen
Print "Set Bandwith"
Call Rf12_setbandwith(4 , 1 , 4) ' 200kHz Bandbreite, -6dB Verstärkung, DRSSI threshold: -79dBm
Print "Set Baudrate"
Call Rf12_setbaud(rf12baud) ' 19200 baud
Print "Set Power"
Call Rf12_setpower(0 , 6) ' 1mW Ausgangangsleistung, 120kHz Frequenzshift


' ################################################## ######################
' ###### Hauptproggi
' ################################################## ######################

Portd.7 = 1
Text = "bt"

' Je nachdem ob Sender oder Empfänger die entsprechenden Zeilen aktivieren
Do 'Ewigschleife



' Hier ist die Senderoutine
' Print "Sende"
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd Text


Call Rf12_txdata(maxchar) 'senden

Wait 1



' Hier ist die Empfangsroutine
' Print "Empfange"
' Call Rf12_rxdata(maxchar)
' For Count = 1 To Maxchar
' A$ = Chr(rfdata(count)) ;
' If A$ = "e" Then
' A$ = ""
' Print "a"
' End If
' Next Count
' Print
Schleife:

'Locate 2 , 1
'Lcd A$
Cls
Loop


End 'end program


' ################################################## ######################
' ###### Unterroutinen
' ################################################## ######################

Sub Rf12_init:
Waitms 150
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)
'Print "stop1"
Rf12_readys
'Print "stop2"
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb8aa)
Rf12_readys
Temp = Rf12_trans(&Hb82d)
Rf12_readys
Temp = Rf12_trans(&Hb8d4)
Rf12_readys
For Count = 1 To Maxchar
Rf12_readys
Temp = &HB800 + Rfdata(count)
Temp = Rf12_trans(temp)
Print Chr(rfdata(count));
Next Count
Rf12_readys
Temp = Rf12_trans(&H8208)
End Sub


'Sub Rf12_rxdata(byval Maxchar As Byte)
' Temp = Rf12_trans(&H82c8)
' Temp = Rf12_trans(&Hca81)
'Temp = Rf12_trans(&Hca83)
'For Count = 1 To Maxchar
' Rf12_ready
' Temp = Rf12_trans(&Hb000)
' Rfdata(count) = Temp
'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
Reset Spi_cs
nop
While Spi_sdo = 0 'In Der Sim Auf 1 Setzen
Wend
End Sub

Sub Rf12_ready 'ready Empfangen
Reset Spi_cs
While Spi_sdo = 0
If Len(s) > 0 Then 'Wenn ein string eingelesen
Temp = Rf12_trans(&Hca81) 'Fifo deaktivieren
Temp = Rf12_trans(&H8208) 'Empf. ausschalten
Goto Schleife 'Springe zum hauptprogramm
Else 'sonst warte weiter auf Empfangsdaten
Wend
End If
End Sub

in meiner beigefügten Schaltung (anmelden) ist geschlossen:
JP 3 = SS-Pin
JP 6 = VCC
JP 8 = Int 1 , geht mit Dein Code ohne
JP11 = externer Takt

Der Resetpin wird bei mir nicht benutzt.

Wigbert

bastian07
24.09.2007, 20:40
Ich geh am Stock. Hab deinen veränderten Code so genommen und draufgespielt und siehe da funktioniert einwanfrei. Toll dacht ich. Dann hab ich meine empfänger hergerichtet und siehe da hab ein paar mal ein vernünftiges Signal übermittel und auf einmal ohne was am Code zu verändern bums geht er wieder nicht und bleibt an der gleichen stelle hängen das kann doch nicht wahr sein.
Naja trotzdem danke für deine Bemühungen. Bni jetzt erstmal die Woche in Paris und werd mich dann weiter damit auseinandersetzten und hier melden falls es klappt.

Gruß
Sebastian

Picht
24.09.2007, 20:57
kannst ja mal die Werte erhöhen,

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

aber ich glaube ehr an ein Wackelkontakt

Wigbert

bastian07
24.09.2007, 21:37
Also hab mal feste auf den Transceiver gedrückt und gerüttelt und gedreht und auch an den Einstellungen gedreht aber nix. Obgleich die einzi logische erklärung kann ja nur ein wackler irgendwie sein. hmmm

bastian07
24.09.2007, 21:58
Was mich ja auch wundert ist das das empfangen wunderbar funktioniert. Benutzt das rfm12 denn großartig andere Ports beim senden als beim empfangen doch nur den Miso bzw Mosi port oder ?

Picht
25.09.2007, 07:08
Duch den "getunten" Testcode könnte es sein, das die Stack überlaufen und nicht ordentlich gelöscht werden. Bei mir lief aber der Code 30 min
und nach einen Reset sollte er dann auch wieder laufen.

Die Einstellungen sollten richtig sein, sonst hätte ich Probleme.

Wenn ich mich richtig erinnere, benutzt Du 6V Spannungsversorgung
warum?

Wigbert

-tomas-
25.09.2007, 09:25
Hallo Wigbert,

ich wollte Dir schon immer mal die Frage stellen, warum Du im Originalcode
http://home.arcor.de/dirk.milewski/RFM12/rf12Tranceiver.bas
schreibst:

Sub Empfangen
Print "Empfange"
Call Rf12_rxdata(maxchar)
For Count = 1 To Maxchar
Print Chr(rfdata(count)) ; "-";
Next Count
Print
Goto Zuruck
End Sub

beim Aufruf der Sub wird ein Call ausgeführt, der 2 Byte auf den STACK pusht. Da "Goto Zuruck" das RET umgeht, wird der Stackpointer nicht um 2 Byte wieder heruntergezählt
-> das führt unweigerlich zum Stacküberlauf!
Du hast den Fehler noch nicht bemerkt, da Du keine Variablen mit Dir herumschleppst...

Picht
25.09.2007, 12:13
Na ja,
etwas habe ich schon bemerkt, hatte einfach den Stack hochgesetzt.
Ich dachte bei Gosub müsse return.

Und wie lösche ich nun den Stack in meinen Bespiel ?

Wigbert

-tomas-
25.09.2007, 14:08
nicht den Stack manipulieren und es verschlimmbessern, sondern einfach die Struktur aufräumen.

Programmierregel Nummer Eins: "Verwende niemals nie GOTO!"

Anbei ungetesteter Code:

Do
S = ""
WHILE Len(s) < 3
Empfangen
WEND
Senden
Text = S
Loop


Sub Empfangen
Print "Empfange"
Call Rf12_rxdata(maxchar)
For Count = 1 To Maxchar
Print Chr(rfdata(count)) ; "-";
Next Count
Print
End Sub

Picht
25.09.2007, 14:33
Na ja das springen aus der Sub war mir sowieso nicht geheuer.
Mit einen Flag wäre das auch gegangen.

Dank Dir für die Hinweise.

Wigbert

bastian07
29.09.2007, 18:11
Abend
also bin wieder aus Paris zurück,
ist so das ich mit bei dem Bauteil vertippt hab. Benutze 5 V Spannungsversorgung.meint ihr also das liegt an dem Stack?
Aber müsste das nicht zumindest ne kleine weile laufen?

Bastian

Picht
29.09.2007, 18:16
eine Weile lief das Programm bei mir auch,
wenn der Stack voll wäre, muss das Programm nach Reset
wieder laufen

Wigbert

bastian07
29.09.2007, 18:30
Also geh ich jetzt einfach mal davon aus das das board einen Fehler hat. Den atmega hab ich auch schon ausgetauscht daran liegts nicht. Wenn ich das modul enkoppel (Über die dip schalter) dann liegt auf dem Miso pin (Der ja in verbindung mit der Rf12_readys steht) 0V an wenn ich das modul wieder verbinde liegt auf dem pin +5V kann es sein das das Modul kaputt ist?
gruß

Picht
29.09.2007, 18:44
ein Versuch hab ich noch

Leg mal zusätzlich
10 K Widerstand von SS an + 5V
(warum? war irgendwo mal im Forum beschrieben)

Wigbert

bastian07
29.09.2007, 18:59
Ne leider auch kein erfolg. Muss ich wohl mal ein neues Board machen. Oder meinste das das Modul irgendwie seinen Geist aufgegeben hat. Wobei kann auch schlecht sein weil es ja noch sendet.
Irgendwo muss der fehler ja bei dem Miso pin liegen..
Und auch seltsam das es ein paar mal geklappt hat.

Bastian

Picht
29.09.2007, 19:20
na ja , ein versuch war es wert,

Ic raus und Leiterbahn auf Durchgang prüfen, nachlöten
Brück mal den Jumper.

Ich löte deshalb den rfm 12 mit stiftleisten auf. rfm 12 tauschen

Wigbert

bastian07
29.09.2007, 19:25
Teste die geätzten Platinen grundsätzlich da war kein Feher und ich hab das rfm12 modul auch auf stiftleisten aber beim ersten Board musste ich die stiftleisten falschherum dranlöten und deswegen kann ich die nicht so einfach tauschen. Werde morgen mal das modul ablöten und nochmal messen meld mich dann nochmal

Danke

Bastian

Picht
29.09.2007, 19:55
nun Klugsch... liegt mir fern,

hab noch mal den MOSI Pin am Oszi gehangen.

Da sind irgendwelche Pegel drauf, und beim Senden zusätzlich
das Datenpaket, kaum zu erkennen, wie ein paar Morsezeichen.
Ich lass jetzt mal den Code Dudeln.

einen hätte ich doch noch

Bau mal das For I mit ein



Sub Rf12_ready
Local I As Word
Reset Spi_cs
For I = 1 To 65000
If Spi_sdo = 1 Then Exit For
Next
End Sub


Wigbert

bastian07
29.09.2007, 20:08
Das wollte ich garnicht sagen sorry falls das so rüber kam.
Aber defacto bleibt das Programm ja hängen während der Abfrage des MISO ports. oder wird sobald am SDI was ankommt der SDO port auf gnd gezogen ? Und das ist bei mir nicht der Fall.

Bastian

Picht
29.09.2007, 20:14
Hatte noch mal meine Antwort erweitert.

Der o.g. Code wurde eingefügt, weil die Schleife hängen blieb.
(Forum)

Dein Code sendet immer noch munter

Wigbert

bastian07
29.09.2007, 20:46
Das Programm bleibt zwar nicht mehr stehen aber er scheint trotzdem nicht zu senden. Leider kein Frequenzanalyzer zu Hand =). Aber mein empfänger müsste eigentlich klappen.
Zumindest hat er das zu Anfang.

Bastian

Picht
29.09.2007, 20:59
Wenn der Empfänger geht, so war es ja,

müsste eigentlich die Hardware ok sein , der Testcode sendet bei mir
immer noch, also ist die Software auch ok, auf Softwareveränderungen
reagiert das Ding auch. Und eine starke Strahlenquelle wird wohl nicht
in der Nähe sein.

Soll das wirklich eine "Montagsproduktion" sein?

Wigbert

bastian07
29.09.2007, 21:27
Habe es gerade nochmal getestet empfangen tut er wunderbar einwandfrei. Dann kann im grundegenommen auch kein Fehler im Board sein. Werde mir trotzdem das Board nochmal genauer anschauen und eventuell mal die Module umlöten das ist der einzigst logische Schritt der mir noch bleibt glaub ich !
Bastian

bastian07
29.09.2007, 21:50
Was ich mir auch noch vorstellen könnte is das die mir ausversehen einfach nur nen Transmitter geschickt haben. Würde einiges erklären. Die Pinbelegung ist ja die selbe

bastian07
30.09.2007, 11:59
Also heute morgen hab ich eine Kuriose entdeckung gemacht:
Habe bisschen am Board rumgespielt aber nix verändert außer den Reset Jumper entfernt. Dann hab ich auf den mega8 nochmal die Software neu draufgespielt und vergessen den Programmieradapter abzuziehen und siehe da es funktioniert. konnte das board abschalten und wieder an und es funktioniert dann hab ich den Adapter abegzogen und kurz hat es auch noch nach 1, 2 mal reseten geklappt und danach nicht mehr dann den Adapter wieder dran und es ging nicht erst nachdem ich erneut programmiert hatte. Aber dann hab ich länger zeit den Adapter entfernt und auch den strom aus gelassen und jetzt gehts wieder nicht mehr. Ich denke da is irgendwas am Board Faul und ich werd heut mal schnell ein neues machen.

Bastian

Picht
30.09.2007, 15:29
Hatte ich nicht schon mal erwähnt das bei mir der
rfm 12 Resetpin nicht beschaltet ist?

Also resetpin offen lassen , Programm laden und....?


Wigbert

bastian07
30.09.2007, 15:42
Trotzdem nichts hatte ich ja auch schon alles getestet. =( Das Board ist gleich fertig dann berichte ich nochmal !

Picht
30.09.2007, 15:50
Interessanter Fehler,

bin mal gespannt

Übrigens den Code hab ich bis Mitternacht, also mehrehre Stunden
anstandslos laufen lassen.

Wigbert

bastian07
30.09.2007, 15:53
Gut gut also den Code können wir definitiv ausschließen. Hattest du das mit dem Stacküberlauf denn noch geändert?

Picht
30.09.2007, 16:17
nein,
bin noch nicht zu gekommen

ich hatte den gemeinten Code nur zum schnellen Testen beider Funktionen
entworfen. Na gut ändern werd ich ihn doch noch mal.

Wigbert

bastian07
30.09.2007, 19:49
So.. Board neu entworfen und geätzt und siehe da es geht nicht =)
Also soweit läufts:
Wenn ich das Programm neu aufspiele und den Prog.-adapter ran lasse sendet das ding wunderbar. Zieh ich den Stecker ab sendet er auch wunderbar. Nun unterbrech ich den Strom kurz ohne das der Prog.-adapter drauf ist sendet er immer noch (Ich denke der Kondensator wird nicht voll entladen). Lass ich länger den Strom weg sendet er nicht mehr. Lass ich bei der ganzen Prozedur die ganze Zeit den Prog.-adapter drauf kann ich dem Board auch längere Zeit den strom abdrehen und nach dem widereinschalten gehts alles. Es scheint als würde er etwas saft aus dem Prog.-adapter kriegen. Wenn das Board nicht mehr sendet (Nach strom abschaltung ohne Prog.-adapter) Muss ich das Programm auf Empfang umschalten auf den Mega8 übertragen einmal anschalten dann das Programm wider auf Senden umschreiben erneut aufspielen und es funktioniert wieder. --> Sobald das Board also keinen Strom mehr hat (Egal aus welcher Quelle) verändert sich irgendwas und es funktioniert nicht mehr es sei denn der Code wird, wie oben beschrieben, neu aufgespielt. Da gibts also in der Empfangsroutine irgendwas was das Senden wieder "freischaltet".

Was sagst du dazu? =)

gruß Bastian

***editiert***

habe jetzt mal
Temp = Rf12_trans(&Hca81) 'Fifo deaktivieren
Temp = Rf12_trans(&H8208) 'Empf. ausschalten
Temp = Rf12_trans(&H82c8)
Temp = Rf12_trans(&Hca83)
vor die Hauptschleife gesetzt, weil das macht der ja in der Empfangsroutine und siehe da wenn ich strom lange weg nehme und wieder anschließe passiert wieder nix aber sobald ich dann einen hardware reset durchführe sendet er.