Ressourcen-Icon

SAM D21J17A im Modularen Board System 2017-06-18

Du willst mir(!!) doch keinen Tausendfüßer vorschlagen, oder?!
Ouuuuhhh, Todesfalle. @LotadaC ICs zu empfehlen die mehr als 6 Pins haben, das ist gefährlich :D

Alles nur Spass :)
Der arme @dino03 wurde auch - mehr oder wenig freiwillig - umgetauft in Alabel :D (Insider)
Aber die Angebote sind durchaus ernst gemeint. Ich helf ja auch wo ich kann.
 
Hallo
habe die Bilder noch eingefügt. Hoffe das ich nichts vergessen habe. Bitte mal anschauen.
Habe beim Laden eine Fehlermeldung bekommen. Datei ist zu gross, hat jetzt 1,22 M. wird woll nicht heute mit hochladen.
Dirk, wie kann ich das ändern oder gibt es andere Möglichkeit?
achim
 
Datei ist zu gross, hat jetzt 1,22 M. wird woll nicht heute mit hochladen.
Dirk, wie kann ich das ändern oder gibt es andere Möglichkeit?
Ich habe die maximale Größe für Anhänge etwas erhöht (1,5MB). Ich hoffe dies hilft für die PDFs.

Dirk :ciao:
 
Es funktiniert. Danke Dirk. Damit kann es jeder lesen und Anwenden. Wünsche viel Spass damit. Falls Fehler drin sind oder der Ablauf nicht korrekt dargestellt ist bitte ein kurze mail an mich. Werde es sofort ändern.
Falls du die Schrift ändern willst oder in eine anderen bereich speichern willst, kann ich dir gern die Word Datei dazu schicken
achim
 
Hallo Achim,
Falls du die Schrift ändern willst oder in eine anderen bereich speichern willst, kann ich dir gern die Word Datei dazu schicken
also die Schrift finde ich nun nicht sooo tragisch, ich würde aber für zukünftige neuere Tutorials mal ein bisschen mit der Schritart "experimentieren" und nach Alternativen suchen ;)

Ansonsten würde ich es erst mal so belassen, da es bestimmt auch bei den vielen Bildern irgendwelche Umbrüche geben wird, wenn man die Schriftart und/oder Schriftgröße ändert. Diejenigen, welche mit Atmel Studio starten möchten, kommen bestimmt mit deinem Tutorial gut klar :)

Dirk :ciao:
 
Keine Kritik? Habe bestimmt etwas falsch beschrieben, doch wo? Vielleicht könnte es jemand anderes darauf überprüfen. Hst du einen Vorschlag für die Schrift? Was kann man nehmen für den Hobby Bereich oder als Hilfe?
achim
 
Hst du einen Vorschlag für die Schrift?
TommyB hat ja schon einige genannt ...
Seriös wirkende Schriftstücke (wie Dokumentationen) sollten doch eher in gängigen Schriftarten wie Arial, Segoe oder (was eigentlich auch schon grenzwertig ist aber ich nutze) Verdana verfasst sein.

Habe bestimmt etwas falsch beschrieben, doch wo?
Ich schaue morgen mal drüber, wenn mir was auffällt, melde ich mich :)

Dirk :ciao:
 
Wie versprochen habe ich die Hardware fertig gemacht. Mit Leiterplattenbild und Belegung der einzelen Ports. Damit kann jeder was damit machen.
Wünsche viel Spass damit.
achim
 

Anhänge

  • ARM SAM D21 Hardware.pdf
    1,2 MB · Aufrufe: 11
Hallo Achim,

ich habe leider gerade sehr wenig Zeit, deine Tutorials genauer durchzuarbeiten. Ich hatte sie nur "überflogen" und dabei ist mir aber nichts aufgefallen.

Interessant finde ich für mich den Teil mit dem einfachen Levelshifter für I2C, hierzu gibt es auch eine Appnote von NXP:
AN10441 Level shifting techniques in I2C-bus design

Hat dir der ASF Beispiel-Sourcecode weitergeholfen, konntest du über I2C eine Verbindung aufbauen?

