Forum: Compiler & IDEs Win AVR funktioniert nicht richtig !! Hilfe.


von Micha (Gast)


Lesenswert?

Hallo, ich hoffe jemand kann mir Helfen. Ich habe ein Programm was 
definitiv funktioniert. Meine Nixi Uhr leuft schon 1 Jahr damit. Jetzt 
wolte ich das Programm verbessern und die Prüfbits auswerten. Habe das 
alte Programm neu abgespeichert, und die Makefile kopiert. Das Programm 
wird comperliert, jedoch funktioniert es nicht mehr. Am Programm kann es 
nicht ligen. Wenn ich die alte Datei erneut comperlire, geht es genauso 
wenig.

Hat jemand ne idee woran das ligen könnte?


> "make.exe" all

-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.


Compiling C: Nixie_Uhr_4_1.c
avr-gcc -c -mmcu=at90s8515 -I. -gstabs -DF_CPU=4000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=./Nixie_Uhr_4_1.lst  -std=gnu99 -Wundef 
-MMD -MP -MF .dep/Nixie_Uhr_4_1.o.d Nixie_Uhr_4_1.c -o Nixie_Uhr_4_1.o
In file included from Nixie_Uhr_4_1.c:16:
C:/WinAVR/avr/include/avr/signal.h:36:2: warning: #warning "This header 
file is obsolete.  Use <avr/interrupt.h>."
In file included from Nixie_Uhr_4_1.c:17:
C:/WinAVR/avr/include/avr/delay.h:36:2: warning: #warning "This file has 
been moved to <util/delay.h>."

Linking: Nixie_Uhr_4_1.elf
avr-gcc -mmcu=at90s8515 -I. -gstabs -DF_CPU=4000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=Nixie_Uhr_4_1.o  -std=gnu99 -Wundef -MMD 
-MP -MF .dep/Nixie_Uhr_4_1.elf.d Nixie_Uhr_4_1.o --output 
Nixie_Uhr_4_1.elf -Wl,-Map=Nixie_Uhr_4_1.map,--cref     -lm

Creating load file for Flash: Nixie_Uhr_4_1.hex
avr-objcopy -O ihex -R .eeprom Nixie_Uhr_4_1.elf Nixie_Uhr_4_1.hex

Creating load file for EEPROM: Nixie_Uhr_4_1.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 
Nixie_Uhr_4_1.elf Nixie_Uhr_4_1.eep || exit 0

Creating Extended Listing: Nixie_Uhr_4_1.lss
avr-objdump -h -S Nixie_Uhr_4_1.elf > Nixie_Uhr_4_1.lss

Creating Symbol Table: Nixie_Uhr_4_1.sym
avr-nm -n Nixie_Uhr_4_1.elf > Nixie_Uhr_4_1.sym

Converting to AVR COFF: Nixie_Uhr_4_1.cof
avr-objcopy --debugging --change-section-address .data-0x800000 
--change-section-address .bss-0x800000 --change-section-address 
.noinit-0x800000 --change-section-address .eeprom-0x810000 -O coff-avr 
Nixie_Uhr_4_1.elf Nixie_Uhr_4_1.cof
Warning: file C:/DOCUME~1/EWEDDI~1/LOCALS~1/Temp/ccQNdaaa.s not found in 
symbol table, ignoring
Warning: ignoring function __vectors() outside any compilation unit
Warning: ignoring function __bad_interrupt() outside any compilation 
unit

Size after:
AVR Memory Usage
----------------
Device: at90s8515

Program:    6306 bytes (77.0% Full)
(.text + .data + .bootloader)

Data:         37 bytes (7.2% Full)
(.data + .bss + .noinit)



-------- end --------


> Process Exit Code: 0
> Time Taken: 00:02

von Klaus Falser (Gast)


Lesenswert?

Vielleicht solltest Du die Meldungen des Compilers lesen.
Da steht daß einige Headerfiles nicht zu tauschen sind.

<avr/signal.h>    auf    <avr/interrupt.h>
<avr/delay.>      auf    <util/delay.h>

von Klaus Falser (Gast)


Lesenswert?

Entschuldigung, muß heißen :
Da steht daß einige Headerfiles zu tauschen sind.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Am Programm kann es nicht ligen.

Jaja....

Hatte ich heute schon mal zitiert:

"Absence of evidence is no evidence of absence."

Die Tatsache, dass dein Programm mit einer x-beliebigen Version eines
y-beliebigen Compilers zum Zeitpunkt z mal einen funktionsfähigen Code
generiert hat, heißt doch noch lange nicht, dass es deshalb fehlerfrei
ist.  Es kann genauso gut sein, dass da irgendein Fehler drin steckt,
der just unter diesen Randbedingungen halt keine Auswirkungen hatte.

Je aggressiver den Compilern das Optimieren gelehrt wird (und das will
ja letztlich jeder, dass die Compiler möglichst gut optimieren), um so
mehr subtile Fehler (in den zu übersetzenden Programmen, nicht im
Compiler!) können sich letztlich auch in Nichtfunktionieren des
Ergebnisses niederschlagen.

Genug allgemeines Gefasel: wenn du Hilfe bekommen willst, musst du dir
schon die Mühe machen, dein Problem einzugrenzen und dann ggf.  hier
den Sourcecode posten, bei dem du nicht mehr verstehst, warum es jetzt
nicht mehr funktionieren will.

Nur so viel noch: die paar Warnungen, die du da bekommst, tun gar
nichts zur Sache.  Du kannst (und solltest) die geänderten Headerfiles
anpassen, aber all das ist nicht die Ursache deiner Probleme.

