PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI, Slave Reagiert nicht



peter_buchegger
18.07.2007, 17:30
Hallo Leute,

hätte da mal eine Frage:

Ich hab hier 2 Mega16 liegen und diese will ich peer TWI verbinden.
Hab mir ein Programm und alles geschriben nur kommt es mir so vor als würde der Slave nicht reagieren.

Habe die beiden SCL (PC0) und SDA(PC1) miteinander verbunden.
Derzeit ziehe ich die beiden Leitungen noch mit 1k rauf, hab derzeit leider nichts anderes zuhause.

Slaver:

Der Slaver soll auf ein paar Tasten aufpassen, sobald ich eine Taste drücke soll er den ersten buffer auf 1 setzen damit der Master sieht das er neue Daten hat. den buffer kann man durch ne Taste wieder auf 0 setzen.

Ich hab mir das C-File von der Adresse besorgt:
https://www.roboternetz.de/wissen/index.php/TWI_Slave_mit_avr-gcc

Mein Programm schaut so aus:


#include <util/delay.h>
#include <avr\io.h>
#include "twislave.c"

#define BAUD 9600 //Baudrate
#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse

void warte (int loop) //loop: wartezeit in ms
{
int i;
for(i=0;i<loop;i++) _delay_ms(1);
}

int main (void)
{
sei();
uint8_t i;
//uint8_t buffer_size = 8;
//uint8_t txbuffer[buffer_size];
//uint8_t rxbuffer[buffer_size];

//TWI als Slave mit Adresse slaveadr starten
init_twi_slave(SLAVE_ADRESSE);

DDRA = 0x00; // Port C.0 auf INPUT (0)
PORTA = 0xFF; // PullUp bei Port C.0 aktivieren (1)

DDRB = 0xFF; //Port B auf Output
PORTB = 0xFF; //Low
warte(1000);
PORTB = 0x00; //High
warte(1000);
PORTB = 0xFF; //Low
warte(1000);

while(1) {
for(i = 1;i<=7;i++) {
if ( !(PINA & (1 << i)) ) {
if(txbuffer[i]!=1) {
txbuffer[i]=1;
txbuffer[0]=1;
}
PORTB &= ~(1 << i);
} else {
if(txbuffer[i]!=0) {
txbuffer[i]=0;
txbuffer[0]=1;
}
PORTB |= (1 << i);
}
}
if(txbuffer[0]==1) {
//PORTB ^= (1<<0);
//warte(100);
PORTB &= ~(1 << 0);
} else {
PORTB |= (1 << 0);
}
if ( !(PINA & (1 << 0)) ) {
txbuffer[0]=0;
}
if(rxbuffer[0]==1) {
txbuffer[0]=0;
rxbuffer[0]=0;
//PORTB &= ~(1 << 0);
PORTB |= (1 << 0);
}
}
}



Master:

Derzeit sollte der Master nur nachschauen ob der Slaver eine 1 im ersten buffer hat. Wenn da eine 1 Steht dann soll er blinken! (Derzeit zum überprüfen ob er was lesen kann lasse ich ihn immer blinken wenn er was empfängt) (was er derzeit nur 2 mal macht und dann nicht mehr)

Beim Master hab ich die lib von Peter Fleury verwendet.

Mein Code:



#include "i2cmaster.h" //I2C-Master-Routinen von Peter Fleury verwenden (siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs)
#include "twimaster.c"
#include <util/delay.h>
#include <avr\io.h>
#include <stdlib.h.>
#include <avr/interrupt.h>

#define SLAVE_ADRESSE 0x50

void warte (int loop) //loop: wartezeit in ms
{
int i;
for(i=0;i<loop;i++) _delay_ms(1);
}

int main (void) {
sei();

uint8_t ret;
// initialize I2C library
i2c_init();

DDRA = 0xFF;

PORTA = 0xFF;
warte(100);
PORTA = 0x00;
warte(100);
PORTA = 0xFF;
warte(100);

while(1) {
// read previously written value back from EEPROM address 5
//i2c_start_wait(ADRESSE+I2C_WRITE);

// daten:
//i2c_write(0x05);
PORTA = 0xFF;
warte(100);
PORTA = 0x00;
warte(100);
PORTA = 0xFF;
warte(100);
//Lesen:
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) { //Slave bereit zum lesen?

PORTA = 0xFF;
warte(100);
PORTA = 0x00;
warte(100);
PORTA = 0xFF;

i2c_write(0x00); //Buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen

ret= i2c_readNak();
}
/*
PORTA = 0xFF;
warte(100);
PORTA = 0x00;
warte(100);
PORTA = 0xFF;

// set device address and read mode

ret = i2c_readNak(); // read one byte from EEPROM
//if(ret==1) {
PORTA = 0x00;
warte(100);
PORTA = 0xFF;
ret = 0;
warte(100);
//}*/

i2c_stop();
}
}



/*
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
{
i2c_write(0x00); //Buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen

byte0= i2c_readAck();
byte1= i2c_readAck();
byte2= i2c_readNak(); //letztes Byte lesen, darum kein ACK
i2c_stop();
}

*/


Bitte helft mir. DANKE!

Lg Peter