PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Rücksprung Probleme



Furay
19.06.2013, 09:55
Hallo zusammen,

ich hab bei meinem Projekt ein Problem beim zurückspringen aus eigenen Funktionen.
Ich denke mal es ist nur ein trivialer Fehler - nur leider sehe ich ihn nicht,Ggoogle hat mich auch net weiter gebracht...

Ein kleines Testprogramm soll die LED im 1 Hz Takt blinken lassen.



#define F_CPU 8000000UL

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

void LED_ON(); //Prototyp
void LED_OFF(); //Prototyp

int main(void)
{
DDRC = 0x1C; //Richtung festlegen

while(1)
{
LED_ON();

_delay_ms(500);

LED_OFF();

_delay_ms(500);

}
}

//LEDs einschalten
void LED_ON()
{
PORTC = 0x1C;
}

//LEDs ausschalten
void LED_OFF()
{
PORTC = 0x00;
}


Controller: ATMEGA128L
Programmer: AVR Dragon
Prog.Oberfläche: AVR Studio 6

Leider gehen die LEDs nur an und das wars.
Beim Debuggen sehe ich das er beim zurückspringen nicht in die Main, sonderen irgendwo in den leeren Speicherbereich springt und ab da weiter läuft bis er wieder am Anfang ist.

Grüße

Furay

oberallgeier
19.06.2013, 10:32
... Beim Debuggen ... zurückspringen nicht in die Main, sonderen irgendwo ...Ich bin ja nicht sicher, dass es ein Parameterproblem ist - Du deklarierst nämlich Deine Prototypfunktionen ohne Parameterdefinition.

...
void LED_ON(); //Prototyp
...
Auch die Funktion selbst ist ohne Parameterdefiniton . . . bei mir sieht ein Funktionsprototyp etwa so aus:

...
void itxt_rn (void); // "\r\n"
...sprich: es ist eindeutig definiert, dass die Funktion ohne Parameter aufgerufen wird und auch keine/n zurückgibt. Lediglich der Funktionsaufruf geht (meines Wissens) mit der einfachen, leere Klammer für die Parameterübergabe. Meckert der Compiler das nicht an???

Furay
19.06.2013, 11:11
Hallo oberallgeier,

der Compiler hat dies nicht angemosert, nicht mal eine Warnung ist da.
Ich hab nun beim Prototyp und bei der Funktion nun das void reingeschrieben, leider auch dies ohne Erfolg.

Grüße und Danke

Furay

oberallgeier
19.06.2013, 11:24
Doofe Frage: Wo hängt denn die LED? Du schaltest ja (je nachdem ob die LEDs gegen GND oder VCC liegen) die Ports PC2, PC3 und PC4 ein, die anderen aus (oder eben nur die aus und die andern - dauernd - ein).

Furay
19.06.2013, 11:35
Es Hängen nur 3 LEDs an PC2,3 und 4. diese werden über eine Transistorstufe geschalten.

Wenn ich den Port direkt in der Schleife (so wie in den Funktionen) beschreibe, funktioniert das blinken auch problemlos.
Der Funktionsaufruf macht nur Probleme...

Klebwax
19.06.2013, 12:31
Die leere Klammer ist schon ok, obwohl man dort ein void einsetzen sollte. Der ganze Code sieht gut aus.

Ich könnte mir vorstellen, daß der Stack nicht in Ordnung ist. Da das aber der Start-Up Code automatisch erledigt, könnte das nur passieren, wenn der Compiler für die falsche CPU übersetzt. Der Stackpointer könnte dann auf eine Adresse zeigen, an der kein RAM existiert. Ist aber nur eine dürre Vermutung

MfG Klebwax

Furay
19.06.2013, 13:01
Ich hab nochmal mit "Device Programming" mal den Flash gelöscht und neu beschreiben. Ebenso geprüft was für ein Chip erkannt wird.

Der ausgewählte Chip passt und nach dem löschen und beschreiben hab ich das Problem nach wie vor. :(

oberallgeier
19.06.2013, 13:30
Ich bin ja nicht sicher ... Du deklarierst ... Prototypfunktionen ohne Parameterdefinition ...Wieder etwas gelernt - Dein eingangs zitierter Code wird auch bei mir (AVRSTudio 4.18 Build 700, WinAVR-20100110) problemlos compiliert.

Und er läuft problemlos - einfach aus Deinem Posting rauskopiert, compiliert und geflasht, mit Deinen Funktionen/Funktionsaufrufen! Target mega1284P, 20 MHz, eigene (Servo-)Platine, die Ports PC2, ~3 und ~4 werden laut Oskar einwandfrei geschaltet - etwa im Sekundentakt.


... Der Funktionsaufruf macht nur Probleme ...Und deshalb bin ich vollends hilflosverwirrterstauntbeleidigtkommentarlos.

Furay
19.06.2013, 13:34
An irgendwelchen Einstellungen an den FUSES könnte das nicht liegen oder einstellenung bzw. RAM?

oberallgeier
19.06.2013, 13:54
Sorry, musste mir erst das Datenblatt laden. Das neueste Datenblatt /Rev. 8151H–AVR–02/11/ schreibt:

"... The Atmel®AVR® ATmega128A is by default shipped in ATmega103 compatibility mode ..." und
"...Port C also serves the functions of special features of the ATmega128A as listed ..." und
"... PORTC will be output during first power up, and until the ATmega103 compatibility mode ..."

Vielleicht mal den ATmega103 compatibility mode abschalten (ich will einfach nicht für Dich das ganze DAtenblatt durchackern).

Furay
19.06.2013, 14:09
Dankeschön. Das war das Problem.
Ich hab bei den FUSES das M103 umgestellt und schon gings...

Für die Nachwelt vielleicht... hier steht es auch nochmal:

http://www.mikrocontroller.net/articles/AVR_Checkliste

Grüße

Furay

oberallgeier
19.06.2013, 14:33
... Das war das Problem ... Für die Nachwelt vielleicht ...Die Nachwelt wills nicht lernen; ich habe das schon soo oft und viel kürzer geschrieben:
Der Umgang mit Mikrocontrollern ohne das zugehörige Datenblatt zu lesen ist eines der letzten großen Abenteuer unserer Tage.

HeXPloreR
19.06.2013, 16:46
... Das war das Problem ... Für die Nachwelt vielleicht ... Die Nachwelt wills nicht lernen; ich habe das schon soo oft und viel kürzer geschrieben:
Der Umgang mit Mikrocontrollern ohne das zugehörige Datenblatt zu lesen ist eines der letzten großen Abenteuer unserer Tage.

hehe...Drama Baby ;) ...naja so schlimm wird es schon nicht sein.

@Furay: Ich finde es gut das Du es hier schreibst woran es nun gelegen hat. Viele melden sich einfach nicht mal mehr. Vielleicht schämen sie sich weil sie sich mal irgendwann irgendwo richtig vertan haben und nicht weiter wussten...und das auch noch in ein Forum schreiben...um gottes willen, wie kan man nur. Allerdings haben die wenigsten ja hier das Zeug komplett inhaliert, so das man sagen kann...jeder hat mal irgendwie angefangen, der eine besser der andere schlechter.

Sogar ich habe mich über das Datenblatt des ATmega8 hergemacht, damit mich son "ZwischendrinInterruptAusstieg mit GOTO" ;) nicht aus der Bahn wirft, wenigstens wollte ich wissen warum das so ist.
(@Oberallgeier: Hoffe Dein "Abenteuer" sollte keine Link zu "Indiana Jones" enthalten...von wegen mit Glück klappt es schon ;) )

Aber ein Abenteuer bleibt es dennoch...hoffentlich...

