pic_12f629_led_blinken

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
pic_12f629_led_blinken [2014/07/24 13:21] – [relocatable code] dokuwikiadminpic_12f629_led_blinken [2015/01/12 08:24] (aktuell) – [relocatable code] dokuwikiadmin
Zeile 6: Zeile 6:
  
  
-Im folgenden ein ganz einfaches Beispiel für die Verwendung eines PIC12F629. Die Schaltung wird mit 3V betrieben, am PIN 7 (GP0) wird eine LED angehängt. PIN 8 wird mit Masse/GND verbunden und an PIN 1 kommt die 3V Spannung.+Im folgenden ein ganz einfaches Beispiel für die Verwendung eines PIC12F629.  
 +Am PIN 7 (GP0) wird eine LED angehängt.  
 +PIN 8 (GND) wird mit Masse (= minuspol des Netzgerätes) verbunden und an PIN 1 (VDD) werden die 3V Gleichspannung angelegt.
  
 {{:img_20140716_133105_nopm_.jpg?200|}} {{:img_20140716_133105_nopm_.jpg?200|}}
Zeile 82: Zeile 84:
  
 Vorteil dieser Methode ist, dass sich dieser Code dann besser in der MPLAB X IDE debuggen lässt, da man jetzt alle Variablen sieht. Vorteil dieser Methode ist, dass sich dieser Code dann besser in der MPLAB X IDE debuggen lässt, da man jetzt alle Variablen sieht.
 +
 +=== LED blinken, interner Timer ===
 +
 +Einer der Vorteile des C Programmiersprache sind die vielen fertigen Libraries die Funktionen wie zb. _delay_ms() zur Verfügung stellen. Für das Abwarten des Zeitraumes X in Assembler muss man selber geeignete Routinen implementieren. Dies kann im einfachsten Fall eine Schleife sein, die x-mal NOP (= no operation) ausführt.
 +
 +Im folgenden Beispiel wird der TIMER0 des PIC Prozessors verwendet. Der PIC12F629 läuft mit 4 MHz. Der Timer wird über den Prescaler an den internen Takt angeschlossen. Der TIMER0 ist limitiert auf 8 bit und zählt daher nur bis max. 255. Eine weitere Einschränkung ist, dass der Timer auf 1/4 der Taktfrequenz limitiert ist d.h. dieser läuft nur mit 1 MHz. Wenn man den Prescaler auf das Verhältnis 1:32 setzt, bedeutet dies dass der Timer0 alle 32 µs einen Impuls/Tick erhält und um eins hochgezählt wird. Ein Wert von 250 im TIMER0 entspricht dann etwa 8 ms.
 +
 +<code asm>
 +;---------------------------------------------------------
 +;22.07.2014 Stelzl Marius
 +;translate from C to ASM
 +    list      P=12F629         ; Prozessor definieren
 +    include "P12F629.inc" ; entsprechende .inc Datei für MPASM
 +
 +;#pragma config WDTE = OFF, PWRTE = ON, CP = OFF, BOREN = OFF, 
 +;  MCLRE = OFF, CPD = OFF, FOSC = INTRCCLK
 +__config _WDTE_OFF & _PWRTE_ON & _CP_OFF & _BOREN_OFF & 
 +   _MCLRE_OFF & _CPD_OFF & _FOSC_INTRCCLK
 +
 +;variable definition
 +;relocatable, use udata_shr
 +    UDATA_SHR
 +counter1 res 1 ;reserve one byte for counter1 variable
 +counter2 res 1 ;wait counter
 +
 +;-----------------------------------------------------------------
 +;code starts here
 +RESET CODE 0x000
 +
 +    goto main
 +
 +;------------------------------------------------------------------
 +;init subroutine
 +init
 +    bcf  STATUS,RP0    ;select bank 0
 +    clrf GPIO          ;GPIO = 0;
 +
 +    movlw 0xFF         ;CMCON =  0b1111111;
 +    movwf CMCON        ;set all GPIO to digital IO
 +
 +    bsf  STATUS,RP0    ;select bank1
 +
 +    ;setting TRISIO bit
 +    ; 1 ... PIN is input
 +    ; 0 ... PIN is output
 +    movlw 0xFE         ;0xFE = 254 = 0b11111110
 +    movwf TRISIO       ;TRISIO = 0b1111110; //output to GP0
 +
 +    ; OPTION register is also on bank1
 +    ; setup for usage of Timer0 with prescale 1:32
 +    movlw b'11010100'
 +    movwf OPTION_REG
 +
 +    return
 +    
 +;--------------------------------------------
 +;wait routine
 +wait_500
 +        clrf counter2
 +waitls  clrf TMR0
 +        
 +w_tmr0  movf TMR0,w
 +        xorlw .250      ;250 ticks x 32 us/tick = 8ms
 +        btfss STATUS,Z
 +        goto w_tmr0
 +
 +        incf counter2,1
 +        movlw .63        ;passed 62 * 8 ms = 500 ms ?
 +        xorwf counter2,0
 +        btfss STATUS,Z
 +        goto waitls
 +
 +    return
 +
 +;--------------------------------------------
 +;our processing starts here
 +main 
 +    clrf  counter1
 +    movlw 0x2
 +    movwf counter1
 +loop
 +    decfsz counter1,1 ;we call the init subproc only once
 +    call init
 +
 +    bcf STATUS,RP0    ;select bank 0 for writing to GPIO
 +    bsf GPIO,       ;set bit 0 of GPIO register to 1 => GPIObits.GP0 = 1;
 +
 +    ;wait 500 ms
 +    call wait_500
 +    ;now switch off LED
 +    bcf GPIO,      ;clear bit 0 of GPIO register
 +    call wait_500
 +
 +    goto loop        ;endless loop, run forever
 +
 +    end
 +</code>
 +
 +
 +
 +
  
  
  • pic_12f629_led_blinken.1406200865.txt.gz
  • Zuletzt geändert: 2014/07/24 13:21
  • von dokuwikiadmin