Hallo,
Ich habe test programm (Slave Transmit und Masterreceive Polling-betrieb )aus RN-Wissen aufgespielt und erfolgreich gehabt .
Jetzt will ich in Interrupt betrieb umsteigen
Untere sind meine code in Bascom :
Aber das Programm funktioniert leider nicht .Ich will count1 und count2 zu Master senden aber wenn ich debug in Master angeguckt , habe ich nur den Wert von Adresse gesehen ;und wenn ich das Status gelesen ,bekomme ich nur einen Wert A8 .Ich glaub , ich habe den Fehler in Slave-Transmit gemacht aber ich weiss nicht wo.Kannst du den code für mich kurz schauen oder eine Bspl mit Interrupt in TWI geben, damit ich von der lernen kann.Code:$regfile = "m128def.dat" ' the used chip $crystal = 16000000 ' frequency used $baud1 = 9600 ' keine baud rate angeben ! Config Sda = Portd.1 'Pins für I2C festlegen Config Scl = Portd.0 Config Twi = 200000 Open "com2:" For Binary As #3 Dim Twi_control As Byte ' Controlregister lokale kopie Dim Twi_status As Byte Dim Twi_data As Byte Dim Count1 As Byte Dim Count2 As Byte ' Testwert, Declare Sub Twi_init_slave Enable Interrupts Enable Twi On Twi Transmit Nosave ' Werte zuweisen Count1 = 1 Count2 = 2 Twi_data = 0 Call Twi_init_slave ' TWI aktivieren ' ---------------Hauptschleife------------------ Do ' hier könnte ihr Code stehen Loop End ' ------------------Unterprogramme ------------------------------------- ' TWI als slave aktivieren Sub Twi_init_slave Twsr = 0 ' status und Prescaler auf 0 Twdr = &HFF ' default Twar = &H30 ' Slaveadresse setzen Twcr = &B11000101 ' TWI aktivieren, ACK einschalten End Sub Transmit: Twi_status = Twsr And &HF8 Print #3 , "Twi status : " ; Twsr 'Debug If Twi_status = &HA8 Then Twdr = Count1 ' neue Daten ausgeben Print #3 , "test1" End If ' Twcr = &B10000000 ' Return If Twi_status = &HB8 Then Twdr = Count2 ' neue Daten ausgeben Print #3 , "test2" End If ' Twcr = &B10000000 ' Return ' TWINT muss immer gelöscht werden, damit es auf dem Bus weiter geht Twcr = &B11000101 ' TWINT löschen,TWIE löschen mit ACK Return
Masterreceive Programm habe ich in C geschrieben und scheint nicht
Problem zu sein
Ich danke euch im VorausCode:swicht (twi_state++) { .. case 23: //i2c_write_byte(0x00); i2c_write_byte(SLAVE_ADRESSE+1); break; case 24: byte1=i2c_readAck(); break;//1 byte lesen case 25: byte2= i2c_readNak(); //letztes Byte lesen, darum kein ACK i2c_stop(); //-------ende des zugefügeteil----- I2CTimeout = 10; twi_state = 0; break; } //Aus library unsigned char i2c_readAck(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA)|(1<<TWIE); return TWDR; }// i2c_readAck unsigned char i2c_readNak(void) { TWCR = (1<<TWINT) | (1<<TWEN)| (1<<TWIE); return TWDR; }// i2c_readNak
MFG







Zitieren

Lesezeichen