Forum: Mikrocontroller und Digitale Elektronik LED Stk600 und AVR32


von Christian S. (hunner)


Lesenswert?

Hi Leute,

ich bin Neuling und habe ein Problem mit mit einem selbst geschriebenen 
C-Code. Ich möchte eigendlich nur eine LED auf dem STK-Board ein- und 
wieder ausschalten. Als HW habe ich ein Stk600-Board, eine RCUC3C1-38 
Routing Platine und darauf eine TQFP100 für den MC. Der MC ist ein 
AVR32C3C1512C.

Hier mein Code:

#define FPBA_HZ 8000000
#define FCPU  64000000
#define TC_INSTANCE               &AVR32_TC0
#define TC_INSTANCE_IRQ           AVR32_TC0_IRQ0
#define TC_CHANNEL                0

#include <asf.h>
#include <AVR32/io.h>

int main (void)
{
  board_init();

  while (1)
  {
    gpio_clr_gpio_pin(AVR32_PIN_PC06);
    gpio_clr_gpio_pin(AVR32_PIN_PC07);

    gpio_set_gpio_pin(AVR32_PIN_PC06);
    gpio_set_gpio_pin(AVR32_PIN_PC07);
  }

}

Die LED kann ein- aber nicht mehr ausgeschalten werden was ich nicht 
verstehe warum. Ich denke, dass ich einen Fehler im C-Code gemacht habe.

Zum Code: Ich verwende AtmelStudio 6, dort habe ich ein neues Projekt 
erstellt. UserBoard->UC3C anschließend habe ich einen Namen vergeben und 
den o.g. Controller ausgewählt. Danach habe ich im ASF-Wizard 
GPIO,TC,SCIF, delay funktions und Generic board support hinzugefügt.

Sonst habe ich keine weiteren Einstellungen vorgenommen.
Nun hoffe Ich, dass mir von euch jemand einen Fehler oder eine falsche 
Einstellung sagen kann.

Evtl. bin ich heute Nachmittag nicht mehr am PC, so dass ich spätestens 
morgen zurückschreiben werde.

Besten Dank schon mal im Vorraus

Hunner

von Christian S. (hunner)


Lesenswert?

Also den Fehler habe ich gefunden. Ich habe die Anweisungen aus der 
While-Schleife genommen und schon gings. Das Problem war nur, dass der 
MC so schnell arbeitet, dass ich das Ausschalten der LEDs nicht bemerkt 
habe. Nun aber ein anderer Fehler. Ich habe zum Verzögern der Zeit 
zwischen dem Einschalten der beiden LEDs eine For-Schleife programmiert. 
egal was ich da für Zahlenwerte hineinschreibe, werden die beiden LEDs 
immer gleichzeitig eingeschalten. Ich habe auch mal die Funktion 
gpio_tgl_... zum toggeln eines Pins versucht, was aber keine Wirkung 
zeigte.
Evtl. hat jemand dazu eine Idee

von Karsandra (Gast)


Lesenswert?

Hallo Christian,

die While-Schleife ist eine Endlosschleife. Wenn Du die frei laufen 
läßt, dann wird die LED so schnell ein- und ausgeschaltet, dass Du die 
korrekten Vorgänge nur am Osziskop erkennen kannst.

Ich gehe davon aus, dass Du keinen Debugger benutzt. Dann könntest Du 
Schritt für Schritt schauen, ob die Befehle richtig abgearbeitet werden.

Alternativ könntest Du eine For schleife einbauen, die einfach nur 
hochzählt, um so eine Verzögerung zu erzeugen. Nimm einen großen 
Datentyp und taste Dich langsam heran. Als Startwert lass sie bis 1000 
zählen. Beid er Optimierungsoption solltest Du O0 (None) einstellen, 
sonst könnte Sie entfallen, weil der Kompiler keinen ausführbaren Code 
erkennt.

Außerdem sehe ich nicht, dass Du der GPIO-Funktion mitteilst, dass 
PC6_PIN06 und PIN07 als Ausgang funktionieren sollen.

Also überprüfe, ob in der board_init()

so etwas Ähnliches drin steht:

gpio_configure_pin(AVR32_PIN_PC06,GPIO_DIR_OUTPUT | GPIO_INIT_HIGH);
gpio_configure_pin(AVR32_PIN_PC07,GPIO_DIR_OUTPUT | GPIO_INIT_HIGH);

Wenn nicht, denn hinzufügen.

Du hast einen Timer definiert und instanziert. Wenn benutzt Du ihn? Wozu 
brauchst Du ihn? Ich kann nirgends eine Stelle im Code finden, wo Du ihn 
abfragst.

Wird in Deiner Board-init die sys_clk_init() des ASF aufgerufen?

Ansonsten bleiben die Einstellungen für FPBA und FCPU wirkungslos, weil 
als Standard-Oszillator der RC-Oszilllator mit 115 kHz benutzt wird.

Tipp: Im Zweifel empfiehlt es sich die Beispiele zu benutzen.

Hoffe das reicht erst einmal, für den Anfang

Viel Erfolg ...

von Henry P. (henrylexx)


Lesenswert?

Hey,

vielleicht hier noch zwei hilfreiche Links:
http://blog.anujrai.com/

https://www.kth.se/social/upload/191/Writing%20your%20own%20program%20(AVR32%20Studio)_mg_20100831.pdf

und hier hats zippi auch ganz gu erklärt:
Beitrag "AVR32UC3A Port setzen"

hier das TUT von ihm was sich im Aufbau befindet:

http://avr32-wiki.de/

von Christian S. (hunner)


Lesenswert?

Habe den Fehler gefunden. Mir hat jemand erzählt, dass AtmelStudio leere 
for-Schleifen wegrationalisiert.
Ich würde jtzt gerne einen Baustein mittels TWI ansteuern. Hat jemand 
ein Beispielcode für meinen Controller?

von Dr.Who (Gast)


Lesenswert?

Scheitern am LED-Toggeln und jetzt auf TWI stürzen? Vergiss es :)
Grundlagen wären eher angebracht.

von Christian S. (hunner)


Lesenswert?

Mein Program funktioniert jetzt so weit. An dieser Stelle mal vielen 
Dank an Karsandra und Henry. Das mit dem TWI werde ich wohl erst noch 
mal stehen lassen und die Grundlagen anschauen.
Allen beteidigten an dieser Stelle vielen Dank für die Hilfe.

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.