Autor |
Mikrokontrollerprint spinnt!! Grund: unbekannt |
|
|
|
|
BID = 486076
Rambodischien Schreibmaschine
Beiträge: 1341 Wohnort: Österreich
|
|
Hi
Ich habe ein kleines Problem.
Ich habe mir vor langer Zeit ein Mikrokontrollerboard von myAVR gekauft.
Wegen meinem aktuellen Projekt habe ich angefangen mit diesem Mikrokontrollerboard zu experimentieren.
Nun zu meinem Problem:
Immer wenn ich Zuhause mein Board an den Laptop anschließe und ein Bluetoothmodul anbringe spielt der Mikrokontroller verrückt. Er überträgt, über UART, anstatt eines Enter-Zeichens ein vollkommen falsches Zeichen und das Zeichen ändert sich immer wieder wenn ich das gleiche Programm neu auf das Board übertrage.
Aber: Immer wenn ich in der Schule das Board anschließe funktioniert es ohne Probleme. Immer !!!. Aber immer nur wenn ich in dem einem Laboratorium bin ansonsten nicht mehr.
Woran kann das denn bitte liegen?
Ich bedanke mich im voraus für eure Antworten.
Mfg
Rambodischien
|
|
BID = 486395
Rambodischien Schreibmaschine
Beiträge: 1341 Wohnort: Österreich
|
|
Ich habe es jetzt Probiert das Board auf verschiedene Temperaturen zu bringen. Leider Fehlanzeige.
Was ich noch herausgefunden habe: Wenn ich das Enter-Zeichen durch einen Buchstabe ersetzte gibt das LCD kein falsches Zeichen mehr aus (brauche aber das Enter-Zeichen).
Habe den Enter-Befehl mit \r eingefügt.
Gibt es andere Möglichkeiten ein Enter einzufügen? (AVR-Studio)
Mfg
Rambodischien |
|
BID = 486426
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Probier mal \n.
Das ist unter Unix und auch unter Windows das Steuerzeichen für eine neue Zeile.
kA was du genau machen willst, daher ist das mal blind ins Dunkel geraten.
Windows macht aus dem \n zwei Steuerzeichen (ich meine 0xA und 0xC), während n unter Unix ein Byte nutzt.
Edit:
Jedes beliebige Zeichen kann man auch in einen String packen, indem man die Schreibweise "\n" vorstellt:
string = "Soso\01" wird dann im Speicher als
53 6f 73 6f 01
abgelegt.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 31 Dez 2007 13:37 ]
[ Diese Nachricht wurde geändert von: DonComi am 31 Dez 2007 13:39 ]
|
BID = 486431
Nukeman Schriftsteller
Beiträge: 754 Wohnort: bei Kleve
|
Vielleicht koppelt der Bluetooth-Funk irgendwie auf den UART
ein? Du könntest mal probieren, Bluetooth ein wenig abzuschirmen,
wenn der \n-Tipp nicht hilft.
Wenn ich mein aktives Handy nahe an bestimmten Stellen vom Monitor
halte, fängt der auch an zu flippen
Andererseits sendet Bluetooth mit sehr viel weniger Energie.
Versuch macht kluch.
Gruß,
Stefan
|
BID = 486476
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Zitat :
|
blabla..
indem man die Schreibweise "n" vorstellt:
|
Da hat mir die Edit-Funktion die Bachslashes wegeditiert.
Sollte natürlich heißen "... indem man die Schreibweise \0 ("Backslash 0") vorstellt.
_________________
|
BID = 486483
Rambodischien Schreibmaschine
Beiträge: 1341 Wohnort: Österreich
|
Danke für die Antworten.
Werde es mal mit \n probieren und das mit dem Abschirmen ist auch keine schlechte Idee.
Noch eine Frage wie kann ich in C ein Ascii-Zeichen einfach an einen String anhängen?
Mfg
Rambodischien
|
BID = 486496
Nukeman Schriftsteller
Beiträge: 754 Wohnort: bei Kleve
|
Entweder mit strcat:
http://www.cplusplus.com/reference/clibrary/cstring/strcat.html
oder Du greifst hart auf den Speicher zu:
char cText[80]="Hallo"; // weiss nicht genau, ob der Compiler
//das so frisst
cText[5] = 0x0A; // carriage return einfügen, hier stand vorher die alte
// stringendekennung 0
cText[6] = 0x00; // Stringendekennung
Gruß,
Stefan
|
BID = 486513
Rambodischien Schreibmaschine
Beiträge: 1341 Wohnort: Österreich
|
@nukeman
Danke
Ich habe das mit \n ausprobiert funktioniert leider auch nicht. ( um genau zu testen fehlt mir leider das Equipment).
Ich werde es einmal mit dem direkten also mit dem Ascii-Zeichen probieren.
Danke erstmal an euch beide, wünsche einen guten Rutsch ins neue Jahr.
Mfg
Rambodischien
|
BID = 486577
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Moin,
aber genau das tut das Steuerzeichen \n doch!
Schaus dir im Hexeditor an, an der Stelle, wo vorher der reguläre Ausdruck n stand, steht dann das entsprechende Steuerzeichen!
Als Beispiel sei hier mal folgender String dargestellt:
"Dies ist eine Zeichenkette,\ndie von einem Zeilenumbruch unterbrochen wird.\n"
Das sieht dann in C im Speicherabbild etwa so aus (C-Strings werden grundsätzlich mit einem \0-Zeichen terminiert):
00000000 44 69 65 73 20 69 73 74 20 65 69 6e 65 20 5a 65 |Dies ist eine Ze|
00000010 69 63 68 65 6e 6b 65 74 74 65 2c 0a 64 69 65 20 |ichenkette,.die |
00000020 76 6f 6e 20 65 69 6e 65 6d 20 5a 65 69 6c 65 6e |von einem Zeilen|
00000030 75 6d 62 72 75 63 68 20 75 6e 74 65 72 62 72 6f |umbruch unterbro|
00000040 63 68 65 6e 20 77 69 72 64 2e 00 |chen wird..|
0000004b
Edit:
Können denn sonst Werte korrekt übertragen werden?
Wenn nein, dann kann es sein, dass die UART-Einstellungen auf Rechner- und mikrocontroller-Seite nicht übereinstimmen. Das Problem kenn ich daher.
Funktioniert jedoch alles, wenn das BT-Modul nicht dran ist, dann liegts daran!
_________________
[ Diese Nachricht wurde geändert von: DonComi am 31 Dez 2007 18:57 ]
|
BID = 486683
Rambodischien Schreibmaschine
Beiträge: 1341 Wohnort: Österreich
|
@DonComi
Ich weiß normalerweise sollte es mit /n funktionieren aber es geht nicht.
Zeichen kann ich korrekt übertragen nur eben der Enter-Befehl funktioniert nicht.
Im Datenblatt des Bluetoothmodules steht für Enter folgendes: 0x0A
Ich versuche jetzt einmal das in einen String umzuwandeln und anzuhängen vielleicht funktioniert es.
Mfg
Rambodischien
|
BID = 487165
Rambodischien Schreibmaschine
Beiträge: 1341 Wohnort: Österreich
|
Habe es jetzt auf dem direkten Weg ausprobiert wie nukeman beschrieben hat
Jetzt kommt das gleiche Zeichen wie \n wenn ich direkt auf dem Speicher 0x0A eingebe. Ich brauche aber das \r Zeichen. Und fast immer wenn ich ein Reset mache steht wieder ein anderes Zeichen da.
Das ist zum ausflippen.
Anbei noch ein paar Fotos des LCD's.
|
BID = 487186
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
\r ist Carriage Return, also auf meinem System 0xD, nicht 0xA.
Probiers mal damit.
Allerdings frage ich mich, wozu. Die Displays, die ich so kenne, können mit diesen Zeichen nichts anfangen, kein Wunder, das sind ja auch Steuerzeichen...
Erkläre nochmal bitte, wofür das sein soll, das CR-Zeichen. So ganz kapiert habe ich das noch nicht, was das anstellen soll. Wenn das an eine Routine übergeben wird, die die Daten zum LCD verarbeitet, dann kann es sein, dass diese Steuerzeichen interpretiert, so mache ich das teilweise auch für meine LCDs.
_________________
|
BID = 487265
Rambodischien Schreibmaschine
Beiträge: 1341 Wohnort: Österreich
|
Ich werde das mit 0x0D ausprobieren.
Ich brauche das CR um ein Bluetoothmodul anzusteuern. Ich gebe nur die ganzen Befehle zusätzlich auf dem LCD aus. Es kann sein, dass das LCD keine Steuerzeichen ausgeben kann, aber dann dürfe es auch nicht immer was anderes ausgeben oder, sondern müsste immer den gleichen Salat zeigen. Fakt ist wenn ein bestimmtes Zeichen als CR auf dem Display erscheint geht das Bluetoothmodul.
Ich versuche jetzt mal das was vom Bluetooth zurückgesendet wird auch auf das Display auszugeben.
Leider ist das nicht so einfach über UART eine Antwort des Bluetoothmoduls einzulesen ( bin Anfänger ).
Wenn ich es probiere kommt immer nur Schwachsinn heraus.
Code : |
unsigned char uart_gets( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) );
/* Get and return received data from buffer */
int z;
for(z=0;z<10;z++)
{
cEmpfangen[z]=UDR;
strcat(sEmpfangen,cEmpfangen);
}
return sEmpfangen;
}
|
|
Kann mir jemand helfen?
Danke
Mfg
Rambodischien
|
BID = 487302
Nukeman Schriftsteller
Beiträge: 754 Wohnort: bei Kleve
|
Hallo Rambodischien,
hab in der Empfangsroutine noch ein mögliches Problem gesehen:
Wenn cEmpfangen nicht mit Nullen initialisiert ist, werden mit
jedem Schritt zuviele Zeichen nach sEmpfangen angehängt. Denn es
fehlt bei cEmpfangen die Stringendekennung.
Entweder Du machst so:
cEmpfangen[z]=UDR;
cEmpfangen[z+1]=0; // hier aufpassen, dass das Array immer gross genug ist
strcat(sEmpfangen,cEmpfangen);
oder machst vor der for Schleife ein
memset(cEmpfangen,0x00,sizeof(cEmpfangen));
Zu dem Sonderzeichen ans Display:
Wenn das so ein Standard-HD44780-Typ ist, werden mit Ascii-Code 00-0F
CGRAM-Zeichen aktiviert. Das sind user-definierte Zeichen, die der
User ( nämlich Du ) wahrscheinlich nicht definiert hat. Von daher
wird dann irgendwelcher Bitmüll angezeigt.
Am besten du ersetzt nicht darstellbare Zeichen in der LCD-Anzeige
durch einen Punkt und/oder hinterlegst Sonderzeichen für 0x0A und 0x0D.
Gruß
Stefan
|
BID = 489481
Rambodischien Schreibmaschine
Beiträge: 1341 Wohnort: Österreich
|
Danke für die Antworten. Leider bin ich momentan ziemlich im Stress.
Hatte also keine Zeit um zu testen.
Wie kann ich denn ein /n durch irgendein Zeichen ersetzen?
Mfg
Rambodischien
|