Forum: Mikrocontroller und Digitale Elektronik PIC16F876 Problem mit Tabelle


von coluna (Gast)


Lesenswert?

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.

von Andreas R. (blackpuma)


Lesenswert?

Nix im Anhang.

von coluna (Gast)


Angehängte Dateien:

Lesenswert?

ich hoffe das er sich jetzt im Anhang befindet.

von schwups... (Gast)


Lesenswert?

Bischen Kommentar im Programm wäre hilfreich.

von stepp64 (Gast)


Lesenswert?

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

von coluna (Gast)


Lesenswert?

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.

von Severino R. (severino)


Lesenswert?

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

von stepp64 (Gast)


Lesenswert?

Ich schau mal heute Abend, wie ich das immer gemacht habe. Kann im 
Moment nicht auf meine Quellen zugreifen.

von Jens P. (picler)


Lesenswert?

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.

von coluna (Gast)


Angehängte Dateien:

Lesenswert?

ich hab mal das Programm geändert seh es Euch mal an.

von coluna (Gast)


Lesenswert?

Hallo,
wenn ich das Programm Simuliere erhalte ich diese Meldung:CORE-E0001: 
Stack over flow error occurred from instruction at 0x000039
Was bedeutet das?

von ich (Gast)


Lesenswert?

>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.

von Sven S. (stepp64) Benutzerseite


Lesenswert?

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
5
  movwf  PCLATH        ;Vektor nach PCLATH schreiben
6
  movlw  Low (Tabelle_Uhr)  ;Low Tabellen Vektor holen
7
  addwf  tmp1,w        ;Low Vektor hinzu addieren
8
  btfsc  STATUS,C      ;Gab es einen Übertrag?
9
  incf   PCLATH,f      ;ja, PCLATH incrementieren
10
  movwf  PCL        ;und springen
11
Tabelle_Uhr
12
  retlw  .0        ;Dummy  
13
  retlw  .32        ;Januar
14
  retlw  .29        ;Februar
15
  retlw  .32        ;März
16
  retlw  .31        ;April
17
  retlw  .32        ;Mai
18
  retlw  .31        ;Juni
19
  retlw  .32        ;Juli
20
  retlw  .32        ;August
21
  retlw  .31        ;September
22
  retlw  .32        ;Oktober
23
  retlw  .31        ;November
24
  retlw  .32        ;Dezember

Hoffe es nützt was.

von coluna (Gast)


Lesenswert?

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.

von Jens P. (picler)


Lesenswert?

> 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.

von coluna (Gast)


Lesenswert?

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.

von Jens P. (picler)


Lesenswert?

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.

von stepp64 (Gast)


Lesenswert?

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

von Severino R. (severino)


Lesenswert?

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.

von coluna (Gast)


Lesenswert?

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.

von Sven S. (stepp64) Benutzerseite


Lesenswert?

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

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.