Forum: Mikrocontroller und Digitale Elektronik PIC: Bit aus Byte an PORT ausgeben


von HDW (Gast)


Lesenswert?

Hallo

Ich habe gerade erst mit PIC-Mikrocontrollern angefangen.

Ich wundere mich momentan darüber, dass ich einzelne Bits aus einem 
File-Register (PIC 16F84A: 8 bit breit) nur über Bit-Test-Befehle (btfss 
...)an einem bestimmten Port-Pin ausgeben kann.

Ganze Register kann man ja einfach mit den mov..-Befehlen an den Port 
ausgeben. Aber dann liegt das ganze Byte am gesamten Port.
Kann man denn nicht ein Bit eines File-Registers einfach an z.B. PORTB,5 
kopieren?

mfg   Wolfram Hildebrandt

von Reiner (Gast)


Lesenswert?

einfach mit einem Befehl nicht. Da mußt Du schon die Bits testen und 
dann gezielt ausgeben.

z.B so

  btfss PORTB,3  ; Bit 3 von Portb prüfen
  goto  xxx
  bsf   PORTA,0  ; und an A0 als '1' ausgeben
  goto  yyy
xxx:
  bcf   PORTA,0  ; oder '0'
yyy:


blödes gespringe...

Reiner

von HDW (Gast)


Lesenswert?

Hm.
Das ist ja nicht so schön.
Vielleicht wird das ja mal iregendwann geändert.

von Peter D. (peda)


Lesenswert?

Also beim Jonglieren mit Bits, ist der 8051 eindeutig der Weltmeister.
Einfacher gehts bei keinem anderen. Man kann Logikgleichungen fast 
direkt hinschreiben. Das C-flag ist dann der Accu für Bitoperationen

Hier mal ein Beispiel:

P3.3 = (P1.0 AND (NOT P1.1)) XOR P2.7

sieht dann so aus:

mov c, p1.0
anl c, /p1.1
jnb p2.7, l1
cpl c
l1:
mov p3.3, c


Die Bitoperationen sind aber nicht nur auf Ports beschränkt. Bis zu 128 
SFR-Bits und 128 SRAM-Bits können die Bitbefehle.


Peter

von Reiner (Gast)


Lesenswert?

Ich will ja nichts sagen, aber das sind auch 5 Befehle. Zudem ebenso auf 
128 Byte Adressumfang beschränkt und auf alle Register anwendbar - nur 
so zur Info

Reiner

von mikki merten (Gast)


Lesenswert?

Es gibt bei jedem Prozessor etwas zu mäkeln. Daher sollte man sich für 
seine Anwendung denjenigen aussuchen (das Marktangebot ist vielfältig) 
der am besten passt bzw. mit dessen Architektur man am Besten klar 
kommt. Wer dort nichts findet, kann sich mit einem FPGA seinen eigenen 
Microcontroller designen.

von HDW (Gast)


Lesenswert?

Hallo

Hier im Forum herrscht anscheinend der AVR.
Was sind denn die Vorteile gegenüber den PICs?

von Reiner (Gast)


Lesenswert?

Wer die Architektur vom PIC kennt wird verstehen das C auf dem PIC nur 
'ne schlechte Krücke sein kann. Stack nicht erreichbar(außer beim 18er)
Du bekommts größeren Speicher (Flash und RAM). Du kannst jedes Portbit 
mit einem separaten Pullup beschalten.
Die Angaben von Strings sind bequemer(mit Trick kann man auch bei den 
PIC-Flashtypen Speichereffiziente Strings anlegen).

Was ich bei den PIC's schön finde sind die Zielangaben, ob der Operant 
in ein File oder in's WREG geladen wird - schön einfach.

Seit '97 hatte ich mit PIC's gearbeitet. Richtig gearbeitet wo Zeit 
wirklich Geld ist. Mit den Atmels wär es einfacher und schneller von der 
Hand gegangen.

Reiner

von Peter D. (peda)


Lesenswert?

@Rainer,

was meinst Du mit "auch 5 Befehle" ?

Diese Beispielgleichung besteht ja aus 4 Operationen und da sind nur 5 
Assembler Befehle schon wahnsinig effizient.

Ich glaube kaum, daß der PIC das mit "auch" nur 5 Befehlen kann.



Ich hatte mich auch erst gewundert, wozu dieser verrückte RETLW Befehl 
beim PIC gut ist. Bis ich dann gesehen hab, das man nur damit 
DB-Anweisungen simulieren kann, wobei man immer auch noch die 256 Wort 
Grenze im Auge behalten muß.

Beim 8051, AVR und den anderen sind DB-Anweisungen bis 64kB und ein 
16Bit-Pointer darauf kein Problem.


