PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NIBOBee sagt "Hallo Welt!"



pinsel120866
21.11.2009, 17:32
Hallo zusammen,

ich habe mir einen USB UART-Wandler (http://watterott.com/FTDI-Basic-Breakout-5V) besorgt und mir ein Programm gemacht das die Bee "Hallo Welt" sagen lässt:


#include <nibobee/iodefs.h>
#include <nibobee/led.h>
#include <nibobee/line.h>

void writeChar(uint8_t data );
void writeString(char *string);

int main() {

writeString("NIBOBee sagt\n\r");
writeString("Hallo Welt!\n\r");
}

void writeChar(uint8_t data )
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
void writeString(char *string)
{
while(*string)
writeChar(*string++);
}

Lässt sich fehlerfrei kompilieren und auch flashen - nur kommt im Terminalprogramm nichts an.

Bitte um Hilfe, was ich falsch gemacht haben könnte.

radbruch
21.11.2009, 17:44
Hallo

Baudrate und Übertragungsparameter fehlen und das Senden wurde nicht aktiviert (TX-Enable), schau mal ins Datenblatt des Mega16 unter USART;) Hier meine Initialisierung für 2400, 8,none,1:

#define UBRR_BAUD_2400 390 // Baudrate auf 2400 setzen
UBRRH = UBRR_BAUD_2400 >> 8;
UBRRL = (uint8_t) UBRR_BAUD_2400;

UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); // 8, none, 1
UCSRB |= (1<<TXEN); // Senden enablen

Den Wert für das UBRR-Register (390 für 2400 Baud) errechnet man so:

Kontrollertakt/16/Baud-1 oder 15000000/16/2400-1

(Bei asuro und RP6 wurde der USART schon vom Bootloader richtig und komplett initialisiert)

Zusätzlich fehlt noch die finale Endlosschleife im Programm und das obligatorische return:

int main(void) {

writeString("NIBOBee sagt\n\r");
writeString("Hallo Welt!\n\r");
while(1); // ohne stürzt der Kontroller ins Nirwana!
return(0); wird nie erreicht
}
btw. wird die main()-Funktion ohne Parameter aufgerufen: int main(void)...

Gruß

mic

pinsel120866
21.11.2009, 19:02
Danke mic, wieder was dazugelernt.

Ich habe nun die Baudrate auf 9600 gestellt, falls es jemand ausprobieren möchte:

#include <nibobee/iodefs.h>
#include <nibobee/led.h>
#include <nibobee/line.h>

void writeChar(uint8_t data );
void writeString(char *string);

int main()

{

#define UBRR_BAUD_9600 96 // Baudrate auf 9600 setzen
UBRRH = UBRR_BAUD_9600 >> 8;
UBRRL = (uint8_t) UBRR_BAUD_9600;

UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0); // 8, none, 1
UCSRB |= (1<<TXEN); // Senden enablen

writeString("NIBOBee sagt 'Hallo Welt!'\n\r");
while(1);
return(0);
}

void writeChar(uint8_t data )
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
void writeString(char *string)
{
while(*string)
writeChar(*string++);
}

julianf123
02.12.2009, 14:44
Ist so etwas eigentlich auch mit dem RP6 möglich ihn irgendwass spechen zu lassen ?

Thomas$
02.12.2009, 14:49
wenn man am rp6 serielle übertragung macht und mit dem niobee sollte es kein problem sein. nur zwei mobile roboter mit kabel zu verbinden ist vileicht unpraktisch oder man verwendet ein funk modul

radbruch
02.12.2009, 17:20
Hallo

Ich habe es noch nicht ausprobiert, aber der RP6 sollte die nibobee per IR-Kommunikation verstehen können. Und zwar ohne zusätzliche Bauteile nur mit Bordmitteln. Die Grundlagen mit funktionierendem Programm für den RP6 (allerdings auf eigene Gewähr, Thread bitte durchlesen!):

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=32585

Und für das IR-Senden mit der nibobee gibt es gleich zwei Ansätze:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=470629#470629
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=470683#470683

