Forum: Mikrocontroller und Digitale Elektronik AVR311 implementieren, aber wie


von Christian S. (mueke)


Lesenswert?

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

von Jörg X. (Gast)


Lesenswert?

Kannst du ein bisschen genauer beschreiben, WAS nicht geht, bzw. nicht 
so geht wie erwartet?
Ich blick nicht ganz durch wieviel Bytes da übertragen werden. Hast du 
die "#define TWI_BUFFER_SIZE 4 " (aus der "TWI_slave.h") angepasst, 
falls da mehr als 4 Bytes kommen? (das config-struct ist schon 7Bytes 
groß + 1 "headerbyte" wenn ich das richtig lese).
Der Code wird etwas übersichtlicher, wenn du die Auswertung (switch 
....) in eine Funktion auslagerst, dann könnte ggf den Puffer vorher 
kopieren ( z.B. mit memcpy)

hth. Jörg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.