Forum: Mikrocontroller und Digitale Elektronik AVR springt nicht aus Funktion


von Andreas (Gast)


Lesenswert?

Hi Leute,

ich bin Neu hier und habe ein merkwürdiges Problem mit meinem Programm:

1
#include <avr/io.h>
2
#include <stdio.h>
3
#include <stdint.h>
4
#include <stdlib.h>
5
#include <avr/interrupt.h>
6
#include <avr/pgmspace.h>
7
#include <util/delay.h>
8
9
#define Stat_LED_bl PC5
10
#define Stat_LED_rt PC6
11
12
void test_Funktion()
13
{
14
  PORTC |= (1<<Stat_LED_bl);    // blaue Status-LED einschalten
15
}
16
17
int main(void)
18
{
19
  test_Funktion();
20
  PORTC |= (1<<Stat_LED_rt);    // rote Status-LED einschalten
21
22
    while (1) 
23
    {
24
    
25
    }
26
}


Und zwar springt der Controller beim oben gezeigten Beispiel zwar in die 
Funktion "test_Funktion()", messbar durch die eingeschaltete blaue LED 
auf der Platine, aber dort einfach nicht mehr heraus. -> Die rote LED 
bleibt ausgeschaltet

Dabei ist es völlig egal was in der Funktion steht und welche Funktion 
auch aufgerufen wird. In der ersten, in die er springt verharrt der uC 
und wartet auf besseres wetter oder so...

Da ich mein Programm mitlerweile auf diesen kleinen Code 
heruntergebrochen habe, verschiedene "Schreibweisen" von Funktionen 
(z.B. void test(void), int test(void) und return-Befehle am Ende der 
Funktion) versucht habe, aber alles nichts gebracht hat, melde ich mich 
in meiner Verzweiflung bei euch...

Zu meinem Umgebung:
ATmega128
AVR Studio 7 (v7.0.790)

Da es das erste Mal ist, das ich mit AVR Studio 7 programmiere, schließe 
ich einen Bug oder falsche Einstellungen nicht aus, aber bei Onkel 
Google finde ich da rein garnichts zu...

Vieleicht hat wer von euch noch eine Idee!

Vielen Dank schonmal!

LG
Andreas

von Peter II (Gast)


Lesenswert?

Andreas schrieb:
> ATmega128

habe jetzt nicht nachgeschaut, aber einige ATmega haben ein 
Kompatibilitätsmodus die Standardmäßig aktiviert ist. Schau mal bei den 
Fuse ob du etwas findest.

Das führt zumindest genau zu dem verhalten.

von Guest (Gast)


Lesenswert?

Wie sieht denn die Schaltung dazu aus? Auf jeden Fall fehlt noch je eine 
1 im DDRC, damit die Pins auch getrieben werden.

von Frickelfritze (Gast)


Lesenswert?

Guest schrieb:
> Auf jeden Fall fehlt noch je eine
> 1 im DDRC, damit die Pins auch getrieben werden.

Richtig. Ein Wunder dass die blaue LED überhaupt was von sich gibt.

von Flip B. (frickelfreak)


Lesenswert?

fuer die rote reichen die paar ua einfach nicht. Schonmal beide 
untereinander getauscht?

von spess53 (Gast)


Lesenswert?

Hi

>habe jetzt nicht nachgeschaut, aber einige ATmega haben ein
>Kompatibilitätsmodus die Standardmäßig aktiviert ist. Schau mal bei den
>Fuse ob du etwas findest.

>Das führt zumindest genau zu dem verhalten.

Nö, macht es nicht. Im M103-Mode wäre PortC generell als Ausgang 
konfiguriert.

MfG Spess

von Stefan R. (1994rstefan)


Lesenswert?

Bist du dir sicher, dass er nicht mehr aus der Funktion heraus springt 
oder einfach die rote LED aus anderen Gründen nicht funktioniert?

Vertausche im Code einmal Stat_LED_bl und Stat_LED_rt, leuchtet dann 
auch die blaue LED oder funktioniert die rote dann?


Bezüglich DDRC - Standardmäßig ist beim ATmega128 der ATmega103 
Kompatibilitätsmodus aktiviert, solang dieser nicht deaktiviert wurde 
ist Port C sowieso als Ausgang konfiguriert.

von Kirsche (Gast)


Lesenswert?

Am besten in der LSS-Datei nachschauen oder diese posten.

von Peter D. (peda)


Lesenswert?

Andreas schrieb:
> Und zwar springt der Controller beim oben gezeigten Beispiel zwar in die
> Funktion "test_Funktion()", messbar durch die eingeschaltete blaue LED
> auf der Platine, aber dort einfach nicht mehr heraus.

M103-Fuse
Der Stack zeigt in den Wald.

