Forum: Compiler & IDEs Frage zu Code vom AVR Studio 4 auf 6


von Achim S. (achims)


Lesenswert?

Hallo Gemeinde
in einem Programm steht:
1
#define INT_CNTDWN_INIT (int) ((0.2L * F_CPU) / (CKDIV_VALUE * 256L * INT_PRESCALE))

geschrieben mit dem AVR Studio 4. Das bezieht sich auf diese Zeile
1
int_cntdwn = INT_CNTDWN_INIT;

Leider meckert der Compiler im AVR Studio 6 und ich versteh nicht was 
der Unterschied ist
Fehlermeldung:
1
Error  1  'cntdwn_init' undeclared (first use in this function)  E:\AAA Technik\Robot\RNC Programme\ATB_Test_1\ATB_Test_1\ATB_Test_1.c  261  16
(unklare Funktion)

Leider versteh ich das nicht. Könnte mir jemand zeigen was ich falsch 
mache?
achim

: Verschoben durch User
von Dieter M. (Gast)


Lesenswert?

> #define INT_CNTDWN_INIT
> 'cntdwn_init'


"INT_CNTDWN_INIT" und "cntdwn_init" ist nicht so ganz dasselbe.
Also falls Du das #define wirklich so gemacht hast

von Peter II (Gast)


Lesenswert?

Achim S. schrieb:
> int_cntdwn

gibt es einfach nicht. Wo ist die variabel deklariert, welchen Datentype 
hat sie?

von HildeK (Gast)


Lesenswert?

Achim S. schrieb:
>  int_cntdwn = INT_CNTDWN_INIT;
> 'cntdwn_init' undeclared ...

Deine Fehlermeldung und dein (gezeigter) Code passen nicht zusammen.
Offenbar hast du int_cntdwn irgendwo definiert und das wird auch nicht 
angemeckert.
An anderer Stelle (nicht gezeigt) verwendest du aber cntdwn_init und das 
ist nirgends deklariert und wird deshalb zu Recht vom Compiler 
bemängelt.

Suche einfach mal in deinem Programm nach cntdwn_init und prüfe, ob du 
an der Stelle nicht int_cntdwn verwenden wolltest ...

von Karl H. (kbuchegg)


Lesenswert?

Achim S. schrieb:

>
1
> Error  1  'cntdwn_init' undeclared (first use in this function)  E:\AAA 
2
> Technik\Robot\RNC Programme\ATB_Test_1\ATB_Test_1\ATB_Test_1.c  261  16
3
>
> (unklare Funktion)

undeclared bedeutet doch nicht 'unklare Funktion'.

undeclared bedeutet schlicht und ergreifend nur, dass du einen Namen 
benutzt hast, für den es nirgendwo eine Definition gibt.
Das kann sein, weil du tatsächlich vergessen hast, eine Variable oder 
Funktion zu definieren.
Das kann natürlich auch ein simpler Tippfehler sein, oder ein 
Buchstabendreher, ein Gross-Kleinschreibungsfehler oder irgendsowas in 
dieser Richtung. Du meintest eigentlich 'Heustadel', hast aber 
'Stricknadel' geschrieben.
Tatsache ist jedoch, dass der von dir benutzte Name im Code nirgends 
definiert wurde (sei es als Variable oder als Funktion. Hier muss es 
logischerweise eine Variable sein, weil es sich ja um eine Zuweisung 
handelt).


> Leider versteh ich das nicht.

Wie lange programmierst du jetzt schon?
2 Jahre? 3 Jahre?
Und in diesem Zeitraum ist dir nie ein 'undeclared'-Error untergekommen 
und du hast darüber sinniert, was dafür die Ursache ist?


(Mit dem Unterschied zwischen Definition und Deklaration will ich dich 
jetzt erst mal nicht langweilen.)

: Bearbeitet durch User
von achim (Gast)


Lesenswert?

Hallo Karl Heinz
danke an alle für die Hilfe
Das Programm stamt aus ca 2009 (?) mit AVR Studio 4. Habe es übersetzt 
auf Studio 6. Soweit alle Fehler oder änderungen gefunden. Konnte mir 
nicht so recht einen Reim auf die Sache machen, da es mit AVR St 4 
funktioniert. Mit euren Hinweisen werde ich das mal angehen.
Das Programm stammt nicht von mir. Habe vom Autor die Erlaubnis 
bekommen, die Soft- und Hardware zu nutzen.
achim

von Achim S. (achims)


Lesenswert?

Habe es noch mal kontrolliert. Hat sich was eingeschlichen. Hoffe das es 
jetzt richtig ist.
1
#define INT_CNTDWN_INIT (int) ((0.2L * F_CPU) / (CKDIV_VALUE * 256L * INT_PRESCALE))

Es kommt dann diese Fehlermeldung

Error  3  'F_CPU' undeclared (first use in this function)  E:\AAA 
Technik\Roboter\RN-Controll\

und bezieht sich auf duiese Zeile:
1
int_cntdwn = INT_CNTDWN_INIT;

allerdings das Stück nach dem = Zeichen. Das doch oben definiert?
Steh irgendwie auf dem Schlauch.
achim

von Kaj (Gast)


Lesenswert?

Achim S. schrieb:
> Es kommt dann diese Fehlermeldung
>
> Error  3  'F_CPU' undeclared (first use in this function)  E:\AAA
> Technik\Roboter\RN-Controll\
>
> und bezieht sich auf duiese Zeile:
Der Fehler (und das ist ganz klar ersichtlich!) bezieht sich auf F_CPU!
Entschuldigung, aber liest du die Fehlermeldungen?
1
'F_CPU' undeclared (first use in this function)
Der Compiler bzw. der Präprozessor kann F_CPU nicht finden. Es fehlt 
etwas wie
1
#define F_CPU <hier wert einragen>

von BirgerT (Gast)


Lesenswert?

Achim S. schrieb:
> Error  3  'F_CPU' undeclared (first use in this function)  E:\AAA
> Technik\Roboter\RN-Controll\

Mensch Achim, Du der Verfasser des Tutorials, wie man mit AVR Studio 6 
programmiert/einsteigt?

Unter Projekt Properties -> Compiler -> Symbols F_CPU='taktfrequenz in 
Hertz'UL eintragen.

Das die Fehlermeldung erst in der Zeile mit
int_cntdwn = INT_CNTDWN_INIT;
gemeldet wird, liegt daran das der Compiler dort folgendes übersetzen 
will
int_cntdwn = (int) ((0.2L * F_CPU) / (CKDIV_VALUE  256L  
INT_PRESCALE))

Alles klaro..

von Achim S. (achims)


Lesenswert?

Du hast recht, habe es gerade gefunden und eingestellt. Eigentlich kommt 
der Fehler woanders her. Dazu müsste jemand was sagen.
Verwende den Ati 2313 ohne Quarz mit internen Generator mit der 
Einstellung

Ex 0x77
Hi 0xDF
Lo 0xE4

Mit dieser Einstellung läuft er mit 8MHz ohne Teiler.
Wird die F_CPU übernommen?
achim

von BirgerT (Gast)


Lesenswert?

Mit F_CPU teilst DU dem Compiler mit, mit welcher Taktfrequenz des 
Prozessor er rechnen soll.

Und die Flags werden auch separat eingestellt (ohne Compiler).

Ich glaube nicht, dass bisher jemand daran gedacht hat, die Taktfrequenz 
aus den Fusebits zu berechnen ;-)

Und das Fuseorakel solltest Du auch kennen
http://www.engbedded.com/fusecalc/

von Achim S. (achims)


Lesenswert?

