Forum: Mikrocontroller und Digitale Elektronik PIC16F877A - HEX-konverter


von Georg (geisterzwiebel)


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.

von Max H. (hartl192)


Lesenswert?

Was funktioniert nicht?
Was sollte die main machen?

von Max H. (hartl192)


Lesenswert?

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

von Georg (geisterzwiebel)


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.

von Max H. (hartl192)


Lesenswert?

Der Inhalt des Registers wird indirekt über das FSR und Das INDF 
Register adressiert.

http://www.sprut.de/electronic/pic/grund/adress.htm#indirekt

von Georg (geisterzwiebel)


Lesenswert?

Alles klar. Hab nicht gewusst, dass man indirekte Adressierung irgendwie 
speziell machen muss...

Aber vor allem mit den 9-Bit Adressen ergibt das natürlich Sinn.

von Max H. (hartl192)


Lesenswert?

Bei mowf darf die Adresse nur eine konstente sein, die in Quelcode 
angegeben wird.

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.