PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger bittetum Tips zur Selbsthilfe bei Problem mit 16F876A



Thommy07
20.09.2017, 13:27
Hallo zusammen
Bin neu hier im Forum und bitte daher um Nachsicht bei etwaigen Fehlern!

Kurz zu mir: Ich heiße Thomas bin 50 Jahre alt und versuche seit einiger Zeit mich mit der Programmierung von PIC´s. Als Hilfeseite habe ich bisher die Seite von "sprut" genutzt von der ich auch viel gelernt habe! Ach habe ich Teile aus Seinen Projekten bei mir genutzt, vor allem wenn ich mit meinen eigenen nicht weiter kam.
Nun zu meinen Problem-Projekt: Ich möchte einen Fahrregler für die Modellbahn konstruieren, der digital angesteuert wird und ein PWM Signal ausgibt. Wenn das geht soll er später weiter modifiziert werden aber halt erst wenn das mit der PWM funktioniert. Die PWM wird über einen Zähler (Fahrstufenzähler) welcher über Tasten hoch und runter gezählt wird modifiziert (Wert für Duty cycle). Der Wert der Fahrstufe (0 bis 31) wird in BCD Zahlen umgewandelt und über 2 Schieberegister (4094) an 2 7-Segmentdisplays ausgegeben (Zehner und Einer). Als Grundprojekt habe ich dazu ein PWM Regler, der über einen Poti gesteuert wurde, genommen, daher die Fragmente für den ADC. Ohne PWM funktioniert ganze so wie ich es mir gedacht habe.
Nun zu meine Problem: Wenn jetzt die Konfigvariablen für die PWM freischalte (Semikolon weg) fängt das Programm an zu "spinnen". Das äußert sich dahin, das beim hochzählen der Zähler bei bestimmtem Einer Werten wieder genullt wird. Beim runterzählen nullt sich der Zähler beim Wechsel von 0 zu 9. Mit den Tasten +/- 5 kann ich über diese Werte drüber springen. Und es passiert nur bei den Einer Werten. als 2. Phänomen hatte ich, das der Zähler nur bis zu einen bestimmten Wert zählte z.B. 27 und sich dann nullte. Der PIXC hängt sich aber anscheinend nicht auf, da auf Tastendruck weiter zählt aber hat nur bis zum "Problemwert".
ich wäre sehr dankbar wenn mir hier jemand weiterhelfen könnte, da ich derzeit nicht mehr weiterweis wo das Problem liegt. Es ist bestimmt ein Programmierfehler von mir aber ich finde ihn nicht.

ich habe im Anhang mal die gerade noch funktionierende asm uns lst Dateien angehängt. Wenn ich in dieser asm Datei jetzt ein Semikolon für die PWM weg nehme (freigeben der Konfigvariable) funktioniert das ganze nicht mehr (jedenfalls bei mir):(
Als Pich verwende ich einen 16F876A, als Taktquelle einen 4MHz Resonator, aufgebaut ist das ganze auf einem Steckbrett. Zum programmieren verwende ich ein "PICKit 3" und als Software "MPLAB IPE v3.55" und zum Übersetzen "MPASMWIN".

Vielen Dank im voraus für eure Hilfe. Sollten noch Fragen oder Infos fehlen, dann bitte melden.

PS: ich hoffe das mit den Anhänge war richtig. Da der Code recht lang ist wollte ich nicht hier direkt einstellen. Bei Fehlern hier im Forum bitte darauf hinweisen.

Gruß Thomas

witkatz
20.09.2017, 21:12
Hallo Thomas,
willkommen im RN und danke für die interessante Frage :)

Du hast das Listing der funktionierenden Version geposted. Wenn du dir die Adressen anschaust, müsste eigentlich klar sein was passiert. Die Sprungtabellen enden gerade zufällig auf Adresse 0x0FF. Das ganze Programm inklusive der Sprungtabellen passt zufällig gerade eben in einen 256 Byte Block.

