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.
Patrick Oppliger schrieb: > Irgendwie scheint mir der PortB teilweise nach dem Zufallsprinzip zu > reagieren. > [...} > BSF PORTB,5 > BSF PORTB,6 > BSF PORTB,7 Könnte was damit zu tun haben: http://www.sprut.de/electronic/pic/fallen/fallen.html#iospeed http://www.sprut.de/electronic/pic/fallen/fallen.html#inout > START BSF STATUS,5 ;Turns to Bank1. Dafür würde ich Banksel verwenden, ist meiner Meinung nach übersichtlicher:
1 | BANKSEL TRISA |
:
Bearbeitet durch User
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
:
Bearbeitet durch User
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!
San Lue schrieb: > > Dann: >
1 | > |
2 | > 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?
> Dachte das ginge nur bei der 18F-Familie?
Enhanced Midrange bei der 16F kennt den auch schon.
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?
:
Bearbeitet durch User
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!!:-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.