IR-Empfangen für die nibobee habe ich noch nicht fertig. Ohne TSOP könnte man dazu die Liniensensoren nutzen.

Gruß

mic

s.frings
28.03.2010, 14:41
In einem völlig anderen Projekt hatte ich den seriellen Port so eingerichtet, dass die ganzen Funktionen der Standard C Library den seriellen Port als Konsole verwenden.

So kann man z.B. puts() und printf() für Ausgaben, sowie fgets() und scanf() für Eingaben benutzen. Beispiel:


char buffer[100];

int main(void) {
initserial();
while (1) {
fgets(buffer,sizeof(buffer),stdin);
if (strcmp_P(buffer,PSTR("help"))==0) {
puts_P(PSTR("Can I help you?"));
}
}
return 0;
}


Wer diese PSTR() Sachen nicht kennt: Zeichenketten belegen doppelt Speicher (und zwar RAM und ROM), wenn man es nicht so macht. Die Funktion puts_P gibt eine Zeichenkette aus, die im Programmspeicher liegt, während puts vorraussetzt, dass die Zeichenkette im RAM liegt.

Schlecht: puts("Hallo");
Besser: puts_P(PSTR("Hallo"));

salvadordali
20.05.2010, 19:57
Hallo zusammen,

ich habe mir folgenden UART Wandler besorgt http://www.nbglin.com/485.htm und den TTL UART auf X5 der Nibobee verdrahtet. Ich habe das Program von Pinsel mit 9600 Baud hergenommen, lässt sich compilieren und flashen. Der USB Serial Converter scheint zu gehen es kommt aber nix auf meinem Terminal an. Ich habe HTerm und Realterm probiert. Ich bin für jede Idee wo ich etwas falsch gemacht habe dankbar.

Salvador

oberallgeier
20.05.2010, 22:31
Hallo Salvador,

willkommen im Forum.


... folgenden UART Wandler besorgt http://www.nbglin.com/485.htm und den TTL UART auf X5 der Nibobee verdrahtet ...
... Der USB Serial Converter scheint zu gehen es kommt aber nix auf meinem Terminal an ...Hübsches Teil mit vielen Möglichkeiten ! ! Ein nicht unüblicher Fehler ist es, RX und TX zu verwechseln. Das passiert mir immer wieder. Daher habe ich einen Stecker (wie von RN empfohlen) mit (RX) - (GND) - (TX). Einfaches Drehen führt dann fast immer zum Erfolg *ggg*.

salvadordali
20.05.2010, 23:01
Thanks for the welcome,

tja laut Beschreibung bzw. Schaltplan (http://www.nbglin.com/cpjsimage/485c.jpg) sollte das Modul eigentlich mit TTL auskommen, daher habe ich das Ding bestellt. Bin also wie gesagt etwas ratlos.

s.frings
21.05.2010, 07:04
Ich bin drauf reingefallen, dass man beim ATmega 16 ein Bit mehr setzen muss (nämlich das URSEL Bit), als bei allen anderen ATmegas. Denn beim ATmega 16 haben zwei Register für den seriellen Port die selbe physikalische Adresse!

Im Makefile:
-DBAUD=9600 -DF_CPU=15000000

Im C Programm:

// set baudrate
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
// enable receiver and transmitter
UCSRB = (1<<RXEN) | (1<<TXEN);
// framing format 8N1
#ifdef URSEL
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
#else
UCSRC = (1<<UCSZ1) | (1<<UCSZ0);
#endif

oberallgeier
21.05.2010, 13:45
... laut Beschreibung bzw. Schaltplan sollte das Modul eigentlich mit TTL auskommen ...Das sehe ich genauso. In Deinem ersten Link ist ja ein 4-fach-Stecker an Deinem Modul (dem UART Wandler) mit TTL-UART beschriftet - genau der Pegel, den Du an der Beene brauchst. Der 4-fach-Stecker "TTL-UART" muss mit der Beene verbunden werden. Ich würde
a) Vcc nicht verbinden (= keine Leitung zwischen Modul und Bee)
b) GND verbinden von Modul nach Bee - das MUSS sein
c) RX (und TX) des TTL-UART am "Modul" mit TX (und RX) an der Beene verbinden
Wenns dann nicht läuft,
d) TX (und RX) des TTL-UART am "Modul" mit TX (und RX) an der Beene verbinden.

Wenns dann noch immer nicht läuft: schimpfen, grübeln - keine Ahnung . . . .

salvadordali
25.05.2010, 08:00
So wie es aussieht hat sich mein Multifunktionswandler verabschiedet, werde erst mal ein neuen bestellen müssen.

oberallgeier
25.05.2010, 10:08
Hi, salvadordali,

vor einer Neubestellung teste doch Deinen Wandler, ob der tatsächlich das Zeitliche gesegnet hat.

Wenn Du ein Oszilloskop hast, dann miss mal zwischen TX und GND des TTL-UART. Als Signal könntest Du aus einem Terminalprogramm z.B. bei 1200 Baud einen File mit jeder Menge großen "U" an die Schnittstelle ausgeben lassen. Du kannst Dir 200000 "U"s hier holen (http://oberallgeier.ob.funpic.de/200000grosseU.txt) (abspeichern als irgendwas.txt) - und an die Schnittstelle senden. Der Oskar müsste dann etwa 6 kHz anzeigen.

WENN Du keinen Oskar hast, dann baue Dir die Schaltung (http://oberallgeier.ob.funpic.de/fuseretter1.jpg) wie in diesem Posting gezeigt (https://www.roboternetz.de/phpBB2/viewtopic.php?p=476536#476536&sid=b9692c11b4535988b787f2a49dc540d7) auf - ohne Controller, versteht sich. Es reicht im Prinzip eine einzige LE D, die LE D_CLK aus dem Schaltplan - also Anode zum TX, mit Vorwiderstand. Sie wird zwischen TX und GND geschaltet. Die LE D muss dauernd leuchten, sobald der Wandler am US B eingesteckt ist. Wenn Du dann übers Terminal die Sammlung "Groß-U" als file sendest, MUSS die LE D dunkler werden. Sie leuchtet dann nämlich mit 50% duty cycle, d.h. sie ist nur noch zur Hälfte der Zeit an. Erklärt ist das Ganze im genannten Link, allerdings für einen anderen Zweck.

Sollte die LE D nicht leuchten, dann, wie schon geübt, diesmal auf RX<-> GND probieren. Wenn die dann auch nicht leuchtet, könntest Du dasselbe noch direkt an den RS 232-Ausgängen von Deinem Wandlerbaustein statt am TTL-UART testen. Es könnte sein, dass wenigstens der noch heil ist und benutzt werden kann . . . . . . . Natürlich könntest Du damit auch die Schnittstelle Deiner Bee testen - musst halt ein paar tausend "U"s senden, dann möglichst mit wenigen Baud *ggg*.

Und zum Schluss:

... Der USB Serial Converter scheint zu gehen es kommt aber nix auf meinem Terminal an ...Wieso bist Du dann der Meinung, dass der geht? UND - Es könnte auch der US B-Port hinüber sein.

Viel Erfolg und schreib, wie´s ausgeht.

salvadordali
25.05.2010, 12:48
Ich hab den Wandler an verschiedene Rechner angeschlossen und er wird von keinem mehr erkannt. Der Pegelwandler könnte aber tatsächlich noch funktionieren. Ich werde erst mal die Testschaltung zusammenbasteln und prüfen. Danke für den Tip! Ich geb auf jeden Fall Bescheid was rausgekommen ist.

oberallgeier
25.05.2010, 15:31
Ich hab den Wandler an verschiedene Rechner angeschlossen und er wird von keinem mehr erkannt ...Die pessimistische Formulierung heißt: man kann Läuse UND Flöhe haben. Sprich: es können ja die (evtl. alle) Rechnerschnittstellen hinüber sein und(oder) der Wandler. Also sollte eigentlich mindestens eine US B-Schnittstelle mit irgendeinem Datentransporter (Festplatte, Memorystick, MP3Player etc) getestet werden. Meist hatte ich bei solchen Problemen aber nur ein winziges Detail übersehen . . . . . Du hast schon den Punkt b) oben gelesen und beherzigt? ( b) GND verbinden von Modul nach Bee - das MUSS sein )

