Forum: Compiler & IDEs Blinky mit ATMega 128


von Florian M. (skywalker79)


Lesenswert?

Hallo,
ich habe ein Problem mit meiner ATMega 128 Schaltung. ich versuche schon 
länger eine LED zum blinken zu bekommen, die mit vcc verbunden ist und 
über den Controller auf Masse gezogen wird.
Aber ausser das sie entweder kontinuierlich, bzw. gar nicht leuchtet tut 
sich nichts.
Die LED die blinken soll hängt an PA0. An PA1 und PA2 sind ebenfalls 
LED, die dauerhaft leuchten sollen.
mein Quellcode dazu ist:

#include <avr/io.h>
#include <util/delay.h>

void delay_ms(int ms)
{
  int t;
  for(t=0; t<=ms; t++)
  _delay_ms(1);
}

void main(void)
{
  DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2);
  while(1)
  {
    PORTA &= ~(1<<PA0);
    delay_ms (100);
    PORTA |= (1<<PA0);
    delay_ms (100);
  }
}

bzw. als Versuch ohne delay:

#include <avr/io.h>


void main(void)
{
  int t;
  int f;

  DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2);
  while(1)
  {
    for (t=0; t<=10; t++)
    {
    PORTA &= ~(1<<PA0);
    }

    for (f=0; f<=10; f++)
    {
    PORTA |= (1<<PA0);
    }
  }
}

Wer kann mir sagen, wo mein Denkfehler liegt?

mfg Florian

von Markus (Gast)


Lesenswert?

Hmm,
scheint Du initialisierst den Port-Pin falsch:
1
DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2);
müßte doch
1
DDRA = (1 << PA0) | (1 << PA1) | (1 << PA2);
heißen ?

von Karl heinz B. (kbucheg)


Lesenswert?

DDA0 etc stimmt schon.
Spielt aber keine Rolle, da sowohl DDA0 als auch PA0
über ein #define jewiles zu 0 expandieren.

Das Programm an sich schaut soweit ok aus.
Aber es kommt schon mal vor, dass man ein extrem langsames
Blinken mit einem stationären Zustand verwechselt (wenn
das Blinken zb. sich über 20 Sekunden erstreckt).

Daher fragen wir mal die Umgebung ab.
Dein ATMega128 läuft mit welcher Taktfrequenz?
Weiss das auch der Compiler? (Sprich hast du oder AVR-Studio
auch das Makro F_CPU richtig besetzt?

Bist du ach 100% sicher, dass der Mega mit der von
dir genannten Taktfrequenz läuft? Wenn du nicht an
den Fusebits gespielt hast, dann läuft der mit 1Mhz
egal welchen Quarz du extern angeschlossen hast.

Also probier mal folgendes:
1
#define F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
void delay_ms(int ms)
7
{
8
  int t;
9
  for(t=0; t<=ms; t++)
10
  _delay_ms(1);
11
}
12
13
void main(void)
14
{
15
  DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2);
16
  while(1)
17
  {
18
    PORTA &= ~(1<<PA0);
19
    delay_ms (100);
20
    PORTA |= (1<<PA0);
21
    delay_ms (100);
22
  }
23
}

von Florian M. (skywalker79)


Angehängte Dateien:

Lesenswert?

Hallo,

Also mein Controller läuft mit einem 3,686411 MHz Quarz.
Ich habe mal einen Screenshot von den Fusebits angehängt. Laut 
Datenblatt sollte der Controller also auch auf den externen Quarz 
eingestellt sein. Ob dieser allerdings real auch anschwingt kann ich im 
moment ohne Oszi nicht nachprüfen.
Als Programmierumgebung nutze ich WinAVR und Ponyprog zum Programmieren.
Die Quarzfrequenz habe ich im Makefile eingestellt.

Derzeitiger Stand ist, das die LED alle drei leuchten. Durch setzen der 
Pins als Eingang mit DDRA=0xFF; bzw. DDRA=0x00; kann ich die LED 
anschalten bzw. ausschalten.
Nur das gewünschte blinken kommt nicht zustande.


mfg Florian

von Peter D. (peda)


Lesenswert?

Florian M. wrote:

> Ich habe mal einen Screenshot von den Fusebits angehängt.

Watchdog ein, was soll das ?

Vor dem Watchdog einschalten erstmal das Datenblatt dazu lesen !!!


Peter

von Karl heinz B. (kbucheg)


Lesenswert?

Mit welcher Optimierungsstufe betreibst du den Compiler.
Benutzte Os

Ansonsten: Verändere mal die Zeiten. Mach die 100 mal grösser
oder kleiner. Da stimmt irgendwas am Timing nicht.

Mach auch mal folgendes:

void main(void)
{
  DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2);
  PORTA = 0b00000100;

  ...

Jetzt muss Led2 nicht leuchten, Led1 leuchten und Led0
solte eigentlich blinken (aber das hatten wir schon).

Wenn das Muster Led2/nicht Led1/schon nicht da ist, dann
läuft der Prozessor aus irgendeinem Grund nicht. Denke
aber nicht dass das der Fall ist, da du ja anscheinend
eine Reaktion auf das Umschalten der Pins kriegst.


von Florian M. (skywalker79)


Lesenswert?

Danke, es lag am Watchdog.
Wie ich den allerdings Aktiviert habe weiss ich nicht.
Muss dann ungewollt passiert sein.

mfg Florian

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.