Moin Moin
Ich bin gerade wie deran, am TWI-Slave zu basteln. Da ich zur zeit noch
keine Interrupts verwende, sondern alles polle, kann der Slave sonst
halt nicht viel machen. Darum will ich nun meinen TWI-Slave mit dem
Interrupt betreiben.
Hierzu habe ich in Datasheet des ATmega16s im Kapittel "Interrupts"
geseh, dass es schon einen TWI vektor gibt. Nun gut.
Anscheinend verstehe ich da was falsch: Ich habe nun die
<avr/interrupt.h> eingebunden, sei(); gesetzt und nun die ISR mit dem
TWI-Vektor initialisiert. Jedoch passiert nun garnichts. Der Master
sendet die Slave Adresse etc, jedoch kriegt weder der Master noch der
Slave irgend ein Ack oder so.
Wo ist mein Fehler? habe ich irgend welche Register übersehen, die es zu
sezten gibt?
Hier mein Code:
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include "twislave.h"
|
5 | #include "lcd.h"
|
6 |
|
7 |
|
8 | int main(void)
|
9 | {
|
10 | uint8_t twisend; // TWI sendevariable
|
11 | uint8_t twirecive; // TWI empfangsvariable
|
12 | unsigned char buffer[10]; // Buffer für itoa
|
13 |
|
14 | lcd_init(LCD_DISP_ON);
|
15 | twi_slave_init(0x00); // TWI Slave initialisieren & Adresse festloegen
|
16 | sei();
|
17 |
|
18 |
|
19 | while(1)
|
20 | {
|
21 | twisend = 0xCB;
|
22 |
|
23 | /*
|
24 | twi_slave_transmit(twisend);
|
25 |
|
26 | //twirecive = twi_slave_recive();
|
27 |
|
28 | lcd_clrscr();
|
29 | lcd_gotoxy(0,0);
|
30 | lcd_puts("I am your Slave");
|
31 | lcd_gotoxy(0,1);
|
32 | lcd_puts("Senden: 0x");
|
33 | lcd_puts(itoa(twisend, buffer, 16));
|
34 | */
|
35 | }
|
36 | }
|
37 |
|
38 |
|
39 | ISR(TWI_vect)
|
40 | {
|
41 | lcd_clrscr();
|
42 | lcd_gotoxy(0,0);
|
43 | lcd_puts("Okay"); //Test
|
44 | }
|
Danke und Greez Jey