- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: RFM12 mit ATMEGA32 - Interrupt problem

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578

    RFM12 mit ATMEGA32 - Interrupt problem

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Leute,

    ich habe wieder mal ein Problem:
    Für mein derzeitiges Projekt (ein Roboter mit 2 Motoren) wollte ich eine Kommunikation zwischen PC und dem Robi über zwei RFM12 funkmodule herstellen. Das Senden und Empfangen funktioniert mit beiden Modulen problemlos! Damit die µC nicht immer warten müssen, bis etwas "reingeflogen" kommt, wollte ich einen Interrupt auslösen lassen! Dazu habe ich den FFIT-Pin auf INT0 beim Mega32 gelegt. Das funktioniert auch, das überprüfe ich, indem ich eine LED in der ISR toggeln lasse. Wenn ich jetzt aber in der ISR die Daten holen möchte, bleibt das Programm irgendwo hängen Hier mal mein Code eines µC:

    Code:
    ' ###################################################################################################
    ' ### 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                                                                                                  ###
    ' ### weiterentwickelt von:                                                                                                              ###
    ' ### Wigbert Picht 18.06.                                                                                                               ###
    ' ### Stringkennung 24.08                                                                                                                ###
    ' ### Hardware siehe Pollinboard                                                                                                         ###
    ' ############################################################################################################
    ' ###                                                                                                                                    ###
    ' ###              RFM12 Master                                                                                                          ###
    ' ###            ---------------                                                                                                         ###
    ' ##########################################################################################################################################
    $regfile = "m32def.dat"
    $hwstack = 100                                              ' default use 32 for the hardware stack
    $swstack = 100                                              'default use 10 for the SW stack
    $framesize = 100
    
    '$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
    
    $crystal = 16000000                                         'Hier Dein Quarz
    $baud = 19200
    Baud = 19200
    
    
    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_txdata(byval Maxchar As Byte)
    Declare Sub Rf12_rxdata(byval Maxchar As Byte)
    Declare Sub Sendetext
    
    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.4
    Config Spi_cs = Output
    Spi_sdo Alias Pinb.6
    Set Spi_cs
    
    'init the spi pins
    Spiinit
    
    ' was so gebraucht wird
    ' Kennung
    Dim Count As Byte
    Dim Temp As Word
    Dim Rfdata(32) As Byte
    Dim Text As String * Maxchar At Rfdata Overlay
    Dim Laenge As Byte
    Dim Lean As Byte
    Dim La As Byte
    Dim L As Byte
    Dim C As Byte
    Dim Empf_wait As Byte
    Dim Rufzeichen As String * 32
    Dim Sendedata As String * 32
    Dim Ruf As String * 32
    
    Config Portc.7 = Output
    Portc.7 = 1
    
    
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5
    Config Lcdbus = 4
    Initlcd
    Cls
    Cursor On Blink
    
    
    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"                                           '  1mW Ausgangangsleistung, 120kHz Frequenzshift
    Call Rf12_setpower(0 , 6)
    
    Config Pind.2 = Input
    Portd.2 = 0
    
    Config Int0 = Rising
    Enable Int0
    On Int0 Isr_von_int2
    
    Enable Interrupts
    ' ########################################################################
    ' ###### Hauptproggi  ####################################################
    ' ########################################################################
    
    '  Rufzeichen
    
      Rufzeichen = "00000000"                   
    
    ' #########################################################################
    
      Sendetext                                     
                                                     
    ' #########################################################################
    
    
    
    
    Do
    
    
    Call Rf12_rxdata(maxchar)
    If Text = "Hallo" Then
    Text = "return"
    Call Rf12_txdata(maxchar)
    Text = ""
    Else
    Text = "wrong"
    Call Rf12_txdata(maxchar)
    Text = ""
    End If
    
    
    Loop
    
    
    End                                          
    
    
    ' ########################################################################
    ' ###### 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 Sendetext                                               'Aufbereitung des Text="Teststring"
     Sendedata = Rufzeichen                                     'welcher String gebraucht wird
     Laenge = Len(sendedata)
     Lean = Laenge + 3
     La = Laenge + 52                                           '50 Bei Empfänger subtrahieren-um bei Print Steuerzeichen zu umgehen
     Ruf = Chr(la) + Sendedata
     C = Checksum(ruf)
     Text = Ruf + Chr(c)
     Text = Text + " "
    'Print Text                                                  'Testprint
    'Print L ; Sendedata ; C;                                    'Testprint
    End Sub
    '##########################
    Sub Rf12_txdata(byval Maxchar As Byte)
      'Disable Interrupts
      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 Lean                                     'Veriable Länge duch Stringberechnung
      'For Count = 1 To Maxchar
        Rf12_ready                                              'hier kann das gesendete Datenpaket eingesehen werden
        'Print Rfdata(count) ; "-";
        Temp = &HB800 + Rfdata(count)
        Temp = Rf12_trans(temp)
      Next Count
      Rf12_ready
      Temp = Rf12_trans(&H8208)
      'Enable Interrupts
    End Sub
    
    
    Sub Rf12_rxdata(byval Maxchar As Byte)
      'Disable Interrupts
      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)
      'Enable Interrupts
    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_ready
      Reset Spi_cs
      While Spi_sdo = 0                                         'In der Sim. auf 1 stellen
      Wend
    End Sub
    
    '###############################################################################
    
    Isr_von_int2:
    Set Flag
    Toggle Portc.7
    Return
    So funktioniert es noch! Wenn ich jetzt aber diesen Code in die ISR von INT0 (Hier falscher name, aber kein problem) schreibe, dann bleibt der µC hängen:

    Code:
    Call Rf12_rxdata(maxchar)
    If Text = "Hallo" Then
    Text = "return"
    Call Rf12_txdata(maxchar)
    Text = ""
    Else
    Text = "wrong"
    Call Rf12_txdata(maxchar)
    Text = ""
    End If
    Kann es sein, dass die SPI in der ISR deaktiviert wird??
    Was muss ich machen, damit es auch funktioniert, wenn diese Text-Passage auch in der ISR funktioniert?!

    Was macht eigentlich die Sub Sendetext? Also kann ich mit ihr etwas senden?
    Muss man eigentlich so senden, wie ich es mache, also:

    Code:
    Text = "......"
    Call RF12_txdata(maxchar)
    Text = ""
    oder geht es auch einfacher?


    Gruß
    Chris

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Kann mir den niemand helfen?!
    Das ganze ist echt wichtig und ich habe momentan ein kleines Zeitproblem
    Bitte schreibt irgendwas (*verzweifel*)... mir genügt auch schon ein "Was meinst du damit jetzt? Ich verstehe deine Frage nicht!" , etc.....

    Gruß
    Chris

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Kann sein, dass deine Interrupst-Routine zu lang ist und während der Abarbeitung bereits ein neuer kommt. Am besten nur ein Flag im Interrupt setzen und dieses in der Hauptschleife abfragen und dann zum Empfangen übergehen. Oder halt als erstes den Int0 disablen und am Ende der Routine wieder enablen.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo peterfido,

    erstmal danke für deine Antwort!
    Jedoch habe ich beides schon ausprobiert, aber ohne Erfolg! Das hätte ich vielleicht in meinem ersten Post noch erwähnen sollen!!

    Welchen Pin soll ich den jetzt überhaupt benutzen? FFIT oder nIRQ?
    Was ich auch noch sagen sollte ist, dass wenn ich in der ISR den Teil aus der Hauptschleife einfüge, die LED dann nicht mehr getoggelt wird!

    Gruß
    Chris

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Ich würde sagen, dass der INT immer weiter ausgelöst wird, denn der Zustand verschwindet erst nach dem Auslesen des RFM, oder?
    Also als 1. in der ISR den INT ausschalten und dann als letztes, bzw. nach dem Auslesen der Daten, wieder anschalten.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo stefan_Z,

    danke für deine Antwort, aber das habe ich schon ausprobiert (steht glaube ich auch oben)!

    Hat jemand sowas vielleicht schon am laufen??

    Gruß
    Chris

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hat den keiner eine Idee??
    Oder hat jemand das selbst schon am laufen??

    Gruß
    Chris

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo Leute,

    bitte helft mir! Das ganze ist sehr wichtig, ich muss das bis zum 15. Juli am laufen haben, den da muss ich das projekt in der Schule vorstellen! Und ich habe noch andere Probleme, welche ich erst lösen kann, wenn dieses gelöst ist! Es wäre wirklich toll, wenn jemand eine Idee hätte?!

    Es ginge auch, wenn ich das RFM12 an einen ATTiny2313 anschließen könnte, allerdings passt da der Code nicht drauf
    Mit dem könnte ich dann empfangen, das empfange unverarbeitet an den ATMega32 (Hauptcontroller) weitersenden und dort verarbeiten. Der ATTiny2313 müsste dann nurnoch das empfange zurücksenden, um sicherzugehen, dass alles richtig empfangen wurde... Hat jemand vielleicht dafür einen Code?

    Gruß
    Chris

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Sonst schau dir mal bei Elektor das Projekt mit den RFM12 aus der Januarausgabe an!
    Wenn du dich bei Elektor.de einloggst, kasst du den source laden.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hallo stefan_Z,

    danke für deine Antwort, allerdings kannte ich den Code schon.

    Er beantwortet leider keine meiner Fragen, weder die Frage nach einem Code für den ATTina2313 noch die Frage, welchen Anschluss ich für einen Interrupt verwenden muss!

    Gruß
    Chris

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress