mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software TX 1 bit Pause einbauen, C


Autor: kalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe hier im Forum eine kleine Routine für eine serielle 
Schnittstelle gefunden.
volatile uint16_t stxdata = 0;
void sputchar(uint8_t val){
  while(stxdata);
  stxdata = 0x200 | (val<<1);
}

Wird im Timerinterrupt mit Baudrate aufgerufen:
  if (stxdata){
    if (stxdata & 1)
    {
      PORTB &= ~(1<<TX);  // off
    }
    else
    {
      PORTB |= (1<<TX);  // on
    }
    stxdata >>= 1;
  }

Jetzt würde ich gerne noch ein Bit Pause anhängen, damit es keine 
Probleme beim Empfänger gibt. Hat jemand eine Idee?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ kalle (Gast)

>ich habe hier im Forum eine kleine Routine für eine serielle
>Schnittstelle gefunden.

Das ist ein Soft-UART:

void sputchar(uint8_t val){
  while(stxdata);
  stxdata = 0x400 | (val<<1);
}

>Jetzt würde ich gerne noch ein Bit Pause anhängen, damit es keine
>Probleme beim Empfänger gibt. Hat jemand eine Idee?

Siehe oben.

MFG
Falk

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk Brunner:

> Das ist ein Soft-UART:
>
> void sputchar(uint8_t val){
>   while(stxdata);
>   stxdata = 0x400 | (val<<1);
> }
> 

Mit einer 0 als Stopbit?
0x200 war schon richtig.


@ kalle:

> Jetzt würde ich gerne noch ein Bit Pause anhängen, damit es keine
> Probleme beim Empfänger gibt.

Ändere das 0x200 in 0x600.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kalle wrote:

> Jetzt würde ich gerne noch ein Bit Pause anhängen, damit es keine
> Probleme beim Empfänger gibt. Hat jemand eine Idee?

Das einzige Problem, daß Du damit lösen kannst ist das, daß der 
Empfänger 2 Stopbits erwartet.

Probleme mit Baudratenfehlern (RC-Oszillator statt Quarz, kein 
Baudratenquarz bei hohen Baudraten) oder wegen fehlendem Protokoll 
lassen sich damit natürlich nicht lösen.


Peter

Autor: kalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, das ist richtig, das Ganze ist invertiert.
Und danke, mir ist gerade aufgefallen dass ich übersehen habe, dass das 
Stop Bit ja = Ruhepegel ist. Die Invertierung hat mir einen Strich 
durchs Gehirn gemacht ;-)

Autor: kalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem liegt wahrscheinlich wirklich an anderer Stelle. Nach 17 
Bitzeiten wird nichts mehr gesendet, wenn ich 4 *

sputchar('G');

versuche.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kalle wrote:

> Hallo, das ist richtig, das Ganze ist invertiert.

Invertiert funktioniert aber dein Timerinterrupt nicht, weil du ja in 
stxdata eine 1 als Endemarke brauchst, und diese 1 wird dann ja als 0 
ausgegeben und vom Empfänger als neues Startbit erkannt.

  if (stxdata){
  ...
  }

Müsstest du ändern in (um die letzte 1 zu ignorieren):
  if (stxdata > 1){
  ...
  }
  else
    stxdata = 0;

Außerdem musst du in sputchar 0x200 in 0x401 ändern (oder 0x801, wenn du 
2 Stopbits möchtest).

Autor: kalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, genau das war mein Problem, ich dachte das Stopbit wäre eine 0. Kann 
man schlecht noch eine dahintersetzen ;-)
Die Daten sind nicht invertiert, lediglich die Ausgabe (es ist kein 
MAX232 oder so dran).

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kalle wrote:

> Die Daten sind nicht invertiert, lediglich die Ausgabe (es ist kein
> MAX232 oder so dran).

Achso, dann ignoriere meinen vorigen Post einfach. ;-)

Autor: kalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke trotzdem!

Evtl sollte man die Funktion interruptsicher machen:
void sputchar(uint8_t val)
{
  while(stxdata);
  cli();
  stxdata = 0x200 | (val<<1);
  sei();
}

Löst aber noch nicht mein Problem. Ich forsche weiter.

Autor: kalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ursache: Spannungsversorgung   oc:

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.