Forum: Mikrocontroller und Digitale Elektronik Timer für PIC18F4550


von Acre A. (acre)


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?

von snowman (Gast)


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

von snowman (Gast)


Lesenswert?

ich meinte: ...PDF, in dem alle vorprogrammierten funtionen beschrieben 
sind.

von Acre A. (acre)


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.

von Castlerock (Gast)


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?

von snowman (Gast)


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.

von snowman (Gast)


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

von Acre A. (acre)


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.

von Castlerock (Gast)


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.

von snowman (Gast)


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?

von Acre A. (acre)


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.

von snowman (Gast)


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

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.