www.mikrocontroller.net

Forum: Compiler & IDEs Wie binde ich im AVR-Studio ein C-File ein?


Autor: H. G. (ledi)
Datum:
Angehängte Dateien:
  • preview image for c1.PNG
    c1.PNG
    6,42 KB, 173 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Ich habe im AVR-Studio ein C-Programm geschrieben und möchte nun weitere 
C-Programmteile einbinden.
Das habe ich unter Source-Files <create new sourcefiles> gemacht.
Um das zu testen, habe ich im testfile eine Funktion geschrieben, welche 
ich vom Hauptprogramm aufrufe.

Beim Compilieren erhalte ich dann Fehlermeldungen mit ...first use in 
this function.

Muss ich im HP das neue c-File irgendwie bekannt machen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heimo G. schrieb:
> Ich habe im AVR-Studio ein C-Programm geschrieben und möchte nun weitere
> C-Programmteile einbinden.
> Das habe ich unter Source-Files <create new sourcefiles> gemacht.
> Um das zu testen, habe ich im testfile eine Funktion geschrieben, welche
> ich vom Hauptprogramm aufrufe.
>
> Beim Compilieren erhalte ich dann Fehlermeldungen mit ...first use in
> this function.

Zeig bitte die ganze Fehlermeldung und deinen Code

> Muss ich im HP das neue c-File irgendwie bekannt machen?

Nein. Aber wenn du eine Funktion aufrufen willst, brauchst du einen 
Prototypen, der normalerweise in einem Header File sitzt.

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich rufe im HP die beiden Funktionen im Testfile:

char TX_SPI_Master_Transmit_1
und
char TX_Strobe_1
auf.


Dieser Code steht im Testfile:

char TX_SPI_Master_Transmit_1(char cCommand, char cData)//, char cStrobe)
{
  PORTD &=   ~(1<<PD3);      // SS = low
  _delay_us(500);          // Delaytime before start transmission

  SPDR = cCommand;        // Start transmission adress to FIFO
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete

  SPDR = cData;          // Start transmission data to FIFO
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete

  PORTD |= (1<<PD3);        // SS = high
  _delay_us(500);

  return SPDR;          
}

char TX_Strobe_1 (char cCommand)
{
  PORTD &=   ~(1<<PD3);      // SS = low  
  _delay_us(50);          // Delaytime before init rf-settings

  SPDR = cCommand;        // STROBE TX
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete

    while (!((PINB) &(1<<PB4)));  // Wait for GDO0 to be set -> sync transmitted
    while ((PINB) &(1<<PB4));      // Wait for GDO0 to be cleared -> end of packet
  return SPDR;
}


hier das HP:
#include <avr/io.h>
#include <util/delay.h>
#include "SMARTRF_CC2500.h"

void SPI_Master_Init(void)
{
  SPCR &=    ~(1<<DORD);  // Send MSB first
  SPCR |=    (1<<MSTR);  // Controller = Master
  SPCR &=    ~(1<<CPOL);  // CLK positiv phase
  SPCR &=    ~(1<<CPHA);  // Sampling data @ rising edge
  SPCR |=    (1<<SPR1);  // CLK / 64 = 125kHz

  DDRB |=    (1<<PB1);  // Set MOSI output
  DDRB &=    ~(1<<PB0);  // Set MISO input
  DDRB |=    (1<<PB7);  // Set SCK output
  DDRB &=    ~(1<<PB4);  // Set GDO0 input

  DDRD |=    (1<<PD3);  // Set SS output 

  SPCR |=    (1<<SPE);  // SPI enable
}

char TX_SPI_Master_Transmit(char cCommand, char cData)//, char cStrobe)
{
  PORTD &=   ~(1<<PD3);      // SS = low
  _delay_us(500);          // Delaytime before start transmission

  SPDR = cCommand;        // Start transmission adress to FIFO
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete

  SPDR = cData;          // Start transmission data to FIFO
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete

  PORTD |= (1<<PD3);        // SS = high
  _delay_us(500);

  return SPDR;          
}

char TX_Strobe (char cCommand)
{
  PORTD &=   ~(1<<PD3);      // SS = low  
  _delay_us(50);          // Delaytime before init rf-settings

  SPDR = cCommand;        // STROBE TX
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete

    while (!((PINB) &(1<<PB4)));  // Wait for GDO0 to be set -> sync transmitted
    while ((PINB) &(1<<PB4));      // Wait for GDO0 to be cleared -> end of packet
  return SPDR;
}

