sonderbares define Problem mit AVR Studio 5

OP #2721839
Hallo,

ich habe ein kleines Problem:
ich habe eine define.h
da steht folgendes drin:
#define VER_1 ((PINA & 0x02) != 0)
#define VER_2 ((PINA & 0x01) != 0)
#define HOR_1 ((PINA & 0x08) != 0)
#define HOR_2 ((PINA & 0x04) != 0)


dann eine c Datei:
da verwende ich das folgendermaßen:
case 1:
if
((HOR_1 & (Richtung == DOWN)) | (HOR_2 & (Richtung == UP)) | (count_hor 
== Anzahl) ) {stop_hor = 1;
break;
};

Wobei es hier nur darum geht das HOR_1 und HOR_2 funktionieren, setze 
ich da VER_1 oder VER_2 ein, kommt folgende Meldung:
Error  1  'VER_1' undeclared (first use in this function) 
C:\Users\....\Motor.c  32  2  SolarTracker


Ich weiß, es heisst das es in der Funktion nicht deklariert ist, jedoch 
geht es mit den anderen, vorher definierten sachen..

ich bin wirklich ratlos?
1. Warum zeigst du den Code, der funktioniert, und nicht den der nicht 
funktioniert?

2. Formatiere bitte vernünftig, und verwende [c]...
So einen unformatierten Haufen will das doch keiner lesen (ich zumindest 
nicht).

3. Wieso verknüpfst du logische Ausdrücke (((PINA & 0x08) != 0) etc.) 
mit binären Operatoren (& und |)? Bist du sicher, daß du das willst?

4. Die Zeilennummer der Fehlermeldung hilft nur, wenn man weiß, welche 
Zeile in deinem Quelltext diejenige ist, welche.

5. Man kann nur helfen, wenn du den Quelltext soweit reduzierst wie 
möglich, sodaß der Fehler noch auftritt, und den dann vollständig 
zeigst.
Nur ein kleines Fragment zeigen wird hier nicht helfen.
Bspw. sehe ich in deiner C-Daei kein #include "define.h"

clemens kruse schrieb:
> ich bin wirklich ratlos?

ich auch
OP
also, entschuldig meine miese aufbereitung, hier nochmal richtig:

define.h:
1
#define VER_1 ((PINA & 0x02) != 0)
2
#define VER_2 ((PINA & 0x01) != 0)
3
#define HOR_1 ((PINA & 0x08) != 0)
4
#define HOR_2 ((PINA & 0x04) != 0)


meine test.c:
1
#include "define.h"
2
#include <avr/io.h>
3
#include "delay.h"
4

5
void test(){
6
HOR_1;
7
VER_1;   
8
};

die Fehlermeldung:

Error  2  'VER_1' undeclared (first use in this function) 
C:\Users\...test.c  15  1  SolarTracker
Warning  3  each undeclared identifier is reported only once for each 
function it appears in  C:\Users\...test.c  15  1  SolarTracker


Zu & und ||, das ist um alles Bitweise zu machen? funktioniert es dann 
auch korrekt? ich habe es ehrlich gesagt so aus dem Turorial gezogen.
clemens kruse schrieb:
> C:\Users\...test.c  15  1  SolarTracker

Soll 15 die Zeilennummer sein?
Soviele Zeilen hat die Datei doch gar nicht.

clemens kruse schrieb:
> };

das ; ist sicher falsch, aber hier wohl nicht das Problem.

clemens kruse schrieb:
> Zu & und ||, das ist um alles Bitweise zu machen? funktioniert es dann
> auch korrekt? ich habe es ehrlich gesagt so aus dem Turorial gezogen.

Es kommt drauf, an was du vorhast. Ich vermute: nein.

Nimm ein vernünftiges C-Buch, anstatt nach Gerüchten zu programmieren.
Und nein: man muß nicht jedem einzeln vorbeten, welche Operatoren es in 
C gibt und was sie machen. Das ist kein Fall für hier.
PS: im Zweifelsfall würde ich erst die System-Headerdateien einbinden, 
dann die eigenen. PIN.. etc. werden ja in den eigenen schon verwendet, 
außerdem möchte man mit eigenen #defines ja nichts ändern, was in den 
systemweiten Headern definiert wird.
Moderator Persönliche Seite
Klaus Wachtler schrieb:
> Die beiden Makros werden durch Quelltext ersetzt, der nichts tut.

