mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software UART und dereferencing pointer to incomplete type


Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe versuche grade in mein Projekt ein Software UART zu 
implementieren, da der Hardware UART bereits für den LIN Bus belegt ist.

Hierzu brauche ich 8-Bit Timmer, da der 16-Bit Timer für die PWM 
benötigt wird.

Ich versuche nun die Methoden aus Peter Daneggers LCD1Wire und I2C 
Sniffer einzubauen.

Angefangen habe ich mit den RX Routinen aus der LCD1Wire allerdings habe 
ich nun beim kompilieren einen Fehler.

../suart.c:41: error: dereferencing pointer to incomplete type

bzw tritt dieser 3 mal an den entsprechenden Stellen auf.

Hier erstmal der Code
#include "suart.h"
#include "main.h"

#ifdef RX_INVERT
#define get_rxd()  (RXD_PIN == 0)
#else
#define get_rxd()  (RXD_PIN == 1)
#endif

uint8_t srx_tmp;
uint8_t srx_data;
uint8_t srx_mask;
volatile uint8_t srx_done;


void suart_init( void )
{
  srx_done = 0;

  srx_mask = 0;        // also change direction flag
  PCMSK2 = 1<<RXD_INT;      // enable start detection pin
  PCIFR = 1<<PCIF2;

  TCCR0A = 0;
  TCCR0B = 0;
  OCR0A = BIT_TIME;
  TIMSK0 = 1<<OCIE0A;
}


uint8_t sgetchar( void )
{
  while( !srx_done );
  srx_done = 0;
  return srx_data;
}


ISR( PCINT2_vect )
{
  if( get_rxd() == 0 ){      // if start bit
    TCNT0 = 256 - (BIT_TIME/2); // 1.5 bit time until compare
    TCCR0A |= ( 1<<WGM01 );
  TCCR0B |= ( 1<<CS01 );    // start T1 with XTAL / 8
    srx_tmp = 0;        // clear bit storage
    srx_mask = 1;        // start with LSB
    PCMSK2 = 0;          // disable start detection
  }
}


ISR( TIMER0_COMPA_vect )
{
  if( srx_mask ){
    if( get_rxd() == 1 )
      srx_tmp |= srx_mask;
    srx_mask <<= 1;
    return;
  }
  if( get_rxd() == 1 ){      // Stop bit valid
    srx_done = 1;      // mark rx data valid
    srx_data = srx_tmp;      // store rx data
    TCCR0A = 0;        // stop T1
  TCCR0B = 0;
    PCMSK2 = 1<<RXD_INT;      // enable further start detection
  }
}

Controller ist ein ATA6613 bzw ein ATmega168

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#ifdef RX_INVERT
#define get_rxd()  (RXD_PIN == 0)
#else
#define get_rxd()  (RXD_PIN == 1)
#endif
if( get_rxd() == 0 )
if( get_rxd() == 1 )

Solche Makros lieb ich ja.
Nicht ganz klar ist mir jedenfalls, wo hier ein Zeiger dereferenziert 
wird. Diesen Fehler kenne ich auch eher in Zusammenhang mit einer 
struct. Von einer solchen ist ebenfalls nüscht zu sehn.

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

Bewertung
0 lesenswert
nicht lesenswert
Mark Brandis schrieb:

> Nicht ganz klar ist mir jedenfalls, wo hier ein Zeiger dereferenziert
> wird. Diesen Fehler kenne ich auch eher in Zusammenhang mit einer
> struct. Von einer solchen ist ebenfalls nüscht zu sehn.

Es sei denn hinter RXD_PIN versteckt sich ein Pointer auf eine struct.
PeDa benutzt ja ein System, wie er in so einem Makro gleichzeitig Port 
und Pin im Port codiert.

Wahrscheinlich fehlt nur irgendein #include

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich hab das von Peter 1:1 übernommen und dann die Ports angepasst, 
dann werd ich das gleich nochmal umschreiben und nochmal testen.

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