Wenn ich mich richtig erinnere, hatte ich irgendwann (zusammen mit der Bee-Installation) Probleme an den US B-Schnittstellen. Nach längerem sinnlosen Rumprobieren hatte ich alle US B-Treiber in der Systemsteuerung ( - System - Hardware-Gerätemanager - Anschlüsse (COM und LPT) ) rausgeworfen. Ich bin nicht sicher, ob ich nicht auch im Gerätemanager bei US B-Controller irgendwas ausgemistet hatte. Danach musste ich je nach Anwendung neue Treiber installieren, aber jetzt laufen alle meine benötigten Werkzeuge. Das kann ich aber nicht empfehlen, weil ich nicht weiß, ob die Aktion so ok war. Zumindest habe ich in den letzten Monaten keine Fehler mehr festgestellt . . .

wastel
03.06.2010, 10:03
Hallo zusammen.
Ich versuche auch gerade meinem NIBObee ein "Hallo Welt" zu entlocken.
Hab dafür das Programm von Pinsel benutzt combiliert und geflasht-> soweit alles ready.
Als Hardwareanschluss bin ich an die X5 Schnittstelle und hab meinen eigenen Wandler mit einem MAX232 Drangebaut mit diesem Schaltplan hier:http://www.captain.at/electronic-atmega-mmc.php

Als Programm zur Kommunikation verwende ich Terminal in der Version 1.9b. Hab also alles verbunden und mit meinem COM 1 connected aber leider kommt nicht an. Baudrate stimm überein. Schaltplan hab ich auch schon überprüft.

Danke

wastel
03.06.2010, 10:51
Korrektur. Ich empfange doch was aber leider kein "Hallo Welt".
Hab mir mal Realteerm runtergeladen und wenn ich hier auf empfangen gehe komme mit dem Code von Pinsel nur nullen an, wenn ich bei "Disaplay as" <uint8> angebe. Bei Ascii kommen nur undefinierte Zeichen raus. Kennt jemand das problem?

salvadordali
10.07.2010, 22:29
So nach etwas längerer Pause bin ich wieder da.
Ich habes nun auch geschafft.
Ich habe mir mit der Anleitung vom oberallgeier eine Testschaltung gebastelt und mit dem Programm von Pinsel "U" in der Endlosschleife gesendet. Damit habe ich überprüft ob die RS232 der Biene auch richtig tut.
Ich habe ebenfalls den Baustein FTDI Basic Breakout5V von Watterot besorgt RX und TX richtig angeschlossen sowie GND mit "-" verbunden.
Und siehe da ich empfange lauter "U U U ....." wunderbar.
Ich habe die Realtermeinstellungen dokumentiert und als Attachement angefügt.
Zwei Sachen hab ich gelernt:
1. RX und TX tauschbar zu haben ist eine gute Idee.
2. Die Einstellungen von Realterm sind etwas merkwürdig.

Nachdem das neue Modul funktioniert werde ich das alte erst mal beiseite legen und später mal checken ob es noch tut.
Will jetzt erst mal an de Biene weiter basteln.

Danke noch mal für die Unterstützung!

Salvador

Hier noch der komplette Code den ich verwendet habe:



#include <nibobee/iodefs.h>
#include <nibobee/led.h>
#include <nibobee/line.h>
#include <nibobee/usart.h>
#include <nibobee/sens.h>
#include <nibobee/delay.h>

void writeChar(uint8_t data );
void writeString(char *string);
void waitForStartBySensor();
void blink();
void init();

int main()

