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.
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.
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.
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
unsignedcounter;
2
3
voidinterrupt()
4
{
5
if(TMR0IF_bit)
6
{
7
counter++;
8
TMR0IF_bit=0;
9
TMR0L=0;
10
}
11
}
12
13
voidmain()
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 :)
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