PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bit setzen und ausgeben



02.03.2004, 06:35
Hi Leute brauch mal eine Antwort.

Habe im Assembler folgendes geschrieben,

cport equ $02 ;Port B
cpdir equ $06 ;Portrichtung

org $101

lda #252 ;lade Port 9 und 10
sta cpdir ;Port 9 und 10 als Ausgang
bset 0,cport ;setze Port 9 auf 1
bset 1,cport ;setze Port 10 auf 1
rts

Meine Frage .....bset bedeutet doch "Port auf 1 setzen"
Habe an Port 9 und 10 ein Relais. Der Assembler setzt aber das Port nicht auf 1, denn das Relais bleibt aus.
Oder ist das nicht so wie ich denke????

Frank
03.03.2004, 09:31
Hi,

hab jetzt leider bald 2 Monate nix mehr im C-Control Assembler gemacht da ich mir derzeit etwas mehr den Atmel anschaue. Von daher hab ich die Portadressen und Bezeichnungen nicht mehr so im Kopf.

Aber wie es aussieht verwendest Du glaub die falschen Adressen. Hab mal kurz in mein letztes Listing gelinst ;-) , da steht folgendes

PORTB .EQU $01 ;PortB
DIRB .EQU $05 ;PortBdir

Also das solltest du schon mal ändern. Und dann solltest du beim kommentieren möglichst auch imme rdie Bit´s des Ports nennen, denn die Nummerbezeichnung bei der C-Control ist manchmal etwas verwirrend. Von dahe rweiss ich jetzt nicht ob du den Port schaltest den du auch willst. Am besten und übersichtlichsten ist es wenn du auch das Datenrichtungsregister mit BSET setzt. Ansonsten stimmt es wohl, bset setzt immer auf 1 !
Hier hast du mal Auszug aus meinem letzten Listing, ist zwar hinsichtlich Bytegröße nicht sonderlich optimiert, aber einigermaßen übersichtlich. Vielleicht hilft es dir


;Ansteuerung eines PCF8574 ber SDA und SCL
;Verwendung des vorhandenen I2C-Bus

I2CAdr .EQU $0A1 ;Adresse
I2CDat .EQU $0A2 ;Adresse
SensorDatenA .EQU $0A3 ;PCF Baustein 1 vorne linken und rechten 4
SensorDatenB .EQU $0A4 ;PCF Baustein 2 Seiten und Mitte vorne
PCF3Befehl .EQU $0A5 ;PCF Baustein 3 Lichtschranke
LSchritte .EQU $0A6
HSchritte .EQU $0A7


.org $101
;EEPROM vom Bus abmelden
I2C jsr $08BB ;I2C_ReadLast
;Schreibzugriff auf PCF8574
jsr I2C_Start
lda I2CAdr ;Adresse PCF8574 lesen
jsr I2C_Write
lda I2CDat ;Daten lesen
jsr I2C_Write
jsr $08E5 ;I2C_Stop
;Lesezugriff auf PCF8574
jsr I2C_Start
lda I2CAdr ;Adresse lesen
inca ;Lesebit setzen
jsr I2C_Write
jsr $086F ;I2C_Read
sta I2CDat ;Daten speichern
jsr $08BB ;I2C_ReadLast
;EEPROM wieder anmelden
ldx #$0A0 ;Adresse 24C65, write
jsr $083C ;I2C_Start
ldx $066 ;AdrCounter Hi
jsr $0846 ;I2C_Write
ldx $067 ;AdrCounter Lo
jsr $0846 ;I2C_Write
ldx #$0A1 ;Adresse 24C65, read
jsr $083C ;I2C_Start
rts


PORT .EQU $00 ;PortA
DIR .EQU $04 ;PortAdir
SDA .EQU 0 ;Port A.0
SCL .EQU 1 ;Port A.1

I2C_Start BSET SDA,DIR ; SDA hi ausgeben
BSET SDA,PORT ; Vorbereiten der Startbed.
BSET SCL,PORT ; SCL hi falls lo
BCLR SDA,PORT ; SDA lo -> STARTBEDINGUNG
BCLR SCL,PORT ;
RTS

I2C_Write BSET SDA,DIR ; SDA out
LDX #8 ; init loop
Nextbit ROLA
BCC Lobit ;
BSET SDA,PORT ; hi bit
BRA Clock
Lobit BCLR SDA,PORT ; lo bit
Clock BSET SCL,PORT ; scl hi
BCLR SCL,PORT ; scl lo
DEX
BNE Nextbit ; loop
BCLR SDA,DIR ; sda als Eingang
BSET SCL,PORT ; scl hi
BCLR SCL,PORT
RTS


;Schrittmotor vorwärts

PORTB .EQU $01 ;PortB
DIRB .EQU $05 ;PortBdir
LMOTOR .EQU 4 ;Port B.5
RMOTOR .EQU 5 ;Port B.6
PCF1 .EQU $70
PCF2 .EQU $72
PCF3 .EQU $74

Vor ldx #250 ;unnötig
VorA jsr Pulse
jsr Pause
jsr SensorAbfragen

lda SensorDatenA ;Vorne IR Sensoren
cmp #255
bne Fertig

lda SensorDatenB ;Vorne mittlere IR Sensor
and #16
cmp #16
bne Fertig

lda PCF3Befehl ;Vorne mittlere IR Sensor
and #8
cmp #8
bne Fertig

bra VorA ;Immer springen
Fertig rts

Pulse BSET LMOTOR,DIRB ;Als Ausgang schalten
BSET RMOTOR,DIRB ;Als Ausgang schalten

BCLR LMOTOR,PORTB
BCLR RMOTOR,PORTB

BSET LMOTOR,PORTB
BSET RMOTOR,PORTB

inc LSchritte ;Schritte zählen
bne Pulse1
inc HSchritte
Pulse1 RTS

Pause Lda #2
pause1 ldx #255
pause2 decx
bne pause2
deca
bne pause1
rts

SensorAbfragen lda #PCF1
sta I2CAdr
lda #255
sta I2CDat
jsr I2C
lda I2CDat
sta SensorDatenA

lda #PCF2
sta I2CAdr
lda #255
sta I2CDat
jsr I2C
lda I2CDat
sta SensorDatenB

lda #PCF3
sta I2CAdr
lda PCF3Befehl
ora #8 ;Lichtschranke Input
sta I2CDat
jsr I2C
lda I2CDat
sta PCF3Befehl
rts

.end

Gruß Frank

03.03.2004, 15:23
Danke für Antwort,muß mal testen.

cport equ $02 ;Port B
cpdir equ $06 ;Portrichtung


das ist richtig denn PCF liegt an Port B an 9 und 10.

Port9 equ 0 ; Port 9 C-Control
Port10 equ 1 ;Port 10 C_Control

lda #252 ;lade Port 9 und 10
sta cpdir ;Port 9 und 10 als Ausgang
bset Port9,cport ;setze Port 9 auf 1
bset Port 10,cport ;setze Port 10 auf 1
rts

Muß ich manchmal den Akku noch mal laden, um Relais zu schalten.