PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom -> C, Programm umschreiben



jagdfalke
26.11.2005, 20:18
Hi,
kann mir jemand erklären, was Bascom bei diesem Code macht:


Sub Rnb_servob(byval Servonummer As Byte , Byval Position As Byte)
Open "comd.7:9600,8,n,1" For Output As #2
Print #2 , "#s" ; Chr(servonummer) ; Chr(position)
Close #2
End Sub


Die Methode bewegt nen Servo, bzw sagt dem CoController, dass er den Servo bewegen soll. Wie mach ich das in C?

mfg
jagdfalke

linux_80
26.11.2005, 21:43
Hallo,

probiern wirs mal:

Öffnet eine Software UART am PortD.7 mit 9600 usw. nur TX, also ausgabe,

gibt vier Zeichen aus, beginnend mit "#s"

schliesst die UART Verbindung.


Lässt sich aber mithilfe der BascomHilfe entschlüsseln.

jagdfalke
26.11.2005, 21:58
bascom war noch nie so mein Fall. Hmm Software UART? Wo kann ich herausfinden, wie das geht? (Software UART = normale UART nur an selber definierten pins oder?)

mfg
jagdfalke

linux_80
26.11.2005, 22:31
Wenn Du aber den eingebauten USART sonst nicht brauchst, ist es für C natürlich besser. In C das nachzubauen wird timingmässig durchaus anspruchsvoll, ist aber zu schaffen, denn es wir nur gesendet.

Bascom hab ich auch vor allem drauf, um nachschauen zu können, von was hier geredet wird.

jagdfalke
26.11.2005, 22:35
Ok, sagen wir mal ich brauch den eingebauten UART nicht. Wie läuft das dann mit C? Ich glaub das mit dem Timing usw schaffe ich nicht, da ich gerade erste mit C angefangen habe.

mfg
jagdfalke

linux_80
26.11.2005, 22:47
Du verwendest einfach deinen Code aus dem anderen Thread, https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=14641
und sendest Die vier Zeichen die Du da senden musst.

jagdfalke
26.11.2005, 23:00
hmm ich hab jetzt "#s1255" rübergesendet, aber der Servo 1 zuckt nicht einmal. Sicher, dass ";" zwischen den Werten in Bascom das ganze einfach zusammenfügt?
mfg
jagdfalke

recycle
26.11.2005, 23:41
Sicher, dass ";" zwischen den Werten in Bascom das ganze einfach zusammenfügt?

Sende es doch einfach mal an ein Terminalprogramm auf deinem Computer. Dann siehst du was da ankommt.

linux_80
26.11.2005, 23:56
Hi jagdfalke,
das waren aber mehr als 4 Zeichen !
Ausserdem werden die Zahlen nicht als String gesendet, sondern mit
CHR(zahl), so wird das als ein Byte übertragen.
Das lässt sich allerdings nicht so einfach mit einem Terminal testen.

jagdfalke
27.11.2005, 07:53
ok, also ";" fügt die zusammen, sagt mein terminal.
Und was ist das Äquivalent zu "CHR()" in C ? In der Bascom Hilfe steht, dass es Zahlen zu Zeichen macht, aber macht das char *s = "#s1255" nicht auch schon?

Ich möchte die Servos geren mit dieser Funktion bewegen:

void servo_move(int servo, int pos) {
char *s = "#s"+servo+pos;
while(*s) {
loop_until_bit_is_set(UCSRA, UDRE);
UDR = *s;
s++;
}
}

Das "+" zwischen dne String-Teilen macht nicht so ganz das was ich will. Ich glaub der addiert die Zahlen und hängt sie nicht an. Ich hab jetzt die Variable int len aus der Funktion rausgenommen, weil ich eigentlich nicht immer nachrechnen will, wie Viele Zeichen das jetzt haben wird. (len war ursprünglich dafür da, dass er while nicht abbricht sobald eine 0 auftaucht, es könnten ja noch andere Zeichen folgen.)


mfg
jagdfalke

PicNick
27.11.2005, 11:25
Das String-zusammenbasteln zahlt sich da nicht aus


void servo_move(int servo, int pos)
{
loop_until_bit_is_set(UCSRA, UDRE);
UDR = '#';
loop_until_bit_is_set(UCSRA, UDRE);
UDR = 's';
loop_until_bit_is_set(UCSRA, UDRE);
UDR = servo;
loop_until_bit_is_set(UCSRA, UDRE);
UDR = pos;
}

Das Stringbauen + schleifen-konstrukt macht die Sache nur länger

SprinterSB
27.11.2005, 12:57
Mit '+' Kann man in C keine Strings zusammenbasteln!!!

Mit '+' addierst du die Adressen der Strings, das Resultat zeigt irgendwo in deinen Speicher und du liest Käse raus bzw das, was gerade da steht.

Strings aneinanderhängen geht mit strcat(), aber besser ist der Vorschlag von Robert.

jagdfalke
27.11.2005, 19:58
Ja, warum einfach, wenns auch kompliziert geht ? :D
Danke, jetzt klappts.

Eine neue Frage hat sich aufgetan:
wenn ich jetzt


int i=0;
for(i=0; i<=255; i++) {
servo_move(1, i);
}

laufen lasse, beept mein PC immer. Woran liegt denn das? Das ist dasselbe beepen, das man hört, wenn man in ner Linuxkonsole die Pfeiltaste nach unten drückt.

mfg
jagdfalke

linux_80
27.11.2005, 20:13
Du meinst, Du willst Die ausgabe die für den Motor gedacht ist am PC sehen ?

Es piept deshalb, weil das Zeichen das ankommt nicht darstellbar ist, und evtl. den Code 7 hat.
Sehen kann man nur die ersten beiden Zeichen also "#s", von den 255 möglichen nur die, die auch als Zeichen darstellbar sind.
Da kommt dann allerhand drucheinander an, oder ?

jagdfalke
27.11.2005, 20:55
Durcheinander kommt eigentlich nix.
Er zeigt halt nur "#s" an und beept. Naja das geht dann wohl nicht.

PicNick
28.11.2005, 13:58
Dazu gleich eine Warnung: je nach Emulation kann sich ein Terminal bei ungünstigen Zeichen regelrecht "aufhängen". Nicht erschrecken, ggf. beenden und neu starten