C: Pointerübergabe klappt nicht

Gast #1681282
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
#1681295
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.
Gast #1681386
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?
#1681416
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.

Antwort schreiben

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.

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.