Denn die Ausgabe liefert nur sechs Nullen!
Wenn ich aber die Schleife verkürze, also i<5 oder noch kürzer, werden
die korrekten Wert der Tabelle ausgegeben, also 0,1,2,3,4
Woher kommt sowas?!
Stephan schrieb:> korrekten Wert der Tabelle ausgegeben, also 0,1,2,3,4
wie kommst du auf diese werte? Ich kann keinen Bezug zu den Hexzahlen
herstellen.
Peter II schrieb:> wie kommst du auf diese werte? Ich kann keinen Bezug zu den Hexzahlen> herstellen.
Oh shit, tschuldige.
Die Ausgabe lautet natürlich 1,0,20,30... bei der gegebenen Tabelle.
unsigned int als index fuer ein Byte Array?
Meine C Zeiten sind lange vorbei, meine aber mich zu erinnern dass dein
index wohl besser auch ein byte ist, da C einfach nur die Index
"groesse" (Datentyp) mit dem Indexwert zu Arrayoffset Addresse addiert.
Was macht Funktion uart_putc(...); aus den Werten?
Wenn die Zahlen in ASCII Zeichen überzsetzt werden, kommen für die Werte
der Tabelle folgende "Sonderzeichen" zu stande:
{0x01,0x10,0x20,0x30,0x10,0x20,0x30,0x20,0x30};
SOH, DLE, SP, 0, DLE, SP, 0, SP, 0
Mladen G. schrieb:> Meine C Zeiten sind lange vorbei, meine aber mich zu erinnern dass dein> index wohl besser auch ein byte ist, da C einfach nur die Index> "groesse" (Datentyp) mit dem Indexwert zu Arrayoffset Addresse addiert.
nein das ist schon so ok. Byte gibt es in C nicht. Und ein index darf
sogar negativ sein.
Schlumpf schrieb:> So, jetzt konzentriere dich mal, atme ein, und aus und dann gaaaaaanz> langsam.....
Zu viel Kaffee.
SkyperHH schrieb:> Aha... und Empfangen tut das ein Terminal am PC?
Genau!
Stephan schrieb:> Werden ohne Übersetzung in den Ringbuffer gelegt und gesendet.
... und dann am PC von einem Terminalprogramm empfangen und
dargestellt???
Stephan schrieb:>> Was macht Funktion uart_putc(...); aus den Werten?>> Werden ohne Übersetzung in den Ringbuffer gelegt und gesendet.
und ist der Ringpuffer auch gross genug?
Ok, Dir ist schon klar, das alles ASCII-Zeichen kleiner als 0x1f - 31d
reine Steuerzeichen sind... wie Sie das Terminal umsetzt, bzw. sie
überhaupt anzeigt, keine Ahnung... 0x20 - 32d ist Space, also ein
Leerzeichen, ist also auch nichts zu sehen...
Einziges sichtbares Zeichen ist 0x30 48d, das entspricht der "0" ...
Peter II schrieb:> nein das ist schon so ok. Byte gibt es in C nicht. Und ein index darf> sogar negativ sein.
Kommt darauf an ;)
Ob es bytes etc. gibt, liegt an der HW.
Klar, wenn ein usigned byte genauso "breit" ist wie ein unsigned int (16
bit), dann passt das natuerlich.
Ansonsten passt das aber nicht.
Muesste nochmals in der Literatur nachschlagen, aber Array Indizes
sollten m.E. folgerndermassen berechnet werden:
Array Adresse + (Index * Datenbreite)
Stephan schrieb:> int i;> i=0;>> uart1_putc(tabelle[i]);>>> liefert das richtige Ergebnis....
Ist jetzt aber geschummelt weil uart1_putc statt uart_putc.
Falsche Bitrate?
Peter II schrieb:> nein nicht ganz:>> Array Adresse + (Index * sizeof( Datentype ) )
Eben, hast es nur anders ausedrueckt ;)
Wenn dieser C Dialekt auf dieser HW aber doch 8 Bit Bytes unterstuetzt,
dann sollte man auch ein Byte als Index verwenden, das war es worauf ich
hinaus wollte.
SkyperHH schrieb:> Einziges sichtbares Zeichen ist 0x30 48d, das entspricht der "0" ...
Das verwendete HTerm zeigt alles an, in Hex, Dez, Ascii
Ich bin aber weiter mit meinen Forschungen und es kommt hinzu:
Mladen G. schrieb:> Wenn dieser C Dialekt auf dieser HW aber doch 8 Bit Bytes unterstuetzt,> dann sollte man auch ein Byte als Index verwenden, das war es worauf ich> hinaus wollte.
das ist aber falsch. Denn die Speicher-Adressen sind 16bit. Auch wenn es
eine 8bit cpu ist.
In dem code sind keine Fehler, ausser das nur 5 zeichen aus dem Array
angezeigt werden.
Um alle zu zeigen muss man das tun.
for (i=0; i<10; i++)
{
uart_putc(tabelle[i]);
}
Schlumpf schrieb:> Stephan schrieb:>> Stephan schrieb:>>> Jetzt aber.. 1,10,20,30 (hex)>>> Bzw. 1,16,3,48,16 (dec)>> Warum wird dann aus einer 20hex eine 3dez?
Fipptehler.
Mladen G. schrieb:> dann sollte man auch ein Byte als Index verwenden, das war es worauf ich> hinaus wollte.
Das ist kompletter Unfug. Meinst Du, ein Array aus mehr als 256 Bytes
wäre nicht möglich?
Justus Skorps schrieb:> von einer Funktion uart0_putc() war bis jetzt nie die Rede...
Ich sollte auf Koffeinfreien Kaffee umsteigen. Der µC hat UART, die
Funktionen dazu sind -bis auf den Index- alle gleich.
Wie wärs erst mal die Rungbufferausgabe durch eine stink normale zu
ersetzen? Dann kannst du dich erst mal davon überzeugen, dass die
Arrayzugriffe klappen, anstatt da von einem Problem zum anderen zu
hampeln.
Rufus Τ. Firefly schrieb:> Das ist kompletter Unfug. Meinst Du, ein Array aus mehr als 256 Bytes> wäre nicht möglich?
Genau darum ging es doch.
Mit 8 Bit Adressen waere genau da schicht im Schacht, die Formel fuer
die Addressarithmetik nutzt ja die Breite des Datentyps.
Wer oder was ist denn "uart0txcounter" ?
Eine globale Variable? Vermutlich wird an ihr dann auch noch im
Interrupt und ggf anderen Stellen rumgeschraubt?
Wenn ja, dann mach die mal bitte "Volatile".
SkyperHH schrieb:> Ok... da fehlt aber noch was, die ISR die den Puffer ausliest und> übeträgt, die Initalisierung des Puffers... usw.Karl Heinz schrieb:> Wie wärs erst mal die Rungbufferausgabe durch eine stink normale zu> ersetzen?
Bin ich dabei.
Was mich allerdings wirklich verwundert:
1
for(i=0;i<5;i++)//kurze Schleife
2
{
3
uart1_putc(tabelle[i]);
4
}
5
6
uart1_putc(tabelle[i]);
7
i++;
8
uart1_putc(tabelle[i]);
9
i++;
10
uart1_putc(tabelle[i]);
11
i++;
12
uart1_putc(tabelle[i]);
liefert das richtige Ergebnis vom ersten bis zum letzten
Tabelleneintrag,
1
for(i=0;i<6;i++)//lange Schleife
2
{
3
uart1_putc(tabelle[i]);
4
}
5
6
uart1_putc(tabelle[i]);
7
i++;
8
uart1_putc(tabelle[i]);
9
i++;
10
uart1_putc(tabelle[i]);
11
i++;
12
uart1_putc(tabelle[i]);
liefert für die ersten 6 Tabelleneinträge Nullen, danach aber korrekte
Werte. Riecht mir irgendwie nicht nach UART-Problem.
Doch eher UART bzw Buffer Problem. Sonst müssten ja auch bei der langen
Schleife die ersten fünf Zeichen richtig ankommen.
Theorie: die Zeichen laufen erst in den Buffet bevor gesendet wird. Bei
5 (oder sogar nur 4?) Zeichen ok, bei mehr geht etwas kaputt.
Stephan schrieb:> liefert für die ersten 6 Tabelleneinträge Nullen, danach aber korrekte> Werte.
Das glaubt Dir keiner. Mit i<5 soll es gehen, mit i<6 nicht?
Änderst Du evt. noch andere Codezeilen, wenn Du i<6 programmierst?
Übersetzt Du auch die richtige Datei?
Mladen G. schrieb:> Mit 8 Bit Adressen waere genau da schicht im Schacht, die Formel fuer> die Addressarithmetik nutzt ja die Breite des Datentyps.
Nein. Die Breite des Datentyps geht als Zahl in die Berechnung ein. Das
hat rein gar nichts damit zu tun, in welcher Breite die Berechnung und
Indexierung durchgeführt wird.
OldMen schrieb:> Das glaubt Dir keiner. Mit i<5 soll es gehen, mit i<6 nicht?> Änderst Du evt. noch andere Codezeilen, wenn Du i<6 programmierst?> Übersetzt Du auch die richtige Datei?
Ohne Flachs!
Auch wenn ich ohne Ringbuffer sende, also
1
while(!(UCSR1A&(1<<UDRE1)))/* warten bis Senden moeglich */
2
{
3
}
4
UDR1=c;/* sende Zeichen */
verwende, werden bei der langen Schleifenversion aus der Schleife heraus
nur Nullen gesendet!
Peter II schrieb:> mache mal ein sleep in die lange schleife
Hab ich schon gemacht. Das führt dazu, dass selbst bei kleiner Schleife
nur Nullen rauskommen! Verwirrung weicht Verzweiflung.
SkyperHH schrieb:> Welche Baudrate zum senden? Was für einen Quarz verwendest Du?
38,4k, 16MHz
Schlumpf schrieb:> Stimmt deine Abfrage, ob der UART sendebereit ist?
Normal senden tut er ja ohne Murren.
Stephan schrieb:> Normal senden tut er ja ohne Murren.
Na ja aber wenn deine Abfrage immer "true" ist, dann sendet er, sobald
er in die Funktion kommt. Ist zu dem zeitpunkt aber der vorangegangene
Sendevorgang noch nicht abgeschlossen, dann.....
Und hast du parallel noch irgendwelche Interrupts am laufen?
Schlumpf schrieb:> Und hast du parallel noch irgendwelche Interrupts am laufen?
Ja, Windows!
Ich habe 0 Ahnung, warum, aber nach An-und-Ausmachen von Windows klappt
es plötzlich. 2h für die Tonne!
Danke für die Unterstützung!
Die 0,2% Fehlerrate sollten nicht das Problem sein...
Stephan schrieb:> SkyperHH schrieb:>> Welche Baudrate zum senden? Was für einen Quarz verwendest Du?>> 38,4k, 16MHz
Stefanus schrieb:> War das ein Witz mit dem reboot? Oder läuft es jetzt tatsächlich> problemlos?
Leider kein Witz! Alles gut! Vielleicht hatte AVRStudio einen Pups quer.