Hallo Birger
du hast ja vollkommen recht. Bloss das blöde dabei ist, ich hab keinen 
Quarz drin (zum ersten mal arbeite ich mit dem internen). Die Frage 
dabei ist doch, muss ich die Frequenz eintragen. Da das Stück geht, 
würde ich sagen ja. Es sieht jetz so aus.
1
#define INT_PRESCALE 8L    
2
#define CKDIV_VALUE   8L  
3
#define PRESCALER  ((1 << CS01) | (1 << CS00))
4
#define INT_CNTDWN_INIT ((0.2L * 16000000) / (CKDIV_VALUE * 256L * INT_PRESCALE))

Wahrscheinlich kann man das ganze noch vereinfachen. Brauche es nicht so 
kompliziert machen.
Die Zeit kann mit der folgenden Teil verlängert oder verkürzt werden.
1
uint8_t prog_door() 
2
  {
3
/* Einstellen der Türaktivierdauer nach wiederholtem Drücken des Programmiertaste ohne Codeeingabe */
4
    while(1) 
5
      {
6
        waitforkeyrelease();
7
        /* Plus-Taste erhöht Aktivierdauer */
8
        if ((keyreleased0 & (1 << PROG_DOOR_PLUS))  > 0 && (init_doorcntdwn < 100) ) init_doorcntdwn++;
9
        /* Minus-Taste reduziert Aktivierdauer */
10
        if ((keyreleased0 & (1 << PROG_DOOR_MINUS)) > 0 && (init_doorcntdwn >   5) ) init_doorcntdwn--;
11
        /* Türöffner zum Test aktivieren */
12
        if ((keyreleased0 & (1 << PROG_DOOR_TEST)) > 0) set_door_on();
13
        if (PROGKEYWASRELEASED) 
14
          {
15
            /* geänderte Türaktivierdauer in EEPROM ablegen */
16
  cli();
17
  eeprom_write_byte(&eeprom_initdoorcntdwn, init_doorcntdwn);
18
  sei();
19
  break;
20
          };
21
        if ((keyreleased0 & ((1 << PROG_DOOR_PLUS) | (1 << PROG_DOOR_MINUS) | (1 << PROG_DOOR_TEST))) == 0) 
22
          {
23
            /* undefinierte Taste wurde betätigt */
24
  /* veränderte Türaktivierdauer verwerfen, alten Wert aus EEPROM laden */
25
  init_doorcntdwn = eeprom_read_byte(&eeprom_initdoorcntdwn);
26
  break;
27
          };
28
        };     /* while */
29
      set_door_off();
30
      SET_LED_OFF(1 << LED_PROG_PB)
31
      return STATE_READ_CODE;
32
};

Bin noch am suchen, wie es zusammenhängt. Die Zeit lässt sich noch nicht 
verändern. Die Abfrage der Tasten geht dabei ohne Probleme.
achim

von BirgerT (Gast)


Lesenswert?

Achim S. schrieb:
> Die Frage
> dabei ist doch, muss ich die Frequenz eintragen. Da das Stück geht,
> würde ich sagen ja.

JA - aber in der Form
#define F_CPU 8000000UL
wenn Du die 8Mhz intern verwendest, und dann

#define INT_CNTDWN_INIT ((0.2L * F_CPU) / (CKDIV_VALUE  256L 
INT_PRESCALE))

Jetzt läuft Deine Büchse mit doppelt so langem CountDown - oder?

von Achim S. (achims)


Lesenswert?

Da ist noch was anderes drin, was ich suche. Als Statusanzeige sind 3 
LED drin die zu Anfang 3x blinken. Zuerst waren die so lngsam das der 
Anlauf 3 Minuten gebraucht hat. Jetzt sind die auf 1 Sekunde 
eingestellt. Die Frequenz und die komische Teilung muss ich noch 
anpassen. Das blöde ist aber der Türöffner. Schaltet so für 90 Sekunden 
ein. Optimal ist so 20 Sekunden mit Veränderung zwischen 5 und 30 
Sekunden. Diese Werte werden im EEPROM gespeicher und stehn auch nach 
Stromausfall zur Verfügung. Das ganze Programm ist als Statemaschine 
geschrieben. Im Ablauf steige ich erst langsam durch
achim

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.