Forum: Mikrocontroller und Digitale Elektronik µC PIC18F45K22


von Da Mo (Gast)


Lesenswert?

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

von chick (Gast)


Lesenswert?

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.

von Da Mo (Gast)


Lesenswert?

Meine Aufgabenstellung ist mit jedem µC umsetzbar, aber ich lerne auf 
einem PIC18F45K22.

Welches Tutorial?

von chick (Gast)


Lesenswert?

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.

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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.

von Da Mo (Gast)


Lesenswert?

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!?

von Kein Name (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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.

von Master S. (snowman)


Lesenswert?


von Da Mo (Gast)


Lesenswert?

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

von Master S. (snowman)


Lesenswert?

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.

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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

von Erich (Gast)


Lesenswert?

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

von EGS_TI (Gast)


Lesenswert?

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.

von Re M. (Gast)


Lesenswert?

"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

von Da Mo (Gast)


Lesenswert?

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

von Re M. (Gast)


Lesenswert?

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

von Da Mo (Gast)


Lesenswert?

@re m.

Vielen DANK!!!

Ist die Schreibweise beim setzen der Bits der verschiedenen Register vom 
verwendeten Compiler abhängig?

von chick (Gast)


Lesenswert?

Kann varieren. Schau einfach ins Handbuch des Compilers. Da steht drin 
wie es funktioniert.

von Re M. (Gast)


Lesenswert?

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

von Der Rächer der Transistormorde (Gast)


Lesenswert?

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

von Re M. (Gast)


Lesenswert?

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

von Lästermaul (Gast)


Lesenswert?

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?

von PICuser (Gast)


Lesenswert?

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

von Lästermaul (Gast)


Lesenswert?

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

von Re M. (Gast)


Lesenswert?

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!

von Axel F. (pfennig)


Lesenswert?

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

von Meister E. (edson)


Lesenswert?


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.