Forum: Mikrocontroller und Digitale Elektronik Probleme mit erstem Programm für ATMega128


von Matthias (Gast)


Lesenswert?

Hallo,

ich habe folgendes einfaches Programm (basierend auf einem Beispiel):

#include <stdio.h>
#include <inttypes.h>
#include <avr/io.h>

#define F_CPU      14745600
#define BAUD_RATE    115200

#define LED_DDR  DDRB
#define LED_PORT PORTB
#define LED_PIN  PINB
#define LED      PINB7

int main(void)
{
  asm volatile("nop\n\t");

  uint32_t l;
  for (;;)
  {
    LED_PORT |= (1 << LED); // LED EIN
    for(l=0; l<2000000; ++l);
    LED_PORT &= ~(1 << LED); // LED AUS
    for(l=0; l<20000000; ++l);
  }
}

ich comiliere es mit Eclipse.

dann lade ich es mit uisp auf den µc:

uisp -dprog=stk200 -dpart=atmega128 -dlpt=0x378 --upload if=HelloAVR.hex

Ich öffne ein Terminal auf der seriellen Schnittstelle (es ist ein 
Crumb128 eval-Board mit Bootloader. Der Bootlaoder meldet sich, ich 
drücke "j" was die Adresse 0x00 anspringen soll um das Programm 
auszuführen. Leider blink die LED dann jedoch nicht und der Bootloader 
reagiert bis zum Reset auch nicht mehr.

Kann mir Jemand helfen, ich sehe nicht was ich falsch mache!

Danke und Gruß
Matthias

von Karl heinz B. (kbucheg)


Lesenswert?

Du hast den Led-Port nie auf Ausgabe gestellt.

int main(void)
{
  asm volatile("nop\n\t");

  uint32_t l;

  LED_DDR = ( 1 << LED );

  for (;;) {
   ...

von Matthias (Gast)


Lesenswert?

sorry, dummer Fehler....

also nochmal:
#include <avr/io.h>

#define F_CPU      14745600
#define BAUD_RATE    115200

#define LED_DDR  DDRB
#define LED_PORT PORTB
#define LED_PIN  PINB
#define LED      PINB7

int main(void)
{
  asm volatile("nop\n\t");
  LED_DDR |= (1 << LED); // LED auf Ausgang
  uint32_t l;
  for (;;)
  {
    LED_PORT |= (1 << LED); // LED EIN
    for(l=0; l<2000000; ++l);
    LED_PORT &= ~(1 << LED); // LED AUS
    for(l=0; l<20000000; ++l);
  }
}


Aber funktionieren tut es immer noch nicht.

von Karl heinz B. (kbucheg)


Lesenswert?

Auf welcher OPtimierungsstufe compilierst du?

von Ole H. (tragichero)


Lesenswert?

volatile uint32_t l;  könnte helfen, der compiler killt dir sonst deine 
schleifen... ;-) je nach optimierung

von Matthias (Gast)


Lesenswert?

volatile uint32_t l; hab ich jetzt drin.

Alle Compileroptionen:
-fmessage-length=0 -Wall -Wstrict-prototypes -I/usr/avr/include 
-mmcu=atmega128 -minit-stack=__stack -O0 -fshort-enums -fpack-struct 
-funsigned-char -funsigned-bitfields -std=gnu99 -g2

ich habe dieses Plugin zur Einstellung von Eclipse benutzt:
http://www.mikrocontroller.net/attachment.php/285349/org.eclipse.cdt.avrgcc_1.0.16.zip

von Matthias (Gast)


Lesenswert?

Kann ich über ein Fuesbit einstellen, dass der Controller nicht erst den 
Bootloader anspringt, nur um einen Fehler darin auszuschließen?

von Matthias (Gast)


Lesenswert?

Also jetzt läuft es!

Scheinbar kann es Controller nicht richtig geflasht werden, wenn der 
Botoloader drauf ist.Das denke ich weil:

Ich habe daher erst einen download gemacht -> orig_dl.hex
dann den Flash komplett gelöscht.
Dann das Programm von oben allein auf den Controller geflasht: GEHT!
Dann habe ich wieder einen Download gemacht -> hello_dl.hex
Dann orig_dl.hex und hello_dl.hex gemischt, d.h. den Anfang von 
hello_dl.hex und den Rest von orig_dl.hex (Bootloader ganz am Ende) dann 
das ganze wieder auf den Controller geflasht, und jetzt startet erst der 
Bootloader und dann kann ich das Programm anspringen.

Aber wie würde man das richtig machen? warum geht es nicht, wenn ich das 
Programm "einfach so" auf den Controller flashe?

Gruß
Matthias

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.