Hallo,
im Rahmen einiger Bastelideen bin ich, als totales Greenhorn, auf
Microcontroller gestoßen. In diesem Falle die PICs.
Ich habe mich schon auf "sprut.de" eingelesen und die grundzüge
verstanden.
Jedoch hänge ich im Moment an ein, zwei Stellen.
wenn ich das richtig aufgefasst habe, besteht ein PIC:
1. aus einem Prozessor, der sie Rechenvorgänge bewältigt
2. aus einem Programmspeicher, in den man das Programm brennt.
3. aus dem RAM/Arbeitsspeicher, indem man Daten zwischenspeichern kann.
4. aus den Ports bzw Pins, als Ein- und Ausgänge.
Der RAM ist mehrere Bytes groß, die jeweils aus 8 Bits bestehen, welche
die berühmten Einsen und Nullen darstellen.
Je nach der Bedeutung eines Bits, kann ein Bit eine Einstellung
bedeuten( Pin = Eingang/Ausgang) oder als Teil eines Bytes einen
Zahlenwert ergeben.
Nun wir in der Erläuterung auf "www.sprut.de" von Bänken gesprochen,
womit ich nichts anzufangen weiß.
Kann mir einer erklären, was Bänke sind, als auch ob meine Ausführung
stimmen oder ob ich grundlegende Fehler in meinem Verständnis habe.
MfG Torben
Aus vollkommen bescheuerten historischen Gründen
kann der PIC nicht auf alle Speicherstellen ohne
Umschaltung zugreifen.
Obwohl z.B. der PIC16F84 7 bit für die RAM-Adresse
in seinen Befehlsfeldern frei hält, also 128
Möglichkeiten hat, und nur 68 bytes RAM beinhaltet,
also der Adressbreich locker ausreichen würde,
hat Microchip ihn in 2 Bereiche
aufgeteilt, und man muss ihm, durch ein entsprechendes
bit RP0 im Register STATUS, vorher sagen, in welchen
bank (Bereich) diese 7 bit Adresse zugreift.
z.B. haben TMR0 und OPTION_REG dieselbe Adresse 1,
aber einer liegt in Bank 0 der andere in Bank 1,
und PORTA und TRISA teilen sich Platz 5 und
PORTB und TRISB Platz 6 und EEDATA und EECON1
Platz 8 und EEADR und EECON2 Platz 9. Stimmte
vor dem Zugriff das bit RP0 in STATUS nicht, greift
der Prozessor einfach auf die falsche Speicherstelle
zu.
Glücklicherweise liegt der eigentliche RAM Bereich
von 12 bis 79 ohne Unterteilung in 2 Banks (Bereiche)
drin.
Weil das so krank ist, nutzen viele Leute lieber die
AVR Prozessoren von Atmel, als die uralten PIC von
Microchip.
MaWin schrieb:> Weil das so krank ist, nutzen viele Leute lieber die> AVR Prozessoren von Atmel, als die uralten PIC von> Microchip.
Die Betonung liegt auf "uralt"... es gibt eine grosse Auswahl an PICs,
auch ohne das lästige Bankswitching.
Der 16F84 ist ein schlechtes Beispiel, weil total veraltet.
Mich störts eh nicht, weil der C-Compiler mir diese lästige Mühe
abnimmt.
Einen RISC-uC in Assembler zu programmieren ist Masochismus.
Passt in den PIC16F84 mehr als ein main() { while(1) { } } ?
Nur, wer uC in Assembler programmiert, merkt, wie viel Code ein Compiler
erzeugen müsste, und wie wenig für den 1k ist.
MaWin schrieb:> Nur, wer uC in Assembler programmiert, merkt, wie viel Code ein Compiler> erzeugen müsste, und wie wenig für den 1k ist.
Nö, nur wer kein Assembler lesen kann, für den ist 1kB wenig.
Man muß eben nur nicht für sämtliche Variablen double nehmen, sondern
das gerade sinnvolle Format (oftmals reicht uint8_t), dann kann man auch
effektiv programmieren. Und auch keinen seitenlangen Spaghetticode,
sondern sinnvoll in Funktionen und Schleifen unterteilen.
Wer das Assemblerlisting des Compilers lesen und daraus
Schlußfolgerungen ziehen kann, für den sind 1kB ne Menge.
Peter
@ Torben: zurück zu deinem thema/fragen: das mit RAM, ROM etc. hast du
richtig verstanden. was du noch vergsessen hast. ist, dass sich
mikrokontroller durch praktische hardware-module kennzeichnen:
beispielsweise anstatt für eine RS232 (serielle PC-schnittstelle) im
programm die pins zeitrichtig zu toggeln, gibt's darfür ein modul, in
das du den zu übertragenden wert schreibst und sagst 'los, jetzt senden'
und sich dann dieses modul selbstständig um die übertragung kümmert -
dir also viel aufwand abnimmt. beispiele für solche module sind I2C,
RS232, Timer etc.
wenn du neu bei den PICs bist, vergiss die 16er-reihe!!! wie oben
beschrieben und immer wieder schlecht gemacht wird: die haben
verschiedene bänke, zwischen denen umgeschlatet werden muss - resp. um
die du dich beim assembleren oder der compiler, wenn du in C
programmierst, kümmern musst.
die PIC18 sind ideal: einfach und nicht zu überladen. die PIC24 sind
schneller und haben mehr solche hardware-module, sind aber ein bisschen
komplizierter.
sprut.de ist genial um die funktionsweise und die hardware der PICs
kennen zu lernen - und falls du willst in assembler zu programmieren.
für einen ersten und schnellen erfolg (und somit spass) empfehle ich dir
wärmstens mit PIC18 und MPLAB + C18 zu beginnen!
viel spass!
@Ich: dieser "ratschlag" musste wohl kommen!? bitte, mach dafür einen
eigenen 1001-ten thread auf, ja?! ..PICs und AVRs sind ebenbürdig: für
beide familien gibt es sowohl alte bekannte uC oder aber moderne
exemplare mit viel leistung (die 1000 threads in diesem forum, die das
behandlen, vergleich oft alte PICs mit neuen AVRs - naja..). die einen
mögen lieber die entwicklungsumgebung für AVRs, die anderen MPLAB für
PICs - ich konnte/musste mit beiden arbeiten und bin bei PICs geblieben
(MPLAB ist wirklich angenehm), andere sind bei AVR geblieben.
wenn du dich bereits bei den PICs eingelesen hast, bleib bei denen. wenn
du später verstehst wie uC funktionieren und die AVRs gegen die PICs
abschätzen kannst und die AVRs besser findest, kannst du immer noch
wechseln, aber zu beginn würde ich dir empfehlen auf eine familie zu
setzen.
Schau mal auf der Seite von microchip nach und les
die z.B. den User´s Guide zum PICKit3 durch.
(in Englisch)
Evtl. besorgst du dir auch gleich das PICKit3 mit Demoboard (PICKit3
Debug Express).
http://www.microchipdirect.com/productsearch.aspx?Keywords=DV164131
(Als Student/Schüler gibt es Rabatte)
Eine weitere Möglichkeit ist dir PIC´s am Besten den PIC 18F4550
kostenlos von Microchip schicken zu lassen und dir ein Board von einem
Drittanbieter zu besorgen + PICKit3 ohne Zubehör.
Ich hab z.B. das P40 von olimex.
Oder du holst gleich alles bei wem anders z.B. mikroe.com
> am Besten den PIC 18F4550
der ist wirklich gut, um die ersten schritte zu machen und wird lange
hinhalten (hat viel drin)
ja, ein PICkit3 in der eBucht kaufen oder ein ICD2-Clone selber
nachbauen, ist sehr ratsam und günstig.
dann noch MPLAB und C18* gratis runterladen
http://www.microchip.com/MPLABhttp://www.microchip.com/C18
dann ein demo-board kaufen (mit taster, ein paar LEDs und einem 2x16 LCD
- mehr braucht's am anfang nicht) oder vorerst mal auf einem steckbrett
(geht auch ganz gut) das aufbauen, was man gerade braucht.
* die sog. "student"-version ist freeware und schaltet nach 60 tagen ein
paar code-optimierungen ab, die für hobby- und studium zu selten
gebraucht werden, als dass es darauf ankommt.
@ alle
Erst einmal danke für die vielen und schnellen Antworten.
Ich werde auch erst mal bei den PICs bleiben, vorallem weil ich mir
schon den auf sprut.de vorgestellten Brenner8 nachgebaut habe.
Eure Antworten haben mir sehr weitergeholfen und ich seh solangsam recht
klar, was den Microcontroller angeht.
Nur woran erkenne ich, ob ein PIC die Bank-Unterteilung hat oder auch
nicht?
MfG Torben
Hi,
steht im Datenblatt, dort taucht des dann bei der Registerbeschriebung
auf. Die Tabelle mit den Registern hatt dann mehrere Spalten mit den
Registern und oben stehen die Status-Bits, links die Adressen.
Gruß simon
servus,
die pic18'er Reihe hat des bankswitching nicht mehr!
zu meinen Erfahrungen:
ich habe angefangen mit pic16f628! Habe mir bewußt nur Controller der
16'er
Reihe bis 2 Kbyte rom geholt weil darüber B.-switching von Nöten ist!
Bin danach tu Pic18f2550 weil 12 Mips und relativ leicht zu programmiern
und konnte die bei 15 mips anstatt 12 mips laufen lassen. die lf-Tyen
haben 16 Mips.
Da ich aber mehr Rechenleistung brauchte, bin ich jetzt bei den Pic24hj
Typen gelandet!
Die sind ein wenig kommplizierter zu handhaben, sind dafür aber sehr
schnell und das bei 16 Bit Breite, haben also 40 Mips!
Ich bin Assemblerprogrammierer weil ich die Rechenleistung effektiv
nutzen möchte.
mein Fazit ist:
Die Pic18'er ist zwar etwas langsamer als die 8-Bit AVR's (4 Mips), sind
aber viel leicher zu beherrschen.
Die Pic24HJ sind der Hammer, denn sehr starke 16-Bitter ,denn 40 Mips
bei 16 Bit.
viel Spaß beim proggen
Maik Werner schrieb:> die pic18'er Reihe hat des bankswitching nicht mehr!> zu meinen Erfahrungen:
Das ist so nicht ganz richtig. Auch die 18F haben immer noch RAM-Banke
(bis zu 16 Stück mit jeweils 256 Bytes) welche über das BSR-Register
ausgewählt werden können. Bei den 18F wurden in Bezug auf den RAM auch
noch andere Dinge geändert. So liegen jetzt die SFR-Register (also die
Steuerregister) in Bank 15 auf den Adrssen 0x60 - 0xFF. Zusätzlich gibt
es eine Art "virtuelle" Bank, die Access-Bank. In der Access-Bank werden
die Bytes 0x00 bis 0x5F aus Bank0 mit den SFR-Registern in eine Bank
gelegt. In jedem Befehl, der auf den RAM zugreifst kann man nun angeben,
ob man Zugriff auf die Access-Bank haben will oder auf die Bank, auf
welche das BSR-Register zeigt. Dadurch entfällt quasi das Bankswitching
bei den SFR-Registern, da man im Befehl einfach angibt die Access-Bank
zu benutzen. Seine eigenen Daten legt man dann einfach in z.Bsp Bank 1
und stellt das BSR auch auf Bank 1. Nun kann man einfach im Befehl
zwischen den eigenen Daten und den SFRs umschalten. Benötigt man mehr
wie 256 Bytes muss man allerdings wieder umswitchen...
Schönes WM Spiel heute
Sven
stepp64 schrieb:> Maik Werner schrieb:>> die pic18'er Reihe hat des bankswitching nicht mehr!>> zu meinen Erfahrungen:>> .... Benötigt man mehr wie 256 Bytes muss man allerdings wieder> umswitchen...
oder man benutzt zur Adressierung einen der 3 fsr Pointer, die können
den kompletten RAM Bereich ansprechen incl. so nützlicher Sachen wie
z.B. autoincrement oder decrement.