Als nächstes werde ich einmal die Konfiguration für einen Systemtakt 48MHz über XTAL Oszillator mit 12MHz Quarz nachreichen.

Dirk :ciao:
 
Hallo
danke für deine Info. Habe jetzt auch den Levelshifter bestückt, allerdings noch nicht getestet. Habe ein paar Probleme mit meinem "Gedächtnisses" in Form eines Sticks. Sind alle meine Daten drauf, damit auch wo anders was machen kann. Kommen nur noch Stömeldungen und versuche zu retten was geht.
Habe angefange dein Prgramm auseiander zu nehmen und einiges zu begreiffen. So z.B. die Taktfrequenz. Ist nicht so einfach für mich. Mit dem Bus habe ich noch nicht weitergemacht. Sobald meine Daten gerettet sind geht es weiter.
Beim Levelshifter haben wir wahrscheinlich die gleich Quelle verwendet. Ansonsten gibt es x Beispiele dazu im Netz. Das wichtigste dabei, es geht wunderbar und ist recht klein. Habe bei Atmel Datenblätter zum Bus gefunde. Da stehen richtig Codezeilen drin und extra für Master und Slave.
Eine Frage kannst du mir beantworten. Beim At1284 steure ich ein Display mit 4x16 mit dem PCF8574 an. Habe dazu die Bib von Peter verwendet. Wie mache ich das beim SAM?
achim
 
Hallo Achim,
Beim At1284 steure ich ein Display mit 4x16 mit dem PCF8574 an. Habe dazu die Bib von Peter verwendet. Wie mache ich das beim SAM?

die Bibliothek für PCF8574 + alphanumerisches Display kenne ich nun leider nicht. Ich vermute aber, dass hier eigentlich nur der Bereich für die I2C Hardware (SERCOM) angepasst werden muss. Vielleicht reicht hier auch schon das ASF Beispiel aus. Im Idealfall ist alles andere unabhängig vom verwendeten Zielsystem und funktioniert beim MeagAVR genauso wie beim ARM.

Noch ein Tipp: Für konstante Strings im Flash Memory beim AVR verwendest du ja PROGMEM, beim ARM reicht hier "const char Text1[] = {...}"

Habe ein paar Probleme mit meinem "Gedächtnisses" in Form eines Sticks. Sind alle meine Daten drauf, damit auch wo anders was machen kann. Kommen nur noch Stömeldungen und versuche zu retten was geht.
Hmmm, ich hoffe, du hast Erfolg.

Dirk :ciao:
 
Es hat geklappt. Habe ca. 99% aller Daten retten können. Ein paar Datein z.B. Word mit 4M musste ich leider löschen.Was mich jetzt noch interessiert ist, ist der Stick defekt und lieber einen neuen nutzen oder geht er jetzt wieder.
achim
 
Kommt auf den Stick drauf an, ich hatte mal ein ähnlich fieses Problem. Der Stick geht noch, vertrauen tu ich dem aber nicht mehr. Und wenn Stick, dann nur noch von Resellern und Herstellern denen ich vertraue, kein 2€ bling bling shit von ebay. Es gibt auch Sticks mit sagen wir 8GB, physikalisch ist aber nur ein 2GB Chip drin. Nutzt du (respektive das Betriebssystem) nur diese 2GB funktioniert alles; kommste drüber werden existierende Daten überschrieben. So war es bei mir, in Quelltext Dateien waren auf ein Mal Bitmap Daten drin usw.

Ein anderes Beispiel (mit externen Festplatten aus PingPong) wäre hier zu finden.

Ich kann nur stark abraten (grade billig-) Sticks als "Arbeitsspeicher" zu verwenden. Als Transportmedium, ja, klar. Da hat man das Original ja aber auch noch. Aber halt nicht ohne Kopie wo Anders, wie der lokalen HDD/SSD.
 
Hallo Dirk
habe angefangen das I2C Programm auseinander zu nehmen. Habe einiges dazu gefunden. Mal schauen, ob ich es richtig verstanden habe.

void touch_configure_i2c_master(void){ /* Initialize config structure and software module. */ struct i2c_master_config config_i2c_master; i2c_master_get_config_defaults(&config_i2c_master); /* Change buffer timeout to something longer. */ config_i2c_master.buffer_timeout = 10000; config_i2c_master.pinmux_pad0 = PINMUX_PA16C_SERCOM1_PAD0; // SDA = PA16 config_i2c_master.pinmux_pad1 = PINMUX_PA17C_SERCOM1_PAD1; // SCL = PA17 i2c_master_init(&i2c_master_instance, CONF_I2C_MASTER_MODULE, &config_i2c_master); i2c_master_enable(&i2c_master_instance); }

Mit diesem Teil wird der Sercom init. und die Pins des IC angegeben.
Mit den folgenden Teilen überprüfst du die Zet der übertragung bei lesen und schreiben. Einstellung der Zeit mit timeout

while (i2c_master_write_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { if (timeout++ == TIMEOUT) { // Error LED_PB30_ON break; } }

while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { if (timeout++ == TIMEOUT) { // Error LED_PB30_ON break; } } }

Dabei hast du timeout auf 0 gesetzt.
Leider versteh ich das Teil nicht so richtig

packet.address = SLAVE_ADDRESS; packet.data_length = 1; packet.data = i2c_write_buffer;
packet.address = SLAVE_ADDRESS; packet.data_length = 32; packet.data = i2c_read_buffer;

Beim kleinen 8 Bit habe ich die Adresse gesendet bzw Daten gelesen
achim
 
Zuletzt bearbeitet von einem Moderator:
Das mit dem Codeeingabe oder zitieren gat wieder nicht geklappt. Das hat man da von wenn man zu weit den Kopf aus dem Bett steckt, ärgere mich
achim
 
Hallo Achim,

du solltest keine Zitate in eine Codebox setzen, das geht so nämlich nicht.

Es ist kein Problem, ich antworte am Wochenende und korrigiere dann auch deinen Beitrag.

Dirk :ciao:
 
Versuchen wir es noch mal. dirk hat ja bereits gesagt was ich falsch mache.
Habe mir den Beispielcode von Dirk vorgenommen und versucht zu verstehen. Wenn ich es richtig verstanden habe wird mit diesem teil I2C init gemacht.
void touch_configure_i2c_master(void){ /* Initialize config structure and software module. */ struct i2c_master_config config_i2c_master; i2c_master_get_config_defaults(&config_i2c_master); /* Change buffer timeout to something longer. */ config_i2c_master.buffer_timeout = 10000; config_i2c_master.pinmux_pad0 = PINMUX_PA16C_SERCOM1_PAD0; // SDA = PA16 config_i2c_master.pinmux_pad1 = PINMUX_PA17C_SERCOM1_PAD1; // SCL = PA17 i2c_master_init(&i2c_master_instance, CONF_I2C_MASTER_MODULE, &config_i2c_master); i2c_master_enable(&i2c_master_instance); }
Dabei besonders erst ein struct konfiguriert (korrekt?) und danach z.B. die Pins festgelegt an denen SCL und SDA anliegen sollen. Was ich dabei nicht verstehe ist das:
config_i2c_master.buffer_timeout = 10000;
timeout misst die Zeit der Verarbeitung und macht dann ... ?
und das:
i2c_master_init(&i2c_master_instance, CONF_I2C_MASTER_MODULE, &config_i2c_master);
In den Doku habe ich es oft so gesehen:


CodeBox C
while(i2c_master_init(&i2c_master_instance, SERCOM2, &config_i2c_master) != STATUS_OK);

Leider ist mir beides unklar.
while (i2c_master_write_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { if (timeout++ == TIMEOUT) { // Error LED_PB30_ON break; } }
Dirk schreibt es so. Unterschied?
while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK) { if (timeout++ == TIMEOUT) { // Error LED_PB30_ON break; } }
Einmal für schreiben und einmal für lesen? oder generell?
Bisher habe ich immer eine Adresse gesendet und Daten übertragen und gelesen. Was mach ich damit?
packet.address = SLAVE_ADDRESS; packet.data_length = 1; packet.data = i2c_write_buffer;
#define SLAVE_ADDRESS 0x12
Die Slave Adress ist 12, diese übergabe ich an packet.adress und wie geht es weiter?
Sorry für die vielen Fragen. Das alte Problem sind die Infos zum Thema, mehr als dürftig. Viel steht in den Doku zu ASF drin. Leider versteh ich noch nicht genau wie das alles gehen soll.
achim
 
Noch was vergessen.
Möchte als erstes einen PCF8574 betreiben. Der hat zwar 5V und der SAM 3,3V. Habe einen Pegelwandler dazwischen geschaltet. Verwende diesen Typ auf allen meinen Platinen. Sonst wird der Bus immer mit 5V betrieben, wegen der Stromstärke. Da ich LED Matrix betreibe kommen ich schnell mal auf mehrere Ampere. Wenn auf einem Modul 3,3V benötigt wird schalte ich einen Spannungswandler da vor.
achim
 
Dabei besonders erst ein struct konfiguriert (korrekt?) und danach z.B. die Pins festgelegt an denen SCL und SDA anliegen sollen.

Ja das ist richtig. In anderen Bereichen des ASF wird das auch so gemacht.

Was ich dabei nicht verstehe ist das:
config_i2c_master.buffer_timeout = 10000;
Das ist ein Timeout Wert, welche die _wait Funktionen nutzen. Diese geben dann auch einen Status STATUS_ERR_TIMEOUT zurück, falls es zu einem Timeout gekommen ist.
Der Timeout Wert muss zuvor in der Struktur festgelegt oder angepasst werden.
Wie im ASF Beispiel habe ich zusätzlich nocht einen Timeout Zähler dieser ist innerhalb der while Schleife eingebaut. Hier kann man also wiederholt lesen/schreiben. Das ist etwas irritierend im ASF Beispiel.


CodeBox C
while (i2c_master_write_packet_wait(&i2c_master_instance, &packet) != STATUS_OK)
   {
       if (timeout++ == TIMEOUT)
       {
            LED_PB30_ON
            break;
        }
    }


In den Doku habe ich es oft so gesehen:

while(i2c_master_init(&i2c_master_instance, SERCOM2, &config_i2c_master) != STATUS_OK);
Nein das kann eigentlich nicht sein, bei der _init Funktion nicht.

Einmal für schreiben und einmal für lesen? oder generell?



CodeBox C
i2c_master_write_packet_wait(&i2c_master_instance, &packet)
i2c_master_read_packet_wait(&i2c_master_instance, &packet)


Bei beiden Funktionen wird es geanuso gemacht. Zum Timeout kann es ja kommen, wenn der Slave nicht mit einem ACK antwortet, in beiden Fällen.

Zuvor definiertst du in der Package Struktur die Felder für Adresse, Datenlänge und Datenbuffer. Der Datenbuffer ist ein Array und kann für Schreiben und lesen unterschiedlich sein.

Die Slave Adress ist 12, diese übergabe ich an packet.adress und wie geht es weiter?

Beispiel:
Schreiben


CodeBox C
#define DATA_LENGTH 32

static uint8_t i2c_write_buffer[DATA_LENGTH];
static uint8_t i2c_read_buffer[DATA_LENGTH];

// ...

packet.address     = SLAVE_ADDRESS;  // 7bit Adresse
   packet.data_length = 1;  // ein Byte senden
   packet.data        = i2c_write_buffer;   // dieser Buffer wird verwendet
  
   i2c_write_buffer[0] = 0; // 0 wird gesendet
   timeout = 0;
   while (i2c_master_write_packet_wait(&i2c_master_instance, &packet) != STATUS_OK)
   {
       if (timeout++ == TIMEOUT)
       {
            LED_PB30_ON
            break;
        }
    }


Beispiel:
Lesen (äquivalent zu Schreiben)


CodeBox C
    packet.address     = SLAVE_ADDRESS;
   packet.data_length = 32; // 32 Byte lesen
   packet.data        = i2c_read_buffer;  
  
  
   timeout = 0;
  
   while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK)
   {
       if (timeout++ == TIMEOUT)
       {
           LED_PB30_ON
           break;
       }
   }  

// Wenn es fehlerfrei abgelaufen ist, sind befinden sich die 32 Byte im Array i2c_read_buffer
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)