Forum: Compiler & IDEs C: Pointerübergabe klappt nicht


von Marc (Gast)


Lesenswert?

Hallo ihr Experten!

Ich hab ein Problem mit der Übergabe eines Pointers:
1
void TWI_Start_Transceiver_With_Data( unsigned char *msg, unsigned char msgSize)
2
{
3
4
  /*Write address and data */
5
  do
6
  {
7
    /* Write a byte */
8
    PORTB &=~(1<<SCL);            // Pull SCL low
9
    USIDR = *(msg++);            // Setup data
10
    TWI_Master_Transfer(tempUSISR_8bit);  // Send 8 bits on bus
11
12
    /* Clock and verify (N)ACK from slave */
13
    DDRB &=~(1<<SDA);            // Enable SDA as input
14
    if(TWI_Master_Transfer(tempUSISR_1bit) & 0x01) 
15
    {
16
      // NACK
17
    }
18
  }while( --msgSize);
19
}
... wird aufgerufen von...
1
#include <avr/io.h>
2
#include <avr/interrupt.h> 
3
#include <stdint.h>
4
#include "TWI_Master.h"
5
6
volatile uint8_t newuartdata;
7
volatile unsigned char uartin;
8
9
////////////////////////////////////////////////////////////////////////////////////////
10
// Hauptprogramm
11
////////////////////////////////////////////////////////////////////////////////////////
12
13
int main (void)
14
{
15
  cli();
16
  // Initialisierungen
17
  Ports_Init();
18
  Uart_Init();
19
  TWI_Master_Init();
20
21
  sei();
22
  // Hauptschleife
23
     while(1){
24
    if(newuartdata){
25
      newuartdata = 0;
26
      TWI_Start_Transceiver_With_Data((unsigned char)uartin,1);
27
    }
28
     }
29
     return 0;
30
}
31
32
////////////////////////////////////////////////////////////////////////////////////////
33
// Interrupt Service Routinen
34
////////////////////////////////////////////////////////////////////////////////////////
35
36
ISR(USART_RX_vect){
37
  uartin = UDR;
38
  newuartdata = 1;
39
}

Nun das Problem: wenn ich "uartin" mit einem Inhalt von zB 0x02 übergebe 
ist der Inhalt von "USIDR" dann immernoch der alte. Wo liegt der Fehler?

MfG Marc

von Karl H. (kbuchegg)


Lesenswert?

Marc schrieb:

> Nun das Problem: wenn ich "uartin" mit einem Inhalt von zB 0x02 übergebe
> ist der Inhalt von "USIDR" dann immernoch der alte. Wo liegt der Fehler?

In dem Fall: Das du gecastet hast und die Fehlermeldung des Compilers 
nicht überdacht hast. (*)

1
      TWI_Start_Transceiver_With_Data( &uartin, 1 );


(*)
PS: Wenn der Compiler eine Warnung ausgibt, nach dem Motto "... makes 
Pointer from Integer without a Cast", dann ist ein Cast nicht immer die 
richtige Lösung. Manchmal muss man auch einfach nur die Adresse der 
Variablen übergeben, weil die empfangende Funktion eine Adresse haben 
möchte, von der sie sich die Daten holen kann, bzw. in die sie ihre 
Ergebnisse zurückschreibt.

von Marc (Gast)


Lesenswert?

Danke Karl Heinz!

Manchmal ists doch einfach... In meiner Vorlage wurde dort ein Array 
verwendet und da brauchts natürlich kein & davor !

Aber der Compiler meldet jetzt :
1
../RS232_TWI.c:47: warning: passing argument 1 of 'TWI_Start_Transceiver_With_Data' discards qualifiers from pointer target type

Was bedeutet das?

von Karl H. (kbuchegg)


Lesenswert?

Marc schrieb:

> Was bedeutet das?

uartin ist volatile.

Das geht aber verloren, wenn du einfach nur die Adresse an die Funktion 
übergibst.

Im Grunde läuft es darauf hinaus, dass du dir überlegen musst, in welche 
Schwierigkeiten TWI_Start_Transceiver_With_Data kommen wird, wenn sich 
die Daten (auf die es einen Pointer bekommt) verändern, während die 
Funktion arbeitet.

von Marc (Gast)


Lesenswert?

Ok alles klar! Danke dir!

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.