Was muss ich ändern???????? :-s :-s :-s :-s :-s
High Light
Druckbare Version
Was muss ich ändern???????? :-s :-s :-s :-s :-s
High Light
Hallo zusammen,
lang lang ist es her, dass ich mich um dieses Thema gekümmert hab,
aber jetzt will ich es endgültig abschließen!!!
und zwar hab ich hier den Slave- und den Master-Code,
wär klasse, wenn ihr mir sagen könntet, warum es nicht geht!!!
Zur Funktion, der Master soll im Sekundentakt, abwechselnd 100 und 10 an den Slave senden. Bei 10 soll die StatusLED am Slave aus- und bei 100 eingeschlalten werden.
Aber es geht nichts!!!
Mastercode:
Code:$regfile = "m88def.dat"
$crystal = 16000000
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
Dim Wert As Byte 'Wertvariable
' TWI init
Twcr = &B00000100 ' erstmal nur TWI aktivieren
Twsr = 0 ' Status und Prescaler Register
Twbr = 72 ' Bit Rate Register, 100kHz
' Hauptschleife
Do
Wert = 100
Call Twi_send_byte(&Hc0 , Wert)
Waitms 1000
Wert = 10
Call Twi_send_byte(&Hc0 , Wert)
Waitms 1000
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
Slavecode:
Habt ihr eine Idee???Code:$regfile = "m88def.dat"
$crystal = 16000000 !
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
Config Portd.7 = Output 'StatusLED
Statusled Alias Portd.7
Statusled = 1
' 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 Wert 100 gesendet, dann StatusLED anschalten
If Twi_data = 100 Then
Statusled = 0 ' StatusLED anschalten
End If
'wenn Wert 10 gesendet, dann StatusLED ausschalten
If Twi_data = 10 Then
Statusled = 1 ' StatusLED ausschalten
End If
Loop
End
' Unterprogramme
' TWI als slave aktivieren
Sub Twi_init_slave
Twsr = 0 ' status und Prescaler auf 0
Twdr = &HFF ' default
Twar = &HC0 ' Slaveadresse setzen
Twcr = &B01000100 ' TWI aktivieren, ACK einschalten
End Sub
Grüße High Light
Also der Code ist richtig,
es lag an der Hardware, hab die Pullups getauscht
und jetzt geht es.
Gruß High Light
Hi, ich versuch momentan das gleich wie du nur dass ich einen Atmega32 mit Atmega88 verbinden will. Außerdem habe ich den Takt auf int 8Mhz laufen.
weiss zufällig jemand was ich dann beim Master TWBR eingebn muß??
Was für Pullups hast du drann bei mir sind es 10k??
Also beim TWBR kann ich dir leider nicht weiterhelfen,
hab dies nämlich nur kopiert und gehoft dass es geht :-D
Als Pullups hab ich jetzt 2,2 kOhm drin.
Grüße High Light
hm und was hattest du als es nicht ging??
ok hat sich erledigt ein defekter Pin war schuld, Danke.
Hab mal ein kleines Bild vom Oszi dran gehängt.
Achja Die Pullups waren bei mir egal lediglich die Flanken haben sich
ein wenig geändert.
Hi,
ich baue grad eine Servo-Steuerung über I2C! Also die Komunikation zwischen 2 IC´s gehtbei mir! hier mal der Code!
Slave:
Master:Code:$regfile = "m8def.dat" ' specify the used micro
$crystal = 12000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 32 ' default use 32for the SW stack
$framesize = 40 ' default use 40 for the frame space
'SCL is PORTD.4 (T0)
'SDA is PORTD.2 (INT0)
'Use 10K pull up resistors for both SCL and SDA
Config I2cslave = &B01000000 ' same as &H40
Dim Bfake As Byte
Do
Loop
I2c_master_needs_data:
Bfake = 60
_a1 = Bfake
Return
'When the master writes a byte, the following label is always called
'It is your task to retrieve variable _A1 and do something with it
'_A1 is register R16 that could be destroyed/altered by BASIC statements
'For that reason it is important that you first save this variable
I2c_master_has_data:
Bfake = _a1
Print "Data: " ; Bfake
Return
_slave_address = &H40 + Switches ' set the proper address
Code:$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 4000000
'or use the TWI !
Config Scl = Porta.1
Config Sda = Porta.2
Do
I2cstart
I2cwbyte &H40
I2cwbyte &H91
I2cstop
Wait 3
I2cstart
I2cwbyte &H40
I2cwbyte &H3C
I2cstop
Wait 3
Loop