www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer für PIC18F4550


Autor: Acre Acre (acre)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich muss einen Clock (1MHz) erzeugen der an einem PortPin des PIC18F4550 
ausgegeben wird, bei jeder steigenden Clockflanke soll ein Interrupt 
ausgelöst werden. Das Board wird mit 48 MHz betrieben.

Welchen Timer brauche ich (es gibt ja T0, T1, T2 und T3)bzw. gibt es 
irgendeinen Beispielcode oder kann mir irgendwer grob die notwendigen 
Befehle die ich setzen muss erklären?

Autor: snowman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kannst ein PWM generieren mit 1MHz (50% duty-cycle), dann brauchst du 
keinen interrupt (sparst rechenleistung). ich glaube für PWM ist der T2 
zuständig (ev. kann dein PIC auch 2 PWMs machen), bin aber nicht sicher; 
guck mal im datenblatt unter CCP nach. -> von Microchip gibts auch ein 
PDF, in dem alle diese funtkionen vorprogrammiert sind, dann musst du 
sie nur noch konfigurieren...

du kannst natürlich auch eine interrupt-routine schreiben, für einen 
überlauf eines timers (egal welchen) und die interrupt-routine toggelt 
dir ein pin

Autor: snowman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich meinte: ...PDF, in dem alle vorprogrammierten funtionen beschrieben 
sind.

Autor: Acre Acre (acre)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> du kannst natürlich auch eine interrupt-routine schreiben, für einen
> überlauf eines timers (egal welchen) und die interrupt-routine toggelt
> dir ein pin

Genau das habe ich vor allerdings überhaupt keinen Plan wie ich das 
machen soll.

Autor: Castlerock (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In einem Interupt kann mann keine 1MHz frequenz erzeugen!  Du hast 
gerade mal zeit 6 Befehle (500ns) auszuführen bevor du es wieder toggeln 
muss! und um in einer ISR zu gelangen braucht man mehr als 6 Befehle.

Es würde nur gehen als PWM ausgang (CCP module). Da ist es möglich eine 
1MHz / 50% signal zu erzeugen ohne jeglicher Software overhead.

Warum muss bei jeder Flanke ein interupt ausgelöst sein?

Autor: snowman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es gibt zwei möglichkeiten ein pin zu toggeln:
1. PWM
2. zähler mit interrupt: jeder zähler kann so konfigureiert werden, dass 
er einen interrupt auslöst, wenn er vom max. zählerstand wieder auf '0' 
zurückfällt. jeder zähler kann mit einem (start-)wert beschrieben 
werden. bsp. nehmen wir an, du hast einen zähler, der bis 255 zählt und 
du startest ihn mit 205. also hat dieser nach 50 "tackten" 255 und lösst 
dann einen interrupt aus. in diesem interrupt, setzt du den zähler 
wieder auf 205 und toggelst den pin. btw: musst halt gucken, wie du den 
zähler konfigurierst etc.

Autor: snowman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ps: zu dem, was ich zum interrupt oben geschrieben habe: das geht 
natürlich nur bis ein paar kHz - denn wie bereits erwähnt, hätte man bei 
1MHz (offenbar) nur 6 befehle zur verfügung

Autor: Acre Acre (acre)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Castlerock

Ich habe 16Bit die ich bei jeder steigenden Clockflanke um ein Bit 
weitershiften muss, d.h. bei jeder steigenden Flanke geht ein Bit aus 
dem PIC raus.

Gibt es zum PWM irgendwelche Beispiele, ich kann man einfach nix 
darunter vorstellen wie ich das machen soll.

Autor: Castlerock (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du bist wirklich an der Grenze mit einem PIC18 wenn mann 1MHz clock und 
data nur über software routine einen Pin toggeln will.  Vieleicht 
solltest du mal die dsPICs untersuchen (die können bis 30MIPS, also 3x 
schneller).

Was du vor hast hört sich an wie SPI.  vieleicht lässt sich sowas 
realizieren.  Clock out mit PWM, data out mit SPI module.  oder nür über 
denn SPI module (MSSP) machen (der kann 10Mbps).

für PWM beispiele kenn nicht all so viel, aber schau mal nach bei 
Microchip>App.Notes ; AN594, AN564, AN539.

Autor: snowman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, sag mal, was du möchtest ...deine worte von bit raus-shiften tönt 
schwer nach SPI, dann kannst du dir das ganze PWM- und interrupt-zeug 
vergessen, das geht viel einfacher dann mit SPI. -> was möchtest du 
schlussendlich machen?

Autor: Acre Acre (acre)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank erstmal für die Hilfe, habe heute nochmals nachgefragt und 
dabei ist herausgekommen, dass es überhaupt nit notwendig ist mit 1MHz 
zu arbeiten und ich keine Zeitvorgaben habe, bis etwas anliegen muss. 
D.h. ich kann auch einen Timer verwenden der beim Überlauf einen 
Interrupt auslöst und mir meinen PortPin zwischen 0 und 1 schaltet.

Autor: snowman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, wie du meinst. aber wenn du eine elegante lösung möchtest, sind 
wir hier gerne bereit dafür eine lösung zu finden. es macht z.b. keinen 
sinn ein byte via interruptroutine aus einem portpin rauszuschicken, 
wenn es dafür eine fertige hardware im PIC gibt...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.