PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : serial in/out aber wie??



raptor_79
07.12.2005, 18:59
hallo, ich versteh bei serialin/out (software) nicht, WO ich das zu sendende reinschreib. kann mir das mal jemand erklären?? wie soll das gehen?

ich will an einem atmega8 daten an einen atmega32 senden, diese auf einem lcd ausgeben, und dann dem atmega8 was zurückschicken. meinetwegen zahlen oder sowas. einfach nur damit ich seh, wie und ob es geht.
wäre echt super, wenns eine erklärt. und bitte keine "schau in die hilfe" weil, das ist ja das, was nicht geht.
das serialin.bas hab ich nämlich versucht, und komm nicht wirklich weiter.

muß ich was mit config machen? hat demand code? das wäre super!

danke an euch schon mal....

Marco78
07.12.2005, 19:27
Das passt ja eher zu Bascom als zu AVR allgemein ;)

Poste doch mal bitte deine Codes für beide AVR's und erkläre, wie du sie verbunden hast.

Was bringt dir ein Codebeispiel, wenn du das von Bascom auch nicht verstehst. Ich denke so kann man es leichter erklären.

raptor_79
07.12.2005, 19:34
code ist die serialin.bas im compiler.
verbunden über irgendwelche pins.

also, ich will gezielte software-serial in. bin aber grad draufgekommen, das das die usart ist, die ich da configen muss.

PicNick
07.12.2005, 20:08
?? SPI oder UART ?? *unsicher*

raptor_79
07.12.2005, 20:20
uart

bastel grad mit serin/out herum, geht aber nix

Marco78
07.12.2005, 20:47
verbunden über irgendwelche pins.
Und genau das wird das Problem sein! Es können ja nicht alle Pins auf einmal In und Out sein! Du musst schon angeben welcher Pin was machen soll ;)

Ich find bei mir auch nur die Dateien serin_out.bas und serint.bas.
Schon alleine deshalb könnte ich dir nicht helfen wenn ich den Code von dir nicht sehe.

Aber fang erstmal damit an, bestimmte Pins zuzuweisen. Damit kommst du sicherlich schon einen Schritt weiter.

raptor_79
07.12.2005, 20:52
hab ich ja schon.

laut den anweisungen können belibige pins I/O sein, und sogar die gleichen können In ODER out sein. hab Portb.0 in und Portb.1 out.

ich versteh nur nicht, wie ich da was senden soll. also ich will halt was übertragen. aber WIE bekomme ich was in WELCHE Var./Const???
und WIE empfange ich da was.

würde ja auch code schicken, aber das hab ich auf einem anderen pc. tipp das nicht nochmal ab.

raptor_79
07.12.2005, 20:59
hab da was. das erklärt mein problem auch ganz gut.

const Ecs = 27
const Bytes = 1

Dim I As Byte


Do
Serin I , Bytes , B , 0 , 9600 , 0 , 8 , 1
Serout I , Bytes , B , 1 , 9600 , 0 , 8 , 1
If I = Esc Then Exit Do
loop

End

Also:
Was ist "I" und Woher kommt die, und WIE bekomm ich die "27" (ist die ASCII für ESC-Taste) in die "I" hinein??
und wie kann ich da jetzt senden und empfangen?? wie kann man so daten hin und her schicken?? das ist das problem.

Marco78
07.12.2005, 21:00
Was beim einen In idt, muss ja beim anderen Out sein. Die Übertragung muss gekreuzt sein. Wie Rx an Tx und umgekehrt.

Probier doch mal mit Print was zu senden oder mit Input oder Inkey was zu empfangen.
Ich kann mir wirklich nicht vorstellen, das im Beispiel da nichts angegeben ist wie das geh'n soll.

Wenn du mir den genauen Befehl(e) sagen könntest, könnte ich ja mal so in die Hilfe schauen.

raptor_79
07.12.2005, 21:06
serin
serout

das sind die befehle für die Software-UART.

