- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 3 von 3

Thema: TWI Multimaster Problem

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.01.2005
    Ort
    hessen
    Alter
    35
    Beiträge
    1.101

    TWI Multimaster Problem

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    probiere seit einigen Tagen den Twi Bus aus, hat bis her auch alles wunderbar funktioniert.

    Jetze wollte ich mal das fertige Multimaster Konzept von PicNick ausprobieren, da bringt mir Bascom diesen Fehler:

    "Unkown Interrupt(TWI)" bezogen ist das auf diese Zeile => "On Twi Twi_mst_slv_isr , Nosave"

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    $include "MyTWI.bas"
    
    $baud = 19200
    
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    
    Const Tmr_c_prescale = 64
    Const Tmr_c_preload = 131
    Const Tmr_c_divis = 250
    
    Declare Sub Twi_show_state(byref State As Byte)
    
    
    
    '-------------------------------------------------
    '  lokale I2C Adresse   (als Slave)
    '-------------------------------------------------
    Const Mn1_adr = &H6A
    
    '-------------------------------------------------
    '  fremde I2C Adresse   (als Master)
    '-------------------------------------------------
    Const Mn2_adr = &H6E
    
    
    Dim Slv_byte As Byte                                        'sende Byte (irgendwas)
    
    Dim Twi_mst_buff(24) As Byte                                'Buffer für Masterfunktionen
    Dim Twi_slv_buff(24) As Byte                                'Buffer für Slavefunktionen
    
    '-------------------------------------------------
    Config Timer0 = Timer , Prescale = Tmr_c_prescale           'Timer 1mS
    On Timer0 Interrupt_ticker                                  ' Timer for Timer Queue
    
    Dim Timeout As Byte
    Dim Timediv As Word
    '-------------------------------------------------
    
    
    Dim Temp As Byte
    
    
          Twi_slv_addr = Mn1_adr                                'lokale I2C-Adresse
          Twi_sr_data = Varptr(twi_slv_buff(1))                 'datenbuffer empfang
          Twi_st_data = Varptr(twi_slv_buff(1))                 'datenbuffer senden
    
          Twar = Twi_slv_addr + 1                               'I2C Adress Mega32 + GCA
          Config Twi = 400000                                   'I2C Speed
          On Twi Twi_mst_slv_isr , Nosave                       'ISR f. TWI
    
          Gosub Twi_sense                                       'Aktivieren Slave-Funktion
    
          Enable Timer0                                         'Timer
          Enable Interrupts                                     'Generell
    '---------------------------------------------
    '
    '---------------------------------------------
       Do
          If Twi_slv_flag <> 0 Then
    '-----------------------------------------------------------------
    ' Ergebnis als SLave auswerten
    '             Vorsicht, der Bus ist solange blockiert
    '-----------------------------------------------------------------
             Select Case Twi_slv_flag
             Case &H60 : Print Spc(30) ; "SLAVE recv:" ;        'es ist was empfangen worden
                      Print Hex(twi_slv_addr) ; " ";
                      For Temp = 1 To Twi_sr_cntr
                         Print Hex(twi_slv_buff(temp));         'print der Daten
                      Next
             Case &HA8 : Print Spc(30) ; "SLAVE tran:" ;        'es ist was abgeholt worden
                      Print Hex(twi_slv_addr) ; " ";
                      For Temp = 1 To Twi_st_cntr
                         Print Hex(twi_slv_buff(temp));         'print der Daten
                      Next
             Case &H70 : Print Spc(30) ; "SLAVE GCA :" ;        'ein General Call ist gekommen
                      Print Hex(twi_slv_addr) ; " ";
                      For Temp = 1 To Twi_sr_cntr
                         Print Hex(twi_slv_buff(temp));         'print der Daten
                      Next
             Case Else:
                      Print Chr(7) ;                            'Irgendein Fehler
                      Call Twi_show_state(twi_slv_flag)         'Print status-text
             End Select
             Print
             Twi_slv_flag = 0                                   'löschen marker
             Twi_slv_stat = 0                                   'löschen marker
             Gosub Twi_sense                                    'alles wieder enablen
                                       'und Bus freigeben
          End If
    '-----------------------------------------------------------------
    '         Jede Sekunde was senden & empfangen
    '-----------------------------------------------------------------
          If Timeout = 1 Then
            Gosub Master_transmit
            If Twi_mst_flag = 0 Then                            'Hats geklappt ?
                Timeout = 0                                     'ja
    '       else (sonst probieren wir's gleich nochmal)
             End If
          End If
    '-----------------------------------------------------------------
       Loop
    End
    
    '----------------------------------------
    '     1 mS Ticker
    '----------------------------------------
    Interrupt_ticker:                                           ' Timer for Timer Queue
       Timer0 = Tmr_c_preload
       Incr Timediv
       If Timediv >= Tmr_c_divis Then
          Timeout = 1                                           'eine Sekunde ist rum
          Timediv = 0
       End If
       Return
    
    
    '----------------------------------------
    $include "Twi_show_state.bas"
    '----------------------------------------
    
    Run_wait_master:
          Gosub Mst_start                                       'aufruf
          Select Case Twi_mst_flag                              'ergebnis ?
          Case Twi_m_sent:                                      'gesendet
                   Print "<<<<<<MASTER sent:" ;
                   Print Hex(twi_mst_addr) ; " ";
                   For Temp = 1 To Twi_mt_cntr
                         Print Hex(twi_mst_buff(temp));
                   Next
                   Print
                   Twi_mst_flag = 0
          Case Twi_m_recv:                                      'geholt
                    Print ">>>>>>MASTER read:" ;
                   Print Hex(twi_mst_addr) ; " ";
                   For Temp = 1 To Twi_mr_cntr
                         Print Hex(twi_mst_buff(temp));
                   Next
                   Print
                   Twi_mst_flag = 0
          Case Else:                                            'irgendein Problem
                    Print Chr(7) ; Hex(twi_mst_addr) ; " ";
                    Call Twi_show_state(twi_mst_flag)
          End Select
       Return
    '----------------------------------------
    '   Beispiel 8 byte senden,
    '     dann mit Rep.Start von gleicher adresse 3 Byte empfangen
    '----------------------------------------
    Master_transmit:
    ' sende buffer (mit testdaten) füllen
       For Temp = 1 To 24
          Twi_mst_buff(temp) = Slv_byte
       Next
    
       Twi_mst_addr = Mn2_adr                                   'I2C adresse
       Twi_mt_cntr = 8                                          ' erstmal 8 Byte senden
       Twi_mt_data = Varptr(twi_mst_buff(1))                    ' adresse Daten
    
       Twi_mr_cntr = 3                                          ' dann 3 Byte empfangen
       Twi_mr_data = Varptr(twi_mst_buff(1))                    ' empfangsbuffer
    
       Gosub Run_wait_master                                    ' auf gehts
    
       Return
    Habe die Lib´s auch in den Lib Ordner von Bascom kopiert.

    Fehlt irgendwas oder kann ich die einfach weg lassen?

    Gruß

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Fehlt irgendwas oder kann ich die einfach weg lassen?
    Wenn Du die Deklaration des TWI-Interrupts weg lässt, fehlt Dir auch dessen Funktion, das willst Du sicher nicht.

    Compiliert ohne Fehler, Bascom-Version 2.0.7.1, mach' mal 'n Update.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.01.2005
    Ort
    hessen
    Alter
    35
    Beiträge
    1.101
    Vielen Dank für die Antwort, habe jetzt einfach alles neu Installiert schon klappts, obwohl ich das neueste Upate schon hatte.

Ähnliche Themen

  1. TWI multimaster implementieren
    Von tranh85bo im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 27.10.2009, 21:12
  2. TWi Problem =>Multimaster RN-Wissen
    Von mat-sche im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 31
    Letzter Beitrag: 31.08.2009, 10:41
  3. TWI Multimaster mit Fehlermeldung
    Von mat-sche im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 24.08.2008, 13:14
  4. TWI MultiMaster Problem beim Umschalten Slave -> Master
    Von triplebit im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 11.03.2007, 19:13
  5. PCA9543 Multimaster fähig?
    Von N8Surfer im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 22.12.2006, 07:24

Berechtigungen

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

Labornetzteil AliExpress