Sobald du Code hinzufügst, z.B. den PWM Teil, verschiebt sich die Tabelle im Programmspeicher und liegt teilweise in den nächsten 256 Byte Block. Mit dem 8-Bit Befehl addwf PCL, f landest du ab einem bestimmten Wert nicht mehr in der Tabelle, sondern irgendwo im Programm ab Adresse 0. Der PCL läuft einfach über und der PCLATH ist immer noch 0.
Lese dir vielleicht zum besseren Verständnis das Kapitel Tabellen im RN-Wissen Artikel PIC Assembler (http://rn-wissen.de/wiki/index.php?title=PIC_Assembler#Tabellen).
Auch bei Sprut gibt es eine sehr gute Erklärung zu Sprungberechnung mit PCL (http://www.sprut.de/electronic/pic/grund/adress.htm#pcl).

Als Abhilfe könntest du die Tabellen auf eine höhere Adresse legen, so dass sie komplett in einem eigenen 256 Byte Block liegen. Das PCLATH muss vor dem Aufruf der Tabellen-Routinen mit dem höherwertigen Teil der Adresse vorbelegt werden, damit bei der PCL-Berechnung das PCH mit dem richtigen höherwertigen Teil der Adresse geladen wird.
Vielleicht in etwa so:


movlw HIGH Ziffer
movwf PCLATH
movfw Zehner ; Wert für Zehner
call Ziffer ; 7-Segmentwert

...

ORG 0x0200
; 7-Segment-Tabelle
Ziffer
addwf PCL, f
retlw B'01111110' ; Ziffer 0

...



Gruß
witkatz

Thommy07
21.09.2017, 09:18
Hallo witkatz

Vielen Dank für deine Antwort. Hatte mir schon fast gedacht das es an den Tabellen liegt, da sprut ja auch sowas geschrieben hat. Habe leider nicht verstanden wie diese Zuweisung mit org machen muss. Auch den Beitrag habe ich gelesen.
Dabei stellt sich jetzt nur eine Frage, wird "HIGH Ziffer" automatisch generiert oder muss ich da eine Variable bilden und Ihr einen Wert zuweisen.
Ich werde ganze mal versuchen und sehen was der Compiler sagt (ob er das ganze übersetzt).

Nochmals vielen herzlichen Dank für deine Hilfe. Wenn Interesse besteht kann ich das ganze Projekt nach Vollendung hier ins Forum stellen. Auch wenn es nicht gerade für Robis gedacht ist :))

Gruß Thomas

oderlachs
21.09.2017, 09:29
Hallo,
ich habe mal interessehalber (Fahrregler) mitgelesen. Muss feststellen das die Assemblerkenntnisse schon bei mir im Keller gerutscht sind...nun ja 96 habe ich den letzte ASSR - Code "gekloppt" für den 8085...davor nur für den Brotkasten.
Muss sagen das es aber immer wieder interessant ist mal wieder mit ASSR was zu machen.

Thomas ich wünsche Dir viel Erfolg dabei, weil's für die Modellbahn ist ganz besonders !!

Gerhard

Thommy07
21.09.2017, 12:53
Hallo witkaz

nochmals vielen Dank für Deine Hilfe. Der Compiler Versteht "HIGH Ziffer" und das Programm macht was es soll. Habe aber noch eine Frage zu den Adressen, denn hier verwirrt mich das Datenblatt des 16F8XXA. Auf Seite 13 meiner Version steht als Endadresse
eine 1FFFh und auf Seite 15 bei der Bankbeschreibung eine 1FFh. Da die 200h über 1FF liegt, denke ich mal das die 1FFFh die richtige Endadresse ist oder habe ich hier einen Denkfehler?
Mittlerweile hat das ganze noch einen Not-Halt und Fahrtrichtungstaster erhalten. Da das ganze später einmal von "außen" gesteuert werden soll werde ich mich vermutlich noch mal melden, da ich bei Schnittstellen noch ein paar Verständnisprobleme habe. Mal sehen ob ich`s durch testen auch heraus finden, denn aus Fehlern lernt man das meiste

Also nochmals recht herzlichen Dank und ein schönes WE

Gruß Thomas

witkatz
21.09.2017, 16:41
Es sind zwei getrennte Speicher, PIC hat Harvard-Architektur (https://de.wikipedia.org/wiki/Harvard-Architektur)

Auf Seite 13 meiner Version steht als Endadresse eine 1FFFh
Program Memory, wird mit dem Program Counter Adressiert

und auf Seite 15 bei der Bankbeschreibung eine 1FFh.
Data Memory also Register