mikrocontroller.net

Forum: Compiler & IDEs Blinky mit ATMega 128


Autor: Florian M. (skywalker79)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define F_CPU 1000000UL

#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);
  }
}

Autor: Florian M. (skywalker79)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Florian M. (skywalker79)
Datum:

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

mfg Florian

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.