Forum: Mikrocontroller und Digitale Elektronik Assembler PIC "KOTZ"


von Dennis (Gast)


Lesenswert?

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
von pompete (Gast)


Lesenswert?

....wen willst Du erschlagen???

von Carsten S. (dg3ycs)


Lesenswert?

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

von Achim M. (minifloat)


Lesenswert?

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

von Lehrmann M. (ubimbo)


Lesenswert?

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).

von Dennis (Gast)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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

von Glitch (Gast)


Lesenswert?

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!

von Torsten S. (torstensc)


Lesenswert?

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

von ohmho (Gast)


Lesenswert?

Das Standartwerk für PICler in ASM

...auch dem Lehrmann eine Lektion ! --> Standard ! ''KOTZ''

von Michael S. (rbs_phoenix)


Lesenswert?

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)

von Torsten S. (torstensc)


Lesenswert?

>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

von Udo S. (urschmitt)


Lesenswert?

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.

von John B. (johnbauer)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von Dennis (Gast)


Lesenswert?

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?

von Christian K. (Firma: Atelier Klippel) (mamalala)


Lesenswert?

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

von Dennis (Gast)


Lesenswert?

mann leutz, so wird das nix...hab ne idee...ich lad meinen 
aufgabenzettel hoch und ihr macht mir das...ok?

von Udo S. (urschmitt)


Lesenswert?

Sind diese Dennis-Beiträge eigentlich alle von einer Person oder sind 
das mehrere Trolle?

von John Doe (Gast)


Lesenswert?

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...

von Bruddler (Gast)


Lesenswert?

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.....

von dennis (Gast)


Lesenswert?

mann seit ihr alle beschoiuert, ich heng mich gleich auff

von Kaj (Gast)


Lesenswert?

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?!

von Thorsten S. (whitejack)


Lesenswert?

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

von W.S. (Gast)


Lesenswert?

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.

von Old P. (Gast)


Lesenswert?

@W.S.
volle Zustimmung!

Leider nimmt solches Gebaren rasant zu, nicht nur in Elektronik.

Old-Papa

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.