www.mikrocontroller.net

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


Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr Experten!

Ich hab ein Problem mit der Übergabe eines Pointers:
void TWI_Start_Transceiver_With_Data( unsigned char *msg, unsigned char msgSize)
{

  /*Write address and data */
  do
  {
    /* Write a byte */
    PORTB &=~(1<<SCL);            // Pull SCL low
    USIDR = *(msg++);            // Setup data
    TWI_Master_Transfer(tempUSISR_8bit);  // Send 8 bits on bus

    /* Clock and verify (N)ACK from slave */
    DDRB &=~(1<<SDA);            // Enable SDA as input
    if(TWI_Master_Transfer(tempUSISR_1bit) & 0x01) 
    {
      // NACK
    }
  }while( --msgSize);
}
... wird aufgerufen von...
#include <avr/io.h>
#include <avr/interrupt.h> 
#include <stdint.h>
#include "TWI_Master.h"

volatile uint8_t newuartdata;
volatile unsigned char uartin;

////////////////////////////////////////////////////////////////////////////////////////
// Hauptprogramm
////////////////////////////////////////////////////////////////////////////////////////

int main (void)
{
  cli();
  // Initialisierungen
  Ports_Init();
  Uart_Init();
  TWI_Master_Init();

  sei();
  // Hauptschleife
     while(1){
    if(newuartdata){
      newuartdata = 0;
      TWI_Start_Transceiver_With_Data((unsigned char)uartin,1);
    }
     }
     return 0;
}

////////////////////////////////////////////////////////////////////////////////////////
// Interrupt Service Routinen
////////////////////////////////////////////////////////////////////////////////////////

ISR(USART_RX_vect){
  uartin = UDR;
  newuartdata = 1;
}

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

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

Bewertung
0 lesenswert
nicht 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. (*)

      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.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :
../RS232_TWI.c:47: warning: passing argument 1 of 'TWI_Start_Transceiver_With_Data' discards qualifiers from pointer target type

Was bedeutet das?

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

Bewertung
0 lesenswert
nicht 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.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok alles klar! Danke dir!

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.