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_ */
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.
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.
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.
Naja copy und paste ist das nicht habe alles selbst geschrieben. Aber danke wegen der Info bezüglich der Wartezeit
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.
Ich besitze leider keinen Logic Analyzer, weshalb das gerade keine Option ist.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.