PIC16F877A - HEX-konverter

OP #3204866
Lesenswert?

Liebes Forum,

ich habe mich vor ein paar Jahren schon ein bischen mit µC (eigentlich 
nur PIC) beschäftigt. Jetzt wollte ich wieder anfangen und habe mir dazu 
erst einmal ein kleines Versuchsboard aufgebaut. PORTB ist komplett mit 
active-high Schaltern belegt. An PORTD habe ich je nach Jumper eine 
7-Segmentanzeige oder 8 LEDs (auch active-high). Das erste Testprogramm 
hat einwandfrei funktioniert. Es hat in der main-Schleife einfach PORTB 
auf PORTD kopiert.
Der nächste Schritt ist eigentlich kein großer. PORTB wird eingelesen, 
die 4 MSB "rausgeundet" und dann das Ergebnis als HEX auf der 
7-Segmentanzeige angezeigt.
Ich finde soweit keinen Fehler in meinem Code:
1
; Übungsbeispiel Hex-Converter
2
; PORTB auf 7Segment und in Hex darstellen
3

4
  list p=16f877a
5
  include "p16f877a.inc"
6

7
  __CONFIG  0x3F41
8

9
  org 0x00        ; Programmstart (also 0x00)
10
  goto init
11

12
  org 0x04        ; Interuptadresse
13

14
init
15
  BCF  STATUS,  RP1      ;Wechsel auf Bank1 (RP1 = 0, RP0 = 1)
16
  BSF  STATUS,  RP0 
17
  MOVLW  0xFF        ; PORTB Eingang
18
  MOVWF  TRISB     
19
  MOVLW  0x00        ;PORTD Ausgang
20
  MOVWF  TRISD    
21
    
22
  BCF  STATUS, RP0      ;Wechsel auf Bank0 (RP1 = 0, RP0 = 0)
23

24

25
;   HEX-Zeichen in Speicher schreiben  
26
  MOVLW  0x3F 
27
  MOVWF  0x30
28
  
29
  MOVLW  0x06
30
  MOVWF  0x31
31
  
32
  MOVLW  0x5B
33
  MOVWF  0x32
34
  
35
  MOVLW  0x8F
36
  MOVWF  0x33
37
  
38
  MOVLW  0x66
39
  MOVWF  0x34
40
    
41
  MOVLW  0x6D
42
  MOVWF  0x35
43
    
44
  MOVLW  0x7D
45
  MOVWF  0x36
46
   
47
  MOVLW  0x07
48
  MOVWF  0x37
49
   
50
  MOVLW  0x7F
51
  MOVWF  0x38
52

53
  MOVLW  0x67
54
  MOVWF  0x39
55

56
  MOVLW  0x77
57
  MOVWF  0x3A
58

59
  MOVLW  0x7C
60
  MOVWF  0x3B
61

62
  MOVLW  0x39
63
  MOVWF  0x3C
64
  
65
  MOVLW  0x3F
66
  MOVWF  0x3D
67

68
  MOVLW  0x79
69
  MOVWF  0x3E
70

71
  MOVLW  0x71
72
  MOVWF  0x3F
73
  
74
main
75
    
76
  MOVF    PORTB,  0
77
  ANDLW   0x0F
78
  ADDLW   0x30
79
  MOVF    W,  0
80
  MOVWF  PORTD
81
  goto  main
82

83
  END
Ich habe NOPs an verschiedenen Stellen versucht. Der µC sollte so weit 
in Ordnung sein. Komplett gelöscht hab ich ihn auch dazwischen ein paar 
mal.

Einen Schaltplan gibts auf Anfrage gerne auch. Nachdem ich den aber nur 
handschriftlich hab, der Fehler vielleicht offensichtlich ist und das 
erste Programm bei gleicher Beschaltung funktioniert wollt ich mir 
ehrlich gesagt Arbeit ersparen.

Bitte um Ratschläge.
OP #3204913
Lesenswert?

M. H. schrieb:
> Versuchs mal damit:
>
>
1
> bcf STATUS,IRP
2
> main
3
> 
4
> movf PORTB,w
5
> andlw 0x0F
6
> addlw 0x30
7
> movwf FSR
8
> movf INDF,w
9
> movwf PORT
10
> goto main
11
>

Funktioniert einwandfrei. Danke! Werd auch gleich nachlesen was du da 
genau gemacht hast (und ein paar falsche Zeichen ändern räusper.)

M. H. schrieb:
> Was funktioniert nicht?
> Was sollte die main machen?

Vor Beginn der Main werden beginnend bei 0x30 (willkürlicher Start) im 
Speicher die Bitkombinationen für die 16 Hex-Ziffern gespeichert. In der 
Main wird
1. PORTD eingelesen
2. Die MSB durch AND mit 0x0F gelöscht
3. 0x30 (= Listenbeginn) dazu Addiert
4. Der Inhalt der Speicheradresse bei dem Ergebnis ausgegeben.

Somit hab ich einen einfachen Binär-Hex-Konverter.


Herzlichen Dank nocheinmal für die schnelle Hilfe.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren