Forum: Mikrocontroller und Digitale Elektronik Problem mit eingebundener 232.h -> Undefined Reference


von Phillip H. (philharmony)


Lesenswert?

Hallo,
Ich bin grade dabei, ein Kleines Testprogram zu schreiben, daß mir 
einmal den status von PortA an den Rechner schickt, und einmal das vom 
Rechner empfangene auf PortB ausgibt.
Dazu habe ich eine RS232.h mit #include angehängt.
Solange ich nur vom Controller zum PC sende funktioniert alles.
Wenn ich aber die Funktion USART_RX noch aufrufe, kommt die Meldung 
"imlizite Deklaratien" und dann "undefined reference"...

Hier der Code
1
#include <avr/io.h>
2
#include <avr/delay.h> 
3
#include "RS232.h"
4
5
//#define F_CPU 3686400 
6
7
int Data, rec;
8
9
int main(void)
10
  {
11
  DDRA=0x00;
12
  DDRB=0xff;
13
  USART_Init(MYUBRR);
14
  uart_puts("Das ");  
15
  uart_puts("ist ");
16
  uart_puts("ein ");
17
  uart_puts("Test ");
18
  for(;;)
19
  {
20
  Data=PINA;
21
  var_out(Data);
22
  uart_puts("PORTA: \r\n");
23
        rec = USART_Rx();
24
  PORTB=rec;
25
  }
26
  }

Und hier das 232-h
1
 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2
//+RS232 Headerdatei zur Terminalkomunikation mit dem PC         +
3
//+Datum: 30.11.06                   +
4
//+Autor: Kai Lindermeier                        +
5
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6
 
7
#define BAUD 9600        // Baudrate festlegen
8
#define MYUBRR F_CPU/16/BAUD-1      // Formel zur UBRR-Berechnung
9
 
10
 
11
void USART_Init( unsigned int ubrr);    // Initialisierungs Fkt. der Uart
12
void USART_Transmit( unsigned char data );  // ein Zeichen sende Fkt.
13
void uart_puts (char *s);      // String sende Fkt.
14
void var_out (int16_t varout);      // Variablen sende Fkt.
15
uint8_t Usart_Rx(void);
16
 
17
//======================================================================
18
// Wert von Variable senden
19
//======================================================================
20
void var_out (int16_t varout)
21
{
22
  char varoutp[7];                    // char array 
23
  uart_puts( itoa( varout, varoutp, 10 ) );  // itoa = Integer to ASCII
24
}
25
 
26
 
27
//======================================================================
28
// String senden
29
//======================================================================
30
 
31
void uart_puts (char *s)
32
{
33
  while (*s)          // so lange *s != '\0' 
34
 
35
    { 
36
      USART_Transmit(*s);
37
      _delay_ms(1);        // timing, kurze pause
38
      s++;
39
    }
40
}
41
 
42
//======================================================================
43
// RS232 Init 9600/8/2
44
//======================================================================
45
 
46
void USART_Init( unsigned int ubrr)
47
{
48
  /* Baudrate setzen */
49
  UBRRH = (unsigned char)(ubrr>>8);
50
  UBRRL = (unsigned char)ubrr;
51
 
52
  /* RX/TX einschalten */
53
  UCSRB = (1<<RXEN)|(1<<TXEN);
54
 
55
  /* Datenformat setzen: 8data, 2stop bit */
56
  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
57
}
58
 
59
//======================================================================
60
// ein Zeichen senden RS232
61
//======================================================================
62
void USART_Transmit( unsigned char data )
63
{
64
  /* auf leerem TX Buffer warten */
65
  while ( !( UCSRA & (1<<UDRE)) )
66
    ;
67
  /* Daten in den Speicher legen und senden */
68
  UDR = data;
69
}
70
 
71
 
72
//====================================================================================
73
// UART: ein Zeichen einlesen
74
 
75
uint8_t Usart_Rx(void)
76
{
77
  while (!(UCSRA & (1<<RXC)));  // warten bis Zeichen verfuegbar
78
  return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
79
}

Kann mir da jmd helfen, bin noch nicht so fit in der ganzen Geschichte.
Grüße
Phil

von holger (Gast)


Lesenswert?

USART_Rx() ist nicht gleich Usart_Rx().

Falsch geschrieben einfach ;)

von Phillip H. (philharmony)


Lesenswert?

Autsch, wie blöd lol
Jetzt kommt zumindest keine Fehlermeldung mehr.
Jetzt habe ich ein neues Problem: Ich habe (STK500) den PortB an die 
LEDs angeschlossen.
Wenn ich initialisiere leuchten alle (0x00 mit Pull-Up). Soweit korrekt.
Aber egal was ich jetzt sende (mit Advanced Serial Port Monitor 3.7.0), 
es geht die LED0, LED2 und LED3 aus, bei weiterem senden Blinken diese 
einemal kurz, die restlichen bleiben an...Ne idee?
Ich sende immer nur einstellige Zahlen.

Edit: Ich depp, lag daran daß der Port-Monitor am ende jeder Übertragung 
das zeichen CR (dezimal: 13) anhängt, das natürlich dann immer am ende 
dranhängt...
Jaja, so lernt man Schritt für Schritt

von Phillip H. (philharmony)


Lesenswert?

Ok, da ich wahrscheinlich in Zukunft immer wieder mal ne Frage haben 
werde, stelle ich am besten hier mal mein Projekt vor, dann muß ich 
nicht immer nen neuen Thread eröffnen.

Ich studiere an der HS Bremen im 5. Semester Luftfahrtsystemtechnik, 
eine Art "Allround-Studiengang" in Engineering mit etwas Management, BWL 
etc, als duale Ausbildung mit einer Pilotenausbildung.
Ich leite nun ein Projekt zum Bau eines Fix-Based Flugsimulators als 
Procedure-training-Device.(also ohne Hydraulikstelzen, keine Bewegung 
der Hülle).
Eine meiner Aufgaben besteht darin, die diversen Schalter und 
Kontroll-leuchten auszulesen bzw. anzusteuern.
Dazu möchte ich jedes der Panels ( als Beispiel 
http://www.airliners.net/open.file/1192850/M/ ) als eigenes Gerät 
aufbauen, mit jeweils einem Atmega8535 der die Hardware 
ansteuert/Ausliest und das ganze dann per TWI an einen Master-controller 
verschickt der wiederum über RS232 UART mit dem zuständigen PC 
kommuniziert.

Die erste Frage ist, wie groß diese Daten insgesammt maximal werden 
dürfen, bevor ich ein Speicherproblem im Mastercontroller bekomme,  der 
ja alles was von den Panels kommt quasi "sammelt" und als ein 
Datenstring an den PC sendet, sowie den String vom PC bekommt und an die 
Panels weitergibt.

Grüße
Phil

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.