Forum: Mikrocontroller und Digitale Elektronik PWM mit PIC18F und Timers


von Tato (Gast)


Lesenswert?

Hallo zusammen.

Ich will verschiedene PWM Signale mit einem PIC18F erzeugen.
Aber wenn ich das Code auf mein PIC hochlade, dann kriege ich keine 
Signal raus..


mein Code sieht so aus:

#include <p18f2525.h>
#include <xc.h>
#include <timers.h>
#include <stdlib.h>


void main(void) {

    unsigned char time = 0;

    TRISBbits.RB4 = 0;      // Make the PORTB as Output
    LATB4 = 1;              // Set PORTB HIGH

    /*  Configure TIMER0 :
     *
     * Timer interrupt on
     * Set timer 16 bit
     * Source Edge HIGH-TO-LOW
     * Clock Source Intern
     * setting prescalar 256
     */

    OpenTimer0(TIMER_INT_ON &
               T0_16BIT &
               T0_EDGE_RISE &
               T0_SOURCE_INT &
               T0_PS_1_256);


    // Load starting value to the timer 0
    WriteTimer0(0XE17B);     // 1s

    // Reset Interrupt Flag
    INTCONbits.TMR0IF = 1;

    // Enable Global Interrupt
    ei();

    while(1){


    }

    //CloseTimer0();

    return;
}


// Interrupt Service Routine
void interrupt interruptTimer0Overflow(){

    di();                           // Disable Interrupt
    if(INTCONbits.INT0F == 1)       // When TIMER0 Overflow
    {
        LATB4 = ~LATB4;
        INTCONbits.TMR0IF = 0;      // Clear the TIMER0 Interrupt Flag
        WriteTimer0(0XE17B);        // Load the timer Value
    }
    ei();                           // Enable Interrupt
}

von Axel (Gast)


Lesenswert?

ich hab mir den Code jetzt nicht genau angeschaut aber:

1. hast du die config Bits gesetzt?
2. du machst das mit der PWM etwas umständlich.
3. welchen Programmer benutzt du, bzw wie versorgst du den Chip mit 
Strom?

von Tato (Gast)


Angehängte Dateien:

Lesenswert?

Axel schrieb.

> 1. hast du die config Bits gesetzt?
JA, also mit der Datei

> 3. welchen Programmer benutzt du, bzw wie versorgst du den Chip mit Strom?

Ich nutze MPLABX mit XC8 Compiler. Spannungsversorgung wir über dem ICD3

von Volker S. (vloki)


Lesenswert?

Tato schrieb:
>> 1. hast du die config Bits gesetzt?
> JA, also mit der Datei
Wie kommt die Datei in dein Projekt?
Warum ist es keine Source Datei *.c?

Tato schrieb:
> Spannungsversorgung wir über dem ICD3
Im Debug-Mode oder nur als Programmer?

von Andras H. (kyrk)


Lesenswert?

// Interrupt Service Routine
void interrupt interruptTimer0Overflow(){

    di();                           // Disable Interrupt
    if(INTCONbits.INT0F == 1)       // When TIMER0 Overflow
    {
        LATB4 = ~LATB4;
        INTCONbits.TMR0IF = 0;      // Clear the TIMER0 Interrupt Flag
        WriteTimer0(0XE17B);        // Load the timer Value
    }
    ei();                           // Enable Interrupt
}
Braucht man hier wirklich di und ei? War schon recht lange her aber ich 
meine der ei am ende könnte wieder ein Interrupt hereinlassen obwohl der 
jetzige gar nicht zu Ende gelaufen ist. Interruptfunktionen müssen ja 
den Kontext wieder herstellen. Wenn da noch ein Interrupt hereinkommt 
dann wird der Kontext irgendwann zerstört.

Der retfi hat damals den interrupt wieder enabled. Ob das jetzt 16F oder 
18F war weiß ich nicht mehr.

von Volker S. (vloki)


Lesenswert?

Andras H. schrieb:
> Braucht man hier wirklich di und ei?

Nein ;-)

von Axel H. (axhieb)


Lesenswert?

Volker S. schrieb:
> Tato schrieb:
>>> 1. hast du die config Bits gesetzt?
>> JA, also mit der Datei
> Wie kommt die Datei in dein Projekt?
> Warum ist es keine Source Datei *.c?

eine Header Datei passt eh.
Du kann die fuse bits auch direkt in die Haupt C Datei kopieren. Oder 
hast du die Header-Datei richtig eingebunden?

