-         

Ergebnis 1 bis 8 von 8

Thema: PIC 12F675 kaputt??

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2009
    Beiträge
    19

    PIC 12F675 kaputt??

    Anzeige

    Hallo Leute,
    ich habe mir erstmalig einen PIC zugelegt und wollte als erstes eine LED zum leuchten/blinken bringen - allerdings ohne Erfolgt. Der Microcontroller gibt keine Lebenszeichen von sich.
    Den PIC 12F675 an sich konnte ich fast problemlos mit meinem Programm beschreiben, was ich auch nachträglich nochmal durch Lesen getestet habe.
    An der Beschaltung kann es eigentlich auch nicht liegen, hab den Vorwiderstand mal rausgenommen und die Diode direkt an den PIN gesteckt und wieder nichts.
    Also entweder es liegt am PIC oder am Programm.
    Ich hoffe jemand kann mir bei letzterem weiterhelfen, denn ich bin verzweifelt
    Danke schonmal im Voraus!!!


    LIST ;P=PIC12F675
    NOLIST

    #include <C:\PicProg2006\Include\p12f675.inc>


    ORG 0 ;PIC's reset vector
    BSF STATUS,RP0 ;Bank1
    MOVWF OSCCAL ;Calibrate the Int RC osc
    GOTO START ;Jump to START routine when boot

    DELAY100MS BCF STATUS,RP0 ;Bank0
    CLRW
    MOVLW D'255'
    MOVWF TMR0

    ;---------------------------------------------------------------------------------------

    START CLRWDT ;Clear the watchdog a power up
    MOVWF CMCON ;disable comparator

    BSF STATUS,RP0 ;Bank1
    MOVLW B'11111100' ;
    MOVWF TRISIO ;GP0,GP1 = Outputs
    CLRF ANSEL ;Digital I/O

    LOOP BCF STATUS, RP0 ;Bank0
    MOVLW B'11111100' ;
    MOVWF GPIO ;GPIO0,GPIO1 = on
    CALL DELAY100MS ;Wait for 100mS
    CLRF GPIO ;Clear the LED
    CALL DELAY100MS ;and wait again for 100mS
    GOTO LOOP ;Do forever this loop....

    END ;End of source code.

  2. #2
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.979
    Hallo martini007!

    Die LED muss immer mit Vorwiderstand betrieben werden. Ich vermute, dass du den PIC in Assembler programmieren willst. Dein Programm ist aber nicht i.O. Es fehlt z.B. das Unterorogramm "DELAY100MS" das mit "call" aufgerufen wird. Es gibt noch mehr Fehler in deinem Programm.

    Um den PIC auszuprobieren, würde ich dir empfehlen ein fertiges und geprüftes Programm zu nehmen, z.B. "Das erste..." aus dem Wiki Artikel:

    http://www.roboternetz.de/wissen/ind.../PIC_Assembler

    Viel Erfolg beim Programmieren!

    MfG

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2009
    Beiträge
    19
    Hallo,
    danke für den praktischen Link, genau das habe ich eigentlich lange gesucht. Aber die Beschreibungen waren meistens nie so detailliert.
    Ich werde das Programm mal testen.

    Bezüglich meines kleinen Programms wollte ich nur sagen, dass das Unterprogramm "DELAY100MS" gleich am Anfang steht.
    Was ist denn noch falsch?
    Ich meine so lang ist das Programm ja nicht und eigentlich finde ich den Programmiercode recht logisch aber es ist ja wie schon erwähnt mein erstes Programm ...

  4. #4
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.979
    Na ja, mach dir kein Stress !

    Ich möchte nicht alle Fehler suchen, aber ich habe z.B. kein "return" Befehl gesehen und deswegen war für mich das ganze Programm nicht verständlich. Aber der Anfang ist immer am schwersten...

    MfG

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    16.03.2007
    Ort
    Mücke Sellnrod
    Alter
    30
    Beiträge
    58
    In dem DELAY100MS fehlt wie picture schon sagtv das return. auserdem seh ich nirgends eine Auswertung des TMR0. Durch fehlen des return durchläuft das Programm immer die selbe schleife von DELAY100MS bis hin zum ersten Aufruf von DELAY100MS.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2009
    Beiträge
    19
    Vielen Dank für eure Tips und Anregungen! Ich habe ein neues Programm geschrieben und es mit MPLAB getestet, hat alles in der Simulation funktioniert. Dann habe ich das Programm auf den Controller geschrieben,
    5 Volt Versogungsspannung angelegt und wieder nichts.
    Ich messe eine Spannung von etwa 0,3 Volt an einigen Pins aber das hat wahrscheinlich nichts mit dem Programm zu tun. Also es regt sich nach wie vor nichts. Könnte das vielleicht an dem Timer liegen?


    ;

    NAME: Flash Led for PIC 12F675


    list P=12F675
    include "P12F629.inc"
    nolist

    __config _CP_OFF & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

    #define _DTT1 GPIO,0
    #define _CKT2 GPIO,1
    #define _T3 GPIO,2
    #define _RNG GPIO,3
    #define _INT GPIO,4
    #define _RL GPIO,5

    org 0x0000

    call Init

    ;-----------------------------------------------------------------------------

    Haupt
    MOVLW b'00000011'
    MOVWF GPIO
    call DELAY100MS
    call DELAY100MS
    call DELAY100MS
    call DELAY100MS
    call DELAY100MS
    MOVLW b'00000000'
    MOVWF GPIO
    call DELAY100MS
    call DELAY100MS
    call DELAY100MS
    call DELAY100MS
    call DELAY100MS

    goto Haupt

    ;-----------------------------------------------------------------------------

    DELAY100MS
    bcf INTCON,T0IF
    MOVLW D'255'
    MOVWF TMR0
    ;BTFSS INTCON,T0IF
    ;goto $-1
    return

    ;-----------------------------------------------------------------------------

    Init clrf GPIO
    bsf STATUS,RP0
    call 0x3FF
    movwf OSCCAL
    bcf OPTION_REG,7
    movlw B'11111100'
    movwf TRISIO
    bcf STATUS,RP0
    movlw 7
    movwf CMCON

    return

    ;-----------------------------------------------------------------------------

    end

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2009
    Beiträge
    19
    ach ja, beim compilieren steht in der LIST-Datei, dass einige der verwendeten Funktionen nicht in den angegebenen Bänken stehen.
    Allerdings bin ich mir eigentlich "fast" sicher, dass ich die richtigen Bänke verwendet habe, da ich ja auch mit dem Datenblatt gearbeitet habe.
    Oder könnte es sein, dass ich die Bänke vertauscht habe?

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2007
    Ort
    Berlin
    Beiträge
    536
    Hallo martini007
    beim flüchtigen hinschauen, fiel mir einiges auf.
    Für welchen PIC soll denn das Programm sein ??? 675 oder 629
    weil da gibt es schon einen Wiederspruch in deiner Software:
    list P=12F675
    include "P12F629.inc"

    vor dem wort include, muss meiner Meinung nach ein # stehen, also
    #include "P12679.inc"

    ich hoffe, deine Programmzeilen sind nicht alle "linksbündig" (stehen ganz links in der Zeile) wie hier im Text. Da dürfen sich nur die Sprungmarken bzw. Labels befinden.
    Dann würdest Du aber etliche von Warungen bekommen: Found opcode in column xx
    ich hoffe, daß ist nicht der Fall.

    Deine Verzögerungsschleife DELAY100MS hast Du ja schon entschärft (Zeilen ausgeklammert), damit der PIC dort nicht "hängen" bleibt.
    Das gibt wirklich eine Endlosschleife, hab ich mal simuliert. Da diese Verzögerung nun weg ist, kann es sein (bzw. sehr wahrscheinlich) daß deine LED derart schnell blinkt, daß Du es garnicht mitbekommst.

    Der Timer 0 ist noch garnicht initialisiert worden, dadurch läuft er auch nicht.

    Übrigens, Timer 0 zählt aufwärts. Wenn Du den Wert im TMR0 Register auf 255 setzt, dann ist der Timer recht schnell fertig,
    da im nächsten Zyklus der Wert auf 256 bzw. 0 geht und das Interruptflag T0IF gesetzt wird.
    Wenn Du den Wert auf 0 setzt, ist der Timer nach 256 Zyklen fertig, das sind dann aber auch nur 256 mikro Sekunden.
    Für deine Blinkfrequenz immer noch unbrauchbar.

    Also verpassen wir dem Timer einen Vorteiler, bzw. programmieren ihn.
    Dafür gibt es den sogenannten "Prescale" Vorteiler, dieser kann jedoch für den Watchdog oder den Timer 0 benutzt werden.
    Standardmäßig ist der Vorteiler für den Watchdog programmiert, daß können wir ändern, indem wir das Bit PSA im OPTION_REG löschen.
    Dann gibt es 3 Bits, welche für das Teilerverhältnis zuständig sind PS0,PS1,PS2 ebenfalls im OPTION_REG
    wenn wir alle 3 Bits setzen können wir den Timer am langsamsten laufen lassen. Aber selbst dann liegt die Laufzeit des Timers
    immer noch unter 100ms. Wir kommen auf ca. 65ms aber schon wesentlich brauchbarer.

    baue mal bitte den folgen Code mit in deine Initialisierunge rein:

    InitTimer0:
    bsf STATUS,RP0 ; die richige BANK auswählen

    bcf OPTION_REG,T0CS ; interne Taktquelle wählen für Timer 0
    bcf OPTION_REG,PSA ; Vorteiler für Timer 0 benutzen
    bsf OPTION_REG,PS0 ; Teilung durch 256 einstellen
    bsf OPTION_REG,PS1
    bsf OPTION_REG,PS2

    bcf STATUS,RP0 ; und die BANK wieder zurückschalten

    in der Schleife DELAY100MS schreibts Du dann nicht den Wert 255 sondern 0 in das TMR0 Register

    Nun kannst Du, denke ich, alles weitere selbst probieren.
    Aller Anfang ist schwer, mach Dir nix draus.
    mit freundlichen Grüßen
    Siro

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •