Pogrammierung SAM D21 mit Atmega ICE und SWD

Hallo
habe mein erstes eigene Programm geschrieben. Ist nichts neues oder weltbewegendes. Manche bezeichnen sowas als "Hello World" mal anders.
Es soll eine LED blinken, ganz einfach. Es läuft dank der Hilfe von Dirk. Es bringht aber eine Warnung die ich nicht so richtig verstehe

#include <asf.h>
#define LED1 PIN_PB30 // Angabe Pin
void configure_pins(void) // unterprogramm Pins init
{
struct port_config config_port_pin;
port_get_config_defaults(&config_port_pin);
config_port_pin.direction = PORT_PIN_DIR_OUTPUT;
port_pin_set_config(LED1, &config_port_pin);
}
int main (void)
{
system_init(); // system wird init
delay_init(); // delay init
configure_pins(); // Pins init Unterprogramm
while(1)
{
port_pin_toggle_output_level(LED1);
delay_ms(1000); // Pause 1000ms
}
}

Warnung:
no previous prototype for 'configure_pins'

Noch eine Frage.
Verwende ich mehrere LED oder schalte sie frei im Programm, muss ich dann mehrmals configure_pins aufrufen mit unterschiedlichen Angaben zu den LEDs oder können mehrere LEDs angeben werden und wie oder kann ein ganzer Port angegeben werden?

achim
 
Noch eine Frage.
Verwende ich mehrere LED oder schalte sie frei im Programm, muss ich dann mehrmals configure_pins aufrufen mit unterschiedlichen Angaben zu den LEDs oder können mehrere LEDs angeben werden und wie oder kann ein ganzer Port angegeben werden?

Du kannst hier die Group Funktionen des ASF verwenden.



CodeBox C
// Beispiel: Alle Pins von PORTB als Ausgang (PIN_PB31 ... PIN_PB0)
port_get_config_defaults(&config_port_pin);
config_port_pin.direction = PORT_PIN_DIR_OUTPUT;  // output
port_group_set_config(&PORTB, 0x0000FFFF, &config_port_pin);


Weitere Infos findest du hier ...
ASF Explorer -> Port - GPIO pin Control -> API Documentation

void port_group_set_config ( PortGroup *const port, const uint32_t mask, const struct port_config *const config )

Writes a Port group configuration group to the hardware module.
Writes out a given configuration of a Port group configuration to the hardware module.
Note
If the pin direction is set as an output, the pull-up/pull-down input configuration setting is ignored.
Parameters
[out] port Base of the PORT module to write to
[in] mask Mask of the port pin(s) to configure
[in] config Configuration settings for the pin group
 
Wenn ich ASF richtig verstanden habe, kann ich mit 0x000FFFF auch mehrere verschiedene Ausgänge setzen.

Ja das zweite Argument ist eine Maske.

Mit 0x00000C00 würdest du Pin 10 und 11 als Ausgang setzen, alles andere wird nicht geändert.
 
Hallo Dirk
habe im ASF Explorer auch einiges gelesen, z.B. als Gruppe und mehr. Eines ist mir noch unklar.
Habe in meinem kleinen Programm die LED1 als PIN_PB30 definiert. Wie kann ich das definieren wenn ich mehrere Ausgänge habe oder sogar Gruppen?
Nehme an, das es für Eingänge gleich ist? Nicht output sondern halt input.

achim
 
Habe in meinem kleinen Programm die LED1 als PIN_PB30 definiert. Wie kann ich das definieren wenn ich mehrere Ausgänge habe oder sogar Gruppen?

Hier müsstest du die Port-Mask für PB30 verwenden
PORT_PB30
das entspricht (1ul<<30)

port_group_set_config(&PORTB, PORT_PB30, &config_port_pin);

wenn du mehrere Pins in der Gruppe hast, dann "verodern"

port_group_set_config(&PORTB, PORT_PB30 | PORT_PB31, &config_port_pin);

probiere es mal aus.

Nehme an, das es für Eingänge gleich ist? Nicht output sondern halt input.
Ja, es wird dann eben nur eine andere Konfiguration zugewiesen.
 
Hallo Dirk
port_group_set_config(&PORTB, 0x0000FFFF, &config_port_pin);
Du verwendest hier 0x0000FFFF
Ja das zweite Argument ist eine Maske.

Mit 0x00000C00 würdest du Pin 10 und 11 als Ausgang setzen, alles andere wird nicht geändert.

Verwende meinen Taschenrechner oder ein kleines Programm zur Umrechnung zwischen HEX-DEZ-Binär. Wie kann man das ganze vernünftig rechnen? Welchen Weg nehmen. Im Grunde geht es dabei um die einzeönen Ports/Pins, Auf Grund der Bauweise verwende ich teilweise sehr unterschiedliche Pins, Bei unterschiedlichen Ports ist es keine Frage. Du gibst als Beispiel 0x00000C00 an. das sind PIN 10 und 11. Wie geht es z.B. am besten bei PB30 und PB04.
Sorry stehe dabei im Wald.
achim
 
Wie geht es z.B. am besten bei PB30 und PB04.
Hallo Achim,

ich hatte oben schon mal geschrieben, dass du hier die Port-Maske der Portpins verodern müsstest.

port_group_set_config(&PORTB, PORT_PB30 | PORT_PB04, &config_port_pin);

das entspricht

port_group_set_config(&PORTB, (1ul<<30) | (1ul<<4), &config_port_pin);

Stellst du die binär dar, hast du bei der Maske eine 1 auf Bit30 und eine 1 auf Bit4, alles andere ist 0. Nur für diese Portpins wird die Konfiguration angewandt.

Probiere es einfach mal aus.

Dirk :ciao:
 
Hallo
habe noch so meine Probleme damit. Gerade die group Funktion klappt nicht. Vielleicht könnte mal jemand es ansehen und mir sagen wo der Fehler liegt.


CodeBox C
// Angabe LED
   struct port_config config_port_pin;                   // ok LED G
   port_get_config_defaults(&config_port_pin);           // ok LED G
   config_port_pin.direction = PORT_PIN_DIR_OUTPUT;   // ok LED G
   port_pin_set_config(LEDG, &config_port_pin);       // ok LED G
   
   // Angabe Taster
   port_get_config_defaults(&config_port_pin);           // ok Taster 1
   config_port_pin.direction = PORT_PIN_DIR_INPUT;       // ok Taster 1
   config_port_pin.input_pull = PORT_PIN_PULL_UP;       // ok Taster 1
   port_pin_set_config(Button1, &config_port_pin);       // ok Taster 1
   
   // Gruppe
   //port_group_set_config(&PORTB, 18, &config_port_pin);
   port_group_set_config(&PORTB, PORT_PB04 | PORT_PB05, &config_port_pin);
   config_port_pin.direction = PORT_PIN_DIR_OUTPUT;
   config_port_pin.input_pull = PORT_PIN_PULL_DOWN;
   port_pin_set_config(Button2, &config_port_pin);

und das nächste


CodeBox C
if (port_pin_get_input_level(Button2))           // Taste 4
         {
           //port_group_set_output_level(&PORTB, PORT_PB04 | PORT_PB05);
           port_pin_toggle_output_level(PORT_PB04 | PORT_PB05);       // 30
           delay_ms(500);
           
           //port_group_set_output_level(&PORTB, PORT_PB04 | PORT_PB05, 0);
           port_pin_toggle_output_level(PORT_PB04 | PORT_PB05);       // 30
           delay_ms(500);
         }


mit Taster und LED klappt alles. Gebe noch an:


CodeBox C
#define LEDG  PIN_PB30                       //PA03                //define the pins
//#define LEDR  PIN_PB04
#define Button1   PIN_PB22                   //PB23 PA13
#define Button2  PIN_PB23


Mit dem Taster 1 und LEDG klappt alles. Habe einige dahinter geschrieben. Teilweise habe ich alles sehr ausführlich gemacht.
achim
 


CodeBox C
   // ...
   // Angabe Taster
   port_get_config_defaults(&config_port_pin);           // ok Taster 1
   config_port_pin.direction = PORT_PIN_DIR_INPUT;       // ok Taster 1
   config_port_pin.input_pull = PORT_PIN_PULL_UP;       // ok Taster 1
   port_pin_set_config(Button1, &config_port_pin);       // ok Taster 1
  
   // Gruppe
   //port_group_set_config(&PORTB, 18, &config_port_pin);
   port_group_set_config(&PORTB, PORT_PB04 | PORT_PB05, &config_port_pin);
   config_port_pin.direction = PORT_PIN_DIR_OUTPUT;
   config_port_pin.input_pull = PORT_PIN_PULL_DOWN;
   port_pin_set_config(Button2, &config_port_pin);


Du möchtest PB04 und PB05 als Output konfigurieren. Diese Pins konfigurierst du aber als Input mit aktiviertem Pullup.



CodeBox C
port_pin_toggle_output_level(PORT_PB04 | PORT_PB05);

... funktioniert nicht. Da port_pin_toggle_output_level einen GPIO_Pin (uint8_t) erwartet und nicht eine Port-Maske für eine Gruppe. Außerdem ist PB04 und PB05 noch Input.
 
Habe jetzt den Taster und die LED getrennt. Als einzelner Aufruf eines GPIO funktiniert es. Habe aber grosse Schwierigkeiten die Grupp zu definieren.


CodeBox C
// Angabe Taster 2
   port_get_config_defaults(&config_port_pin);           // ok Taster 2
   config_port_pin.direction = PORT_PIN_DIR_INPUT;       // ok Taster 2
   config_port_pin.input_pull = PORT_PIN_PULL_UP;       // ok Taster 2
   port_pin_set_config(Button2, &config_port_pin);       // ok Taster 2
   
   // Gruppe LED
   port_get_config_defaults(&config_port_pin);           // ok LED G
   config_port_pin.direction = PORT_PIN_DIR_OUTPUT;   // ok LED G
   port_group_set_config(&PORTB, (1ul<<5) | (1ul<<4), &config_port_pin);

habe die Angabe von dir eingetragen. Wird aber als Fehler ausgegeben.
Wie muss ich das dann aufrufen?
achim
 


CodeBox C
port_group_set_config(&PORTB, (1ul<<5) | (1ul<<4), &config_port_pin);

hier wird das (1ul<<5) | (1ul<<4) in schwarz angezeigt.

Dann konnt noch das:

Message expected 'uint8_t {aka const unsigned char}' but argument is of type 'PortGroup * {aka struct <anonymous> *}'
Message expected 'uint8_t {aka const unsigned char}' but argument is of type 'PortGroup * {aka struct <anonymous> *}'
Warning passing argument 1 of 'port_pin_toggle_output_level' makes integer from pointer without a cast [-Wint-conversion]
Warning passing argument 1 of 'port_pin_toggle_output_level' makes integer from pointer without a cast [-Wint-conversion]
 
Ich vermute es hat mit dieser Zeile nichts zu tun. Bei mir wird diese auch fehlerfrei kompiliert.

Der Fehler ist irgendwo anders. Eventuell postest du dein komplettes .c File, damit man den Fehler zu einer Zeile in deinem Sourcecode zuordnen kann.
 


CodeBox C
#include <asf.h>

#define LEDG  PIN_PB30                       //PA03                //define the pins
//#define LEDR  PIN_PB04
#define Button1   PIN_PB22                   //PB23 PA13
#define Button2  PIN_PB23

void configure_port_pins(void);

void configure_port_pins(void)        //setup of the configuration of the pins
{       
   // Angabe LED
   struct port_config config_port_pin;                   // ok LED G
   port_get_config_defaults(&config_port_pin);           // ok LED G
   config_port_pin.direction = PORT_PIN_DIR_OUTPUT;   // ok LED G
   port_pin_set_config(LEDG, &config_port_pin);       // ok LED G
   
   // Angabe Taster 1
   port_get_config_defaults(&config_port_pin);           // ok Taster 1
   config_port_pin.direction = PORT_PIN_DIR_INPUT;       // ok Taster 1
   config_port_pin.input_pull = PORT_PIN_PULL_UP;       // ok Taster 1
   port_pin_set_config(Button1, &config_port_pin);       // ok Taster 1
   
   // Angabe Taster 2
   port_get_config_defaults(&config_port_pin);           // ok Taster 2
   config_port_pin.direction = PORT_PIN_DIR_INPUT;       // ok Taster 2
   config_port_pin.input_pull = PORT_PIN_PULL_UP;       // ok Taster 2
   port_pin_set_config(Button2, &config_port_pin);       // ok Taster 2
   
   // Gruppe LED
   port_get_config_defaults(&config_port_pin);           // ok LED G
   config_port_pin.direction = PORT_PIN_DIR_OUTPUT;   // ok LED G
   //port_group_set_config(&PORTB, (1ul<<5) | (1ul<<4), &config_port_pin);
   port_group_set_config(&PORTB, 30, &config_port_pin);
   
   
   
   
   
}

int main (void)
{
   system_init();                         //initialization
   delay_init();
   configure_port_pins();                 //configuration of the pins

   while (1)
   {
       if (port_pin_get_input_level(Button1))           // Taste 3   
         {
           port_pin_toggle_output_level(LEDG);           // PB30
           delay_ms(500);
           port_pin_toggle_output_level(LEDG);           // PB30
           delay_ms(500);
         }
       
       if (!port_pin_get_input_level(Button2))           // Taste 4
         {
           //port_group_set_output_level(&PORTB, PORT_PB04 | PORT_PB05);
           //port_pin_toggle_output_level(PORT_PB04 | PORT_PB05);       // 30
           port_pin_toggle_output_level(&PORTB, 30,30);       // 30
           delay_ms(500);
           
           //port_group_set_output_level(&PORTB, PORT_PB04 | PORT_PB05, 0);
           //port_pin_toggle_output_level(PORT_PB04 | PORT_PB05);       // 30
           port_pin_toggle_output_level(&PORTB, 30, 0);       // 30
           delay_ms(500);
         }
       
       
   }
}

Das ist der komplette Code. Es sind noch einige Sachen drin, die auskommentiert sind oder was ich geändert habe. Vielleicht siehst du was nicht richtig ist.
achim
 
port_pin_toggle_output_level hat einen Parameter nicht drei. Dadurch lässt sich nicht kompilieren.
Ansonsten sehe ich keinen Fehler.
Dirk :ciao:
 
Hallo Dirk
hab da noch eine Idee zum Fehler.


CodeBox C
[QUOTE="achim S., post: 41086, member: 2968"]port_group_set_config(&PORTB, (1ul<<5) | (1ul<<4), &config_port_pin);[/QUOTE]

Die Angabe (1ul<<5) | (1ul<<4) wird bei mir schwarz dargestellt. Hatte es bei delay auch gesehen. Bis ich die Bibliothek delay eingebunden hatte. Welche Bibliotheken verwendest du genau? Hatte auch gelesen das <strukt> verwendet werden soll (anderer Prozessor oder war es XAt.. ). Gibt es Bibliotheken die man generell für so ziemlich alles brauchen kann?


CodeBox C
[QUOTE="Dirk, post: 41087, member: 1"][B]port_pin_toggle_output_level[/B] hat einen Parameter nicht drei.[/QUOTE]

Das war ein Versuch von mir einem anderen Beispiel zu folgen. Hat auch nicht geklappt. Wie muss ich die Funktion aufrufen, wenn es mal klappt? Mit &PORTB?
achim
 
Das war ein Versuch von mir einem anderen Beispiel zu folgen. Hat auch nicht geklappt. Wie muss ich die Funktion aufrufen, wenn es mal klappt? Mit &PORTB?

Im zweiten Post vom Thema hatte ich ein Beispiel mit den Port-Pin-Funktionen gepostet.
Pogrammierung SAM D21 mit Atmega ICE und SWD

Welche Bibliotheken verwendest du genau?

Für die GPIO Port Funktionen aus dem ASF benötigst du "Port - GPIO Pin Control". Alle Routinen und Funktionen sind in der API Dokumentation beschrieben.

Dirk :ciao:
 

Ü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)