Forum: Mikrocontroller und Digitale Elektronik PIC16F818 Einstellung korrekt für diese Anwendung?


von Patrick O. (mrjack)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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
von Patrick O. (mrjack)


Lesenswert?

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.

von San L. (zwillingsfreunde)


Lesenswert?

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
von Chris B. (dekatz)


Lesenswert?

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!

von Patrick O. (mrjack)


Lesenswert?

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?

von ./. (Gast)


Lesenswert?

> Dachte das ginge nur bei der 18F-Familie?

Enhanced Midrange bei der 16F kennt den auch schon.

von chris (Gast)


Lesenswert?

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.

von Patrick O. (mrjack)


Lesenswert?

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

von Chris B. (dekatz)


Lesenswert?

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!

von Patrick O. (mrjack)


Lesenswert?

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"?

von Max H. (hartl192)


Lesenswert?

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
von Patrick O. (mrjack)


Lesenswert?

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
Noch kein Account? Hier anmelden.