Forum: Mikrocontroller und Digitale Elektronik Serielle Schnittstelle emulieren


von Michael A. (michael_a108)


Lesenswert?

Hallo Community,
bin seit einiger Zeit dabei eine Uart-Kommunikation mit meinem uC 
(ATmega16) zu emulieren. Dabei kommuniziere ich mit meinem PC. Habe 
allerdingss das Problem, dass die Kommunikation nicht einwandfrei 
funktioniert. Habe hier meinen C-Code hineinkopiert. Weiter unten findet 
ihr den dazugehörigen Code der Header Datei. Könntet ihr mir helfen und 
mir einige Tipps geben? Wo könnte der/die Fehler liegen? Hat jemand von 
euch schon mal was ähnliches versucht?

Freu mich auf eure professionelle Meinung ;)

C-Code:
#include "uart_Emu.h"

void EmuSerialWriteStr(volatile unsigned char* str)
{
  static uint8_t count = 0;
  while(str[count])  EmuSerialWriteChr(str[count++]);
  EmuSerialWriteChr(13);
  EmuSerialWriteChr(10);
  count = 0;
}

void EmuSerialWriteChr(volatile unsigned char chr)
{
  static uint8_t count = 0;
  EmuSerialStrtCond();
  while(count < DATA_BITS)
  {
    if(chr & 0x01)    EMU_PORTx |= (1 << TX);
    else      EMU_PORTx &= ~(1 << TX);
    chr >>= 1;
    _delay_us(TIME_DELAY);
    count++;
  }
  count = 0;
  EmuSerialEndeCond();
}

void EmuSerialStrtCond(void)
{
  EMU_PORTx &= ~(1 << TX);
  _delay_us(TIME_OFFSET);
  _delay_us(TIME_DELAY);
}

void EmuSerialEndeCond(void)
{
  EMU_PORTx |= (1 << TX);
  _delay_us(TIME_DELAY);
}

Header-Code:
#ifndef UART_EMU_H_
#define UART_EMU_H_

#ifndef DATA_BITS
#define DATA_BITS 8
#endif

#ifndef BAUD
#define BAUD 9600
#endif

#ifndef F_CPU
#define F_CPU 1000000UL
#endif

#ifndef EMU_PORTx
#define EMU_PORTx PORTD
#endif

#ifndef RX
#define RX 0
#endif

#ifndef TX
#define TX 1
#endif

#define TIME_DELAY ((DATA_BITS + 2) / BAUD)
#define TIME_OFFSET (TIME_DELAY/2)

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

void EmuSerialStrtCond(void);
void EmuSerialEndeCond(void);
void EmuSerialWriteStr(volatile unsigned char* str);
void EmuSerialWriteChr(volatile unsigned char chr);
void EmuSerialWriteSeq(volatile unsigned char chr);

#endif /* UART_EMU_H_ */

von Stefan F. (Gast)


Lesenswert?

Bitte beachte die Hinweise bezüglich Formatier-Tags für Quelltexte. 
Beschreibe das Problem erheblich detaillierter. Was hast du bereits 
analysiert, wo hängt oder hakt es?

"dass die Kommunikation nicht einwandfrei funktioniert" ist keine valide 
Fehlerbeschreibung.

Hast du einen Logic Analyzer? Wenn nicht, besorge Dir einen und mache 
dich mit seiner Benutzung vertraut, bevor wir hier weiter machen.

Mein erster Eindruck ist, dass dein Startbit zu lang ist. Es muss genau 
so lang sein, wie die Daten-Bits.

von Michael A. (michael_a108)


Lesenswert?

Naja ich weiß eben nicht genau woran es liegt bzw. was genau den Fehler 
verursacht, washalb eine detailliertere Fehlerbeschreibung leider nicht 
möglich ist. Das Terminal-Programm erhält keine Daten, bzw bleibt hängen 
was wahrscheinlich auf einen Fehler der Schreibsequenz zurückzuführen 
ist. Sicher bin ich mir leider nicht. Deshalb frage ich hier nach.

von Michael A. (michael_a108)


Lesenswert?

Das mit dem Startbit löst das Problem leider nicht

von Stefan F. (Gast)


Lesenswert?

Die Berechnung der Delay Zeit(=Dauer eines Bits) ist auch total Kappes:

> #define DATA_BITS 8
> #define BAUD 9600
> #define TIME_DELAY ((DATA_BITS + 2) / BAUD)

Das ergibt Null!

Richtig wäre 1/9600 Sekunde, also 104 µs. Davon muss man aber noch ein 
paar Takte für die eigentliche Code-Ausführung subtrahieren. Bist du dir 
darüber im Klaren, wie man diese Anzahl ermittelt? Kannst du Assembler 
Listings lesen?

Michael A. schrieb:
> Naja ich weiß eben nicht genau woran es liegt bzw. was genau den Fehler
> verursacht

Deswegen sollst du dir einen Logic Analyzer besorgen, damit kannst du 
das erzeugte Signal visualisieren und mit dem vergleichen, was du 
erwartet hast. Ich hoffe, dir ist klar, wie das Signal aussehen soll. 
Falls nicht, musst du das erst einmal lernen bevor du mit der copy/paste 
Programmierung beginnst.

von Michael A. (michael_a108)


Lesenswert?

Naja copy und paste ist das nicht habe alles selbst geschrieben. Aber 
danke wegen der Info bezüglich der Wartezeit

von Stefan F. (Gast)


Lesenswert?

Michael A. schrieb:
> Naja copy und paste ist das nicht habe alles selbst geschrieben.

Dann wirst du mit dem Logic Analyzer gut weiter kommen. Du weißt dann 
ja, wie das Ergebnis aussehen soll.

von Michael A. (michael_a108)


Lesenswert?

Ich besitze leider keinen Logic Analyzer, weshalb das gerade keine 
Option ist.

von Stefan F. (Gast)


Lesenswert?

Michael A. schrieb:
> Ich besitze leider keinen Logic Analyzer, weshalb das gerade keine
> Option ist.

Bestelle dir einen. Amazon liefert bis Dienstag.
https://www.amazon.de/AZDelivery-%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90-Logic-Analyzer-gratis/dp/B01MUFRHQ2

Wenn du dich traust, kannst du dazu auch deinen Audio-Eingang vom 
Computer missbrauchen. Entsprechende Software gibts im Internet. Zum 
Beispiel https://www.zeitnitz.eu/scope_en
Dazu musst du allerdings eine niedrigere Bitrate wählen, zum Beispiel 
1200 Baud.

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.