-         

Ergebnis 1 bis 4 von 4

Thema: I2C an ATMEGA32

  1. #1

    I2C an ATMEGA32

    Anzeige

    Hallo

    ich möchte zwei ATMEGAS mit I2C Verbinden um habe es als erst mal mit der Anleitung aus den RN Wissen Bereich versucht es funktioniert aber leider bei mir nicht ich habe die beiden Leitungen des I2C mit einen 10k Widerstand an +5V gelegt. und folgenden Code verwendet.

    Master
    Code:
    $regfile = "m32def.dat"
    $crystal = 4000000
    $baud = 9600
    
    Config Portd.6 = Output
    
    Portd.6 = 0
    
    Declare Sub Twi_send_byte(byval Slave As Byte , Zeichen As Byte)
    
    Dim Twi_control As Byte                                     ' Controlregister lokale kopie
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    
    Dim B As Byte                                               ' Zeichen von UART
    Dim Error As Byte                                           ' Fehlermerker
    
    ' TWI init
    Twcr = &B00000100                                           ' erstmal nur TWI aktivieren
    Twsr = 0                                                    ' Status und Prescaler Register
    Twbr = 12                                                   ' Bit Rate Register, 100kHz
    
    ' Startausgabe
    Print "TWI Master Transmitter"
    
    ' Hauptschleife
    Do
        ' hier könnte ihr Code stehen
    
        ' warten bis etwas über UART kommt
        Input B
    
        ' Den Wert zum Slave senden
        Call Twi_send_byte(&H40 , B)
    
        ' Ausgabe, damit wir sehen was geschehen ist
        Print B ;
        Print " Error : " ;
        Print Hex(error)                                        ' error status Ausgeben
    
    Loop
    
    End
    
    ' Unterprogramme
    
    ' TWI send_byte
    ' sendet ein Byte und schliesst die Übertragung ab
    Sub Twi_send_byte(byval Slave As Byte , Zeichen As Byte)
        Error = 0                                               ' Fehler zurücksetzen
    
        ' Startbedingung
        Twcr = &B10100100                                       ' TWINT
    
        ' warten bis TWINT gesetzt ist
        Gosub Twi_wait_int
    
        ' wenn Zugriff auf den Bus erlaubt, Slaveadresse ausgeben
        If Twi_status = &H08 Or Twi_status = &H10 Then
            Twdr = Slave And &HFE                               ' slave adresse + Write
            Twcr = &B10000100                                   ' TWINT löschen, Byte senden
    
            ' warten bis TWINT gesetzt ist
            Gosub Twi_wait_int
    
            ' Slave hat sich gemeldet
            If Twi_status = &H18 Or Twi_status = &H20 Then
                Twdr = Zeichen                                  ' Daten
                Twcr = &B10000100                               ' TWINT löschen, Byte senden
    
                ' warten bis TWINT gesetzt ist
                Gosub Twi_wait_int
    
                ' Zeichen wurden gesendet
                If Twi_status = &H28 Or Twi_status = &H30 Then
                    Error = 0                                   ' kein Fehler
                Else
                    Error = Twi_status                          ' Fehler
                End If
    
            Else
                ' kein slave
                Error = Twi_status                              ' Fehler
            End If
    
            ' STOPbedingung kommt hier immer im Ablauf, egal welcher Status
            Twcr = &B10010100                                   ' TWINT löschen, STOP senden
            ' nach einem STOP wird TWINT nicht mehr gesetzt,
            ' man darf/kann also nicht darauf warten !
    
        Else
            ' Bus belegt, wird er wieder freigegeben
            Twcr = &B10000100                                   ' TWINT löschen, Bus freigeben
            Error = Twi_status                                  ' Fehler
        End If
    
    End Sub
    
    ' warten bis TWINT gesetzt ist, status auslesen
    Twi_wait_int:
        Do
            Twi_control = Twcr And &H80
        Loop Until Twi_control = &H80
    
        Twi_status = Twsr And &HF8                              ' status
    
        ' status nur zu Debugzwecken ausgeben, weil Bus sehr langsam wird !
    Print "Err " ; Hex(twi_status)
    Return
    Slave
    Code:
    $regfile = "m32def.dat"
    $crystal = 4000000
    $baud = 9600
    
    Config Portd.6 = Output
    
    Portd.6 = 0
    
    Config Portb = Output                                       ' kompletter PortB als Ausgang
    
    Dim Twi_control As Byte                                     ' Controlregister lokale kopie
    Dim Twi_status As Byte
    Dim Twi_data As Byte
    
    Dim Neuesbyte As Byte                                       ' Bytemerker
    
    Declare Sub Twi_init_slave
    
    Twi_data = 0
    Call Twi_init_slave                                         ' TWI aktivieren
    
    ' alle LEDs ein
    Portb = 0
    
    ' Hauptschleife
    Do
        ' hier könnte ihr Code stehen
    
    
        ' Merker zurücksetzen
        Neuesbyte = 0
    
        ' schauen ob TWINT gesetzt ist
        Twi_control = Twcr And &H80                             ' Bit7 von Controlregister
    
        If Twi_control = &H80 Then
            Twi_status = Twsr And &HF8                          ' Status
    
            ' wurde ein Byte geschickt
            If Twi_status = &H80 Or Twi_status = &H88 Then
                Twi_data = Twdr                                 ' neue Daten merken
                Neuesbyte = 1                                   ' merken das ein neues Byte da ist
            End If
    
            ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht
            Twcr = &B11000100                                   ' TWINT löschen, erzeugt ACK
        End If
    
        ' wenn ein neues Byte gekommen ist, dieses an PortD ausgeben
        If Neuesbyte <> 0 Then
            Portb = Twi_data                                    ' Daten auf PortD ausgeben
        End If
    
    Loop
    
    End
    
    
    ' Unterprogramme
    
    
    ' TWI als slave aktivieren
    Sub Twi_init_slave
        Twsr = 0                                                ' status und Prescaler auf 0
        Twdr = &HFF                                             ' default
        Twar = &H40                                             ' Slaveadresse setzen
        Twcr = &B01000100                                       ' TWI aktivieren, ACK einschalten
    
    End Sub
    Ich bin mir nicht sicher ob ich alles richtig angepasst habe und wollte wissen wie ich die Daten bei Input übermitteln muss mit CR+LF oder ohne.

    Danke

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    bei dem Input B kann man nur Zahlen eingeben, die dann von Bascom intern gleich in den Byte-Wert gewandelt wird, und so versendet wird.
    Eingeben zB:
    231<Enter>
    Mehr als 3 Zeichen kann man sowieso nicht eintippen, da Bascom nur den Wert für ein Byte erwartet.

  3. #3
    Hallo danke ich habe jetzt das Bascom terminal verwendet jetzt funzt alles.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Beim Master würde ich aber trotzdem die Bascom-Befehle verwenden, dann liest sich das später auch besser falls man Fehler suchen muss

Berechtigungen

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