Hallo liebe Gemeinde.
Die Überschrift sagt hoffentlich schon was ich will.
Ich soll für ein Arbeitsprojekt eine Wasserfüllstandanzeige bauen.
Bestimmte Komponenten waren vorgegeben um die Studieninhalte wieder
aufzugreifen.
Ich habe jetzt den PIC16F84A vor mir liegen. Er soll das Rechtecksignal
eines NE555 empfangen und auswerten bzw. entsprechend der Anzahl von
Amplituden über eine gewisse Zeit eine oder mehrere von 9 LEDs ein- bzw.
abschalten.
Verwirklicht werden soll das ganze mittels MPLab über die
Programmiersprache C.
Ich habe im Internet einiges an Hilfreichem gefunden, komme aber nun
nicht weiter. Eine Seite hat ein ähnliches Programm geschrieben wie ich
es brauche, aber beim Wechsel von Bank 0 auf Bank 1 irgendetwas
deklariert, das ich nicht nachvollziehen kann.
set_bit( STATUS, RP0 );
OPTION_REG = 5; // set prescaler to 1:64
set_bit (TRISB,0); // set RB0 to input
clear_bit (STATUS, RP0 ); // switch to Bank 0
Das wäre der Code dazu. Das OPTION_REG = 5 habe ich via #define schon
einbinden können. Doch wie ich von Bank 1 auf Bank 0 bzw. umgekehrt
komme und was genau die dritte Zeile bedeuten soll, da bin ich
überfragt.
In Assembler könnte ich wenigstens die erste Frage beantworten, aber ich
muss ja C benutzen.
Ich kann gerne weitere Teile des Codes einstellen, falls die
Informationen so nicht ausreichend sein sollten.
Und last but not least:
Ja ich orientiere mich an dem Code den ich im Internet gefunden habe.
Allerdings kann ich ihn aufgrund etlicher unbekannter Definitionen
(selbst wenn ich das gewollt hätte, was nicht der Fall ist) sowieso
nicht direkt übernehmen sondern muss verstehen was gemeint ist und es
mir entweder selber deklarieren oder es anders schreiben.
Bis auf diesen Abschnitt funktionierte das auch vergleichsweise gut und
ich hoffe nun hier auf Hilfestellung.
Und bitte nicht ganz böse mit mir sein. Das ist das erste mal das ich
überhaupt etwas sinnvolles (sprich kein "Hello World!"-Programm)
schreibe und auch das erste mal das ich überhaupt von PICs gehört habe.
Liebe Grüße, Nanshaid
Welchen Compiler benutzt du?
Der XC8 übernimmt die Bankumschaltung:
1
OPTION_REG=5;
2
TRISBbits.TRISB0=0;
OPTION_REG hat ausser des Prescaler noch mehr bedeutende Bits.
OPTION_REG = 5 bewirkt viel mehr als nur den Prescaler auf 1:64 zu
setzen. Die Infos dazu findest du im Datenblatt des PIC16F84A.
Nanshaid schrieb:> Ich habe jetzt den PIC16F84A vor mir liegen.
Aus welchem Museum hast du den denn geklaut?
Wurde der dir vorgesetztes oder hast du den selber ausgesucht?
Der Compiler müsste da eigentlich Befehle
wie PAGESEL oder BANKSEL verstehen.
Jürgen D. schrieb:> PAGESEL oder BANKSEL
sind ASM Makros, die in C nichts zu suchen haben.
Jürgen D. schrieb:> Aus welchem Museum hast du den denn geklaut?
Ich habe auch noch einen 84A in der Schublade. War mein erster µC und
den behalte ich aus Nostalgie - für neue Projekte wäre er mir zu schade
;-)
Den PIC16F84A habe ich mir nicht selber ausgesucht. Er wird hier für die
Projekte der Azubis und Studis gerne genutzt, warum kann mir aber auch
keiner erklären :D
Ja, ich benutze den Compiler XC8.
Ich habe jetzt tatsächlich nach langer langer google Suche (und etlichen
Anzeigen von Banken in meiner Nähe die wollen das ich dort hin wechsle)
auch noch eine Definition für das SET_BIT und das CLEAR_BIT gefunden/mir
passend umschreiben können.
Was mich aber noch wundert ist die Aussage von Witkatz.
TRISBbits.TRISB0 = 0;
habe ich bei meinen Recherchen auch an einigen Stellen gefunden,
allerdings hat er mir TRISBits und auch TRISB0 als nicht erkannt
unterkreidet.
Auch wenn es für das eigentliche Projekt jetzt nicht mehr relevant ist
würde mich einmal interessieren (falls einer von euch da eine Vermutung
hat) woran das liegen könnte.
Auf jeden Fall danke ich euch ganz herzlich für eure Antworten und
Hilfestellungen!
Jetzt muss ich ihm nurnoch beibringen welche Werte er mit welchen LEDs
verknüfen soll.
Liebe Grüße,
Nanshaid
Nanshaid schrieb:> allerdings hat er mir TRISBits und auch TRISB0 als nicht erkannt> unterkreidet.
- PIC16F84A als Device in den Projekt-Properties ausgewählt?
- xc.h eingebunden?
hier ein Blinkbeispiel:
@Witkatz
Ja tatsächlich habe ich beides getan.
Wirklich haben will er es trotzdem nicht.
Etwas ärgerlich, dann hätte ich mir eine Menge Sucharbeit schenken
können, aber das bildet ja auch.
Dadurch dass das gesamte Projekt mich programmiertechnisch in viel
Neuland einführt hangle ich mich quasi von Problem zu Problem.
Jetzt bin ich am Nachdenken wie genau ich den prescaler anpasse (und am
nachlesen wie genau ich das tue, also die Belegung ist klar, aber wie
ich das ins Programm integriere) und am ausrechnen wie lang die
Zeitdauer der Messung sein sollte, da ich nur Werte zwischen 4 und 7
Mykrosekunden auswerten muss.
Und dann muss ich noch rausfinden wie ich das alles hübsch und geordnet
in mein Programm bekomme.
Man merkt glaube ich sehr, dass ich auf dem Gebiet wirklich ein Neuling
bin. Andererseits habe ich dadurch auch schon verdammt viel gelernt und
verstanden was in den Vorlesungen nie so wirklich rüber gekommen ist.
Meine Kollegen stehen schon alle hier und gucken Bahnhof.
Also falls mir jemand ein paar Tipps geben möchte bin ich nicht
abgeneigt.
Aktuell arbeite ich mich durch sprout.de
Nanshaid schrieb:> Wirklich haben will er es trotzdem nicht.
Lässt sich das Projekt nicht übersetzen?
Manchmal werden in MPLAB die Symbole unterstrichen, das Projekt lässt
sich aber trotzdem übersetzen - ist ein leidiges Thema in MPLAB.
Ob sich das übersetzen lässt habe ich bisher noch garnicht ausprobiert
wenn ich ehrlich bin. Ich dachte wenn er den Fehler anstreicht geht das
auch garnicht. Muss ich in ner ruhigen Minute mal ausprobieren.
Nanshaid schrieb:> TRISBbits.TRISB0 = 0;>> habe ich bei meinen Recherchen auch an einigen Stellen gefunden,> allerdings hat er mir TRISBits und auch TRISB0 als nicht erkannt> unterkreidet.
Hallo,
hast Du die Bezeichner denn auch richtig geschrieben?
TRISBbits ≠ TRISBits
Diese Bezeichner werden durch die Include-Datei ja vorgegeben und müssen
natürlich auch exakt so geschrieben werden. Der Compiler kennt diese
Namen ja nicht von sich aus.
Frank
Hallo Frank
Ja in der Datei habe ich sie richtig geschrieben, zur Kontrolle sogar
noch einmal hier hinaus kopiert. Hier im Forum habe ich dann doch einen
Schreibfehler eingebaut.
Schande auf mein Haupt.
Ich habe jetzt durch einen hilfreichen Arbeitskollegen sogar zwei
Lösungsansätze dafür, die ich für eventuelle google-Nutzer mit selbem
Problem einmal aufschreiben mag.
Achja, die Kommentarzeilen bitte nicht beachten. Die sind noch aus dem
Original und von mir nicht überarbeitet.
Eigentlich müsste es heißen
// Wechsel zu Bank 1
// Setze Prescaler auf das Verhältnis 1:64
// Setze RB0 als Eingang
// Wechsel zu Bank 0
soweit ich das richtig verstanden habe.
Für Verbesserungsvorschläge bin ich aber offen :)
Nanshaid schrieb:> #define opt_reg 0x81
C ist casesensitiv. Wenn du OPTION_REG im Quelltext verwendest, kannst
du #define opt_reg weglassen. OPTION_REG ist bereits in einer
Headerdatei definiert. Mit STRG + Klick auf OPTION_REG wird(sollte) die
Headerdatei geöffnet.
Auch die manuellen Bankumschaltungen mit SET_BIT und CLR_BIT kannst du
in C weglassen. Die Bankumschaltungen fügt der XC8 sowieso in dem
compilierten Code ein, du brauchst dich in C nicht selbst drum zu
kümmern.
Der Wechsel zu Bank 1 geschieht in C automatisch durch Zugriff auf einen
Register in Bank 1. Du kannst dir das nach Übersetzen in dem ASM Listing
anschauen, dass der Compiler vor dem Zugriff auf STATUS Register ein BSF
STATUS, 0x5 einbaut. Mit dem zusätzlichen SET_BIT ist es doppelt
gemoppelt ;-)
Welche MPLAB X und XC8 Versionen verwendest du?
Noch was
Klaus schrieb:> Schon mal hiermit probiert:>> ww1.microchip.com/downloads/en/DeviceDoc/50002053F.pdf
Und noch
ww1.microchip.com/downloads/en/DeviceDoc/50002027D.pdf
+ ww1.microchip.com/downloads/en/DeviceDoc/35007C.pdf
+ Vorlesungsmitschrift, Arbeitsblätter u.u.u. ...
Mehr brauchen die Jungs nicht - ausser vielleicht Motivation, sich mit
der Doku und mit dem Unterrichtsstoff zu befassen. Sonst artet es kurz
vor Semesterende aus in
Nanshaid schrieb:> langer langer google Suche
und hirnloses Zusammenschustern irgendwelcher irgendwo gefundenen
Codeschnipsel...