void main(void)
{   
  DDRC = 0xFF;

  unsigned int i;            
  SPI_Master_Init();        // Init SPI

  PORTD &=   ~(1<<PD3);      // SS = low
  _delay_us(500);

  SPDR = 0x30;          // Reset
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete

  PORTD |=   (1<<PD3);      // SS = high
  _delay_us(500);

  PORTD &=   ~(1<<PD3);      // SS = low  
  _delay_us(500);          // Delaytime before init rf-settings



// ********** Init RF-Settings ***************************************
  for (i=0; i<=70; i+=2)    
  {
    PORTD &=   ~(1<<PD3);      // SS = low  
    _delay_us(200);          // Delaytime before init rf-settings
    SPDR = rf_settings[i];      // Init RF-Settings address
    while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete

    SPDR = rf_settings[i+1];    // Init RF-Settings data
    while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete

    PORTD |=   (1<<PD3);      // SS = high
    _delay_us(200);          // Delaytime before init rf-settings
  }
// *******************************************************************

  PORTD |=   (1<<PD3);      // SS = high
  _delay_us(500);

  PORTD &=   ~(1<<PD3);      // SS = low  
  _delay_us(500);          // Delaytime before init rf-settings

  /*SPDR = 0x31;          // Sync
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete
  PORTD |=   (1<<PD3);      // SS = high
  _delay_ms(50);
  PORTD &=   ~(1<<PD3);      // SS = low  
  _delay_us(500);          // Delaytime before init rf-settings */

    while(1)
    {
    PORTC   = TX_SPI_Master_Transmit(0x3F, 0xAA); //Adresse vom FIFO = 3F
    PORTC = TX_Strobe(0x35);
    _delay_ms(1000);
    PORTC  = 0x00;      // Clear PORTC  

    PORTC   = TX_SPI_Master_Transmit(0x3F, 0x55); //Adresse vom FIFO = 3F
    PORTC = TX_Strobe(0x35);
    _delay_ms(1000);
    PORTC  = 0x00;      // Clear PORTC
    _delay_ms(1000);

    PORTC   = TX_SPI_Master_Transmit_1(0x3F, 0xFF); //Adresse vom FIFO = 3F
    PORTC = TX_Strobe_1(0x35);
    _delay_ms(1000);
    PORTC  = 0x00;      // Clear PORTC
    _delay_ms(1000);
    }
}


und hier die Fehlermeldungen:

Build started 13.10.2010 at 16:30:01
avr-gcc  -mmcu=at90pwm316 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test.o -MF 
dep/test.o.d  -c  ../test.c
../test.c: In function 'TX_SPI_Master_Transmit_1':
../test.c:4: error: 'PORTD' undeclared (first use in this function)
../test.c:4: error: (Each undeclared identifier is reported only once
../test.c:4: error: for each function it appears in.)
../test.c:4: error: 'PD3' undeclared (first use in this function)
../test.c:5: warning: implicit declaration of function '_delay_us'
../test.c:7: error: 'SPDR' undeclared (first use in this function)
../test.c:8: error: 'SPSR' undeclared (first use in this function)
../test.c:8: error: 'SPIF' undeclared (first use in this function)
../test.c: In function 'TX_Strobe_1':
../test.c:21: error: 'PORTD' undeclared (first use in this function)
../test.c:21: error: 'PD3' undeclared (first use in this function)
../test.c:24: error: 'SPDR' undeclared (first use in this function)
../test.c:25: error: 'SPSR' undeclared (first use in this function)
../test.c:25: error: 'SPIF' undeclared (first use in this function)
../test.c:27: error: 'PINB' undeclared (first use in this function)
../test.c:27: error: 'PB4' undeclared (first use in this function)
make: *** [test.o] Error 1
Build failed with 14 errors and 1 warnings...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heimo G. schrieb:

> Dieser Code steht im Testfile:
>

da fehlt
#include <avr/io.h>

> char TX_SPI_Master_Transmit_1(char cCommand, char cData)//, char
> cStrobe)
> {
>   PORTD &=   ~(1<<PD3);      // SS = low

....


Jedes C-File wird unabhängig von allen anderen compiliert. Das heisst 
aber auch, jedes C-File muss alles includen was es selbst braucht. Dein 
text.c braucht die Dinge wie Portdefinitionen aus avr/io.h. Also muss es 
das auch includieren.

Und da du auch _delay_us benutzt, musst du auch diesen Header in test.c 
includen.

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genau das war der Fehler!

SUPER es funktioniert.

DANKE für die schnelle Hilfe!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.