PIC PCLATH

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 12 2025  10:04:03      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : 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
Zitat :
Anzeige_menü_1
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


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


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 1 Beiträge verfasst
© x sparkkelsputz        Besucher : 187998659   Heute : 2674    Gestern : 15227    Online : 251        29.12.2025    10:04
7 Besucher in den letzten 60 Sekunden        alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0377428531647