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