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
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
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
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
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
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
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
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
@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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.