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....
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_tspi(uint8_tsend)
2
{
3
uint8_trcv=0x00;
4
uint8_tmask;
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
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.
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
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.