- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Slave-Master-Slave übertragung geht nicht

  1. #11
    Benutzer Stammmitglied
    Registriert seit
    08.07.2008
    Beiträge
    49
    Anzeige

    E-Bike
    Hi

    Also erst ma Danke für das Programm.

    Aber ich bin so langsam am verzweifeln bin ich zu doof für so was hier?!

    Habe das Prog genommen und einmal denn empfangenem Buffer in eine Variable schreiben lassen. Dann nach dieser Variablen gefragt und wenn dies gleich is soll eine LED eingeschaltet werden.

    Hier der Code

    µC 1

    Code:
    $crystal = 16000000
    
    $include "MyTWI.bas"
    
    $baud = 9600
    
    $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)
    
    Config Porta = Input
    Config Portb = Input
    Config Portd = Output
    
    Waitms 30
    '-------------------------------------------------
    '  lokale I2C Adresse   (als Slave)
    '-------------------------------------------------
    Const Mn1_adr = &H40
    
    '-------------------------------------------------
    '  fremde I2C Adresse   (als Master)
    '-------------------------------------------------
    Const Mn2_adr = &H50
    
    
    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
    '---------------------------------------------
    '                    initialiesierung
    '---------------------------------------------
    Dim Speicher(24) As Byte
    Led1 Alias Portd.2
    
    '------------------Konfigurierung-------------
    Portd = &HFF
    Led1 = 1
    Slv_byte = &H02
    
       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
    '-----------------------------------------------------------------
    If Speicher(1) = &H03 Then Led1 = 0
    
    
       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));
                         Speicher(temp) = 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 = 3                                          ' 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
    µC 2
    Code:
    '------------------------interface-------------------
    
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    $include "MyTWI.bas"
    
    $baud = 9600
    
    $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)
    
    Config Porta = Output
    Config Portb = Output
    Config Portc = Input
    
    '-------------------------------------------------
    '  lokale I2C Adresse   (als Slave)
    '-------------------------------------------------
    Const Mn1_adr = &H50
    
    '-------------------------------------------------
    '  fremde I2C Adresse   (als Master)
    '-------------------------------------------------
    Const Mn2_adr = &H40
    
    
    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
    '---------------------------------------------
    '                   initialiesierung
    '---------------------------------------------
    Dim Speicher(24) As Byte
    Led1 Alias Portb.0
    
    '------------------Konfigurierung-------------
    Porta = &HFF
    Portb = &HFF
    Slv_byte = &H03
    Led1 = 1
    
       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
    '-----------------------------------------------------------------
    If Speicher(1) = &H03 Then Led1 = 0
    
    
       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));
                         Speicher(temp) = 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 = 3                                          ' 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
    Mein Problem ist wenn ich beim µC1

    Mn1_adr = &H40
    Mn2_adr = &H50

    und bei µC2

    Mn1_adr = &H50
    Mn2_adr = &H40

    nehme dann geht nichts....

    wenn ich aber beim µC1

    Mn1_adr = &H50
    Mn2_adr = &H40

    und bei µC2

    Mn1_adr = &H40
    Mn2_adr = &H50

    nehme dann leuchtet nur bei µC2 die LED?!

    Wieso...........

    Danke für jede Unterstützung.

    mfg dämmi

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    08.07.2008
    Beiträge
    49
    Kann keiner Helfen?

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Zitat Zitat von PicNick
    Das solltest du entfernen:
    Dim Slave As Byte
    Das könnte den Bascom verwirren, weil du eine gleichnamige Variable in der Function verwendest
    Ist das wirklich so?
    Die Namen sind Bascom doch eigenlich wurst, die wer die eh in Registernamen/Stackpointer verwandelt, oder?

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Jo, ist so. Am besten jede Variable nur 1x nutzen
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  5. #15
    Benutzer Stammmitglied
    Registriert seit
    08.07.2008
    Beiträge
    49
    das hab ich doch aber schon geändert hab nu eine nen ganz anderes Programm....

  6. #16
    Benutzer Stammmitglied
    Registriert seit
    08.07.2008
    Beiträge
    49
    kann denn keiner helfen?

  7. #17
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Dämmi,

    gibt die Variable "Twi_slv_flag " das Zustandsbyte so zurück, wie es der ATmega erzeugt?

    Wenn ja, dann zeigt &60 nur den Empfang der eigenen Adresse an - Daten sind da noch keine empfangen worden. Deshalb kann die nachfolgende Druckschleife an dieser Stelle keine empfangenen Daten finden. Der abgeschlossene Empfang eines Datenbytes wird jedesmal mit Statusbyte &80 angezeigt.

    Die TWI-Zustandsbytes des ATmega sind eigentlich sehr übersichtlich und leicht auszuwerten. Die besten Erläuterungen dazu gibt es z.B. auf den Seiten 181ff des ausführlichen Datenblattes des ATmega8. Dort sind auch gut ausgearbeitete und kommentierte Beispielprogramme abgedruckt. Die helfen Dir bestimmt weiter .

    Ciao,

    mare_crisium

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

LiFePO4 Speicher Test