www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR311 implementieren, aber wie


Autor: Christian S. (mueke)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>
#include "TWI_slave.h"
#include "LTC1257.h"

// Variablendeklaration
struct conf{
  uint8_t motorcontroll;
  uint16_t steps, motorcurrent, frequency;
}config;

uint16_t counter=0;

int main ( void )
{
  uint8_t TWI_slaveAddress, messageBuf[9], temp1=1, temp2=1;
  
  // Initialisierung des MCU
  DDRA = 0xF0;
  DDRB = DDRC = DDRD =0xFF;
  TCCR1A = 0x40;

  TWI_slaveAddress = 0x40 | (PINA & 0x0F);

  // Slaveadresse setzen und TWI-Initialisieren
  TWI_Slave_Initialise( TWI_slaveAddress );

  // Globale Interrupts zulassen
  sei();

  // Transceiver auf Bereitschaft setzen
  TWI_Start_Transceiver();

  while(1)
  {
    if( ! TWI_Transceiver_Busy() )
    {
      if( TWI_statusReg.lastTransOK )
      {
        if( TWI_statusReg.RxDataInBuf )
        {
          TWI_Get_Data_From_Transceiver(messageBuf, 7);

          temp2 = temp1 = 1;
          switch(messageBuf[0])
          {
            case 0x00:
              temp1=0;

            case 0x10:
              config.motorcontroll   = (messageBuf[temp2] & 0xE0);
              temp2++;
              PORTC &= 0x1F;
              PORTC |= config.motorcontroll;
              if(temp1)
                break;

            case 0x20:
              config.steps       = (messageBuf[temp2] << 8);
              temp2++;
              config.steps       |= messageBuf[temp2];
              temp2++;
              if(temp1)
                break;

            case 0x30:
              config.motorcurrent   = ((messageBuf[temp2] & 0x0F) << 8);
              temp2++;
              config.motorcurrent    |= messageBuf[temp2];
              temp2++;
              LTC_Set_DA(config.motorcurrent);
              if(temp1)
                break;

            case 0x40:
              config.frequency    = (messageBuf[temp2] << 8);
              temp2++;
              config.frequency    |= messageBuf[temp2];
              temp2++;
              if(config.frequency == 0)
                config.frequency = 1;
              if(temp1)
                break;
            
            case 0x50:
              TCCR1B = 0;
              TCNT1 = 0;

              if(config.steps <= 100 && config.steps > 0)
                  {
                OCR1A = 31250 / config.frequency;
                TCCR1B = 0x0B;
              }
              else if(config.steps > 100 && config.steps <= 255)
              {
                OCR1A = 250E3 / config.frequency;
                TCCR1B = 0x0A;
              }
              else if(config.steps > 255)
              {
                OCR1A = 2E6 / config.frequency;
                TCCR1B = 0x09;
              }
              break;

            case 0x60:
              TCCR1B = 0x00;
              break;
          }          
        }
        else
        {
          ;
        }
      }
      TWI_Start_Transceiver();
    }
    
  }
}

ISR ( TIMER1_CAPT_vect )
{
  if(PIND & (1 << PIND5))
    counter++;

  if(counter > 0 && counter == config.steps)
    TCCR1B = 0x00;
}

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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.