Peter

von Peter D. (peda)


Lesenswert?

Zur Information:

Ich bin auch nur zufällig zum 8051 gekommen. Ich war mal auf einem 
Atmel-Seminar, wo sie die ersten preiswerten Flash-Mcs der Welt 
vorgestellt hatten. Das muß so 1993/1994 gewesen sein. Da war an AVR 
noch nicht zu denken und die PIC-Leute brauchten einen großen Mülleimer, 
wo sie die fehlgebrannten OTPs versenken konnten.

Dann hat mein Chef den super leistungsfähigen Keil C-Compiler für damals 
nur 1600,-DM spendiert und seitdem halte ich dem 8051 die Treue. Und 
bezüglich Geschwindigkeit und Flash-Größe hatte ich auch noch keinen 
Grund zu wechseln.

Etwas ärgert mich jedoch, daß Atmel bisher nicht auch die 
AT89C4051-Serie mit ISP, internen Reset und Takt ausgerüstet hat. Kommt 
ja vielleicht noch.


Peter

von mikki merten (Gast)


Lesenswert?

@peter
Wenn wir zu den Kunden mit 100k pro Monat Abnahme gehören würde, gäbe es 
mit Sicherheit sehr schnell ein AT80C4051 mit dem internen Takt-, 
Programmier- und RESET Optionen des AVR MEGA8. So richtig Eigeninitive 
für eine kontinuirliche Verbesserung (außer es führt zu Kostensenkung 
bei der Fertigung) entwickeln wohle alle Hersteller im Augenblick nicht.

von Reiner (Gast)


Lesenswert?

@Peter
Erstmal ist es wichtig die Namen der Leute hier richtig zu schreiben - 
ich heiße R'e'iner mit e. Hier posten schließlich auch Rainer mit a 
herum ;)

Zu den 5 Befehlen stimmt es, der Pic kann in 5 Befehlen solch eine 
Operation mit log. Verknüpfung nicht.
Aber davon mal ab. Ich will Dir deinen kleinen Lieblich nicht schlecht 
machen. Mikki bemerkte mal das man an jedem Mc was zu mäckern hätte und 
das stimmt auch.
Ich selbst bin, obwohl es villeicht so scheint, kein PIC-Freak. Ich hab 
nur viel mit denen gemacht. Mein Herz schlägt für den M16C. Ich fühl' 
mich in einer 68k Umgebung nunmal zuhause. Viel habe ich auch mit dem 
Z180 angestellt, aber das ist ja kein Microkontroller im Sinnes dieses 
Forums.


Reiner

von Bernhard T (Gast)


Lesenswert?

Hallo HDW zu deiner eigentlichen Frage: Ich glaube das geht ganz 
einfach, du brauchst nur den IORWF (oder) Befehl benutzen Bsp.:

MOVLW h'01'     ;wir wollen bit 1 setzen also:
IORWF h'06',1   ; setzte bit 1 xxxx xxx1 in Port B

MOVLW h'02'     ;wir wollen bit 2  setzen also:
IORWF h'06',1   ; setzte bit 2 xxxx xx1x in Port B

MOVLW h'04'     ;wir wollen bit 3  setzen also:
IORWF h'06',1   ; setzte bit 3 xxxx x1xx in Port B

Gruß Bernhard

von Reiner (Gast)


Lesenswert?

@Bernhard
einzelne Bits setzen/löschen geht so

bsf PORTB,3   ; setze Bit 3 am Portb

und

bcf PORTB,3   ; löschen Bit 3 am Portb

Reiner

von Steffen (Gast)


Lesenswert?

Hallo Wolfram,

ich denke mal Du willst die einzelnen Bits nacheinander also seriell 
ausgeben.

Das funktioniert so,

   rlf   0,1       ; durch fsr adressiertes Register um eine Stelle nach 
links rotieren
                   ; Bit 7 ist jetzt in c
   btfss c
   bcf   portb,5
   btfsc c
   bsf   portb,5   ; an portb,6 ausgeben

Das Ganze in einer Schleife 8 mal und dann weiter mit dem nächsten Byte.

MfG
Steffen

von Steffen (Gast)


Lesenswert?

Damit es gleich ohne Probleme geht PORTB groß schreinen. (Gewohnheit)

von HDW (Gast)


Lesenswert?

Das Rotieren ist mal eine Idee.

Ich habe mitterweile mit den Bit-Test-Befehlen hantiert und mein 
Goldwafer-Karten-Schloss übers Wochenende gebaut.
Mit dem Rotieren wäre das wohl sinnvoller gewesen, aber was solls.


mfg   Wolfram Hildebrandt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.