Bewertung
0 lesenswert
nicht lesenswert
Frederik Krämer schrieb:
> Ja ich hab das von Peter 1:1 übernommen und dann die Ports angepasst,
> dann werd ich das gleich nochmal umschreiben und nochmal testen.

Schau einfach noch, wo und wie das Makro RXD_PIN definiert wird (müsste 
eigentlich ein Makro sein, da alles in Grossbuchstaben).
Du siehst dir die Definition dazu an und siehst nach was du alles dazu 
brauchst. Dann suchst du weiter, wo diese Einzelteile wieder herkommen. 
Irgendwann wirst du auf einen Teil stossen, für den es in suart.c keinen 
include (weder direkt noch indirekt) gibt.

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne ich hab eben die struct entdeckt mit der es vermutlich zusammenhängt
#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)

Das Makro ist dann wie folgt definiert.
#define  RXD_PIN    SBIT( PIND, 4 )

Wenn ich das ganze nun irgendwie ohne die struct definiere sollte es ja 
funktionieren.

Ich werd mich da mal dran versuchen.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus einem Makro ein Makro machen und daraus ein Makro ist ganz toll. Als 
nächstes will ich rekursive Makros. Unbedingt.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warscheinlich fehlt ein Include (io.h) und deshalb kann er "DIND" nicht 
auflösen.


Mark Brandis schrieb:
> Aus einem Makro ein Makro machen und daraus ein Makro ist ganz toll.

Wenn Du mal in größere Programme schaust, dann ist das hier noch 
vollkommen harmlos.


> Als
> nächstes will ich rekursive Makros. Unbedingt.

Sowas habe ich auch schon gesehen, über rekursive Includes.
Da sitzt man Stunden davor, um es zu verstehen.


Peter

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das io ist in der suart.h eingebunden.

Aber ich verstehen grad irgendwie das SBIT Makro auch nicht, also kann 
ich es nicht umschreiben.

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

Bewertung
0 lesenswert
nicht lesenswert
Frederik Krämer schrieb:
> Also das io ist in der suart.h eingebunden.
>
> Aber ich verstehen grad irgendwie das SBIT Makro auch nicht, also kann
> ich es nicht umschreiben.

?
So schwer ist das nicht.
Es gibt nur 2 Möglichkeiten

SBIT    Set BIT
SBIT    Is Bit Set

Da das ganze in einer Abfrage verwendet wird, was wird es daher sein?


Peters Code hat nur einen Vorteil:
Er kann das SBIT sowohl zur Abfrage als auch zum Setzen von Bits 
benutzen. Entweder du siehst den restlichen Code durch, ob SBIT auch in 
der anderen Form benutzt wird, oder du benutzt seine Mechanismus einfach 
weiter.

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh alles klar, dann schau ich mir den code nochmal an und vergleiche 
mit dem original weil den kann ich kompilieren.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Wenn Du mal in größere Programme schaust, dann ist das hier noch
> vollkommen harmlos.

Och, ich hab schon lecker Sachen gesehen. Zum Beispiel meinte jemand, 
aus dem "else if" plus der Bedingung ein Makro machen zu müssen. Klar 
flog das im Code Review sofort raus.

> Sowas habe ich auch schon gesehen, über rekursive Includes.
> Da sitzt man Stunden davor, um es zu verstehen.

Dass es das gibt, heißt ja noch nicht, dass es auch gut ist und 
unbedingt so gemacht werden sollte.

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also kompilieren klappt nun. Hatte irgendwie vergessen die passende 
struct Definition auch mitzukopieren.

Jetzt muss nur noch das gesendete ankommen, aber ich denke mal das 
bekomme ich nu auch noch hin.

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So das ganze läuft nun, morgen werd ich mich dann mal an den TX Teil 
setzen, hoffe das ich da etwas schneller vorran komme.

Danke für die 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.