Forum: Mikrocontroller und Digitale Elektronik 7 Segment Multiplex


von Philipp (Gast)


Lesenswert?

Hallo zusammen,

ich programmiere gerade den PIC18F2550 in Assembler und will damit eine 
7 Segment Anzeige ansteuern. Ansich funktioniert das auch wunderbar, 
aber die Variable Seg7_0 inkrementiert immer nur von 0 bis 7 und 
resettet dann auf 0 zurück. Im Simulator klappt alles einwandfrei. Sie 
soll von 0 bis 9 laufen und dann auf 0 zurück.

Ich habe schon etliche Threads zu Multiplexing und Tabellenzugriff 
gelesen aber komme einfach nicht weiter. Ich denke, dass es etwas ganz 
banales ist.

Um die Anzeige jetzt erstmal zu testen, habe ich erst einmal nur eine 
Anzeige angesteuert. PORTA steht aber schon bereit.

Bitte schaut mal rein! Danke. :)

  list p=18f2550
  include "p18f2550.inc"
  CONFIG WDT=OFF; disable watchdog timer
  CONFIG MCLRE = ON; MCLEAR Pin on
  CONFIG DEBUG = OFF; Disable Debug Mode
  CONFIG LVP = OFF; Low-Voltage programming disabled
  CONFIG FOSC = INTOSCIO_EC;Internal oscillator, port function on RA6
  CONFIG PBADEN = OFF

seg7_0 EQU 0x20
seg7_1 EQU 0x21
seg7_2 EQU 0x22
seg7_3 EQU 0x23
tablepos EQU 0x24

  ORG 0x00
  GOTO main

  ORG 0x0008
  BRA Intrpt

Intrpt
  BCF INTCON,TMR0IF
  CLRF TMR0L
  CLRF TMR0H

  MOVLW 0x0A
  INCF seg7_0
  CPFSEQ seg7_0
  RETFIE

  CLRF seg7_0

  RETFIE
;-----------------------
main
  MOVLW 0xB2 ;500kHz clock
  MOVWF OSCCON

  CLRF seg7_0
  CLRF seg7_1
  CLRF seg7_2
  CLRF seg7_3

;Init Ports
  CLRF UCON
  CLRF LATB
  CLRF TRISB
  SETF LATB

  CLRF LATA
  MOVLW 0xF0 ;RA0-RA3 Output, RA4-RA7 Input
  MOVWF TRISA
  SETF LATA

;Init Timer 0
  CLRF TMR0L
  CLRF TMR0H
  BCF T0CON,T08BIT
  BCF T0CON,T0CS
  BSF T0CON,PSA

;Init Timer 0 Interrupt
  BCF RCON,IPEN
  BSF INTCON,TMR0IE
  BCF INTCON,TMR0IF
  BSF INTCON, GIE
  BSF INTCON, PEIE

  BSF T0CON,TMR0ON

  ;Init Timer 2 ("Refresh Timer")
  MOVLW 0x06
  MOVWF T2CON
  BCF PIR1, TMR2IF
  MOVLW 0xFF
  MOVWF PR2
ausgabe
;-----------------------
warte0
  BTFSS PIR1, TMR2IF
  BRA warte0
  BCF PIR1, TMR2IF
  MOVF LATC, w
  MOVWF tablepos
  SETF LATA
  CALL ausgabePB
  MOVWF LATA ;RA0 low
  BRA ausgabe
;---Ausgabe der Zahk in tablepos auf 7Seg
ausgabePB
  BCF INTCON,TMR0IE

  MOVLW LOW seg7
  ADDWF tablepos, w
  MOVWF TBLPTRL, 0
  MOVLW HIGH seg7
  MOVWF TBLPTRH, 0
  BTFSC STATUS, C
  INCF TBLPTRH
  MOVLW UPPER seg7
  MOVWF TBLPTRU, 0
  BTFSC STATUS, C
  INCF TBLPTRU
  TBLRD*

  MOVFF TABLAT, LATB

  BSF INTCON,TMR0IE
  RETURN

;Tabelle mit 7Segmentcodes Low-Aktiv
  ORG 0x90
seg7 DB 0x11, 0x9F
  DB 0x32, 0x16
  DB 0x9C, 0x54
  DB 0x50, 0x1F
  DB 0x10, 0x14

  END

von Philipp (Gast)


Lesenswert?

Sorry, der folgende Abschnitt enthält ein temporärer Test von mir, bei 
dem ich LATC als Variablenregister missbraucht habe. Soll natürlich so 
lauten:
;-----------------------
warte0
  BTFSS PIR1, TMR2IF
  BRA warte0
  BCF PIR1, TMR2IF
  MOVF LATC, w
  MOVWF tablepos
  SETF LATA
  CALL ausgabePB
  MOVWF LATA ;RA0 low
  BRA ausgabe
;---Ausgabe der Zahk in tablepos auf 7Seg


----->>>>

;-----------------------
warte0
  BTFSS PIR1, TMR2IF
  BRA warte0
  BCF PIR1, TMR2IF
  MOVF seg7_0, w
  MOVWF tablepos
  SETF LATA
  CALL ausgabePB
  MOVLW 0x0E
  MOVWF LATA ;RA0 low
  BRA ausgabe
;---Ausgabe der Zahk in tablepos auf 7Seg

von Philipp (Gast)


Lesenswert?

JAAAAAAAAAAAAAAAAAAAAAAA!!!!!!!!

Der Brown Out Reset hatte eingesetzt, weil die Anzeige kurzzeitig zu 
viel Saft gezogen hatte. Meine Güte, ich dachte ich werd verrückt. Danke 
an alle, die noch vielleicht vor hatten mir zu helfen. ;) Grüße

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.