PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : über rs232 empfangene bytes im pic weiterverarbeiten



Simon1990
14.08.2005, 23:40
hallo,
ich hab da mal n problem. ich will mit meinem pc über rs232 dem pic startbefehle für unterprogramme geben.
da ich aber (zurzeit) leider nicht dazu komme, mich näher mit einer programmiersprache für pc zu beschäftigen, wollte ich hier auf clickEXE (so'n programm zum zusammenklicken von Windows-Anwendungen) :oops: zurückgreifen.
da gibt es eine funktion, mit der man einen string über den com-port senden kann. das ist ja eigentlich wunderbar, nur leider weiß ich jetzt überhaupt nicht, was ich dann damit im pic anfangen soll. also wenn ich jetzt z.B ein einfaches "a" vom pc aus sende, dann krieg ich des am pic ja als byte rein (is ja logisch), aber jetzt muss ich am pic ja z.B. mein "a" von einem "b" unterscheiden. und da haperts bei mir an zwei stellen:

1. hat vielleicht jemand eine liste oder so, in der ich ablesen kann, wie buchstaben in ein byte aus Nullen und Einsen zerlegt werden?
und
2. kann ich dann, mal angenommen mein "a" ist als byte ein "00101101", eben dieses "00101101" in eine speicherzelle schreiben und dann das über rs232 reinkommende byte koplette mit dem aus der speicherzelle vergleichen, oder muss ich da einzeln jedes bit überprüfen? des kann doch fast net sein. des wär doch bei einer auswahl von 26 buchstaben ein bisschen viel verlangt, oder??

oder hab ich da vielleicht was kompett falsch verstanden?


ich hoffe mal, es sind nicht alle in urlaub, sodass mir jemand weiterhelfen kann.



mfg Simon




Nochmal was: Hat einer vielleicht grad n link zu ner seite, wo man mal des hexadezimale System erklärt kriegt? des blick ich nämlich noch net so ganz.

gunzelg
15.08.2005, 09:40
Hallo Simon

was du brauchst, ist eine ASCII-Tabelle. da steht dann drin, daß ein "A" durch "hex 41", ein "B" durch "hex 42", ein "a" durch "hex 61" usw dargestellt wird. Schicken kann ich dir so einen tabelle nicht. Ich hab da so ein altes Buch, da steht das drin. Aber google einfach mal in WEB nach "ASCII Tabelle".

Ansonsten: Du bist ganz schön mutig: keine Ahnung von nix, aber programmieren wollen - urps , sorry, also, schau z.B.: bei www.sprut.de
da gibts eine Einführung in PIC Programmierung. Dann gibts da noch www.fernando-heitor.de das ist eine ziemlich gute PIC Seite mit Forum.

Zu deinen Fragen: Der PIC wird so programmiert, daß er z.B. einen Interrupt auslöst, wenn ein Zeichen im RXD-register steht, das holt man dann in der Interrupt-Service-Routine dort ab und schreibts woanders hin oder überprüft was es ist. Je nachdem was du für einen PIC verwendest, mußt Du entweder vergleichen oder subtrahieren. Die PIC 16 Familie kennt keine Vergleichsbefehle. Da mußt du subtrahieren. z.B sagst du SUBLW 0x41 . das empfangene Zeichen steht im Register w . Wenn jetzt w = 0x41 ist, dann ist im Status-Register das Z-Flag gesetzt. Das kannst Du dann abfragen.

Lies dir aber erst mal so eine Einführung durch, dann verstehst du auch leichter wie das geht.

Gruß
Gerhard

Simon1990
15.08.2005, 10:15
ok. vielen dank.
das hat mir schon mal sehr viel geholfen. jetzt weiß ich zumindest mal, was ich brauch und kann dann bei google schauen.

bei sprut bin ich mich auch schon ganz fleißig am durchlesen. und so ganz keine ahnung vom programmieren hab ich auch net. ich kann son bissle c++. für mehr als ne konsolen-anwendung reichts da aber net. aber das hilft mir zumindest einige grundlagen bei sprut besser zu verstehen.
in assembler hab ich auch schon ein paar kleinere programme geschrieben. dass z.B. mit einem taster zwischen ein paar leds umgeschaltet werden kann. nichts dolles aber halt mal so zum üben.
ich hab halt nur noch n bissle probleme, dass ich die befehle die's in assembler gibt noch net so genau kenn und deshalb auch noch net direkt ne idee hab, wie ich was umsetzen kann und deshalb manchmal frag.

mfg Simon

gunzelg
15.08.2005, 10:42
Hallo Simon

war nicht böse gemeint. Ist auch klar - ging mit nicht anders. Ich hab früher nur so olle kamellen wie den Z80 programmiert, dann noch das Intel-Graffel. Dann kommt da so ein uC daher der nur Register hat und kein RAM ? und hat keinen Akku, sondern ein W-register. Das ist schon eine Umstellung. Aber wenn Du die PIC's mal in C programmieren willst, solltest du dir mal die PIC18-Familie anschauen (vielleicht hast du ja schon). die sind komfortabler. Seit ich die kenne mach ich nix mehr mit PIC16.

Gruß
Gerhard

Simon1990
15.08.2005, 11:28
sorry, aber ich glaub ich brauch da doch noch mal n bissle starthilfe.
ich weiß jetzt zwar, dass "A" nach ASCII dezimal eine 65 und hexadizimal eine 41 ist.
und wie kann ich den pic jetzt überprüfen lassen, ob es sich um ein "A" handelt? ich hab deine erklärung oben leider nichts so ganz verstanden, wie dass mit dem subtrahieren geht.
kannst du mir da vielleicht mal ein kurzes Beispiel Programm schreiben?
oder vielleicht kannst du mir auch sagen, welche pics vergleichen können und mit welchem befehl. da hab ich nämlich bei sprut's Befehlsverzeichnis auch nichts zu gefunden.

aber trotzdem schon mal vielen dank für deine hilfe.


Simon

gunzelg
15.08.2005, 13:01
Also ich gehe davon aus, daß du einen PIC16 hast:


test:
movlw 0x41 ;das ist das zeichen aus dem UART receive register
sublw 0x41 ; überprüfen obs 'A' ist, also Zahl 0x41-W
btfsc STATUS, Z
goto isA
isnotA:
nop ;hier springt das Programm hin, wenn das empfangene zeichen nicht 'A' ist
isA:
nop ;Hier gehts weiter, wenns 'A' ist


Die PIC18Fxxxx haben Vergleichsbefehle. Da heisst dann der Befehl CPFSEQ xx, also "compare file with W-reg, skip if equal". ich nehme gerne Pic18F1220 (18-pinner) oder den PIC18F2220 (28-pinner)


Gruß
Gerhard

Simon1990
15.08.2005, 13:34
also hab ich das jetzt richtig verstanden: ich schreibe die zahl "65" für den buchstaben "A" in eine Speicherzelle und subtrahiere dann diese "65" von der empfangene zahl, die ich vorher nach W kopiert hab. ist das ergebnis null wird das zero flag gesetzt, was ich überprüfen kann und wodurch ich weiß, dass es ein A war.
denn wenn das so ist, dann hat dein beispiel oben glaub ich einen fehler. da subtrahierst du nämlich 0x41 von 0x41. und das gibt, da du ja dann die gleichen zahlen voneinander subtrahierst, immer null. also ich glaub ich habs jetzt verstanden, nur du hast dich oben vertippt.

aber wenn ich das jetzt oben richtig verstanden hab, dann krieg ich da über rs232 für "A" z.B. eine "01101000" rein. kann ich dann einfach in eine speicherzelle eine dezimale "65" schreiben und die von der "01101000" subtrahieren? also auf gut deutsch, wir meine 65 vom assembler auch in byte aus nullen und einsen umgewandelt?? musste es ja eigentlich, sonst kann der pic ja gar nicht damit umgehen, oder?

gunzelg
15.08.2005, 14:22
Hallo Simon,

ja, die erste zeile "movlw 0x41" simuliert das empfangene Zeichen. Also Du liest reak das UART Empfangsregister aus und führst dann die Subtraktion durch. Sorry, wenn das jetzt missverständlich war. ich hab als Kommentar deshalb geschrieben dass dies jetzt das Zeichen aus dem UART Empfangsregister sei. - Zum verständnis
Binär - Hex: ja der Prozessor arbeitet nur binär , also mit nullen und Einsen. wegen der Übersichtlichkeit schreibt man das eben als hex oder als Dezimal-Zahl. An die Dezimal-Zahlen kann ich mich in dem Zusammenhang nicht gewöhnen. 4 Binäre Stellen entsprechen so schön einer Hex-Ziffer. das macht das Ganze übersichtlicher.

Ich hoffe, ich hab dir geholfen und nicht verwirrt. Im Anhang ist ein kleines Beispiel. Ein PIC16F627 steuert über die serielle Schnittstelle eine Maschine.

Gruß
gerhard

Simon1990
15.08.2005, 14:47
nein, nein. du hast mir super geholfen. ich war mir nur kurz nicht so ganz sicher. aber dann hat sich meine frage ja jetzt geklärt.

also noch mal vielen dank für deine gedult und deine tolle hilfe.

gruß Simon

15.08.2005, 19:15
Hallo

Ums Leben einfacher zu machen:

Der Microchip Assembler (und alle anderen auch) beherrschen ASCII. D.h. man kann statt 0x65 (o.ä.) auch einfacher 'A' schreiben, der Assembler rechnet das intern um. Die ' ' sind wichtig und es klappt auch nur bei einzelnen Zeichen (weil nur die 8Bit lang sind).

also z.B.

movf Empfänger_Register ; nur ein Name
sublw 'A' ; statt irgendein HEX oder Dezimalcode
etc...

mfg
Felix

Simon1990
15.08.2005, 20:33
ha des is ja echt net schlecht. des macht des ganze besser zum schreiben und lesen. und bei einzelnen zahlen schreib ich die halt auch einfach in anführungszeichen, oder?

16.08.2005, 10:24
Hallo

Was meinst Du mit "Zahlen". Falls Du das ASCII-Zeichen 1 meinst, dann ja: '1' (ergibt hex 0x31 glaub ich)
Falls DU die Zahl 1 meinst:

dezimal: D'1'
hex: 0x01 (H'1' sollte auch gehen)

Schau mal im Handbuch Deines Assemblers nach, da steht das drin (auch was er liest, wenn Du nur 1 eingibst, ob er das als dez, hex, etc interpretiert)

mfg
Felix

Simon1990
16.08.2005, 16:55
jup. dann auch nochmal an dich ein danke.

DHigh
17.08.2005, 21:00
such mal nach COM Terminal da kannste alles senden und zeigt dir auch alles in BIN DEC und halt als zeichen an hab es sonst auch iss nicht sehr groß

mfg Daniel

Simon1990
25.08.2005, 00:06
so. war erst mal im urlaub. danke noch für diesen tollen tipp. des programm is net schlecht.