Forum: Mikrocontroller und Digitale Elektronik FIP Anzeige ersetzen


von Claus S. (mks-70)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe ein gerät, welches eine FIP (VFD) anzeige hat. der controller 
für diese anzeige war ein  nec upd7538a. dieser controller ist defekt. 
ich habe anhand der schaltpläne gesehen, das dieser über einen motorola 
prozessor angesteuert wird, data und clk nur in richtung zum nec. durch 
den kauf eines zeroplus la konnte ich sehen, dass eine byte zur position 
des zeichens im FIP und eines als ascii gesendet werden. ich habe keine 
info über start stop bit usw. ich weis nur, es wird ein syncon modus 
genommen. jedoch vermute ich, das dieser frei läuft. ich habe beim avr 
keinen ser modus gefunden, womit sich dies realisieren kann, so habe ich 
ein hc595 und ein paar ander bateile genommen um dies parallel zu 
wandeln. ein zähler clockt das latch im 595 und gibt mir den interrupt. 
es funktioniert hier nur teilweise, da neben den verstümmelten zu 
erwartenden text auch massig hyroglyphen kommen. hier mein code. als 
attachment die la datei.


; LCD Ansteuerung uber 8-Bit
; Port A als Datenport und Port C als Control Port
; Getestet am PLED Display Winstar WP2002A
; 2 Zeilen a 20 Zeichen

.include "8515def.inc"
;.include "m168def.inc"

.def temp1 = r16
.def DATA = r18
.def COUNT = r19
.def tmp = r24
.DSEG
.org 0x017c
.BYTE 40
.CSEG
.org 0x000
         rjmp main            ; Reset Handler

         rjmp int0_1    ; IRQ0 Handler

         rjmp int1_1    ; IRQ1 Handler

main:
     ldi temp1, '_'
    sts $01A3, temp1
    ldi temp1, '_'
    sts $01A2, temp1
    ldi temp1, '_'
    sts $01A1, temp1
    ldi temp1, '_'
    sts $01A0, temp1
    ldi temp1, '_'
    sts $019F, temp1
    ldi temp1, '_'
    sts $019E, temp1
    ldi temp1, '_'
    sts $019D, temp1
    ldi temp1, '*'
    sts $019C, temp1
    ldi temp1, '*'
    sts $019B, temp1
    ldi temp1, '*'
    sts $019A, temp1
    ldi temp1, '*'
    sts $0199, temp1
    ldi temp1, '*'
    sts $0198, temp1
    ldi temp1, ' '
    sts $0197, temp1
    ldi temp1, ' '
    sts $0196, temp1
    ldi temp1, 'R'
    sts $0195, temp1
    ldi temp1, 'O'
    sts $0194, temp1
    ldi temp1, 'L'
    sts $0193, temp1
    ldi temp1, 'A'
    sts $0192, temp1
    ldi temp1, 'N'
    sts $0191, temp1
    ldi temp1, 'D'
    sts $0190, temp1
    ldi temp1, ' '
    sts $018F, temp1
    ldi temp1, 'M'
    sts $018E, temp1
    ldi temp1, 'K'
    sts $018D, temp1
    ldi temp1, 'S'
    sts $018C, temp1
    ldi temp1, '7'
    sts $018B, temp1
    ldi temp1, '0'
    sts $018A, temp1
    ldi temp1, ' '
    sts $0189, temp1
    ldi temp1, ' '
    sts $0188, temp1
    ldi temp1, '*'
    sts $0187, temp1
    ldi temp1, '*'
    sts $0186, temp1
    ldi temp1, '*'
    sts $0185, temp1
    ldi temp1, '*'
    sts $0184, temp1
    ldi temp1, '*'
    sts $0183, temp1
    ldi temp1, '*'
    sts $0182, temp1
    ldi temp1, '*'
    sts $0181, temp1
    ldi temp1, ' '
    sts $0180, temp1
    ldi temp1, ' '
    sts $017F, temp1
    ldi temp1, ' '
    sts $017E, temp1
    ldi temp1, ' '
    sts $017D, temp1
    ldi temp1, ' '
    sts $017C, temp1

           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten 
RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten 
RAM-Adresse
           out SPH, temp1

           ldi temp1, 0xFF    ; Port A = Ausgang
           out DDRA, temp1

           rcall lcd_init     ; Display initialisieren


       rcall lcd_clear    ; Display löschen

        ldi XL,0xA4        ; Adresse der Zeichen im RAM
             ldi XH,0x01
           rcall ausgabe1

; Interupupt festlegen
; MCUCR   1010   = Int0 und Int1 fallender Flanke
;         1111   = Int0 unt int1 steigende Flanke

      ldi temp1, 0x00
           out DDRD, temp1      ; Port D auf Eingang für Interrupt
            ldi temp1, 0b00001111  ; INT0 und INT1 konfigurieren
           out MCUCR, temp1
            ldi temp1, 0b11000000  ; INT0 und INT1 aktivieren
           out GIMSK, temp1
      sei                   ; Interrupt enable

;reset Impuls auf PIN 0 Port D

      sbi PORTD, 0
      nop
      nop
      nop
      cbi PORTD, 0

; Port B auf eingang setzten

      ldi temp1, 0x00
      out DDRB, temp1
      ldi temp1, 0xff
      out portB, temp1
; Zähler auf 1
      ldi COUNT, 0x01


loop:
      ldi XL,0xA4        ; Adresse des 1. Zeichen im RAM
            ldi XH,0x01
      ldi yH,0x01
            rcall ausgabe1

rjmp loop


int0_1:
      push r22
      push r23
      in DATA, PINB
      mov temp1, DATA
      andi temp1, 0b10000000
      cpi temp1, 0x80
      brne raus
      ;dec COUNT
      mov yL, DATA
        pop r23
      pop r22
      reti
raus:
      ldi yh, 0x01
      st y,DATA


      ;ldi temp1, 0x45
      ;sts $0190, temp1
      ;pop X
      ldi COUNT, 0x01
      ;rcall ausgabe1
      pop r23
      pop r22

      reti

int1_1:
      reti

ausgabe1:
      rcall delay5ms
      rcall delay5ms
      rcall delay5ms
      rcall delay5ms
      rcall delay5ms
      rcall delay5ms
      ldi tmp, 0x28   ;anzahl der Zeichen 28h = 40, 20h =32

  loop40:
      lpm
      ld temp1, -x

      rcall lcd_data

      dec tmp
      brne loop40

      ldi temp1, 0x02      ;cursur home

      rcall lcd_command

      ret





.include "lcd-4bit.asm"

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.