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
lege den anfang deiner tabellen mit org auf den anfang einer seite. dürfen sich nicht überlappen- z.b. 0100,0200,0300
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
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
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ß
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
>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
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
habe die Tabellen neu gelegt,damit sie nicht seitenübergreifend sind. Deinen cod nicht verändert und kontrolliert. hat aber keinen Fehler ergeben. Gruß
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. !!!
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
er funkt nicht wirklich nicht. ich hatte Aufruf und Tabellen auch immer auf der ersten Seite. Gruß
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.