molleonair
03.04.2007, 17:40
Hallo liebe Freunde der hardwarenahen Programmierung
Ich hab dieses Thema auch schon im Bascom-Forum gepostet dort antwortet mir jedoch keiner ,da wahrscheinlich die Bascom nutzer von den fertigen I2C Routinen so verweichlicht sind daß sie gar nicht mehr wissen was die Hardware tut.
Einer von diesen Bascom nutzern bin ich auch.Da ich aber nun tiefer in die Sphären eines AVRs einsteigen will hab ich angefangen ein Bascom Programm zu schreiben das die TWI Schnittstelle nicht über fertige Bascom-Befehle steuert,sondern über die Register.
Verbunden sind ein Mega 168 und ein Mega16 mit RS232 und Bootloader.
Die Übertragung soll erstmal Master-transmitter und Slave -Receiver sein
Dazu hab ich folgenden leicht lesbaren Code im Master
I2c_senden:
Set Twcr.twen 'TWI-Hardware wird aktiviert
Twbr = 72 'Bitrate auf 100Khz bei 16Mhz CPU und Prescaler =0
Twsr = 0 'Prescaler auf 0
Set Twcr.twsta 'TWI-Start wird erzeugt
Bitwait Twcr.twint , Set 'wartet bis TWI-Start gesendet wurde
'Print "sende TWI Start"
If Update_twistatus() = &H08 Then 'wenn start gesendet
'Print "Start erfolgreich"
'Print "sende SLA/W"
Twdr = Slaveid And &B11111110 'SLA-W wird geladen
Reset Twcr.twsta
Set Twcr.twint 'Twint wird gelöscht
Bitwait Twcr.twint , Set 'wartet bis Hardware fertig
If Update_twistatus() = &H18 Then 'wenn SLA-W empfang bestätigt
'Print "SLA/W übertragen"
'Print "sende Datenbyte"
Twdr = Sendebyte 'daten werden geladen
Set Twcr.twint
Bitwait Twcr.twint , Set
If Update_twistatus() = &H28 Then 'wenn Datenempfang bestätigt
Print "datenbyte übertragen"
Else
'Print "TWI-Fehler kein Daten Ack"
End If
Else
'Print "TWI-Fehler kein SLA-R/W Ack"
End If
Set Twcr.twsto 'Stop Condion
Set Twcr.twint 'wird gesendet
Print "sende TWI Stop"
Print ""
Else
Print "TWI-Fehler kein Start gesendet"
End If
Return
Function Update_twistatus() As Byte
Update_twistatus = Twsr And &B11111000 'Twistatus wird gelsen prescaler wird maskiert
End Function
und folgenden im slave:
do
if twi_flag=1 gosub i2c_schreibe
loop
I2cschreibe:
Reset Twi_flag
If Update_twistatus() = &H60 Then
Set Twcr.twea
Set Twcr.twint
Bitwait Twcr.twint , Set
If Update_twistatus() = &H80 Then
I2cbyte = Twdr
Else
I2cbyte = 0
End If
Set Twcr.twint
End If
While I2cbyte > 0
Set Led2
Waitms 100
Reset Led2
Decr I2cbyte
Wend
Return
Function Update_twistatus() As Byte
Update_twistatus = Twsr And &B11111000 'Twistatus wird gelsen prescaler wird maskiert
End Function
Twi_isr:
Set Twi_flag
Return
die LED2 soll dabei so oft blinken wie der empfangene Wert vom Master ist
jedoch passiert gar nix der Master signalisiert über COM nach viel zu langer Zeit das er erfolgreich gesendet hat
der Slave hängt sich auf
Bitte helft mir Gruß Daniel
Ich hab dieses Thema auch schon im Bascom-Forum gepostet dort antwortet mir jedoch keiner ,da wahrscheinlich die Bascom nutzer von den fertigen I2C Routinen so verweichlicht sind daß sie gar nicht mehr wissen was die Hardware tut.
Einer von diesen Bascom nutzern bin ich auch.Da ich aber nun tiefer in die Sphären eines AVRs einsteigen will hab ich angefangen ein Bascom Programm zu schreiben das die TWI Schnittstelle nicht über fertige Bascom-Befehle steuert,sondern über die Register.
Verbunden sind ein Mega 168 und ein Mega16 mit RS232 und Bootloader.
Die Übertragung soll erstmal Master-transmitter und Slave -Receiver sein
Dazu hab ich folgenden leicht lesbaren Code im Master
I2c_senden:
Set Twcr.twen 'TWI-Hardware wird aktiviert
Twbr = 72 'Bitrate auf 100Khz bei 16Mhz CPU und Prescaler =0
Twsr = 0 'Prescaler auf 0
Set Twcr.twsta 'TWI-Start wird erzeugt
Bitwait Twcr.twint , Set 'wartet bis TWI-Start gesendet wurde
'Print "sende TWI Start"
If Update_twistatus() = &H08 Then 'wenn start gesendet
'Print "Start erfolgreich"
'Print "sende SLA/W"
Twdr = Slaveid And &B11111110 'SLA-W wird geladen
Reset Twcr.twsta
Set Twcr.twint 'Twint wird gelöscht
Bitwait Twcr.twint , Set 'wartet bis Hardware fertig
If Update_twistatus() = &H18 Then 'wenn SLA-W empfang bestätigt
'Print "SLA/W übertragen"
'Print "sende Datenbyte"
Twdr = Sendebyte 'daten werden geladen
Set Twcr.twint
Bitwait Twcr.twint , Set
If Update_twistatus() = &H28 Then 'wenn Datenempfang bestätigt
Print "datenbyte übertragen"
Else
'Print "TWI-Fehler kein Daten Ack"
End If
Else
'Print "TWI-Fehler kein SLA-R/W Ack"
End If
Set Twcr.twsto 'Stop Condion
Set Twcr.twint 'wird gesendet
Print "sende TWI Stop"
Print ""
Else
Print "TWI-Fehler kein Start gesendet"
End If
Return
Function Update_twistatus() As Byte
Update_twistatus = Twsr And &B11111000 'Twistatus wird gelsen prescaler wird maskiert
End Function
und folgenden im slave:
do
if twi_flag=1 gosub i2c_schreibe
loop
I2cschreibe:
Reset Twi_flag
If Update_twistatus() = &H60 Then
Set Twcr.twea
Set Twcr.twint
Bitwait Twcr.twint , Set
If Update_twistatus() = &H80 Then
I2cbyte = Twdr
Else
I2cbyte = 0
End If
Set Twcr.twint
End If
While I2cbyte > 0
Set Led2
Waitms 100
Reset Led2
Decr I2cbyte
Wend
Return
Function Update_twistatus() As Byte
Update_twistatus = Twsr And &B11111000 'Twistatus wird gelsen prescaler wird maskiert
End Function
Twi_isr:
Set Twi_flag
Return
die LED2 soll dabei so oft blinken wie der empfangene Wert vom Master ist
jedoch passiert gar nix der Master signalisiert über COM nach viel zu langer Zeit das er erfolgreich gesendet hat
der Slave hängt sich auf
Bitte helft mir Gruß Daniel