PIC PCLATH Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
| Autor |
PIC PCLATH Suche nach: pic (2060) |
|
|
|
|
BID = 403262
techno Neu hier
 Beiträge: 29
|
|
Hallo zusammen,
ich habe ein Problem mit einem Tabelread.
Beschreibung:
In meinem Programm möchte ich die Uhrzeit stellen.
Dazu soll ein blinkender Cursor auf die entsprechenden Stellen im LCD gesetzt werden.
Die Position des Cursors wird über die Tasten "Rechts" und "Links" eingestellt und einmal pro Sek. wird die Uhrzeit aktualisiert wenn "Timerflags,1" gesetzt ist.
Weil sich das Unterprogramm in einem PIC-16F826 im Programmspeicher an der Adresse 0x1XX befindet schreibe ich vor dem Befehl "call Anzeigemenü1" den Wert B'00000001' in das PCLATH Register.
Im Unterprogramm "Anzeigemenü1" wir dann durch einen goto Befehl der Cursor auf die entsprechende Stelle im LCD gesetzt und über "RETURN" beendet.
Das ganze funktioniert solange bis der Befehl "call Anzeigemenü1" ausgeführt wird.
In der Simulation mit MPLAB funktioniert das Ganze nur in der Praxis leider nicht.
Was mache ich falsch ?????
Ich habe den Programmauschnitt hochgeladen und versucht ihn gut zu dokumentieren.
mfg techno |
|
BID = 403354
DonComi Inventar
     
Beiträge: 8604 Wohnort: Amerika
|
|
Ich habe von PICs keine große Ahnung (eher AVR) aber versuche mal die Labels ohne Umlaute wie 'ä' 'ü' und 'ö' zu benutzen.
Das Problem liegt demnach beim Compiler, der möglicherweise falsche Adressen erzeugt.
PS: Ich habe nicht nachgeschaut, ob dein Programm überhaupt Sinn macht. Es viel eben mit den Umlauten auf.
_________________
|
|
BID = 403448
selfman Schreibmaschine
    
Beiträge: 1681 Wohnort: Seekirchen a. W.
|
Hallo!
Soll diese Zeile
Zitat :
| call Anzeigemenü1 ; setze blinking Cursor
; an entsprechende Stelle 00:00:00
|
dieses Label
aufrufen.
Wenn ja, dann wird das nicht klappen. Der Grund ist ja Klar, oder?
Außerdem würde ich einmal nachlesen, wie lange die Labels sein dürfen. Manche Assembler haben nämlich eine begrenzte Anzahl an Zeichen, die für das Label herangezogen werden, die übrigen werden oft ohne Meldung vernachlässigt.
Schöne Grüße Selfman
_________________
Traue keinem Ding, das du nicht selber vermurkst hast.
|
BID = 403749
stepp64 Gesprächig
  
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 162
|
Hallo,
du hast scheinbar, genau wie ich am Anfang, noch einige Verständnisprobleme, was die Nutzung des PCLATH Registers angeht. Also, solange du mit CALL und GOTO innerhalb der 2kByte Grenzen des Flashspeichers bleibst (Pages) brauchst du PCLATH nicht zu verändern. Du kannst also munter hin und her hüpfen. Erst wenn du in die Page 1 (ab 0x800), Page 2 (ab 0x1000) oder Page 3 (ab 0x1800) springen willst, musst du in PCLATH die Bits 3 und 4 verändern. Dabei gilt PCLATH<4:3> , Page0=0:0, Page1=0:1, Page2=1:0 und Page3=1:1.
Die Rücksprünge aus einem CALL funktionieren ohne vorher das PCLATH azupassen. Das liegt daran, das der Stack 13 Bit breit ist und die gesammte Rücksprungadresse speichern kann. Wogegen bei CALL (und GOTO) nur 11 Bits aus dem Befehl kommen und die restlichen zwei Bits aus PCLATH Bit 3 und 4 genommen werden. Für dein kurzes Programm brauchst du also PCLATH nicht zu verändern.
Das nächste was du versuchst ist die Manipulation des PCL (addwf PCL,f). Dies funktioniert nur innerhalb 256 Bytes. Erst wenn bei deiner Addition ein PCL-Registerüberlauf auftritt (du Überschreitest eine 256-Byte Grenze) musst du auch das PCLATH aktualisieren. Das macht man eigentlich, indem man den Wert zu PCL addiert, danach das C-Flag im Statusregister überprüft (wegen Überlauf) und zu PCLATH eine 1 hinzuaddiert sofern ein Überlauf sattfand. Sofern du sicherstellen kannst, dass das es keinen Überlauf geben kann (z.Bsp. weil du nur kleine Werte addierst) dann kannst du die Abfrage das Überlaufs auch weg lassen. Hier musst du aber aufpassen. Du musst immer berücksichtigen in welchem 256-Byte-Block du dich gerade befindest. Wenn dein addwf PCL,f z.Bsp. auf Adresse 0x100 steht und PCLATH=0 ist, wird bei einer Addition von 5 der PIC auf Adresse 5 springen und nicht auf Adresse 0x105!!! Hier mal ein Programmteil welches ich auch so in meinen Programmen benutze:
| Code : |
Unterprogramm
movwf safeW ;w abspeichern
movlw HIGH (tabelle) ;Highteil von tabelle holen
movwf PCLATH ;und nach PCLATH damit
movlw Low (tabelle) ;Lowteil von Tabelle holen
addwf safeW,w
btfsc STATUS,C ;Überlauf?
incf PCLATH,f ;ja, um eins erhöhen
movwf PCL ;Jump
tabelle
goto Jump1
goto Jump2
:
|
|
Wenn du dieses Unterprogramm anspringst und in W den Offset übergibst, dann sollte der PIC eigentlich immer auf den richtigen Wert springen.
Achso, was noch erwähnt werden sollte: Der MPLAB unterscheidet zwischen Groß- und Kleinschreibung bei den Marken. Natürlich müssen auch Unterstriche immer genau so gesetzt werden. Marke1, marke1 und Marke_1 sind also drei unterschiedliche Sprungmarken.
Gruß
Sven
[ Diese Nachricht wurde geändert von: stepp64 am 2 Feb 2007 13:55 ]
|
BID = 404146
techno Neu hier
 Beiträge: 29