Furay
20.06.2013, 08:33
@HEXPloreR: Ich schäme mich für meine Fehler nicht, auchs wenn kleinigkeiten sind, das passiert ja auch den Besten.
Jedoch weiß ich von genügenden Suchen in Forums das es bei der Lösung des Problems dann nur heißt "juhu es geht".
Eine Zusammenfassung oder der Gleichen schreiben die Wenigsten, somit kommt man nicht drum herum den ganzen Beitrag zu lesen... was Zeit frist.

SprinterSB
20.06.2013, 12:18
> der Compiler hat dies nicht angemosert,
> nicht mal eine Warnung ist da.

Dann setze -Werror=strict-prototypes -Werror=missing-prototypes

oberallgeier
20.06.2013, 13:40
... nicht angemosert ... setze -Werror=strict-prototypes -Werror=missing-prototypesHallo SprinterSB - schöner Hinweis. Hat mich grad zu ner halben Stunde Suche animiert um zu sehen, wo um alles in der Welt ich so etwas setzten soll/kann.

Ich sehe nur in meinen Custom Compilation Options in [All files] - die default settings
-Wall
-gdwarf-2
-std=gnu99
-0s
-funsigned-char
-funsigned-bitfields
-fpack-struct
-fshort-enums

In der Hilfe vom AVRStudio (4.18 Build 700) : keinen Hinweis gefunden. Im http:...avr-libc/user-manual/... : keinen Hinweis gefunden. Beim rum-goocke(l)n : keinen Hinweis gefunden. Vielleicht machts doch die Hitze?

Bitte um Hilfe, danke.

Wsk8
20.06.2013, 14:01
-Wstrict-prototypes (C and Objective-C only)Warn if a function is declared or defined without specifying the argument types. (An old-style function definition is permitted without a warning if preceded by a declaration which specifies the argument types.)


-Wmissing-prototypes (C and Objective-C only)Warn if a global function is defined without a previous prototype declaration. This warning is issued even if the definition itself provides a prototype. The aim is to detect global functions that fail to be declared in header files.

http://gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Warning-Options.html

Beim AVR Studio 6.1:
Eigenschaften->AVR/GNU C Compiler->Miscellaneous->Other flags: ....

mfg

sternst
20.06.2013, 16:03
Hat mich grad zu ner halben Stunde Suche animiert um zu sehen, wo um alles in der Welt ich so etwas setzten soll/kann.

Ich sehe nur in meinen Custom Compilation Options in [All files] - die default settings
-Wall
-gdwarf-2
-std=gnu99
-0s
-funsigned-char
-funsigned-bitfields
-fpack-struct
-fshort-enums
Und darunter gibt es ein leeres Feld in das man was eintippen kann und einem Button "Add".
Wozu könnten diese beiden Dinge unterhalb einer Liste von Optionen wohl gut sein?

oberallgeier
20.06.2013, 16:21
... ein leeres Feld in das man was eintippen kann ...Stimmt, vielen Dank, das hatte ich gesehen. Aber "etwas eintippen..." kenne ich als den Beginn vieler Übel, wenn ich nicht weiß, was ich wie eintippen kann und welche Konsequenzen das hat. Hatte mich oben leider schlecht ausgedrückt: ich will gerne im Voraus wissen worauf ich mich einlasse, warum etwas wie vorgegeben oder ausgeschlossen wird um möglichst wenig in experimentelle Softwareentwicklung zu geraten.


... um zu sehen, wo um alles in der Welt ich so etwas setzten soll/kann ...Dieses "wo" wäre ja klar gewesen, aber ob die Syntax von SprinterSB´s Beispiel für mich stimmt - und welche sonstigen Parameter möglich wären, das hatte ich gesucht, das wollte ich wissen. Vor dem Eintippen.

Im Link von Wsk8 steht das ja schön, ausgiebig und ausführlich - und ich bin (endlich, wusste vorher garnicht wie viel über diese Einflussmöglichkeiten ich nicht wusste) ein Stückchen klüger. Vielleicht hilfts bei mir ; - )