das besondere ist ja eben, daß dafür jeder x-beliebige pin verwendet werden kann. MUß ich auch so machen, der rest ist fest belegt.

ich hab halt keine ahnung, wie ich da daten rausbekommen soll, bzw, wie die aussehen sollen. z.b. &HFFFF oder &B0011101010

was weiß ich.
oder kann ich da einfach send *so halt* machen und beim empfänger:
if I= *so halt* then...gosub...

Marco78
07.12.2005, 21:19
Für SUART gibt es auch noch weitere Befehle. Schau z.B. mal nach OPEN.BAS. Da kannst du einfach mit Print und Input arbeiten. Ist evtl einfacher zu verstehen. Und die Pins sind auch frei zuordbar.

Serin sendet wie auch da im Beispiel steht die angegebene Variable (S im Beispiel). Der Befehl muss aber jedesmal komplett geschrieben werden. Da ist Open evtl. einfacher.

raptor_79
07.12.2005, 21:50
ja, das ist ja klar, aber WIE bekomm ich was in WELCHEM format IN die Variable "S"??
soll ich einfach so: s= hallo
schreiben oder muß das s=&H3x4F
sein oder wie?? ich will, daß der eine AVR mir nach ascii die 82 ausgibt, und der andere bei erhalt 82 etwas tut. aber wie muß das aussehen??
weil, wenn ich s=82 mach geht nix, wenn ich es in hex schreib auch nicht, und binär auch nicht... also, wie soll ich da was senden??
der überträgt ja nix

Marco78
07.12.2005, 22:21
Hast du es mal wie im Beispiel probiert? S = String * 10 : A = String * 10
S = "Hallo"
S senden, der andere empfängt das S, sendet es wieder zurück und du empfängst es als A.
If A = "Hallo" Then mach ne LED an oder sonstwas.
Hex, Binär oder Dezimal musst du erstmal umwandeln um es in einen String zu bekommen.

Versuch es doch mal mit Open ...
Da kannst du mit Print, Input, ... arbeiten als wäre es UART. Du musst nur immer den Kanal angeben. Print #1 "Jetzt geht's"

Ich glaube dein Problem ist nicht, das du Serin/out nicht verstehst, sondern dein Problem liegt in der Zuweisung der Variablen. Das ist da nicht anders als wenn du 'intern' mit Variablen arbeitest.

raptor_79
07.12.2005, 23:38
shit!!!

kann es sein, daß der serin-befehl den chip in eine "wartestellung" bringt, und nur dann weitermacht, wenn da was eingegangen ist?? und so bleibt, bis er was bekommen hat??

Marco78
08.12.2005, 20:49
Mit Input wird es bestimmt so sein.

Soll das bedeuten, das es jetzt geht?

Hast du dir Open mal angeschaut?

raptor_79
08.12.2005, 21:46
nein, open ist nicht das was ich will.
ich will ja mir serin/out arbeiten.

muß ja irgendwie gehen. mir ist nur aufgefallen, daß er halt bei serin stehenbleibt. zumindest sieht es so aus. jedenfalls im simulator.
werd mich jetzt an die arbeit machen, und zusehen, daß ich das hinbekomme. weil, wenn das andere auch können.......

Marco78
08.12.2005, 22:09
Naja, wenn ich einen Kaffee möchte, gebe ich mich auch nicht mit gerösteten und gemahlenen Kaffeebohnen zufrieden, über die heißes Wasser gegossen wurde und man mir das Produkt dann serviert ;)

Wie auch immer... Viel Erfolg.

Schau doch mal nach, was Inkey so macht. Ob der auch auf eine Eingabe wartet. In der Hilfe hast du ja auch Links zu weiteren Befehlen. Vielleicht findest du da das passende was nicht wartet, bzw nur eine maximale Zeit. Ohne INT wird es wohl schwer das zu lösen.

raptor_79
08.12.2005, 22:22
hab jetzt ein oszi dran gehängt. der sendet schon mal nichts. klar, wenn nicht gesendet wird, gibts auch keinen empfang.