Hast du einen extern Oszilator/Quarz?
Am Anfang würde ich einmal den internen Oszilator verwenden.

von Tato (Gast)


Angehängte Dateien:

Lesenswert?

Axel H. schrieb:

>> Wie kommt die Datei in dein Projekt?
>> Warum ist es keine Source Datei *.c?
>
> eine Header Datei passt eh.
> Du kann die fuse bits auch direkt in die Haupt C Datei kopieren. Oder
> hast du die Header-Datei richtig eingebunden?
>
> Hast du einen extern Oszilator/Quarz?

Ja ich habe ein extern Oszilator von 8MHz


Die ganze Datei lade ich hier hoch

von Axel H. (axhieb)


Angehängte Dateien:

Lesenswert?

bist du sicher das der auch richtig schwingt? (mit Oszi überprüft)
hast du mal die Versorgungsspannung nach gemessen?

kannst du z.B. ein Led ohne Timer ansteuern?

: Bearbeitet durch User
von Tato (Gast)


Lesenswert?

Ja.. ich habe einfach ein LED blinken lassen .. es hat funktionier

(mit delays)

von Erich (Gast)


Lesenswert?

Axel schrieb:
> 2. du machst das mit der PWM etwas umständlich.

Das kann man wohl sagen!
Für Erzeugung einer PWM braucht es keinen Interrupt.

Vielleicht hilft dir das weiter:
http://www.microchip.com/forums/download.axd?file=0;789451
Beispiel 12

Gruss

von Volker S. (vloki)


Lesenswert?

Tato schrieb:
> Ich will verschiedene PWM Signale mit einem PIC18F erzeugen.
Erich schrieb:
> Axel schrieb:
>> 2. du machst das mit der PWM etwas umständlich.
>
> Das kann man wohl sagen!
> Für Erzeugung einer PWM braucht es keinen Interrupt.
Für "verschiedene" ist das vieleicht dann doch nicht so verkehrt, wenn 
nur ein Timer dafür geeignet ist...


Erich schrieb:
> Vielleicht hilft dir das weiter:
> http://www.microchip.com/forums/dow...
> Beispiel 12
Vorsicht, das scheint eine eher ältere Version zu sein. Gibt an einigen 
Stellen Probleme mit aktuellen Versionen des XC8 Compilers.
Irgendwo gab es auch überarbeitete. Wenn ich die finde...


Axel H. schrieb:
> ist du sicher das der auch richtig schwingt?
Tato schrieb:
> Ja.. ich habe einfach ein LED blinken lassen .. es hat funktion
Einfach erst mal im Debug Mode bleiben. Da merkt man sofort, wenn was 
mit der Oszillator Konfiguration nicht stimmt, weil eine Fehlermeldung 
ausgegeben wird! Keine Ahnung, warum man überhaupt in den 
Programmer-Mode wechselt, bevor alles läuft ;-)


Axel H. schrieb:
> Volker S. schrieb:
>> Tato schrieb:
>>>> 1. hast du die config Bits gesetzt?
>>> JA, also mit der Datei
>> Wie kommt die Datei in dein Projekt?
>> Warum ist es keine Source Datei *.c?
>
> eine Header Datei passt eh.
Funktioniert schon, widerspricht aber dem Prinzip, dass nichts in eine 
Header Datei sollte, was "direkt" Programm- oder Daten-speicher belegt. 
(Definitionen von Funktionen, Variablen und eben auch Config-Bits)

: Bearbeitet durch User
von Volker S. (vloki)


Lesenswert?

Volker S. schrieb:
> Irgendwo gab es auch überarbeitete. Wenn ich die finde..

Ok, keine Ahnung mehr wo die neueste Version zu finden ist.
War vermutlich auf Nicos Seite hier
https://pic-projekte.de/blog/category/elektrotechnik/mikrocontroller/pic18-tutorial/ 
(Da gab es früher auch ein PIC-Forum)

Einigermaßen aktuell dürfte auch die hier sein:
http://www.hs-ulm.de/nocache/wir/Personal/PersonalSaSchr/vschilli/Mikrocontroller/allMCHP/
Erster Download oben, an der rechten Seite...

: Bearbeitet durch User
von skorpionx (Gast)


Lesenswert?

Hier findest du etwas mehr.Auch Interrupts...:
Beitrag "Matrix Tastatur (Matrixtastatur) mit 74HC4051 und 162A Display."

von Tato (Gast)


Lesenswert?

Vielen Dank euch alle :)

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.