Forum: Mikrocontroller und Digitale Elektronik PIC16F84A : Von Bank 0 auf Bank 1 wechseln (MPLab / C)


von Nanshaid (Gast)


Lesenswert?

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

von Witkatz :. (wit)


Lesenswert?

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.

: Bearbeitet durch User
von Jürgen D. (poster)


Lesenswert?

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.

: Bearbeitet durch User
von Witkatz :. (wit)


Lesenswert?

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 
;-)

: Bearbeitet durch User
von Nanshaid (Gast)


Lesenswert?

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

von Witkatz :. (wit)


Lesenswert?

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:
1
#include <xc.h>
2
#define _XTAL_FREQ 4000000
3
4
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
5
#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
6
#pragma config PWRTE = ON       // Power-up Timer Enable bit (Power-up Timer is enabled)
7
#pragma config CP = OFF         // Code Protection bit (Code protection disabled)
8
9
void main(void) {
10
    OPTION_REG = 5;
11
    TRISBbits.TRISB0 = 0;
12
    while (1){
13
        PORTB ^= _PORTB_RB0_MASK;
14
        __delay_ms(250);
15
    }
16
}

: Bearbeitet durch User
von Nanshaid (Gast)


Lesenswert?

@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

von Witkatz :. (wit)


Lesenswert?

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.

von Nanshaid (Gast)


Lesenswert?

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.

von Frank H. (urmelchen)


Lesenswert?

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

von Nanshaid (Gast)


Lesenswert?

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.

1
#define opt_reg     0x81        
2
#define SET_BIT(p,n) ((p) |= (1 << (n)))
3
#define CLR_BIT(p,n) ((p) &= (~(1) << (n)))
4
5
    SET_BIT (STATUS, RP0);              // Wechseln Bank 1
6
    OPTION_REG = 5;                   // Setzt prescaler auf 1:64
7
    SET_BIT (TRISB, 0);               // Setzt RB0 zur Eingabe
8
    CLR_BIT (STATUS, RP0);              // Wechseln Bank 0

oder
1
#define opt_reg     0x81        
2
    RP0 = STATUS;
3
    TRISB = 0;
4
    STATUS = RP0;

von Nanshaid (Gast)


Lesenswert?

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 :)

von Witkatz :. (wit)


Lesenswert?

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
1
TRISB = 0;
 ist nicht gleich zu setzen mit
1
SET_BIT(TRISB, 0);
 wenn nur ein Bit gesetzt werden soll

und
1
RP0 = STATUS;
2
STATUS = RP0;
 ist auch Käse ;-)

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Schon mal hiermit probiert:

ww1.microchip.com/downloads/en/DeviceDoc/50002053F.pdf

MfG Klaus

von Witkatz :. (wit)


Lesenswert?

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

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.