Hallo zusammen
Für einen Kollegen bin ich eine Anzeige für seinen Töff am entwickeln.
Dies zeigt den aktuellen Gang, Liter im Tank und diverse weitere
Eigentschaften an. Die Visualisierung verfolgt über eine
7-Segmentanzeige (Ganganzeige sowie Tankanzeige) sowie eine
Balkenanzeige (einfacher Tankpegel)
Bei der Anzeige der Liter habe ich jedoch noch irgeneinen Fehler drin.
Hier ist der Ausschnitt des Codes für die Literermittelung:
1
ADREADBSFADCON0,2;Tankleveleinlesen
2
WAITADCBTFSCADCON0,2
3
GOTOWAITADC
4
MOVFWADRESH
5
MOVWFADWERT
6
BTFSCPORTA,2;WennPortA2highistLiteranzeigen
7
GOTOLITER
8
BTFSSADWERT,1
9
GOTOLEVEL1
10
GOTOLEVEL2
11
12
LITERBCFSTATUS,0;Carry-Bitlöschen
13
MOVFWTANKST
14
MOVWFHILFSBYTE
15
CLRFADLOOP;Loop-Zahllöschen
16
LOOPMOVFWADWERT
17
ADDWFHILFSBYTE,w;AD-Wandlerwertermitteln
18
BTFSSSTATUS,0
19
GOTOANZLITER;Fallsdetektiertanzeigen
20
MOVLWb'00000101'
21
ADDWFADLOOP,f;Loop5dazuaddieren
22
MOVFWTANKST
23
ADDWFHILFSBYTE,f;nächsterTank-Schrittermitteln
24
GOTOLOOP
25
26
;===========================
27
;Tankpegel
28
;===========================
29
30
LEVEL1BCFPORTB,3
31
BSFPORTB,4
32
GOTOMAIN
33
34
LEVEL2BSFPORTB,3
35
BSFPORTB,4
36
GOTOMAIN
37
38
ANZLITER
39
CALLDISPL
40
CALLDELAY1
41
MOVFWADLOOP
42
ADDWFPCL,f
43
LITER0
44
CALLDISP2;21Liter
45
CALLDELAY1
46
CALLDISP1
47
CALLDELAY1
48
GOTOMAIN
49
50
CALLDISP2;20Liter
51
CALLDELAY1
52
CALLDISP0
53
CALLDELAY1
54
GOTOMAIN
55
56
CALLDISP1;19Liter
57
CALLDELAY1
58
CALLDISP9
59
CALLDELAY1
60
GOTOMAIN
61
62
.......(immmer5ProgrammzeilenimLiterschrittbis:
63
64
CALLDISP_;0Liter
65
CALLDELAY1
66
CALLDISP0
67
CALLDELAY1
68
GOTOMAIN
Die Literanzeige verändert sich fast nicht, wenn ich das Potentiometer
am AD-Eingang maximal verstelle. Die einfache Balkenanzeige (Level1,
Level2), welche immer angezeigt wird, funktioniert einwandfrei.
Irgendetwas bei der Modifikation des Programmcounters geht schief,
konnte jedoch nicht herausfinden was...
Gruss
Schon überprüft, ob all die Calls, innerhalb ihrer Reichweite liegen?!
Was ist eigentlich mit PCLATCH?
http://www.sprut.de/electronic/pic/grund/adress.htm#pcl
Nett wäre es auch, wenn Du mitteilen würdest, für welchen Prozessor das
geschrieben wurde!
Patrick Oppliger schrieb:> ADDWF PCL,f
Das kann leicht schiefgehen, da du bis zu 100 Befehle überspringst. PCL
ist nur 8bit breit und wenn PCL bei der Addition überläuft hast du dann
eine Sprung zur falschen Adresse. Falls es ein
Enhanced Mid-range PIC ist würde ich den "BRW" Befehl empfehlen.
Ich verwende den PIC16F818. Habe leider im Moment noch eine steinalte
Software auf meinem alten XP-PC, den ich für basteleien benötige, und
die hat irgendwelche Probleme im Simulationsmodus.
Mir kam gerade ein anderer Lösungsansatz in den Sinn, bei welchem ich
weniger grosse Sprungschritte machen muss. Probiere auch mal das ganze
mit BRW (danke an Max H.!!)
Werde dies mal testen und mich dann wieder melden.
Patrick Oppliger schrieb:> .......(immmer 5 Programmzeilen im Literschritt bis:>> CALL DISP_ ;0Liter> CALL DELAY1> CALL DISP0> CALL DELAY1> GOTO MAIN
Sowas derart umständliches nennt man, die Hose mit der Kneifzange
anziehen.
Warum schaust Du Dir nicht einfach mal an, wie alle anderen
Programmierer Zahlen anzeigen?
Zuerst zerlegt man die Zahl in Zehner und Einer (z.B. 10 abziehen bis
Unterlauf). Und dann greift man damit auf eine Tabelle zu, die den
7-Segment Code für 0..9 beinhaltet (10 * RETLW).
Die beiden Ergebnisbytes kann man, wenns denn unbedingt sein muß, mit
Delay ausgeben. Timerinterrupt ist natürlich besser, da flackerfrei.
Peter Dannegger schrieb:> Patrick Oppliger schrieb:>> .......(immmer 5 Programmzeilen im Literschritt bis:>>>> CALL DISP_ ;0Liter>> CALL DELAY1>> CALL DISP0>> CALL DELAY1>> GOTO MAIN>> Sowas derart umständliches nennt man, die Hose mit der Kneifzange> anziehen.>> Warum schaust Du Dir nicht einfach mal an, wie alle anderen> Programmierer Zahlen anzeigen?>> Zuerst zerlegt man die Zahl in Zehner und Einer (z.B. 10 abziehen bis> Unterlauf). Und dann greift man damit auf eine Tabelle zu, die den> 7-Segment Code für 0..9 beinhaltet (10 * RETLW).> Die beiden Ergebnisbytes kann man, wenns denn unbedingt sein muß, mit> Delay ausgeben. Timerinterrupt ist natürlich besser, da flackerfrei.
Ich habe meine 7-Segmentanzeige über 2 Ports verteilen müssen, damit die
Stromversorgung von 100mA pro Port nicht überschritten wird. Für jede
Anzeige, sei es ein Zeichen oder eine Zahl habe ich ein Unterprogramm
mit den nötigen Zeilen geschrieben.
Damit ich das Programm simulieren kann, habe ich nun MPLAB v2.10
installiert, jedoch kommt jedesmal beim Programmbuild ein Fehler: "DOS
Error: Fail not found". Hatte dies auch schon jemand zuvor?
Patrick Oppliger schrieb:> Probiere auch mal das ganze> mit BRW (danke an Max H.!!)
Das wird nichts, der PIC16F818 ist zu alt und hat den Befehl nicht.
Patrick Oppliger schrieb:> Ich habe meine 7-Segmentanzeige über 2 Ports verteilen müssen
Ich mache das auch, wenn sich die Platine dadurch leichter routen läßt.
Ich schalte dann eine Routine dazwischen, die das Ausgabebyte auf die
jeweiligen Pins verteilt (Bitbefehle).