Forum: Mikrocontroller und Digitale Elektronik PIC - ORG?PCLATH - ich kapiers einfach nicht =(


von dreaddavid (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe vor zwei Wochen angefangen mit dem PIC 18F84A mich zu 
beschäftigen.
Möchte eine Laufschrift bauen.
So nun ist das mein erstes Programm, aber zum Glück gibt es Sprut.de, 
meinen netten Elektrolehrer (bin auf der FOS Forchheim Technik 12te 
Klasse) und ne Menge Foren, Wikis und Datenblätter.
Ich suche nun schon seit 3 Tagen nach einer Erklärung wie ich meine 
Tabelle aufrufen kann ohne das der PCL wieder zum Anfang springt weil er 
über die 255Bits nicht raus kommt.
org 0xXX und PCLATH erhöhen blablabla. Irgendwie ist es nicht so ganz 
bei mir angekommen....leider :(
Auch die Foreneinträge hier haben mir leider nicht wirklich 
weitergeholfen.

Im Anhang hab ich mein Programm (Problem Stelle gut markiert)
und die Links zu den Datenblättern folgen:
1.der PIC: http://ww1.microchip.com/downloads/en/devicedoc/35007b.pdf
2.die Erklärung für PCLATH: 
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011102

wenn's interessiert, ich schiebe die Daten in das 74HC4094 8-Bit 
Schieberegister 
(http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A240%252F74HC4094%2523STM.pdf;SID=159DLYL9S4AQ8AAH2G4VAeafe7ab38ea1b106514b1fa17a3112b3)

Danke für Hilfe im Voraus.

Gruß
David

______________________________________________________________________ 
_
www.dreaddavids-elektronikpage.de

von juppi (Gast)


Lesenswert?

lege den anfang deiner tabellen mit org auf den anfang einer seite.
dürfen sich nicht überlappen-
z.b. 0100,0200,0300

von Chris (Gast)


Lesenswert?

Am Anfang:

 ; Variablen Declaration


 clrf PCLATH ;
 call Init   ;(init sollte ab und zu vom Programm aufgerufen werden 
können)
 goto Main   ; main loop
 goto $      ; oder goto 0 ; sollte das Programm dann neu starten.
 retfie     ; Interrupt entry point

 ; Tabellen hier rein

 ; Unterprogramme kommen hier rein

 ; Code kommt hier her

Init ; ...
Main ; ...

 ; ...

 END

von dreaddavid (Gast)


Lesenswert?

Hui, danke für die Antworten.

der Tipp von juppi war schon ein Anfang, immerhin ist der PCL nicht 
übergelaufen und in die Tabelle gesprungen nur bei dem Befehl
(PCL mit Wert 12) addwf PCL,f springt der wieder hoch in die 
main-Schleife wo er nicht hinsoll.

@Chris:
wiso die Init wieder aufrufen?? Ich habe am Anfang nämlich das 
Unterprogramm zerobits, einmal 0 komplett reinschieben damit definiert 
ist für das Schieberegister was es tun soll.

goto $ startet das programm wieder bei PCLATH oder??

retfie     ; Interrupt entry point
-> ich will mit Interrupt's nichts zu tun haben. Welchen Sinn hat dies 
dann?

Danke nochmal

Gruß
David

von juppi (Gast)


Lesenswert?

dreaddavid

 Chris hat schon recht.
Ist bei dir nicht unbedingt nötig-

aber für die Struktur ist es besser.

wenn du dir das Disassemblerlisting ansiehst ,erkennst du sofort die 
Tabelle welche Seitenübergreifend ist.

Es ist schade das in Schulen immer noch der 84er behandelt wird.

aber weiter

Der Weg ist das Ziel.

Gruß

von dreaddavid (Gast)


Lesenswert?

also wenn ich das richtig verstehe:
1
             ; Variablen Declaration
2
 clrf PCLATH ;
3
 call Init   ;(init sollte ab und zu vom Programm aufgerufen werden
4
können)
5
 goto Main   ; main loop
6
 goto $      ; oder goto 0 ; sollte das Programm dann neu starten.
7
 retfie      ; Interrupt entry point
dann
1
org 0x00FF
2
Zeile1 blablabla...
3
4
unterprogramme usw.
5
6
Init ....
7
Main ....
8
end

nur das ich aus Main garnicht mehr raus komme, sondern mich dort in 
deiner goto-Schleife im Kreis drehe.

habe grade den Code von Chris eingebaut und das Programm umgestellt.
Der PCL läuft nicht über, aber wenn ich ca. in Programmzeile 100 bin und 
in W die Zahl 5 einlese um sie zum PCL zu addieren,

Der PCL aber nur auf 36 steht und nach dem addwf PCL,f
dann nicht in Zeile 105 Springt, sondern in die Tabelle,
die ich bei org 0x00FF abgelegt habe und dort in der Tabelle
in Zeile 41.

d.h. das Programm landet ganz wo anders wo es keiner braucht.

@juppi: das einzige was ich zum 16F84 in der Schule gemacht habe, war 
das Datenblatt ausdrucken^^ Wir haben garnichts zu Mikrocontrollern 
gemacht. Ich bin nur so ne verrückte Ausnahme die sich damit beschäftigt 
:)

Danke für eure Tipps werde Morgen noch mal dran gehen und schauen das 
ich da weiter komme. Party wartet.

Schönen Freitagabend noch
Gruß
David

von Chris (Gast)


Lesenswert?

>also wenn ich das richtig verstehe:             ; Variablen Declaration
> clrf PCLATH ;
setzt PCLATH auf 0, sollte der verändert worden sein
> call Init   ;(init sollte ab und zu vom Programm aufgerufen werden
>können)      ;
das sollte auch RAM PAGE auf 0 setzen.
Sollte Init kein Unterprogramm sein, passt es auch, und sollte dann
ein RET fehl am Platz sein, dann springt es nochmals ins Main. !
> goto Main   ; main loop
> goto $      ; oder goto 0 ; sollte das Programm dann neu starten.
Im Prinzip ist das nur ein Platzhalter, da es eigentlich niemals 
ausgeführt wird.
> retfie      ; Interrupt entry point
org 4 ist immer Interrupt entry point, und da sollte ein RETFIE stehen,
wenn keine Interrupts verwendet werden, denn ab und zu kann es 
passieren,
daß sie doch aufgerufen werden.

>dannorg 0x00FF
ORG 0xff ist Unsinn, die Tabellen sollen ohne ORG beginnen, nähmlich
auf ORG 5 wenn du es genau wissen willst.

>unterprogramme usw.

>Init ....
>Main ....
>end


>nur das ich aus Main garnicht mehr raus komme, sondern mich dort in
>deiner goto-Schleife im Kreis drehe.
Ist klar, es gibt halt auch code, welcher anders ist, und anstelle von
goto main call main einsetzt, und dann in halt (goto $) geht, bis ein
Reset oder WDT ausgeführt wird. Ist ev. auch bei sleep praktisch, sowie
um zu erkennen, ob ev. ein Fehler auftritt, z.B. bei Multitasking.

habe grade den Code von Chris eingebaut und das Programm umgestellt.
Der PCL läuft nicht über, aber wenn ich ca. in Programmzeile 100 bin und
in W die Zahl 5 einlese um sie zum PCL zu addieren,

>Der PCL aber nur auf 36 steht und nach dem addwf PCL,f
>dann nicht in Zeile 105 Springt, sondern in die Tabelle,
>die ich bei org 0x00FF abgelegt habe und dort in der Tabelle
>in Zeile 41.
PCL ist nur Beschreibbar, und nicht lesbar, sprich er wird nicht 
upgedated.

>d.h. das Programm landet ganz wo anders wo es keiner braucht.
eben wegen den blöden org, denn wenn du das machst, müsstest du PCLATH
entsprechend laden.
avid

von Peter D. (peda)


Lesenswert?

dreaddavid wrote:
> org 0xXX und PCLATH erhöhen blablabla. Irgendwie ist es nicht so ganz
> bei mir angekommen....leider :(
> Auch die Foreneinträge hier haben mir leider nicht wirklich
> weitergeholfen.

Ja, das ist beim PIC total vergurkt, so richtig von hinten durch die 
Brust ins Auge. Daher habe ich auch den PIC schnell wieder beiseite 
gelegt und MCs genommen, die linear 64kB adressieren können (8051, AVR).

Du mußt zuerst mal die Adreßrechnung 16-bittig machen, also 2* 
8Bit-Addition. Dabei Ausnahmebehandlung für das Carry-Bit nicht 
vergessen, das addiert der PIC nicht automatisch!
Dann mit dem High-Teil das PCLATH laden. Der Trick beim PIC ist dabei, 
daß dieser High-Teil nicht sofort wirksam wird, sondern erst beim 
nächsten Call/Goto oder Setzen von PCL. D.h. erst dann springst Du auf 
die gewünschte 13-Bit Adresse.


Neuere PICs haben bessere Befehle für indizierten Zugriff und können 
auch das Carry-Bit addieren.


Peter

von juppi (Gast)


Angehängte Dateien:

Lesenswert?

habe die Tabellen neu gelegt,damit sie nicht seitenübergreifend sind.

Deinen cod nicht verändert und kontrolliert.

hat aber keinen Fehler ergeben.

Gruß

von Chris (Gast)


Lesenswert?

Der Code von Juppi funkt nicht.
Interrupt entry point ist auf org 4 , nicht 3.
Weiters müssen die Subroutinen sowie Tabellen vor dem Code stehen,
da der Pic keinen Call oder Tabellenaufruf über der halben Pages seines
Programmspeichers machen kann. Und die Tabelle funktionieren sicherlich 
nicht, da PCLATH nicht gesetzt wird, setzte die Tabellen einfach nach 
der Interruptroutine und nimm kein Org, dann klappt es. !!!

von juppi (Gast)


Lesenswert?

Hallo
chris

Org 4 (int) richtig

habe mit dem Pic84 noch nichts gemacht,aber im Simulator kann ich mit 
Call

über alle Seiten springen.

MfG

von juppi (Gast)


Lesenswert?

er funkt nicht wirklich nicht.
ich hatte Aufruf und Tabellen auch immer auf der ersten Seite.

Gruß

von Peter D. (peda)


Lesenswert?

juppi wrote:
> er funkt nicht wirklich nicht.
> ich hatte Aufruf und Tabellen auch immer auf der ersten Seite.


Hier ein funktionierendes Beispiel:

Beitrag "Melodieklingel mit PIC"


Peter

von juppi (Gast)


Lesenswert?

Hallo Peter

Habe mir es kopiert.
Die Klingel interessiert mich nicht,
aber die Tabellenlösung.
Bin zu Besuch ,und auf einem 8 Zoll
Netbook ist nicht gut arbeiten.

MfG

von juppi (Gast)


Lesenswert?


von juppi (Gast)


Lesenswert?


von Sven S. (stepp64) Benutzerseite


Lesenswert?

Mach es so wie hier in meinem Programm. Dann brauchst du dich nicht um 
die Tabellenanfänge kümmern, da es das Programm selber ausrechnet.
1
;Anzahl Tage je Monat bzw. den Wochentag ermitteln  
2
Offset_Uhr
3
  movwf  tmp1      ;W sichern
4
  movlw  High (Tabelle_Uhr)  ;High Tabellen Vektor holen
5
  movwf  PCLATH      ;Vektor nach PCLATH schreiben
6
  movlw  Low (Tabelle_Uhr)  ;Low Tabellen Vektor holen
7
  addwf  tmp1,w      ;Low Vektor hinzu addieren
8
  btfsc  STATUS,C    ;Gab es einen Übertrag?
9
  incf  PCLATH,f    ;ja, PCLATH incrementieren
10
  movwf  PCL      ;und springen
11
Tabelle_Uhr
12
  retlw  .0    ;Dummy  
13
  retlw  .32    ;Januar
14
  retlw  .29    ;Februar
15
  retlw  .32    ;März
16
  retlw  .31    ;April
17
  retlw  .32    ;Mai
18
  retlw  .31    ;Juni
19
  retlw  .32    ;Juli
20
  retlw  .32    ;August
21
  retlw  .31    ;September
22
  retlw  .32    ;Oktober
23
  retlw  .31    ;November
24
  retlw  .32    ;Dezember
25
  retlw  'M'    ;Montag
26
  retlw  'D'    ;Dienstag
27
  retlw  'M'    ;Mittwoch        
28
  retlw  'D'    ;Donnerstag
29
  retlw  'F'    ;Freitag
30
  retlw  'S'    ;Samstag
31
  retlw  'S'    ;Sonntag
32
  retlw  'o'
33
  retlw  'i'
34
  retlw  'i'
35
  retlw  'o'
36
  retlw  'r'
37
  retlw  'a'
38
  retlw  'o'

Gruß
Sven

von dreaddavid (Gast)


Lesenswert?

Habs jetzt doch hinbekommen mit dem Tabellen problem.

wenn die Tabelle da ja in dem Disassamblylisting, im MPLAB bei org 
0x00FF ist
und ich vor dem aufrufen den PCLATH um eins erhöhe dann gehts.
also:
1
Tabelle aufrufen
2
     movlw    0x01
3
     movwf    PCLATH
4
     call     Zeile1
5
6
.
7
.         ;Code dazwischen
8
.
9
10
     org 0x00FF
11
Zeile1
12
     movf     letter,w
13
     addwf    PCL,f
14
     retlw    B'00011000'   ;A
15
.
16
.
17
.
18
;Rest der Tabelle

und wenn die Tabelle bei 01FF angelangt ist dann in PCLATH 0x02 einlesen 
usw.

der Debugger hat sich nicht beschwert und die Simulation lief auch 
glatt.
der Tipp kam aus irgendeinem wiki das ich heute früh gefunden hab.

Trotzdem danke für eure Tipps
Gruß
David

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.