glaub, das problem ist, was in die string zu bekommen. wie machst du das? ich will &Hxx der in einer var. steht in einen string bekommen. string = *10
das sollte doch reichen?

hättest mir da die umformung? ich habs halt mir var=str(numvar) versucht.
und zurück mir var=hexval(string)
ist doch richtig?

chr-mt
16.12.2005, 00:07
Also wenn du einen String mit den Hex-Zeichen haben willst, dann geht das so:

Dim A As byte
Dim Hexstring As String *2
a=&HFA
Hexstring = Hex(a)
End

Dann steht im String "hexstring" : "FA"

Wenn du eine Integerzahl in einen "Hex"- String wandeln möchtest, dann brauchst du 4 Zeichen:

Dim A As byte
Dim Hexstring As String *4
a=&HFA
Hexstring = Hex(a)
End

Dann steht im String "hexstring" : "00FA"

zurück geht das ganze dann mit hexval

Dim A As Integer
Dim Hexstring As String * 4

Hexstring = "00FA"
A = Hexval(hexstring)
End

Dann steht in A der Wert &HFA


Gruß
Christopher

raptor_79
16.12.2005, 00:18
Naja, wenn ich einen Kaffee möchte, gebe ich mich auch nicht mit gerösteten und gemahlenen Kaffeebohnen zufrieden, über die heißes Wasser gegossen wurde und man mir das Produkt dann serviert ;)

Wie auch immer... Viel Erfolg.

Schau doch mal nach, was Inkey so macht. Ob der auch auf eine Eingabe wartet. In der Hilfe hast du ja auch Links zu weiteren Befehlen. Vielleicht findest du da das passende was nicht wartet, bzw nur eine maximale Zeit. Ohne INT wird es wohl schwer das zu lösen.

das mit dem warten kann man ja durch $timeout lösen. das scheint zu gehen.
jedenfalls macht das programm im sender weiter.

Goblin
16.12.2005, 08:44
mal ne allgemeinfrage zu serin/serout. ich denke es handelt sich um software-usart an einem beliebigen i/o-pin. bzw an 2en. wo ist der nachteil gegenüber dem festen hardware-usart? weil der blockiert mir nämlich am atmega8 den port d.....

raptor_79
16.12.2005, 17:44
software-usart kann man an einem pin betreiben, und das an einem beliebigen.
und sonst, weiß noch nicht.... muß ich erst rausfinden. drum mach ich es selber.

linux_80
16.12.2005, 20:11
Hallo Goblin,

Software UART benötigt einen grösseren Programmieraufwand. Beim Empfang wird evtl. das ganze System langsamer.

HardwareUART:
Wenn alle angaben in den Registern der USART gemacht sind, muss man beim Senden nur noch das Byte in den Ausgabepuffer schreiben, und warten bis es draussen ist.
Beim Empfang braucht man nur ein bestimmtes Bit eines Registers abfragen, ob ein neues Byte empfangen wurde, oder den IRQ verwenden.

Software:
Vorteil:
man kann jedes Pin nehmen,

Nachteil:
man muss das timing selber bauen,
keine Interrupts wenn ein Byte fertig übertragen ist.

Beim versenden ist das noch etwas einfacher, einen Timer anwerfen der der gewünschten BPS entspricht, dann kann man die Bits incl. start/stop und evtl. Paritybit über das gewünschte Pin rausschieben.

Beim Empfang muss man aktiv am Pin lauschen, damit man kein Bit übersieht. (Beim früher im PC verwendeten 16450 wurde das mit dem 16fachen Takt der Übertragung gescannt.)
Man könnte da aber auch einen externen IRQ verwenden, dann meldet dieser, wenn Daten ankommen.

Also meine Meinung, wenn viel zu Empfangen ist, sollte besser die Hardware benutzt werden,
Versenden ist nicht so schlimm, blockiert evtl. einen Timer.