Forum: Mikrocontroller und Digitale Elektronik PIC Programm-Problem


von Sven (Gast)


Angehängte Dateien:

Lesenswert?

Hallöchen,

ich habe mal wieder ein Problem, wo ich alleine nicht dahinter steige,
vielleicht gibt es hier Hilfe ;-)

Ich will, wie an anderen Stellen auch schon beschrieben, meinen
Leiterplattenbelichter mit einem Controller für die Zeitsteuerung
ausrüsten, Anzeige per LCD, über 2 Taster Zeit erhöhen / verringern,
bei gleichzeitigem Drücken Abspeichern im EEPROM, ein START-Taster für
die Belichtung.
Im Prinzip arbeitet das Programm schon. Es liest beim Programmstart die
gespeicherte Zeit aus, zeigt sie an und zählt nach dem Start rückwärts,
steuert dabei das Relais für die Lampen an, alles ok.
Nun wollte ich nur noch etwas Spielerei einbringen. Nach dem
Einschalten zBsp ein kurzes Copyright im Display und nach dem Ablauf
der Zeit die Anzeige "Belichtung ok". Die Ausgabe-Routinen (mit
Tabellen retlw...) habe ich ja schon mehrmals im Programm verwendet,
klappt auch tadellos. Aber sobald ich jetzt etwas zusätzlich ins
Programm einfüge, läuft es nicht mehr, obwohl der Programmcode ja
definitiv ok ist, da er schon mehrmals so im Proggi verwendet wird und
läuft.
Ich habe im File mal, um den bewußten Programmabschnitt zu markieren,
vorher und nachher viele Leerzeilen eingefügt, so daß man es gleich
beim drüberblättern sieht.
Weiß jemand, warum das mit dem eingefügten Teil nicht mehr geht? Hab
extra größere PICs genommen mit mehr Speicher, aber der ist hier nur zu
15% ausgefüllt, das kann also auch nicht der Fehler sein, wie ich
Anfangs vermutet habe..
Danke im Voraus für die Antworten!

mfg Sven

von Sven (Gast)


Lesenswert?

Eventuell hab ich den Fehler. Ich habe bei Sprut gelesen, daß die
retlw-Tabellen nicht im Speicher an einer Adresse ...FF stehen dürfen,
da der Befehl nur 8bitig arbeitet... ich werde die Tabellen mal
umstellen, dann sag ich nochmal ob es der Fehler war..

Sven

von Sven (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

also das mit der Adresse xxxFF war nicht die Lösung. Ich hab nochmal
das aktuelle File angehangen. Ohne den Programmteil, der zwischen den
vielen Leerzeilen steht, läuft das Programm. Sobald der Programmteil
drin ist (obwohl während des Programms dieser Teil noch nicht mal
aufgerufen wird) läuft das Proggi nicht mehr.
Ich hab die Tabellen schon im Programm hin und her geschoben, auf die
Speicherbelegung (xxxFF) geachtet, wo kann das Problem noch sein?
Ich bin nach tagelangen Versuchen nun mit meinem Latein (oder besser
Assembler) am Ende und bin schon auf Tips gespannt ...

mfg Sven

von Ingo (Gast)


Lesenswert?

Hallo Sven,
ich habe Dein Programm mal auf MLAB laufen lassen, es wird tadellos
kompeliert! Es gibt keine ausergewöhlichen Warnmeldungen.
Dies bedeutet Du suchst keinen Syntax-, sondern einen logischen
Fehler.

Was mir aufgefallen ist, wenn die Zeit ausgegeben wird, dann springt
das Programm wieder in die LCD-Init-Routine, ist das gewollt, muss das
Display nach jedem Zeichen neu initialisiert werden??? Was nutzt Du für
ein Display??

GRUSS
INGO

von Sven (Gast)


Lesenswert?

Hallo Ingo,

das habe ich im Sim auch beobachtet. Wenn man aber die 2 Programmteile
zur Anzeige "Belichtung ok" rausnimmt, also die Tabelle und
zugehörige Ausgaberoutine darüber, was ich in die vielen Leerzeilen
eingebettet habe, läuft es ordentlich.
Das ist gerade mein Problem, daß ich nicht weiß, wieso der Programmteil
sich so auswirkt, vor allem, wenn er noch nicht mal
aufgerufen wird...

Sven

von Ingo (Gast)


Lesenswert?

OK,

aber was ist mit der Init-Routine vom LCD, ist das richtig das nach der
Ausgabe eines Zeichen (aus der Zeittabelle) die Init-Routine wieder
aufgerufen wird?

GRUSS
INGO

von Peter D. (peda)


Lesenswert?

Wenn das Einfügen einer Routine Probleme verursacht, klingt das verdammt
nach Stackproblem.

Soweit ich weiß, haben die meisten PICs nur einen sehr begrenzten
Hardwarestack im Gegensatz zu anderen µCs die soviel callen können, wie
SRAM da ist.


Peter

von Steffen (Gast)


Lesenswert?

Es gibt nicht nur Probleme, wenn die Tabelle auf xxFF liegt, sondern
wenn sie diese Adresse überschreitet. Genau das wird dein Problem sein.
Schau dir einfach mal das Listing des Programmspeichers oder das
absolute Listing an.

Entweder sorgst Du dafür, dass die Tabellen definiert im Speicher
liegen oder prüfst vorher, ob ein Überlauf (PCL) aufttritt und erhöhst
vorher PCLATH.

Steffen

von Manfred Glahe (Gast)


Lesenswert?

@Sven,

;  Das ist der eingefügte Programmteil

;*********************************************************************** 
******
;  Belichtung ok; tmpz* ist momentan "frei"

beliok  movlw  b'11000000'  ;40h zweite Zeile im LCD
  call  steuerout
  movlw  d'13'    ;13 Zeichen holen
  movwf  tmpz
  clrf  tmpz1
beliok1  movf  tmpz1,w
  call  belok
  call  datenout
  decfsz  tmpz,f
  goto  beliok2
  return
beliok2  incf  tmpz1,f
  goto  beliok1

so wie ich das sehe, verläßt Du das Unterprog. nicht korrekt mit return
sondern mit "goto beliok2". Die Kombination ist gewagt.

MfG  Manfred Glahe

von Steffen (Gast)


Lesenswert?

decfsz  tmpz,f
  goto  beliok2
  return

Passt doch. Wenn tmpz=0, dann return.

von Manfred Glahe (Gast)


Lesenswert?

@ Steffen,

richtig, ich hätte besser hinschauen sollen.

MfG  Manfred Glahe

von Sven (Gast)


Lesenswert?

Hallo Steffen,

der Tip klingt gut. Wußte nur, daß xxFF Probleme macht. Ich habe ja
mehrere Tabellen, vor und nach dieser Adresse, aber so gelegt, daß xxFF
frei ist. Also sollte ich evtl alle Tabellen an den Programmanfang
schreiben, bevor ich das erste mal an so eine Adresse komme, habe ich
das richtig verstanden?
Was mich halt nur wundert, daß das Programm nicht mehr arbeitet ab dem
Moment wo die Tabelle drin steht, obwohl sie im Programm überhaupt
nicht aufgerufen wird.
Ich teste morgen mal, alle Tabellen an den Anfang zu schreiben.
Danke ;-)

