Hallo,
ich versuche jetzt sdchon seit längerem die AppNote AVR311 zu
implementiern (I2C), aber es will einfach nicht laufen. Hier mal mein
Quelltext:
1 | #include <avr/io.h>
|
2 | #include <avr/iom16.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include "TWI_slave.h"
|
5 | #include "LTC1257.h"
|
6 |
|
7 | // Variablendeklaration
|
8 | struct conf{
|
9 | uint8_t motorcontroll;
|
10 | uint16_t steps, motorcurrent, frequency;
|
11 | }config;
|
12 |
|
13 | uint16_t counter=0;
|
14 |
|
15 | int main ( void )
|
16 | {
|
17 | uint8_t TWI_slaveAddress, messageBuf[9], temp1=1, temp2=1;
|
18 |
|
19 | // Initialisierung des MCU
|
20 | DDRA = 0xF0;
|
21 | DDRB = DDRC = DDRD =0xFF;
|
22 | TCCR1A = 0x40;
|
23 |
|
24 | TWI_slaveAddress = 0x40 | (PINA & 0x0F);
|
25 |
|
26 | // Slaveadresse setzen und TWI-Initialisieren
|
27 | TWI_Slave_Initialise( TWI_slaveAddress );
|
28 |
|
29 | // Globale Interrupts zulassen
|
30 | sei();
|
31 |
|
32 | // Transceiver auf Bereitschaft setzen
|
33 | TWI_Start_Transceiver();
|
34 |
|
35 | while(1)
|
36 | {
|
37 | if( ! TWI_Transceiver_Busy() )
|
38 | {
|
39 | if( TWI_statusReg.lastTransOK )
|
40 | {
|
41 | if( TWI_statusReg.RxDataInBuf )
|
42 | {
|
43 | TWI_Get_Data_From_Transceiver(messageBuf, 7);
|
44 |
|
45 | temp2 = temp1 = 1;
|
46 | switch(messageBuf[0])
|
47 | {
|
48 | case 0x00:
|
49 | temp1=0;
|
50 |
|
51 | case 0x10:
|
52 | config.motorcontroll = (messageBuf[temp2] & 0xE0);
|
53 | temp2++;
|
54 | PORTC &= 0x1F;
|
55 | PORTC |= config.motorcontroll;
|
56 | if(temp1)
|
57 | break;
|
58 |
|
59 | case 0x20:
|
60 | config.steps = (messageBuf[temp2] << 8);
|
61 | temp2++;
|
62 | config.steps |= messageBuf[temp2];
|
63 | temp2++;
|
64 | if(temp1)
|
65 | break;
|
66 |
|
67 | case 0x30:
|
68 | config.motorcurrent = ((messageBuf[temp2] & 0x0F) << 8);
|
69 | temp2++;
|
70 | config.motorcurrent |= messageBuf[temp2];
|
71 | temp2++;
|
72 | LTC_Set_DA(config.motorcurrent);
|
73 | if(temp1)
|
74 | break;
|
75 |
|
76 | case 0x40:
|
77 | config.frequency = (messageBuf[temp2] << 8);
|
78 | temp2++;
|
79 | config.frequency |= messageBuf[temp2];
|
80 | temp2++;
|
81 | if(config.frequency == 0)
|
82 | config.frequency = 1;
|
83 | if(temp1)
|
84 | break;
|
85 |
|
86 | case 0x50:
|
87 | TCCR1B = 0;
|
88 | TCNT1 = 0;
|
89 |
|
90 | if(config.steps <= 100 && config.steps > 0)
|
91 | {
|
92 | OCR1A = 31250 / config.frequency;
|
93 | TCCR1B = 0x0B;
|
94 | }
|
95 | else if(config.steps > 100 && config.steps <= 255)
|
96 | {
|
97 | OCR1A = 250E3 / config.frequency;
|
98 | TCCR1B = 0x0A;
|
99 | }
|
100 | else if(config.steps > 255)
|
101 | {
|
102 | OCR1A = 2E6 / config.frequency;
|
103 | TCCR1B = 0x09;
|
104 | }
|
105 | break;
|
106 |
|
107 | case 0x60:
|
108 | TCCR1B = 0x00;
|
109 | break;
|
110 | }
|
111 | }
|
112 | else
|
113 | {
|
114 | ;
|
115 | }
|
116 | }
|
117 | TWI_Start_Transceiver();
|
118 | }
|
119 |
|
120 | }
|
121 | }
|
122 |
|
123 | ISR ( TIMER1_CAPT_vect )
|
124 | {
|
125 | if(PIND & (1 << PIND5))
|
126 | counter++;
|
127 |
|
128 | if(counter > 0 && counter == config.steps)
|
129 | TCCR1B = 0x00;
|
130 | }
|
Kurze Funktionsbeschreibung:
Mein Slave soll Daten empfangen für einen Schrittmotorsteuerung. Das
untere Adressnibble lässt sich per DIP-Schalter einstellen, also auch
der GEN-Call. Im ersten übertragenen Datenbyte steht ein Code, der mir
sagt, was übertragen wird (switch(messageBuf[0])), dann folgenden die
eigentlichen Nutzdaten...
Ich bekomme keine Daten an meinem uC... Oder kann es daran liegen, dass
meine Pull-Up-Wdst's nur 1k1 und nicht 4k7 groß sind?
Oder muss ich vielleicht das DDRX der SCL und SDA auf einen bestimmten
Wert setzen???
Vielleicht kann es ja auch am Master leigen..., oder seht hier im
Quelltext nen Fehler?
MfG
Muecke