von Andreas (Gast)


Lesenswert?

Hi Leute,

danke schonmal für die vielen Antworten! :)
Ich komme zwar nachher erst zum testen, aber vorab, natürlich 
funktioniert die rote LED! :P Bevor ich mit den Funktionen rumspiele, 
werden erstmal alle "Verbraucher" auf Funktion getestet.

Ausserdem ist es egal was hinter der Funktion steht, nichts von alle dem 
wird ausgeführt leider. ;(


LG
Andreas

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Andreas schrieb:
> Ausserdem ist es egal was hinter der Funktion steht, nichts von alle dem
> wird ausgeführt leider.

Deshalb tippe ich wie Peter auf die M103-Fuse. Wenn der Stack kaputt 
ist, dann kann er auch nach Funktionsaufruf nicht wieder zurückspringen.

Dein µC muss erstmal auf ATmega128 umgestellt werden. Und danach musst 
Du beide Pins noch auf Ausgang setzen, weil die dann nämlich nicht mehr 
standardmäßig auf Ausgang programmiert sind.

von Andreas (Gast)


Lesenswert?

Guten Morgen,

was soll ich sagen, ich habe gestern das Fuse-Bit gesetzt und nun 
funktioniert alles so wie es soll!

Danke!! :)

Auf die Idee wäre ich alleine nie gekommen...

Dann kann es ja weiter gehen und bei weiteren Fragen weiss ich ja nun, 
wo ich damit hinmuss :thumbsup:

LG
Andreas

von Oliver S. (oliverso)


Lesenswert?

Andreas schrieb:
> was soll ich sagen, ich habe gestern das Fuse-Bit gesetzt und nun
> funktioniert alles so wie es soll!

Ohne ein Bit in DDRC zu setzen? Das ist dann doch eher unwahrscheinlich.

> Auf die Idee wäre ich alleine nie gekommen...

Dafür gibt's hier u.a. sowas:
https://www.mikrocontroller.net/articles/AVR_Checkliste

Oliver

von Peter II (Gast)


Lesenswert?

Oliver S. schrieb:
> Ohne ein Bit in DDRC zu setzen? Das ist dann doch eher unwahrscheinlich.

warum? Beim PullUP leuchtet auch eine LED.

von Karl M. (Gast)


Lesenswert?

Peter II schrieb:
> warum? Beim PullUP leuchtet auch eine LED.

Wie soll das gehen ?

bei einem AVR liegt der Widerstandswert nach Vcc bei 30kOhm - 50kOhm.

von Peter II (Gast)


Lesenswert?

Karl M. schrieb:
> Wie soll das gehen ?
>
> bei einem AVR liegt der Widerstandswert nach Vcc bei 30kOhm - 50kOhm.

5V bei 50kOhm sind 0.1mA - das sieht man deutlich ein leuchten

von Frickelfritze (Gast)


Lesenswert?

Peter II schrieb:
> das sieht man deutlich ein leuchten

Nun, da gibt es wohl verschiedene Auffassungen zwischen
Leuchten und Leuchten. Insbesondere dann wenn man noch
die Aussenlicht-Bedingungen in Betracht zieht .....

von Andreas (Gast)


Lesenswert?

Nachtrag:

Das Data Direction Bit ist selbstverständlich gesetzt! :)
Nun funktionieren die Funktionen ja, sodass ich meine Funktion IO_init() 
ja nun auch aufrufen kann! :P

LG
Andreas

von Sterni (Gast)


Lesenswert?

Andreas schrieb:
> #define Stat_LED_bl PC5
> #define Stat_LED_rt PC6

Versuch mal, die Namen der #defines groß zu schreiben.
Ich meine mich erinnern zu können, das das schonmal zu Problemen geführt 
hat.
Also zum Beispiel:
#define STAT_LED_BL PC5

Viele Grüße
Sterni

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sterni schrieb:
> Versuch mal, die Namen der #defines groß zu schreiben.
> Ich meine mich erinnern zu können, das das schonmal zu Problemen geführt
> hat.

Da es nur eine Konvention ist, defines in Großbuchstaben zu schreiben, 
damit man sie als solche erkennen kann, ist Deine Aussage schlichtweg 
falsch.

von led (Gast)


Lesenswert?

Ich halt ja eine statisch LED nicht für eine geeignete Methode um den 
Lauf eines Programms zu testen.

Blinken und wenn auch bloß mit delays, das zeigt an ob das Programm 
läuft.

von Karl M. (Gast)


Lesenswert?

Hallo Peter,

Peter II schrieb:
> 5V bei 50kOhm sind 0.1mA - das sieht man deutlich ein leuchten

Bitte schreibe dann schon die richtig Formel hin:

Iled = (Udd - Uled)/50kOhm

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.