Moin Experten
habe ein Problem mit der Auslesung der Tabele und zwar wird nur der
erste Eintrag gelesen und weiter komm er nicht.Das Programm hängt da
irgen wo.
Nun meine Frage was muss ich tun damit die gesammte Tabelle gellesen
wird.
Das Programm ist im Anhang.
Erst mal DANKE für Euer bemühen.
coluna.
Vermutlich tritt in der Tabelle ein Überlauf bei der add-Funktion auf.
Du solltest also den Beginn der Tabelle auf eine 256-Byte Grenze legen
oder bei der Berechnung des Zeigers auf deine Tabelle auch das Highbyte
des PCL (PCLATH) mit berücksichtigen.
Und schreib mehr Kommentare. Du wirst nach vier Wochen Probleme bekommen
dein eigenes Assemblerprogramm noch lesen zu können.
Gruß
Sven
Moin Sven,
Anfänger Problem!! wie macht man das mit PCL (PCLATH) ?
Damit kein Überlauf stattfindet? hab da zwar ein Buch aber richtig
erklärt wird das dort auch nicht.
coluna schrieb:
> Anfänger Problem!! wie macht man das mit PCL (PCLATH) ?
Microchip beschreibt dies in der Application Note 556.
> Damit kein Überlauf stattfindet?
Die Tabelle mit ORG auf den Anfang eines 256 Word Bereichs legen:
org 0x100
table
addwf PCL,f
retlw h'3F'
retlw h'06'
...
tableend
Oder mit Makros ermitteln, ob die Tabelle eine 256 Word-Grenze
überschreitet.
Das Makro sorgt dafür, dass beim Assemblieren in dem Fall eine
Fehlermeldung erscheint.
#if ( (table & 0xFF00) != ((tableEnd-1) & 0xFF00) )
ERROR "Table crosses 256 word block boundary"
#endif
#if ( (table & 0xFF00) != 0 )
ERROR "Table not in first 256 bytes of page"
#endif
stepp64 schrieb:
> Vermutlich tritt in der Tabelle ein Überlauf bei der add-Funktion auf.
Ich habe das Programm mal durch dem Assembler laufen lassen. Ein
PCL-Überlauf tritt dabei nicht auf. Das Programm ist kürzer als 256
byte. Wie stepp64 schrieb, besteht allerdings die Gefahr, dass bei der
ADD-Funktion ein Sprung entsteht, der außerhalb der Tabelle landet.
Ich hatte vor einiger Zeit aber das gleiche Problem mit eben diesem PIC.
Das Programm stürzte beim Aufruf der Tabelle ab, die Ursache konnte ich
nicht finden. Das richtig merkwürdige an dieser Sache war jedoch, dass
das Programm mit einem anderen PIC-Typ (16F84) bisher ohne Probleme
lief. Es wurden lediglich die Registeradressen geändert. Vielleicht gibt
es da ein Hardwareproblem ...
Ich habe das dann auf die harte Tour gelöst, indem ich den
Tabellenzeiger mittels subwf abgefragt und den Rückgabewert mit movlw
zugewiesen habe.
Hallo,
wenn ich das Programm Simuliere erhalte ich diese Meldung:CORE-E0001:
Stack over flow error occurred from instruction at 0x000039
Was bedeutet das?
>table addwf PCL,f> movwf PORTB> movf PCLATH,f> movwf PORTA> retlw h'3F';ohne org 800> retlw h'06'> retlw h'5B'
So gehht das nicht. Das "addwf PCL" muss natürlich DIREKT vor der
Tabelle stehen. Im Datasheet zum PIC muss eigentlich ein Beispiel sein.
Wie versprochen hier mal meine Routine, welche ich seit einiger Zeit so
benutze. Sie ist unabhängig von den 256-Byte-Speichergrenzen. Hier als
Beispiel in einer Uhrenanwendung
1
;Anzahl Tage je Monat ermitteln
2
Offset_Uhr
3
movwf tmp1 ;W sichern
4
movlw High (Tabelle_Uhr) ;High Tabellen Vektor holen
Hallo Sven,
nee läuft auch noch nicht . Irgend etwas ist hier faul. Muss doch
nochmal das Programm überarbeiten.
Aber erstmal vielen DANK für Eure bemühen.
coluna.
> list p=16F876 ; Baustein> ...> __CONFIG 0x3F72 ; konfigurationsort 16F876
Diese beiden Zeilen meckert mein Assembler an.
Außerdem ist der Code schwer zu lesen, mal werden Werte binär übergeben,
mal hex und dann wieder dezimal. Unklare Calls und Sprünge. Es ist kaum
etwas dokumentiert, so weißt du in 4 Wochen nicht mehr, was das ganze
Programm soll. Von einem Außenstehenden ganz zu schweigen.
Was soll das Programm machen? Eine LED-Anzeige ansteuern? Dann teste das
Programm doch erstmal ohne die Tabelle. Übergebe einen dir passenden
Rückgabewert und springe zurück, z.B. so:
table retlw 05BH
Wenn das zur Zufriedenheit läuft, kannst du dich der Tabelle widmen.
Jens das war ein guter Tip! Ohne Tabelle läuft es durch. Ich werde mmich
jetzt Stück für Stück heran tasten bis es durch läüft. Übriigens habe
ich das Programm auf der suche nach einer LCD-Anzeige im Internet
gefunden und war neugierig was es wohl machte.
war wohl nix!!
coluna.
coluna schrieb:
> Ohne Tabelle läuft es durch.
Na das ist doch schon mal was. Vielleicht kannst du das Programm (mit
Tabelle) mal auf einem anderen PIC testen. Ich hatte mit dem 16F876
ebenfalls Probleme bei einer Tabelle. Das komische dabei ist, das
Programm lief vorher auf einen 16F84 anstandslos mit der Tabelle. Ich
will keine Gerüchte in die Welt setzen, aber hier tendiere ich
mittlerweile zu einem Bug im PIC.
Was ich gerade sah: Du rufst in der Routine display diese erneut mit
einem call display auf. Das kann nicht funktionieren, da der Stack nach
8 Durchläufen überläuft. Eventuell steckt da ja schon der Fehler.
Sven
coluna schrieb:
> Hallo,> wenn ich das Programm Simuliere erhalte ich diese Meldung:CORE-E0001:> Stack over flow error occurred from instruction at 0x000039> Was bedeutet das?
Genau das:
stepp64 schrieb:
> Was ich gerade sah: Du rufst in der Routine display diese erneut mit> einem call display auf. Das kann nicht funktionieren, da der Stack nach> 8 Durchläufen überläuft. Eventuell steckt da ja schon der Fehler.>> Sven
Du hattest den Grund ja schon gefunden. Und der arme PIC ist wohl nicht
buggy.
ich bin der Sache schon halb auf der Spur, mache solange weiter ,bis es
läuft. Das bin ich meinem EGO schuldig.
Am Configurations_Hader glaube ich muss ich auch was tun "
__CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF"
hier meldet er mir nähmlich ERROR.
Also dein Configwort ist nicht falsch, jedenfalls nicht das was du hier
geschrieben hast. Genauso verwende ich es auch für einen 16F877. Aber
ich habe weitere Fehler gefunden:
1. ONE hat die selbe RAM-Adresse wie AMOUNT
2. PORTA ist nicht auf digital Output initialisiert, deshalb keine
Ausgaben auf PORTA
3. Wie schon geschrieben ruft sich die Routine display selbst auf. Das
führt zum Absturz (nimm einfach das call display in der Routine raus)
Die Tabelle funktioniert im Simulator ordnungsgemäß. Stelle mal die o.g.
Fehler ab, und dann schau weiter. Und kommentiere das Programm etwas.
Sven