www.mikrocontroller.net

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


Autor: dreaddavid (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?IdcServic...

wenn's interessiert, ich schiebe die Daten in das 74HC4094 8-Bit 
Schieberegister 
(http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDE...)

Danke für Hilfe im Voraus.

Gruß
David

______________________________________________________________________ 
_
www.dreaddavids-elektronikpage.de

Autor: juppi (Gast)
Datum:

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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dreaddavid (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: dreaddavid (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also wenn ich das richtig verstehe:
             ; 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
dann
org 0x00FF
Zeile1 blablabla...

unterprogramme usw.

Init ....
Main ....
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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: juppi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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ß

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. !!!

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: juppi (Gast)
Datum:

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

Gruß

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
;Anzahl Tage je Monat bzw. den Wochentag ermitteln  
Offset_Uhr
  movwf  tmp1      ;W sichern
  movlw  High (Tabelle_Uhr)  ;High Tabellen Vektor holen
  movwf  PCLATH      ;Vektor nach PCLATH schreiben
  movlw  Low (Tabelle_Uhr)  ;Low Tabellen Vektor holen
  addwf  tmp1,w      ;Low Vektor hinzu addieren
  btfsc  STATUS,C    ;Gab es einen Übertrag?
  incf  PCLATH,f    ;ja, PCLATH incrementieren
  movwf  PCL      ;und springen
Tabelle_Uhr
  retlw  .0    ;Dummy  
  retlw  .32    ;Januar
  retlw  .29    ;Februar
  retlw  .32    ;März
  retlw  .31    ;April
  retlw  .32    ;Mai
  retlw  .31    ;Juni
  retlw  .32    ;Juli
  retlw  .32    ;August
  retlw  .31    ;September
  retlw  .32    ;Oktober
  retlw  .31    ;November
  retlw  .32    ;Dezember
  retlw  'M'    ;Montag
  retlw  'D'    ;Dienstag
  retlw  'M'    ;Mittwoch        
  retlw  'D'    ;Donnerstag
  retlw  'F'    ;Freitag
  retlw  'S'    ;Samstag
  retlw  'S'    ;Sonntag
  retlw  'o'
  retlw  'i'
  retlw  'i'
  retlw  'o'
  retlw  'r'
  retlw  'a'
  retlw  'o'

Gruß
Sven

Autor: dreaddavid (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
Tabelle aufrufen
     movlw    0x01
     movwf    PCLATH
     call     Zeile1

.
.         ;Code dazwischen
.

     org 0x00FF
Zeile1
     movf     letter,w
     addwf    PCL,f
     retlw    B'00011000'   ;A
.
.
.
;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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.