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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren