Hallo zusammen
Nach 10 jahren programmiere ich wieder mal einen PIC. Das Programm ist
grundsätzlich sehr simple: mit 3 Schaltern soll eine 7-Segmentanzeige
angesteuert werden und je nach dem eine bestimmte Ziffer anzeigen.
Irgendwie scheint mir der PortB teilweise nach dem Zufallsprinzip zu
reagieren. Mich dünkt es, dass ich eine Einstellung falsch gemacht habe,
finde diese jedoch nicht. Mein Code:
; HEAD818.ASM for 16F818. This sets PORTA as analogue/digital INPUTs.
;PORTB is an OUTPUT.
;Internal oscillator of 31.25kHz chosen
;The OPTION register is set to /256 giving timing pulses 32.768ms.
; 1second and 0.5 second delays are included in the subroutine section.
;*********************************************************
; EQUATES SECTION
TMR0 EQU 1 ;means TMR0 is file 1.
STATUS EQU 3 ;means STATUS is file 3.
PORTA EQU 5 ;means PORTA is file 5.
PORTB EQU 6 ;means PORTB is file 6.
ZEROBIT EQU 2 ;means ZEROBIT is bit 2.
ADCON0 EQU 1FH ;A/D Configuration reg.0
ADCON1 EQU 9FH ;A/D Configuration reg.1
ADRES EQU 1EH ;A/D Result register.
CARRY EQU 0 ;CARRY IS BIT 0.
TRISA EQU 85H ;PORTA Configuration Register
TRISB EQU 86H ;PORTB Configuration Register
OPTION_R EQU 81H ;Option Register
OSCCON EQU 8FH ;Oscillator control register.
COUNT EQU 20H ;COUNT a register to count events.
;*********************************************************
LIST P=16F818 ;we are using the 16F818.
ORG 0 ;the start address in memory is 0
GOTO START ;goto start!
;*********************************************************
; Configuration Bits
__CONFIG H'3F10' ;sets INTRC-A6 is port I/O, WDT off, PUT ;on, MCLR
tied to VDD A5 is I/O
;BOD off, LVP disabled, EE protect disabled, ;Flash Program Write
disabled,
;Background Debugger Mode disabled, CCP ;function on B2, Code Protection
disabled.
;*****************************************************
;SUBROUTINE SECTION.
; 0.1 second delay, actually 0.099968s
DELAYP1 CLRF TMR0 ;START TMR0.
LOOPB MOVF TMR0,W ;READ TMR0 INTO W.
SUBLW .3 ;TIME - 3
BTFSS STATUS,ZEROBIT ; Check TIME-W = 0
GOTO LOOPB ;Time is not = 3.
NOP ;add extra delay
NOP
RETLW 0 ;Time is 3, return.
; 0.5 second delay.
DELAYP5 MOVLW .5
MOVWF COUNT
LOOPC CALL DELAYP1
DECFSZ COUNT
GOTO LOOPC
RETLW 0
; 1 second delay.
DELAY1 MOVLW .10
MOVWF COUNT
LOOPA CALL DELAYP1
DECFSZ COUNT
GOTO LOOPA
RETLW 0
;*********************************************************
;Configuration Section
START BSF STATUS,5 ;Turns to Bank1.
MOVLW b'00000000' ;8 bits of PORTA are I/P
MOVWF TRISA
MOVLW b'00001110' ;PORTA is digital
MOVWF ADCON1
MOVLW b'00000111'
MOVWF TRISB ;PORTB is OUTPUT
MOVLW b'00000000'
MOVWF OSCCON ;oscillator 31.25kHz
MOVLW b'11000111' ;Prescaler is /256
MOVWF OPTION_R ;TIMER is 1/32 secs.
BCF STATUS,5 ;Return to Bank0.
BCF ADCON0,0 ;Turn ON A/D
CLRF PORTA ;Clears PortA.
CLRF PORTB ;Clears PortB.
;*********************************************************
;Program starts now.
;==> PROGRAM STARTS HERE <==
;===========================
MAIN BTFSC PORTB,0 ;PortB Pin 0 gesetzt? Bei true nächsten
Schritt überspringen
GOTO S0
BTFSC PORTB,1
GOTO S1W0
BTFSC PORTB,2
GOTO DISP8
GOTO DISP8
S0 BTFSC PORTB,1
GOTO S0W0
BTFSC PORTB,2
GOTO DISP4
GOTO DISP5
S0W0 BTFSC PORTB,2
GOTO DISP0
GOTO DISP1
S1W0 BTFSC PORTB,2
GOTO DISP2
GOTO DISP3
DISP0 BCF PORTB,5
BSF PORTB,6
BSF PORTB,7
MOVLW b'11000011'
MOVWF PORTA
GOTO MAIN
DISP1 BCF PORTB,5
BCF PORTB,6
BCF PORTB,7
MOVLW b'01000010'
MOVWF PORTA
GOTO MAIN
DISP2 BSF PORTB,5
BSF PORTB,6
BSF PORTB,7
MOVLW b'01000011'
MOVWF PORTA
GOTO MAIN
DISP3 BSF PORTB,5
BSF PORTB,6
BSF PORTB,7
MOVLW b'11000011'
MOVWF PORTA
GOTO MAIN
DISP4 BSF PORTB,5
BSF PORTB,6
BSF PORTB,7
MOVLW b'01000000'
MOVWF PORTA
GOTO MAIN
DISP5 BSF PORTB,5
BSF PORTB,6
BCF PORTB,7
MOVLW b'11000001'
MOVWF PORTA
GOTO MAIN
DISP8 BSF PORTB,5
BSF PORTB,6
BSF PORTB,7
MOVLW b'11000011'
MOVWF PORTA
GOTO MAIN
END ;End of source code.
Das Verrückte ist ja, wenn ich den ganzen PORTB schreiben will, was mir
lieber wäre, mit:
MOVLW b'1110000'
MOVWF PORTB
dann geht es nicht...wenn ich jedoch jedes Bit einzeln ändere mit
BCF/BSF funktionieren die Ausgänge. Mit den Eingängen habe ich irgendwie
bei beiden Versionen ein Problem. Die Taster ziehen den Eingang
(Pullup-Widerstand auf 5V) auf Low.
Gleich zu beginn weg:
Kommentare sind nicht zum Spass da. Kommentier deinen Code beim nächsten
mal aus. Wird erstens den Forumusern hier helfen zu verstehen, was du
dir dabei überlegt hast, zweitens wird es auch dir helfen wenn du das
Programm in ein paar Monaten vielleicht wieder bearbeiten willst.
Dann:
1
MAIN BTFSC PORTB,0 ;PortB Pin 0 gesetzt? Bei true nächsten
2
Schritt überspringen
3
GOTO S0
4
BTFSC PORTB,1
5
GOTO S1W0
6
BTFSC PORTB,2
7
GOTO DISP8
8
GOTO DISP8
Sehe den Sinn hinter nicht so ganz. So wie ich das sehe, könnte man die
letzten drei Zeilen auch durch ein "Goto DISP8" ersetzen, da unabhängig
von RB2 dorthin gesprungen werden soll.
Patrick Oppliger schrieb:> Irgendwie scheint mir der PortB teilweise nach dem Zufallsprinzip zu> reagieren.
Da wären wir wieder bei den Kommentaren im Code. Auch wenn RBX nicht zu
funktionieren scheint: Wozu brauchst du die überhaupt? Deine 7-Segment
Anzeige scheint ja am PORTA angeschlossen zu sein? Auch wenn ich das
noch so sehr studiere, werde ich daraus nicht schlau wo der Sinn
dahinter ist.
Patrick Oppliger schrieb:> Mit den Eingängen habe ich irgendwie> bei beiden Versionen ein Problem.
Da könnte LATX eine Lösung sein.
http://www.sprut.de/electronic/pic/c/pic_c/pic_c90_pic_spezifisches.html#io
San Lue schrieb:>> Da könnte LATX eine Lösung sein.>
Das hat der "Alt"-PIC noch nicht.
Irgendwie passen die Kommentare auch nicht:
> MOVLW b'00001110' ;PORTA is digital> MOVWF ADCON1
Also RA0 ist sicher nicht Digital sondern Analog, richtig wäre
MOVLW b'00000110' ;PORTA is digital
Interessant wäre auch die Beschaltung des PIC, vor allem, ob beim Test
noch der Programmer dranhängt - der benutzt nämlich auch RB6, RB7!
> MAIN BTFSC PORTB,0 ;PortB Pin 0 gesetzt? Bei true nächsten
3
> Schritt überspringen
4
> GOTO S0
5
> BTFSC PORTB,1
6
> GOTO S1W0
7
> BTFSC PORTB,2
8
> GOTO DISP8
9
> GOTO DISP8
10
>
>> Sehe den Sinn hinter nicht so ganz. So wie ich das sehe, könnte man die> letzten drei Zeilen auch durch ein "Goto DISP8" ersetzen, da unabhängig> von RB2 dorthin gesprungen werden soll.
Ich möchte jede Variante einzeln bearbeiten können, es kann sein das in
Zukunft eine andere Ziffer angezeigt werden soll.
San Lue schrieb:> Da wären wir wieder bei den Kommentaren im Code. Auch wenn RBX nicht zu> funktionieren scheint: Wozu brauchst du die überhaupt? Deine 7-Segment> Anzeige scheint ja am PORTA angeschlossen zu sein? Auch wenn ich das> noch so sehr studiere, werde ich daraus nicht schlau wo der Sinn> dahinter ist.
Die 7-Segment Anzeige ist an PortA,0,1,6,7 sowie an PortB,5,6,7. In
Zukunft werden auch noch zwei weitere LEDs an PortB,3,4 sein.
San Lue schrieb:>Patrick Oppliger schrieb:>> Mit den Eingängen habe ich irgendwie>> bei beiden Versionen ein Problem.>>Da könnte LATX eine Lösung sein.>http://www.sprut.de/electronic/pic/c/pic_c/pic_c90...
Dachte das ginge nur bei der 18F-Familie?
Andere den Code von So:
DISP3 BSF PORTB,5
BSF PORTB,6
BSF PORTB,7
MOVLW b'11000011'
MOVWF PORTA
GOTO MAIN
nach So ab:
DISP3 BSF PORTB,5
BSF PORTB,6
MOVLW b'11000011'
BSF PORTB,7
MOVWF PORTA
GOTO MAIN
dann sollte es funktionieren.
> San Lue schrieb:> Irgendwie passen die Kommentare auch nicht:>>> MOVLW b'00001110' ;PORTA is digital>> MOVWF ADCON1>> Also RA0 ist sicher nicht Digital sondern Analog, richtig wäre> MOVLW b'00000110' ;PORTA is digital>> Interessant wäre auch die Beschaltung des PIC, vor allem, ob beim Test> noch der Programmer dranhängt - der benutzt nämlich auch RB6, RB7!
Ja, das muss ich noch anpassen.
Habe MPLAB v8.70 installiert, kann es sein dass diese Version LATX und
BANKSEL noch nicht kennt? Möchte wenn möglich die MPLAB Version
beibehalten, denn diese kenne ich bereits.
Patrick Oppliger schrieb:> Habe MPLAB v8.70 installiert, kann es sein dass diese Version LATX und> BANKSEL noch nicht kennt? Möchte wenn möglich die MPLAB Version> beibehalten, denn diese kenne ich bereits.
Auch MPLAB 8.70 kennt die BANKSEL Anweisung - allerdings ist die V8.70
nicht die aktuelleste sondern die V8.92 (MPLAB selbst wird nicht mehr
Supported, die V8.92 stammt vom Juni 2013).
LATX selbst gibt es in der Form nicht. Das "X" muss gegen den
entsprechenden Port-Buchstaben ersetzt werden, also LATA, LATB, LATC
etc.
Da aber der verwendete 16F818 ohenhin keine Port-Latches besitzt, gibt
es auch keine LATX Register dafür!
Chris B. schrieb:> allerdings ist die V8.70 nicht die aktuelleste sondern die V8.92>
Dann lade ich diese noch runter, danke Dir.
> LATX selbst gibt es in der Form nicht. Das "X" muss gegen den> entsprechenden Port-Buchstaben ersetzt werden, also LATA, LATB, LATC> etc.>> Da aber der verwendete 16F818 ohenhin keine Port-Latches besitzt, gibt> es auch keine LATX Register dafür!
Ja klar das X steht für den jeweiligen Port. Habe in der
Registerübersicht auch kein LATX-Register gefunden. Teste dann heute
abend noch die Version mit PortB auf In/Output switchen.
Habe den PIC auf einem Steckboard mit der Schaltung aufgebaut, reagiert
teilweise auch wenn ich mit der Hand in die Nähe komme. einen
Kondensator ist zwischen Vdd und Vss eingebaut (zum Porgrammieren kommt
der weg sowie die LED an ProtB,6,7). Habe im Moment 100kOhm
Pullup-Widerstände, sollte ich diese auf 10kOhm ändern oder reagieren
die gesteckten Kabel bereits als "Antennen"?
Patrick Oppliger schrieb:> Kondensator ist zwischen Vdd und Vss eingebaut (zum Porgrammieren kommt> der weg
Wieso? Versuch mal mit Entkoppel-C zu Programmieren.
100k als Pullup sollte passen, wie lange ist das Kabel?
Patrick Oppliger schrieb:>> allerdings ist die V8.70 nicht die aktuelleste sondern die V8.92> Dann lade ich diese noch runter, danke Dir.
Wieso nicht die neue X IDE?
Max H. schrieb:> Patrick Oppliger schrieb:>> Kondensator ist zwischen Vdd und Vss eingebaut (zum Porgrammieren kommt>> der weg> Wieso? Versuch mal mit Entkoppel-C zu Programmieren.
Steht ausdrücklich in der Anleitung der Pickit3, wieso ist für mich auch
nicht logisch.
Habe die Kabel gekürzt und siehe da, die Taster funktionieren 1A! Die
Stecklitzen waren halt universell gefertigt und daher etwa 6-7cm lang,
jetzt sinds so kurz dass es passt.
Problem gelöst!!:-)