Sven

von Steffen (Gast)


Lesenswert?

Hallo Sven,

die Tabellen an den Anfang (nach dem Interuptvektor) zu legen ist die
günstigste Variante. Wenn Du irgendwann mal das Programm erweiterst
kommt es ja immer zu Verschiebungen der einzelnen Programmteile. So
einen Fehler sucht mann dann ziehmlich verzweifelt.

Eine andere Möglichkeit wäre wie gesagt den Überlauf (Bsp:
0x00FE+3=0x0101, wenn PCLATH nicht erhöht wird geht der Sprung auf
0x0001) abzufangen.

Warum es allerdings das Problem gibt, obwohl die Tabelle nicht
aufgerufen wird ist trotzdem noch ein Rätsel.

Steffen

von Sven (Gast)


Lesenswert?

Moin!

Ich habe die Tabellen nun alle an den Anfang des Speichers gelegt,
damit waren alle Probleme beseitigt, läuft super inclusive aller
Anzeigen ;-)
Nun würde auch wieder ein kleinerer PIC reichen, allerdings ist die
Platine schon fertig, also verrechne ich das mal als Lehrgeld g


Vielen Dank für die Tips!



Sven

von Olli (Gast)


Lesenswert?

Hi,

ein Aufruf einer RETLW Tabelle sollte so aussehen:

        movlw   LOW Table       ; get low byte of tableaddress
        addwf   offset,W        ; add offset
        movwf   temp            ; store offset

        movlw   HIGH Table      ; get hi byte of tableaddress
        btfsc   STATUS,C        ; page crossed? (bei dem
addwf-Befehl!!)
        addlw   1               ; yes !

        movwf   PCLATH          ; load high adress in PCLATH

        movf    temp,W          ; load computed Offset back

        call    Table
        ...


Table
        movwf   PCL
        retlw   'D'
        retlw   'a'
        retlw   't'
        retlw   'a'
        ...

Und zwar liegt das daran, daß ein PIC, wenn man sein PLC-Register
manipuliert, automatisch auch PCLATH nach PCH läd. Solche 'netten'
Sachen gibts beim PIC immer wieder. Du hast aber PCLATH in Deinem
ganzen Programm nicht verändert, als stehts noch auf Null. Wenn
jetzt die Tabellen irgendwo im Programmspeicher stehen, bewirkt
der 'addwf pcl,f' Befehl am Anfang Deiner Tabellen, daß sich der
PIC danach im Programmbereich 0x000 - 0x0FF wiederfindet. Hast Du
die Tabellen am Anfang des Programms, funktioniert das, aber nur
zufällig.

Olli

von Sven (Gast)


Lesenswert?

Vielen Dank für die Info. Ganz hab ich das noch nicht verinnerlicht, und
im Datenblatt bei retlw findet man gemeiner Weise auch keinen
Hinweis..ist echt ne Falle. Ich hab die Tabellen am Anfang, da geht es
erstmal, das andere hier guck ich mir in Ruhe mal an und versuch das zu
ergründen lach

mfg Sven

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.