Stimmt nicht ganz: das Register PINA wird zweimal eingelesen. ;-)

Naja, zumindest sollte es sich compilieren lassen.  Wenn ich
allerdings das oben gezeigte Schnipselchen nehme, eine leere
delay.h dazu anlege, und dann alles mit
1
avr-gcc -Os -mmcu=atmega1281 -c test.c

compiliere, dann funktioniert alles.  (Welchen Controller Clemens
wirklich benutzt, hat er uns lieber verschwiegen.)

D. h., das, was Clemens uns hier häppchenweise hinwirft, stimmt nicht
mit dem überein, was er wirklich benutzt.  (Einzige andere Möglichkeit:
seine "delay.h" enthält ein
1
#undef VER_1

was natürlich recht abstrus wäre. :)
OP
Klaus Wachtler schrieb:
>> HOR_1;
>
>> VER_1;
>
>
>
> Was soll das bewirken?
>
> Die beiden Makros werden durch Quelltext ersetzt, der nichts tut.

Das ist schon klar. Das habe ich auch nur gemacht um den Fehler zu 
reproduzieren.

Klaus Wachtler schrieb:
> clemens kruse schrieb:
>
>> };
>
>
>
> das ; ist sicher falsch, aber hier wohl nicht das Problem.


ist korrigiert - ich werde da manchmal etwas schluderig.

Klaus Wachtler schrieb:
> Nimm ein vernünftiges C-Buch, anstatt nach Gerüchten zu programmieren.
>
> Und nein: man muß nicht jedem einzeln vorbeten, welche Operatoren es in
>
> C gibt und was sie machen. Das ist kein Fall für hier.


ich arbeite daran. trotzdem vielen dank!
clemens kruse schrieb:
> Klaus Wachtler schrieb:
>>> HOR_1;
>>
>>> VER_1;
>>
>>
>>
>> Was soll das bewirken?
>>
>> Die beiden Makros werden durch Quelltext ersetzt, der nichts tut.
>
> Das ist schon klar. Das habe ich auch nur gemacht um den Fehler zu
> reproduzieren.

Das Problem ist, dass hier keiner deinen Fehler reproduzieren kann.
Du siehst keinen Fehler
Wir sehen keinen Fehler
Also liegt das eigentliche Problem wohl in den Teilen, die du nicht 
gezeigt hast.

Die Teile, die du gezeigt hast, in ein compilierbares Programm zu 
verpacken bringt nichts. Denn die werden compilieren, das brauchen wir 
gar nicht erst ausprobieren.

Wenn du weiter Hilfe brauchst, dann wird dir nichts anderes übrig 
bleiben als dein Original herzunehmen und abzuspecken. Alles was nicht 
unbedingt gebraucht wird, fliegt raus. Und das geht so lange, bis das 
Problem verschwindet. Die letzte problematische Version zeigst du dann 
und dann kann man sich gezielt auf die Suche machen.
Gast
Hast Du vielleicht im define.h so ein Konstrukt wie
1
#ifndef _DEFINE_H_
2
#define _DEFINE_H_
3

4
#define VER_1 ((PINA & 0x02) != 0)
5
...
6

7
#endif
drinn, das nicht funktioniert? Vielleicht Copy-Paste?
Moderator Persönliche Seite
Rufus Τ. Firefly schrieb:
> Diese Reihenfolge ist das Problem. "define.h" greift auf Definitionen
> zurück, die in <avr/io.h> gemacht werden, wird aber vorher eingebunden.

Nein, das ist nicht tragisch.  Die Makros werden erst beim Aufruf
expandiert, erst zu diesem Zeitpunkt müssen alle Definitionen
vorliegen.

Ich schrieb ja oben schon, dass ich seine Codeschnipselchen
erfolgreich compilieren konnte (nachdem ich mir ein leeres delay.h
dazu erzeugt habe).
OP
hat sich gelöst. Ich hatte in meinem jugendlichen Leichtsinn eine andere 
define.h im Projekt eingebunden als ich in dem Code inkludiert hatte. So 
wurden meine Änderungen einfach nicht compiliert. Jetzt geht alles! 
Vielen Dank nochmal!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.