Forum: Mikrocontroller und Digitale Elektronik pic 16F88 interne oscillator


von Sabine M. (zizo)


Lesenswert?

hallo
Ich habe der Pic 16f88 mit Assembler programmiert, ich habe eine 
Test-Platine mit 2 LED zusammengebaut, und ich möchte dass die zwei LED 
mit verschidene Frequenzen Bliken lassen, d.h ich muss der interne 
Oscillator umschalten, aber das klappt nicht, hat Jamend ein Idee?

  #include <P16F88.inc>
LED equ 1
LED1 equ 0
Wait1 equ 0x25
Wait2 equ 0x26
Wait3 equ 0x27
Wait4 equ 0x28


  org 0x0000
;__CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & 
_WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & 
_PWRTE_ON & _WDT_OFF & _EXTRC_IO
;__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF


  bsf STATUS, RP0
  bcf OSCTUNE, 0x00
  ;bsf OSCCON, 1110110

MainInit
  bsf STATUS, RP0
  bsf OSCCON, 1110110 ;Einstellung der erste Frequenz

  movlw 0x00
  movwf ANSEL

  bcf TRISA, LED
  bcf STATUS, RP0    ;Bank 0
  bsf PORTA, LED  ;LED leuchtet
  call Warten    ;zum Unterprogramm;
  bcf PORTA, LED  ;LED leuchtet nicht
  call Warten    ;zum Unterprogramm;

  bsf STATUS, RP0

  bsf OSCCON, 0000111  ;Einstellung der zweite Frequenz

  bcf TRISA, LED1
  bcf STATUS, RP0    ;Bank 0
  bsf PORTA, LED1  ;LED leuchtet
  call Warten1    ;zum Unterprogramm;
  bcf PORTA, LED1  ;LED leuchtet nicht
  call Warten1    ;zum Unterprogramm;

  goto MainInit
Warten
      ;Wartezeit initialisierung
  movlw 0x10
  movwf Wait2
loop2

  movlw 0x10    ;Wartezeit initialisierung
  movwf Wait1

loop

  decfsz Wait1,1
  goto loop
  decfsz Wait2,1
  goto loop2
  retlw   .0
Warten1
  movlw 0x10
  movwf Wait3
loop3

  movlw 0x10    ;Wartezeit initialisierung
  movwf Wait4

loop4

  decfsz Wait3,1
  goto loop
  decfsz Wait4,1
  goto loop2
  retlw   .0



  end

von Patrick W. (seennoob)


Lesenswert?

Wie schnell sollen die LEDs blinken ?

Ich wür dazu ned den Oszillator umschalten sondern einfach mit dem 
Prescaler vom Timer arbeiten oder mit 2 Timern .....


MFG Patrick

von Meister E. (edson)


Lesenswert?

>der interne Oscillator

und

>_EXTRC_IO

sind ziemlich widersprüchlich, oder? Ich hab hier kein DB, aber EXTRC 
steht im allgemeinen für eine externe Taktquelle.

Grüße,
Edson

von Sabine M. (zizo)


Lesenswert?

ich möchte der erste LED mit 31,25 kHz und der zweite mit 8 MHz blinken 
lassen.

von Meister E. (edson)


Lesenswert?

>  bsf OSCCON, 1110110 ;Einstellung der erste Frequenz

Diesen Befehl interpretierst du falsch. Damit kann nur auf ein einziges 
Bit zugegriffen werden. In diesem Fall setzt du damit nur Bit0 des 
Registers OSCCON auf logisch 1.

So wäre es richtig:
1
   movlw   b'1110110'
2
   movwf   OSCCON

Mit diesem Wert versuchst du allerdings auch das Bit IOFS zu setzen. Das 
geht zwar, bringt aber nichts. Dieses Bit wird vom Controller auf 1 
gesetzt, sobald die Frequenz nach dem Umschalten wieder stabilisiert 
ist. Nach dem Schreiben von OSCCON könnte man folgende Zeilen einfügen, 
um den weiteren Programmablauf mit stabilem Takt fortzusetzen:
1
WaitFrqStable
2
   btfss   OSCCON, IOFS
3
      goto   WaitFrqStable

Grüße,
Edson

von Daniel V. (volte)


Lesenswert?

Alex Mühller wrote:
> ich möchte der erste LED mit 31,25 kHz und der zweite mit 8 MHz blinken
> lassen.

Und es funktiert nicht weil die Led's wahrscheinlich immer leuchten 
vermute ich..... :)

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.