Hall leute bräuchte mal ein kleinen ASM anstupser Will folgendes tuen einen 8bit ADC seriel mit dem pic auslesen nur weiss ich jetzt nicht wie ich da vorgehe... bzw wie ich das genau programmiere ich bekomm ja immer nach meinem Clock ein bit zurück so jetzt bekomm ich das bit auf PORTA,0 aber wie speicher ich den jetzt den status von PORTA,0 ab bzw so das ich die anderen 7 bit´s noch dazu speichern kann....
:
Gesperrt durch User
Dennis schrieb: > ich bekomm ja immer nach meinem Clock ein bit zurück so jetzt bekomm ich > das bit auf PORTA,0 aber wie speicher ich den jetzt den status von > PORTA,0 ab bzw so das ich die anderen 7 bit´s noch dazu speichern > kann.... Das sind doch nun absolute Grundlagen... Und dein Problem hat auch nichts mit der Verwendeten Architektur zu tun sondern es währe unter allen Architekturen gleich. Nur die Befehle sind etwas anderes. Das vorgehen selbst ist recht einfach: Wann immer man etwas im Programm weiterverwenden will muss man das Ergebniss zwischenspeichern. In einer Variablen (bzw. bei ASm Speicherzelle) Dein Programm macht folgendes: Du hast einen Zwischenspeicher: z.B. MEINSPEICHER, der ist 8Bit groß. nun baust du das Programm so auf: Schleife die 8mal läuft: Wenn PORTA,0 == 0 dann MEINSPEICHER,0 auch NULL setzen, sonst 1 MEINSPEICHER um eine Stelle Shiften (== Multiplikation mit 2) das ganze 8 mal Das ist jetzt für MSB first, falls deine Daten mit LSB zuerst kommen musst du die Stelle MEINSPEICHER,7 verändern und nach Links Shiften (== :2) Das ganze jetzt in ASM gießen ist ein Kinderspiel, das serviere ich dir nicht ;-) Gruß Carsten
Ich hätte da einen Ansatz für eine Soft-SPI, ist halt in C, sollte sich aber auch in ASM umsetzen lassen:
1 | uint8_t spi(uint8_t send) |
2 | {
|
3 | uint8_t rcv = 0x00; |
4 | uint8_t mask; |
5 | |
6 | for (mask = 0x80; mask != 0x00; mask = mask >> 1) |
7 | {
|
8 | |
9 | clr_mosi(); |
10 | |
11 | if(send & mask) |
12 | {
|
13 | set_mosi(); |
14 | }
|
15 | |
16 | |
17 | if(read_miso()) |
18 | {
|
19 | rcv |= mask; |
20 | }
|
21 | |
22 | pulse_sck(); |
23 | }
|
24 | return(rcv); |
25 | }
|
set_mosi() ist ein Makro zum MOSI setzen (=> auf HIGH) clr_mosi() ist ein Makro zum MOSI löschen(=> auf LOW ) read_miso() ist ein Makro, was das MISO-Bit aus dem Port-In-Register raus maskiert und auf Not-Equal-Zero geprüft wird. Selbiges wird auch bei (send & mask) getan. pulse_sck() ist eine Routine, die einen Positiven Puls auf SCK ausgibt und -falls benötigt- ein kleines Delay enthält. mfg mf
Ich habe gute Nachrichten für dich - es gibt sowas wie einen Assembler-Papst für PICs: http://www.sprut.de/index.htm Da kann man es wirklich von der Pike auf sauber lernen. Schau dir die Grundlagen an, dann die Lernbeispiele. Sehr lehrreich, sehr ausführlich. Das Standartwerk für PICler in ASM (und inzwischen auch ein wenig C).
Super eure argumente sind mit c totall einfach zu realisieren so hat ichs mir ja auch gedacht aber ich muss das in asm schreiben deswegen auch kotz.... Und sprut hilft mir da auch nicht viel weitef weil ich bis jetzt immernoch nicht geraft habe wie ich einer speicherzelle in asm nur ein bit hinzufüge.
als ertes must due die zele mal ansprechen das macht man mit betimten befelp wenn du das habs kann man ein bitt an den zele anprechn. den kotz kann ich verstene gang mich auch so in die erte zet mit kontrollere JJ
Carsten hat schon recht - das gehört zu den Grundlagen, und zwar unabhängig von der verwendeten Prozessorfamilie. Aber jeder hat mal "nahe Null" angefangen, also ist es kein Problem, diese Frage zu stellen. Als Speicher für den 8 bit breiten Wert vom ADC brauchst Du eine 8 bit breite Variable oder ein 8 bit breites Register. Das setzt Du zu Beginn der Aktion auf 0x00, also binär dargestellt "00000000". Dann schaust Du das an PortA anstehende Bit vom ADC an: ist es "1", dann "ver-oder-st" Du den Inhalt der Variablen mit 0x01 (binär "00000001"). Damit wird das ganz rechte Bit der Variablen "1", alle anderen Bits bleiben unverändert. Ist das an PortA anstehende Bit "0", machst Du nichts. Anschließend machst Du das Gleiche noch siebenmal (für die restlichen Bits vom ADC), schiebst aber vorher jedesmal den Variableninhalt um eine Position nach links, z.B. mit dem Befehl "RLF". Übrigens sehe ich gerade, daß Du bei sprut sehr wohl alles findest, was Du zur Lösung Deines Problems brauchst - beispielsweise hier: http://www.sprut.de/electronic/pic/assemble/befehle.html#bit Also: nicht nur hektisch klicken, sondern auch mal den Zeigefinger stillhalten und lesen - und über das Gelesene nachdenken!
Ist doch nicht so schwer: clrf messwert ;messwert löschen anfang btfsc PORTA,0 ;testen ob porta,0 gleich 1 ist bsf messwert,0 ;wenn ja bit 0 im messwert auf 1 setzen sonst überspringen rrf messwert,1 ;messwert nach rechts rotieren bcf messwert,0 ;bit 0 im messwert löschen da bei rrf das carry-flag mit eingelesen wird goto anfang ;nächstes bit Das ganze musst du natürlich anpassen, z.b. RLF wenn das MSB zuerst kommt, Schleifenabruchbedingung usw.. Es soll nur als Denkanstoß dienen. Torsten
Das Standartwerk für PICler in ASM ...auch dem Lehrmann eine Lektion ! --> Standard ! ''KOTZ''
Torsten Schwalm schrieb: > Ist doch nicht so schwer: > > clrf messwert ;messwert löschen > > anfang > > btfsc PORTA,0 ;testen ob porta,0 gleich 1 ist > bsf messwert,0 ;wenn ja bit 0 im messwert auf 1 setzen > sonst überspringen > rrf messwert,1 ;messwert nach rechts rotieren > bcf messwert,0 ;bit 0 im messwert löschen da bei rrf > das carry-flag mit eingelesen wird > > goto anfang ;nächstes bit > > Das ganze musst du natürlich anpassen, z.b. RLF wenn das MSB > zuerst kommt, Schleifenabruchbedingung usw.. > Es soll nur als Denkanstoß dienen. > > Torsten Wenn du mit bsf das Bit 0 setzt, schiebst du es mit rrf gleich wieder raus ;) Also entweder "bsf messwert,7" oder statt rrf -> "rlf". Also von der Situation her, dass du das in Assembler schreiben MUSST, denk ich mir, dass du es für z.B. Schule oder Studium machen musst. Diese aufgabe denke ich mir, ist auch keins der Programme, die als erstes oder zweites kommen, das ist eher sowas wie Lauflicht, LEDs einzeln an und ausmachen etc. Und bis dahin sollte man schon mal beigebracht bekommen haben, wie man ein einzelnes Bit setzt oder löscht, eben mit BSF (Bit-Set) und BCF (Bit-Clear). Dennis schrieb: > Und sprut hilft mir da auch nicht viel weitef weil ich bis jetzt > immernoch nicht geraft habe wie ich einer speicherzelle in asm nur ein > bit hinzufüge. Wie schon gesagt wurde, steht das hier sehr wohl. Es ist auch egal ob du einen Ausgang setzt oder ein Bit in einer Speicherzelle. Man setzt einfach ein bit in einem Register. Und ob das eins im frei verfügbarem Ram-Bereich ist oder PORTA, was auch nur ein Register (SFR) ist, ist egal. -> Sprut -> Befehlscode -> Befehle (Das suchst du ja) -> 3. Setzen und Löschen einzelner Bits, Bitverschiebungen, Bitvertauschungen (BSF, BCF, RLF, RRF, SWAPF)
>Wenn du mit bsf das Bit 0 setzt, schiebst du es mit rrf gleich wieder >raus ;) Also entweder "bsf messwert,7" oder statt rrf -> "rlf". Du hast natürlich recht, ich war noch nicht ganz munter. Aber etwas Mitdenken sollte er ja. ;-) Torsten
Und die Moral von der Geschicht: Wenn man sich schon bei seinen Hausaufgaben helfen lassen will, sollte man den potentiellen Helfer NICHT ankotzen! Ist echt irre wie arrogant manche Guttenbergs hier rüberkommen und ihnen trotzdem geholfen wird.
Du brauchst nur zwei Befehle: RRF PORTA,W Hier wird der Wert von Port A über Carry nach recht rotiert. Bit 0 von Port A befindet sich danach in Carry. (Der um ein Bit nach recht rotierte Wert von Port A befindet sich im Arbeitsregister, wird aber nicht weiter verwendet.) Jetzt brauchst Du nur noch: RLF Variable,F ; wenn das höchstwertige Bit zu erst empfangen wird oder RRF Variable,F ; wenn das niederwertigste Bit zu erst empfangen wird. Dadurch wird das Carry-Bit von rechts bzw. von links in die Variable geschoben. Wenn Du das acht mal machst (dazwischen immer einen Taktimpuls ausgeben), dann befindet sich der 8-Bit AD-Wert in Variable. Gruß John
Dennis schrieb: > auch kotz.... und > immernoch nicht geraft habe wie ich Ähem.. meinst du, mit diesem Stil wohlwollende Leute begeistern zu können, so daß sie dir dein Problem lösen, ohne daß DU DEINE grauen Zellen anstrengen müßtest? Und nochwas: Du kannst nirgendwo_ und in _keinem elektronischen Bauteil ein Bit hinzufügen oder wegnehmen. Du kannst aber ein Bit in einer Speicherzelle auf 1 oder 0 setzen, indem du den dafür vorgesehenen Maschinenbefehl benutzt: BSF MeineSpeicherzelle,MeineBitnummer setzt das bezeichnete Bit auf 1, und BCF MeineSpeicherzelle,MeineBitnummer setzt eben dieses Bit auf 0. Versuche doch zur Abwechslung mal, das Manual deines uC zu lesen. W.S.
W.S. schrieb: > Versuche doch zur Abwechslung mal, das Manual deines uC zu lesen Wieso? Wenn ich was wissen muss ist doch das Forum dafür da oder?
Torsten Schwalm schrieb: > Ist doch nicht so schwer: > > clrf messwert ;messwert löschen > > anfang > > btfsc PORTA,0 ;testen ob porta,0 gleich 1 ist > bsf messwert,0 ;wenn ja bit 0 im messwert auf 1 setzen > sonst überspringen > rrf messwert,1 ;messwert nach rechts rotieren > bcf messwert,0 ;bit 0 im messwert löschen da bei rrf > das carry-flag mit eingelesen wird > > goto anfang ;nächstes bit > > Das ganze musst du natürlich anpassen, z.b. RLF wenn das MSB > zuerst kommt, Schleifenabruchbedingung usw.. > Es soll nur als Denkanstoß dienen. > > Torsten Ahja. Nur das so nicht wirklich funktioniert. Das schieben des Registers muss vor dem setzen des Bits passieren. Denn sonst ist bei deiner Methode das LSB oder MSB, je nach Richtung, immer 0. Und durch das "zuerst schieben" kann man sich das extra BCF am Ende der Schleife auch sparen, solange "messwert" zuerst immer auf 0x00 gesetzt wird. Grüße, Chris
mann leutz, so wird das nix...hab ne idee...ich lad meinen aufgabenzettel hoch und ihr macht mir das...ok?
Sind diese Dennis-Beiträge eigentlich alle von einer Person oder sind das mehrere Trolle?
Ich glaube eher, daß der Dennis der Troll ist. Der muss eine Aufgabe lösen - Schule oder Berufsschule - und hat keinerlei Lust, sich mit der Materie zu beschäftigen. Alle nötigen Infos hat er ja jetzt hier beisammen. Wenn er die Aufgabe so nicht lösen kann, sollte er vielleicht die Schule wechseln. Aber nicht erwarten, daß sich hier ein Depp findet, der ihm die Hausaufgaben macht...
Dennis schrieb: > Wieso? Wenn ich was wissen muss ist doch das Forum dafür da oder? Leute, dieser arrogante Typ von "Dennis" lacht doch alle hilfsbereiten Forumsteilnehmr aus! Dazu ist er noch zu blöde um die gegebenen Hinweise zu verarbeitenn. Ignoriert seine Fragen künftig. Und wenn er nicht will dass ein anderer Gast seinen Namen verwendet soll er sich doch anmelden.....
Dennis schrieb:
> Wieso? Wenn ich was wissen muss ist doch das Forum dafür da oder?
DAS ist der falsche ansatz! Wenn du nicht in der Lage, oder noch
schlimmer, nicht gewillt bist dich mit dem µC und dem datenblatt
auseinander zu setzen, dann bist du in der falschen schiene.
Die Antwort auf deine frage steht im datenblatt zu deinem µC!
Ebenso wurden dir hier schon mehr als genug lösungsansätze genannt.
Wie wärs wenn du dir mal einen PAP zu deinem Programm machst, damit du
"siehst" was du tun musst?!
Hi Dennis, bitte poste mal deine Aufgabe. Ich würde sie lösen, vorausgesetzt du willst das noch. Das wird ja nicht so das Ding sein. Dafür ist das Forum da - sehe ich auch so. Viele Grüße, TS
Thorsten S. schrieb: > Ich würde sie lösen, vorausgesetzt du willst das noch. Da hätte ich aber sehr was dagegen. Stell dir vor, Leute mit dieser seelischen Ausstattung bekommen ihr Zeugnis oder Diplom auf solche Weise geschenkt und kommen dann in die Firmen, wo sie zwar das große Maul haben, aber grundsätzlich die Arbeit von anderen erledigen lassen wollen. Nee, zukünftige Scharlatane, Trittbrettfahrer und Schmarotzer sollten so früh wie möglich ausgesiebt werden - und da seid IHR mit im Gremium. Das ist schon ein Stück Verantwortung gegenüber den anderen Ingenieuren, Entwicklern und Konstrukteuren. W.S.
@W.S. volle Zustimmung! Leider nimmt solches Gebaren rasant zu, nicht nur in Elektronik. Old-Papa