Blinky mit ATMega 128

OP #426448
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
#426468
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
}
OP #426482
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
Angehängte Dateien:
#426505
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.