Guten Tag, wer kennt sich mit dem µC PIC18F45K22 aus? http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en546239 Ich möchte mit Hilfe von Interrupts ein Blinklicht umsetzen? Mit dem Manual komme ich nicht weiter, da mir das grundlegende Verständnis für die Begriffe/Verwendung von Oscillator, Timer, Clock, ... fehlt? Vielleicht hat jemand von euch die Gedult, um mit mir Schritt für Schritt die Aufgabenstellung zu erarbeiten. 1. Oscillator-Einstellungen 2. Interrupts-Einstellungen 3. ??? Vielen DANK!!!
Deine Aufgabenstellung ist wohl mit jedem Cotroller umsetzbar. Lies einfach das Tutorial, da wird Dir geholfen, die erwähnten Begriffe zu klären. Das sich jemand die Mühe macht Dir einen "Einzelunterricht" zu erteilen, daß erwartest Du sicher nicht. Wenn Du das Tutorial durch hast, dann noch Fragen offen sind, dann meld Dich wieder.
Meine Aufgabenstellung ist mit jedem µC umsetzbar, aber ich lerne auf einem PIC18F45K22. Welches Tutorial?
Linke Spalte: Artikelübersicht. Ob PIC oder AVR oder sonst ein Controller ist bei den Grundlagen zeimlich wurscht. Auf einem PICirgendwas lernen ist blöd, lern die Grundlagen und wende sie an, auch auf dem PICirgendwas.
Do Ma schrieb: > Mit dem Manual komme ich nicht weiter, da mir das grundlegende > Verständnis für die Begriffe/Verwendung von Oscillator, Timer, Clock, > ... fehlt? Da werden Sie geholfen http://sprut.de/electronic/pic/grund/grund.htm
Warum schaust du nicht in die Hilfe von deinem Compiler nach wie es geht ? Das Beispiel wird zwar nicht für deinen µC sein, aber dazu gibt es ein Datenblatt, wo du dann die Änderungen nachsehen kannst.
Bevor ich beginne zu programmieren, muss ich doch die nötigen bits in den Registern setzen!? - Der zu verwendente Oscillator - Interrupts - ... Dies werde ich nicht in der Hilfe des Compilers finden!?
> Dies werde ich nicht in der Hilfe des Compilers finden!?
Im Prinzip schon.
Erstmal wie vom Rächer empfohlen die Sprut Seiten durcharbeiten. Danach
versteht man die detaillierten Angaben im Datenblatt und
Compiler-Handbuch.
Oscillator wird in den Fuse eingestellt. Also im Compiler und nicht im Programm. Geht natürlich auch im Programm. Welche Bits gesetzt werden müßen, steht im Datenblatt. Wie der Interrupt Programmiert wird steht in der Hilfe. Sonst auch Datenblatt.
PIC-Tutorial: http://pic-projekte.de/wiki/index.php?title=PIC_Tutorial und http://pic-projekte.de/wiki/index.php?title=PIC_C_Tutorial
Ich finde eure Hilfeversuche total nett aber ich komme damit einfach nicht weiter. Mir würde eine Analyse von folgendem Demoprogramm viel mehr helfen. Wer kann mir Schritt für Schritt die Zeilen in diesem Programm erklären (warum verwende ich welche "Befehle")?
1 | unsigned counter; |
2 | |
3 | void interrupt() |
4 | {
|
5 | if (TMR0IF_bit) |
6 | {
|
7 | counter++; |
8 | TMR0IF_bit = 0; |
9 | TMR0L = 0; |
10 | }
|
11 | }
|
12 | |
13 | void main() |
14 | {
|
15 | ANSELB = 0; |
16 | TRISB = 0x00; |
17 | LATB = 0xFF; |
18 | |
19 | TMR0L = 0; |
20 | T0CON = 0xC7; |
21 | GIE_bit = 1; |
22 | TMR0IE_bit = 1; |
23 | counter = 0; |
24 | |
25 | do
|
26 | {
|
27 | if (counter >= 10) |
28 | {
|
29 | LATB = ~PORTB; |
30 | counter = 0; |
31 | }
|
32 | } while(1); |
33 | }
|
Warum rufe ich die Funktion interrupt() in der main-Funktion nicht auf? Zur Info: µC --> PIC18F45K22 Compiler ---> MikroC Pro for PIC
sorry, auch wenn es (für dich) hart klingt: aber das wird dir wohl niemand zeile für zeile erklären. wie bereits gesagt: wieso soll man für dich hierher copy-paste machen mit zeilen aus einem tutorial? eben! ...weisst du, selbst wenn du jetzt einen idioten findest, der/die das tatsächlich macht, stehst du in einem tag einfach am nächsten problem an, das in einem tutorial erklärt wird. und dann das nächste und das nächste usw. wie lange hast du vor auf diese weise das nötige wissen zu bekommen? tutorials haben die eigenschaft, dass sie dir das wichtigste (nicht alles, aber das wichtigste) auf den weg geben, um deine ersten programme zu erstellen. und btw: dein code oben ist wirklich sehr einfach zu verstehen nach einem tutorial. so, ich habe fertig; ich melde mich aus diesem thread ab. bye.
Do Ma schrieb: > Warum rufe ich die Funktion interrupt() in der main-Funktion nicht auf? Das ist eine konkrete Frage für die es auch eine sinnvolle Antwort gibt. Die Funktion wird nicht aufgerufen da ein Interrupt durch ein Hardware Ereignis ausgelöst wird. (Timer voll, Port Pin toggelt Daten angekommen usw) Der Controller arbeitet dann einfach die Funktion ab und macht anschließend da weiter wo er unterbrochen wurde. Do Ma schrieb: > Wer kann mir Schritt für Schritt die Zeilen in diesem > Programm erklären (warum verwende ich welche "Befehle")? Zeit kauft Geld, wenn du keine Zeit hast das selbst nachzuschlagen dann her damit ;-)
In den USA gibt es solche Dinge als Dienstleistung per Internet. Schauste mal hier: https://www.elance.com/s/sgttech/job-history/?t=1 Beispiel / Aufgabe 1 : Need Sensor Output Converter Circuit "I have a sensor whose output will vary from 2.188V to 2.812V and I need a circuit that converts this output to 1 to 4 V output. " Diese Berechnung der Beschaltung eines OPA hat $65 gekostet, der Auftraggeber was sehr zufrieden. Preiswert, da keine Software dabei. Beispiel / Aufgabe 2 : Design an LED circuit for manufacture "Function: blue LED light lights up for 30 seconds every 15-20 minutes light LED light also lights up for 30 seconds if unit is inverted ..." (+ weitere Details zum Aufbau und maximalen Kosten), problemlos. Diese Aufgabe mit SW hat $825 gekostet und der Aufraggeber war ebenfalls sehr zufrieden mit der Leistung von Steve. So denke ich: A) Was vergleichbares fehlt hier in Deutschland --oder kennt das jemand ? B) Deine Lernkurve hochzubringen wird bei Intersivbetreuung nicht billig, wird man wohl nach Stundensatz abrechnnen müssen. Denn wie bei der Fahrschule weiss man ja nicht, wie sich der Schüler anstellt. Einer braucht 10, ein anderer vielleicht 40 Stunden... so 1-4 kEuro wirste wohl investieren müssen, Minimum. Gruss
Also ich empfehle dir mal folgende weitere Vorgehensweise. 1. Die µC-Grundlagen studieren. Bspw. auf der Seite "sprut.de" -> Dann erledigen sich solche Fragen wie nach der Interruptroutine von selbst. 2. Die C-Programmiersprache studieren. 3. Programmablaufplan für deine Aufgabenstellung erstellen. 4. Voraussetzungen deiner Hardware mit den Anforderungen der Problemstellung vergleichen 5. Datenblatt für den PIC runterladen. Gucken, wie du die Anforderungen mit deinen Voraussetzungen umsetzen kannst. 6. User Guide zum verwendeten Compiler runterladen. 7. C-Programm erstellen. Hierbei auf Besonderheiten des Compilers achten. User Guide durchforsten. Beispiele suchen und umsetzen.
"Warum rufe ich die Funktion interrupt() in der main-Funktion nicht auf?" Dieser Satz zeigt, dass du ganz neu in der uC Programmierung bist. Und ja aller Anfang ist schwer, aber jeder von uns hier hat das geschafft ;) Dein wichtigstes Hilfsmittel ist das Datenblatt. Um den von dir geposteten Quelltext zu verstehen, kannst du das pdf-file nach den einzelnen Bits zum Beispiel "GIE" durchsuchen. Ich finde bei den PICs ist das immer sehr schön erklärt. Dadurch erklärt sich für dich hoffentlich, welches Bit wann und warum gesetzt wurde. Allerdings wenn du wirklich noch überhaupt nicht vertraut mit uCs bist, solltest du mit (noch) kleineren Sachen anfangen. Warum muss die LED denn direkt blinken. Lass sie erstmal nur leuchten. Guck dir an wie die Hardware dafür initialisiert werden muss. Wenn man mit der Hardware nicht vertraut ist kann das schon schwierig sein :D ich helfe aber gerne auch weiter liebe grüße
@re m. Vorerst vielen DANK für deine netten Worte. :-) Die direkte Ansteuerung von LED's (Dauerlicht, Lauflicht) mit Schleifen habe ich schon verstanden. Mein nächster Schritt ist die Verwendung von Unterrupts (z.B. für ein Lauflicht oder ein blinkendes LED).
okay, dann eine kurze beschreibung zu (timer-)interrupts, falls du es nicht schon selber in erfahrung gebracht hast (kann sein dass nicht alles fachlich korrekt ist, aber so sollte man es verstehen ;)) ein interrupt ist eine funktion, die ausgeführt wird, wenn ein bestimmtes ereignis eintrifft, zum beispiel wenn an einem PIN ein High-Pegel anliegt oder wie in deinem Fall, wenn das Timer-Register überläuft. also der timer zählt ein register hoch, und sobald das register (bei 8-bit uCs) bei 255 angekommen ist und wieder bei 0 anfängt, gibt es einen Overflow (Überlauf). Wenn man das passende Interrupt aktiviert und an die richtige Stelle die auszuführende Funktion (beispielsweise LED ein- bzw ausschalten) schreibt, wird diese ausgeführt sobald das Ereignis eintrifft in der ISR(interrupt service routine) der blinkenden LED müsste dann stehen LED ein bzw LED aus, immer abwechselnd ebenfalls musst du in der ISR ein flag löschen, das gesetzt wurde wenn ein overflow auftrat. dies musst du machen, damit der interrupt beim nächsten overflow wieder auftritt damit interrupts funktionieren musst du mit GIE die globalen Interrupts einschalten jetzt noch zur frage, WO du die interrupt funktion normalerweise hinschreiben musst. da gibt es spezielle einsprungvektoren (steht auch im datenblatt), an die stelle gehört die funktion der teil fehlt in deinem beispiel übrigens, der wird irgendwo in dem restlichen quellcode aber drin stecken. wie du das genau programmieren kannst findest du wahrscheinlich in dem Manual zu deinem Compiler. Da ich mich mit dem Compiler aber nicht auskenne, kann ich dazu nichts weiter sagen ich hoffe, ich konnte dir ein wenig helfen :)
@re m. Vielen DANK!!! Ist die Schreibweise beim setzen der Bits der verschiedenen Register vom verwendeten Compiler abhängig?
Kann varieren. Schau einfach ins Handbuch des Compilers. Da steht drin wie es funktioniert.
jo wie chick sagt kann das variieren, aber es ist immer ähnlich, unterschiedlich ist eigentlich nur, wie die register und bits definiert sind, aber so wie ich das seh, ist das genau gleich wie bei meinem compiler falls du den befehl nicht verstehst "LATB = ~PORTB;", der invertiert einfach nur die Pegel an deinen Ausgabepins. also das ist dein licht ein und aus. ich weiß leider nicht genau wo der unteschied zwischen LATB und PORTB liegt, ich hab meist PICs gehabt die nur die Rrgister PORTB hatten. Ist ungefähr das selbe glaub ich "PORTB=~PORTB" würde sicher zum gleichen Ergebnis führen. Ist aber nicht ordentlich programmiert dann und könnte zu fehlern führen
re m. schrieb: > Ist ungefähr das selbe glaub ich "PORTB=~PORTB" würde sicher zum > gleichen Ergebnis führen. Nun hat sich Sprut so eine Mühe gegeben das einfach und verständlich darzustellen http://www.sprut.de/electronic/pic/c/pic_c/pic_c90_pic_spezifisches.html und dann liest das wieder keiner. Vielleicht solltet ihr lieber Politiker werden ;-).
ich hatte das schonmal gelesen, aber wieder vergessen, da ich meist die weniger fortschrittlichen PICs ohne LAT register verwende also zusammengefasst: bei bitmanipulationen besser ins lat register schreiben (port register würde aber auch gehen)!
Hey Leute, Ihr solltet wirklich Politiker werden. Sowohl bei Sprut als auch im Datenblatt steht: Beim schreiben ist egal, ob man PORT oder LAT nimmt. Beim lesen gibt es einen Unterschied. Programmieren ist eher etwas für Leute, die den Grund verstehen. Nicht für Leute, die sich so etwas als alleine stehenden Fakt merken. Es gibt so viele schöne und nützliche Berufe für alle Arten von Fähigkeiten. Warum beschäftigt ihr euch mit Programmierung?
Lästermaul schrieb: > Ihr solltet wirklich Politiker werden. > Sowohl bei Sprut als auch im Datenblatt steht: Beim schreiben ist egal, > ob man PORT oder LAT nimmt. Beim lesen gibt es einen Unterschied. dann müsstest du präsident sein! mann, in der zeit, in der ihr hier das alles gelesen habt, hättet ihr auch -wie bereits gesagt- ein tutorial durchglesen, von der zeit fürs schreiben hier will ich gar nicht erst reden...
>mann, in der zeit, in der ihr hier das alles gelesen habt...
Stimmt. Ist nur leider auch nicht so ideal.
Würden wir nur nur Tutorials durcharbeiten, entwickelten wir uns zu
reinen Fachidioten. Ohne Sinn ohne Überblick. Auch wenn diese Diskussion
sinnlos erscheint - besser als nur den optimalen Weg verfolgen.
Lästermaul schrieb: >Hey Leute, > >Ihr solltet wirklich Politiker werden. > Sowohl bei Sprut als auch im Datenblatt steht: Beim schreiben ist egal, > ob man PORT oder LAT nimmt. Beim lesen gibt es einen Unterschied. > > Programmieren ist eher etwas für Leute, die den Grund verstehen. Nicht > für Leute, die sich so etwas als alleine stehenden Fakt merken. > > Es gibt so viele schöne und nützliche Berufe für alle Arten von > Fähigkeiten. Warum beschäftigt ihr euch mit Programmierung? was ne frechheit von dir. lies selbst: sprut: "Dabei tappt man schnell in die In/Out-Falle, wenn man so eine Bitmanipulation auf ein PORT-Register anwendet. Das kann nicht passieren, wenn man stattdessen die Bitmanipulation mit dem zugehörigen LAT-Register erledigt. Aus diesem Grunde sollten sämtliche Manipulationen von Portpins immer mit Hilfe des LAT-Registers durchgeführt werden. Nur zum Lesen der Pegel von IO-Pins sollte das PORT-Register Verwendung finden." Ich versteh nicht warum hier im Forum immer gleich beleidigt wird!! Man kann seine Sichtweise anständig einbringen!
hmmmm, wie kam es eigentlich zu dieser Diskussion? warum verirre ich mich grad hier? und schreibe auch noch etwas dazu? hmmm...Beitrag "µC PIC18F45K22" die 2. Frage beantworte ich mal als erstes,, danach die 1.Frage Antwort zu Frage 2! weil Sonntag ist und ich meine Zeit an Rechner für reinen Zeitvertreib in Verbindung mit Nützlichen verbringe, ich arbeite grad etwas für meine Arbeit aus und finde in solchen Threads wie diesen ein gewisses Amusement, so das es sich hier geradezu von selbst versteht, das ich hier meinen Senf hinzu tun muss grins Antwort 2. zu Frage 1 der Threadstarter, das kam wohl in Verlauf dieses Threads durch, hat sich einer Aufgabe angenommen, zu einen Thema, von dem er augenscheinlich besser hätte die Finger lassen sollen, auch anbetracht ihm seiner offensichtlich gewordenen Vorbildung ich für meinen Teil kann da einige Schreiber in Bezug dazu verstehen das sie sich in gewisser Weise der Hilfe verweigern!! ich fand auch, das diese Leute sich wirklich sehr höflich dem Threadstarter gegenüber verhalten haben, das nenne ich angenehme Kommunikationskultur ,,,, aber man muss auch klar hervorholen das der Threadstarter offenbar keine Schmerzgrenze kennt, 1. Aufgaben anzunehmen zu denen ihm sämtliche Vorbildung fehlt, 2. er scheint nicht gewillt zu sein, dass nötige Basiswissen über normalen Wege zu erlangen, also fragt er in einen Forum wie ein kleines Kind, solange nach (finde ich sehr unhöflich), bis einige Schreiber aus dem Forum, sich erweichen lassen und es tatsächlich erklären... ich meine, wenn er zum Beispiel aus Hobby sich der Sache animmt, ist es ihm seins, sich in dem Thema einzuarbeiten, aber wer z.B von einen Oszilloskop kein Plan hat, der hat sich auch sonst nicht viel mit Elektronik beschäftigt,, der macht dies nicht aus Hobby! Hier kommt doch die Vermutung auf, das er die Thematik Microchip Programmmierung vollständig unterschätzt hat und an irgendeiner Stelle (z.B. auf der Arbeit) sein Mund zu voll genommen hat und jetzt vor dem Problem steht, Taten folgen lassen zu müssen...... viel Spass wünsche ich da den Threadstarter, p.s. vieleicht liege ich in meinen annahmen vollkommen falsch, wenn dem so ist, so tut es mir leid,,, so und nun wusel ich mal weiter :) und @Do Ma Menschen wachsen an ihren Aufgaben, lese dich doch mal durch die Turorials... aus welchen Grund auch immer du auf yC Programmmierung gekommen bist, wenn es dir spass bereitet und du Sinn darin findest, gebe nicht auf und arbeite dich in das Thema ein edit, wegen "mir viel grad was auf .... da fällt mir doch glatt auf, das der Thread schon ca 2 Wochen alt ist,, sorry dazu grins LG
Wir hatten das Thema auch hier: http://www.fernando-heitor.de/index.php?option=com_jfusion&Itemid=53&jfile=index.php&topic=4695.msg24158#msg24158
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.