Der Fehler liegt hier:
TWCR |= (
0<<TWEA)|(1<<TWEN)|(1<<TWIE);
Das Bit TWEA muss gesetzt sein, damit beim Adressieren die TWI-Hardware mit ACK
bestätigt.
Weiterhin solltest du statt SIGNAL(...) ISR(...) nehmen, oder für den Fall, dass du SIGNAL() nimmt, avr/signal.h einbinden!
Dann schauste mal in die iom128.h rein, und guckst, wie
dort der Signalname deklariert wurde - nur der zählt! SIGNAL() hat keine Probleme damit, einen Vektor zuzuordnen, der nicht existent ist. Er springt dann intern zum Label bad_vector_ oder so ähnlich. Schau dir doch mal das Kompilat an. Oder besser die Ausgabe von
avr-objdump -d "programmname" > disassembler
Dort sollte dann das SIG_TWI_etc. durch vect_n ersetzt worden sein.
Edit:
und das hier
Zitat :
|
void init_twi_slave (uint8_t adr)
{
TWAR = 0xC4; //Slave-Addr.: 0x62 (Bit1-Bit7) |
...
[/quote]
Macht ja auch wenig Sinn, wenn man das Argument adr nicht ins Register schreibt
.
Du kannst aber dennoch das hier
Zitat :
|
init_twi_slave(SLAVE_ADRESSE);
|
verwenden, wenn du den Teil oben etwas erweiterst:
TWAR = adr*2;
oder
TWAR = adr<<1;
Damit wird automatisch das LSB 0 und die Adresse kommt trotzdem aus adr
.
Edit2:
@Photonic:
Zitat :
|
Dein Fehler liegt wahrscheinlich am falschen Interruptvektor, SIG_2WIRE_SERIAL liegt (in C) auf der 33, nicht 34 wie du definiert hast. Aus irgendeinem Grund muss man bei den Interruptvektoren im Datenblatt eins abziehen um die richtige C-Definition hinzubekommen. Warum das so ist weiss ich auch nicht...
|
Ne, das hat nichts mit C zu tun. Die Interruptvektoren unterschiedlicher AVRs unterscheiden sich oft - das ist aber im Header des jeweiligen Prozessors schon korrekt übernommen. Man muss aber zwingend das richtige Makro dafür benutzen! Es gibt ein paar Header, die sich in der Nomenklatur diesbezüglich unterscheiden: SIG_TIMER1_COMPA oder SIG_COMP1A meinen das gleiche, sind aber vom Header des Prozessors abhängig. Davon hat man aber mit dem ISR() Abschied genommen. Sonst muss man vorher immer in den Header schauen und sich die wirklich korrekte Vektorbezeichnung rausschreiben. Das entfällt mit ISR() und dort meckert der Compiler auch entsprechend.
.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 16 Jul 2008 20:52 ]
[ Diese Nachricht wurde geändert von: DonComi am 16 Jul 2008 20:56 ]
[ Diese Nachricht wurde geändert von: DonComi am 16 Jul 2008 21:01 ]