von Oliver (Gast)


Lesenswert?

>Ich habe ein Programm was definitiv funktioniert.

Das wäre eine Premiere für die Menschheit :-))

Ganz dumme Frage (aus eigener schlechter Erfahrung): Bist du dir 1000% 
sicher, den richtigen Source-Code archiviert und erneut compiliert zu 
haben?

Oliver

von Micha (Gast)


Angehängte Dateien:

Lesenswert?

Also, erstmahl vielen dank für die Tips.
Die 2 Warnungen:
C:/WinAVR/avr/include/avr/signal.h:36:2: warning: #warning "This header
file is obsolete.  Use <avr/interrupt.h>."
In file included from Nixie_Uhr_4_1.c:17:
C:/WinAVR/avr/include/avr/delay.h:36:2: warning: #warning "This file has
been moved to <util/delay.h>."

sind schon mal weg. Das, das Programm geht bin ich mir in sofern sicher 
da die Hex Dadei die sich im selben Verzeichniss wie die .c Datei 
befunden hat,nach übertragung in die Uhr funktioniert hat. Jedoch nach 
erneuten Compelieren nicht mehr. Das ist zumindest sehr seltsam. Aber 
gut vieleicht liegt es ja trotzdem am Quellcode. Ich habe noch  nicht so 
viel Prorammiererfahrung und das Programm ist denke ich recht 
Zusammengeschustert.
Ich versuche trotztem mal den Fehler einzugrenzen:
Nach übertragen des neu compelierten Programms, liest die Uhr die Zeit 
richtig aus, jedoch Sie zeigt keine Sekunden mehr an.
Normalerweise lauft die Uhr beim Neustat bei 00:00:00 an und zshlt die 
Sekunden hoch !
Das ganze mache ich im Programm über den Timmer:
Dieses stück Code ist übrigens auch, von diesen Forum:

//Timer einstellen
TCCR1B = (1<<CS10) | (1<<CS11);       //setzt den Prescaler 64
OCR1A = 62500;                         //setzt den Vergleichswert
TCNT1 = 0;                             //startewert des Counters
TIMSK = 1<<OCIE1A;                     //Compare-Int aktivieren
sei();                                 //globale Ints aktivieren
TCCR0 = (1<<CS00) | (1<<CS02);      //prescaler 1024 Bei einen 
Zhlerdtand von 4 sind 1,024 ms vergangen
TCNT0 = 0;

Dieser Timmer ruft jetzt jede Sekunde diese Routine auf:
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
 //wird ausgeführt wenn der Counterwert mit dem Vergleichswert 
übereinstimmt
  // Uhrenroutine
  s++;
  TCNT1 = 0; //timer 1 auf null
if (s == 60)
{
s = 0;
m++;
Anzeige(s,m,h);
}
if (m == 60)
{
m = 0;
h++;
if (h == 24)
h = 0;
Anzeige(s,m,h);
}
}
Welche dann die Sekunden Hochzahlt.
und mit Anzeige(s,m,h) anzeigt.

Ich glaube immernoch das WinAVR irgendwas falsch macht:
Was heisen diese Fehlermeldungen:
Warning: ignoring function __vectors() outside any compilation unit
Warning: ignoring function __bad_interrupt() outside any compilation
aus meinen ersten Post ?

von Oliver (Gast)


Lesenswert?

>Ich glaube immernoch das WinAVR irgendwas falsch macht:
Das glaube ich nicht. Er macht vielleicht etwas anders, als die alte 
Version, aber richtig "falsch" ist verdammt unwahrscheinlich.

Die Warnungen kommen vom coff-Konverter, und haben nichts zu bedeuten. 
Das coff-File benötigst du sowieso nicht.
(http://winavr.sourceforge.net/WinAVR-user-manual.html)

Zeigt die Uhr gar nichts mehr an, oder nur nach dem Start?
Kannts du auch dein makefile mal anhängen?

Oliver

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

SIGNAL wurde in ISR umbenannt, daher vermutlich auch die Warnung.
Lies mal die aktuelle Doku, wie Du das portieren kannst.

von Micha (Gast)


Lesenswert?

Danke Danke, Fehler gefunden !
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
 //wird ausgeführt wenn der Counterwert mit dem Vergleichswert
übereinstimmt
  // Uhrenroutine
  s++;
  TCNT1 = 0; //timer 1 auf null
!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Hier fehlt: Anzeige(s,m,h);
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

if (s == 60)
{
s = 0;
m++;
Anzeige(s,m,h);
}
if (m == 60)
{
m = 0;
h++;
if (h == 24)
h = 0;
Anzeige(s,m,h);
}
}
Werkwürdig aber war. Ich kam drauf wie ich meinen 2. Post geschrieben 
hab. Die funktioniert normal zeigte aber keine Sekunden an.
Keine Ahnung, wie sich diese Zeile gelöscht hat !
In der Orginaldatei ist Sie jedenfals vorhanden. Ist warscheinlich beim 
umkopieren was schief gegangen.

Jeden fals vielen Dank für eure Hilfe!

Manschmal sieht man den Wald vor lauter Bäumen nicht, aber es zeigt auch 
wenn man sich mit dem Problem logisch auseinandersetzt, kommt man meist 
auf die Lösung.

Autor: Oliver (Gast)
Datum: 29.03.2007 08:23

>Ich habe ein Programm was definitiv funktioniert.

Das wäre eine Premiere für die Menschheit :-))

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.