{

init();

waitForStartBySensor();
blink();
while(1) {
//usart_putchar('U');
//usart_putchar(' ');
writeString("Hallo sagt die Biene\n\r");
}
return(0);
}


void writeChar(uint8_t data )
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
void writeString(char *string)
{
while(*string)
writeChar(*string++);
}
void waitForStartBySensor() {
int8_t start = 0;
while (start == 0) {
if(sens_getLeft() != 0 || sens_getRight() != 0) {
start = 1;
}
delay(10);
}
}

/*!
* LED 0-3 blinken auf. Kann genutzt werden um Aktionen zu bestätigen.
*/
void blink() {
int16_t iBlink = 200;

for(int8_t n=0; n<=4; n++) {
led_set(LED_L_YE, n%2);
led_set(LED_L_RD, n%2);
led_set(LED_R_YE, n%2);
led_set(LED_R_RD, n%2);

delay(iBlink);
}
}

void init() {
sens_init();
led_init();
analog_init();
line_init();
enable_interrupts();
usart_enable();
usart_setbaudrate(9600);
}

s.frings
11.07.2010, 09:50
Für technische Anwendungen gefällt mir das Programm "Der Hammer", gibts Linux und Windows.

http://www.der-hammer.info/terminal/

salvadordali
12.07.2010, 19:44
Hi wastel,
ich hatte das Problem nun zwischendurch auch.
Realterm laufen lassen und Biene neu starten und programmieren hat geholfen.

Gruss
Salvador


Korrektur. Ich empfange doch was aber leider kein "Hallo Welt".
Hab mir mal Realteerm runtergeladen und wenn ich hier auf empfangen gehe komme mit dem Code von Pinsel nur nullen an, wenn ich bei "Disaplay as" <uint8> angebe. Bei Ascii kommen nur undefinierte Zeichen raus. Kennt jemand das problem?

workwind
12.07.2010, 20:25
Hallo salvadordali,

In Deinem Code initialisierst Du die USART mit dem Code aus der NIBObee Library:



enable_interrupts();
usart_enable();
usart_setbaudrate(9600);


Die Bibliothek übernimmt daraufhin die Ansteuerung der USART im Interruptmodus. Du solltest dann nicht direkt die Register beschreiben, sondern die usart_putchar() Funktion aufrufen - oder die Initialisierung selbst übernehmen.

KD81
29.09.2010, 20:47
Hi @all!

Ich überlege, den Nibobee ins MS Robotics Studio zu integrieren. Hübsch wäre es dazu, wenn ich die SerialPort Klasse von .Net benutzen könnte. Die kann auch mit virtuellen Com Ports umgehen. Mein Bluetooth Dongle benutzt zum Beispiel einen solchen (ok, eigentlich sind es zwei und nochmal ok, eigentlich kann ich nur sagen, dass die Klasse mit dem BT Dongle kann ;)). In der Konstellation funzt auch die Kommunikation mit dem Lego NXT (in dessen Servics wird eine SerialPort Instanz verwendet) ohne Probleme.

Meine Idee war daher, den Nibobee um einen der hier genannten USB - seriell Wandler zu erweitern und den (so vermute ich wenigstens) erstellten virtuellen COM Port für die Kommunikation zu nutzen. Das sollte doch eigentlich funktionieren, oder?
Zumindest kann man ja offensichtlich auf ein Terminal schreiben und wohl auch davon lesen (zumindest hat die C Bib auch ne Funktion, um von der seriellen Schnittstelle zu lesen).

Leider habe ich momentan keine Biene zur Verfügung, um das mal eben so probieren zu können. Meine FH oder ich müssten diese dafür extra kaufen. Aus dem Grund ist es mein Interesse, das "Risiko der Anschaffung möglichst gering zu halten" ;), weil der Roboter zunächst nur dafür angeschafft werden würde und, sofern ich ihn selbst bezahlen muss, mir auch die 50 Euronen momentan schon weh täten.

Für Infos und Meinungen dazu wäre ich daher sehr dankbar!

viele Grüße
KD81