|
Hallo zusammen,
sorry ich war die letzten paar Tage beruflich unterwegs und kann deshalb erst verspätet antworten.
Selfman hat natürlich recht so ein call Befehl kann nicht funktionieren.
Dieser Fehler ist mir beim erstellen des posts unterlaufen.
Zitat :
| | Für dein kurzes Programm brauchst du also PCLATH nicht zu verändern. |
Ich habe nur einen Ausschnitt aus meinem Programm hochgeladen.
Um das ganze deutlicher darzustellen habe ich jetzt einmal das Disassembly Listing angefügt.
Zitat :
| | Das macht man eigentlich, indem man den Wert zu PCL addiert, danach das C-Flag im Statusregister überprüft (wegen Überlauf) und zu PCLATH eine 1 hinzuaddiert sofern ein Überlauf sattfand. Sofern du sicherstellen kannst, dass das es keinen Überlauf geben kann (z.Bsp. weil du nur kleine Werte addierst) dann kannst du die Abfrage das Überlaufs auch weg lassen. Hier musst du aber aufpassen. Du musst immer berücksichtigen in welchem 256-Byte-Block du dich gerade befindest. Wenn dein addwf PCL,f z.Bsp. auf Adresse 0x100 steht und PCLATH=0 ist, wird bei einer Addition von 5 der PIC auf Adresse 5 springen und nicht auf Adresse 0x105!!! Hier mal ein Programmteil welches ich auch so in meinen Programmen benutze: |
Das C-Flag zu überprüfen ist eine sehr gute Idee.
Ich habe bisher immer nachgesehen an welcher Stelle ich mich im Programm befinde und dann das PCLATH Register mit dem entsprechenden Wert beschrieben.
Frage:Kann es sein das sich der Controller vom LCD aufhängt?
Weil ich bemerkt habe dass das Display sich erst nach mehrmaligem betätigen der Reset Taste in den Urzustand versetzen läst.
mfg techno
|
BID = 404606
techno Neu hier
 Beiträge: 29
|
Hallo zusammen,
ich habe meinen Fehler gefunden!
Duch anzeigen meines countermenü_2 Registers auf dem LCD habe ich bemerkt das in diesem Register wenn es nicht anders initialisiert wird der Wert 0xFF steht.
Damit konnte der tabel read nicht funktionieren.
Frage: Ist das bei jedem Register im Datenspeicher eines
PIC's so?
mfg techno
|
BID = 404710
stepp64 Gesprächig
  
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 162
|
Die freien RAM-Zellen können durchaus irgendeinen Wert nach dem Einschalten des PICs haben. Ich habe erst letztens hier im Forum gelesen, dass die Werte bis zu 15 sec nach dem Ausschalten noch erhalten bleiben! Du solltest also immer deine benutzten RAM-Zellen initialisieren. Oder du löschst gleich die ganze Bank am Anfang des Programmes. Ich mache das immer mit folgender Routine:
| Code : |
start
;erst mal den RAM löschen (0x20-0x7F + 0xA0-0xFF)
movlw 0x20 ;Bank0 löschen
movwf FSR
RAMerase0
clrf INDF
incf FSR,f
btfss FSR,7 ;0x80 erreicht (Bit7=1)?
goto RAMerase0 ;nö, dann noch mal
bsf STATUS,RP0 ;Bank1 löschen
movlw 0xA0
movwf FSR
RAMerase1
clrf INDF
incf FSR,f
btfss STATUS,Z ;0x00 erreicht (STATUS,Z=1)?
goto RAMerase1 ;nö, dann noch mal
bcf STATUS,RP0 ;Bank0
|
|
Wenn du nur Bank0 benutzt kannst du natürlich den Teil für Bank1 weg lassen. Bank2+3 habe ich bisher noch nie benutzt, desshalb gibts dafür auch keinen Code von mir
Gruß
Sven
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 17 Beiträge im Durchschnitt pro Tag heute wurden bisher 7 Beiträge verfasst © x sparkkelsputz Besucher : 188002709 Heute : 6727 Gestern : 15227 Online : 336 29.12.2025 19:29 7 Besucher in den letzten 60 Sekunden alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0600500106812
|