PIC ASM/C kort fördröjning

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

PIC ASM/C kort fördröjning

Inlägg av net4all »

Hej!

Skissar lite på ett program till en 16F628A, och då behöver jag en någorlunda exakt delay-funktion.
Problemet är att alla timers är upptagna redan...

Däremot så har jag massor med dödtid för just denna funktion, så då passar det ju sig med en mjukvarulösning.

Så jag skrev ett program i C och lät kompilatorn (CC5X) skapa en ASM-fil.
Tanken är att man lägger ett värde i timer-variabeln och sedan får man en fördröjning på ett antal uS.

Sedan tänds RB3 och förblir tänd i evighet.

Jag använder den interna 4MHz oscillatorn, vilket gör att en instruktion blir ca 1 uS

Kod: Markera allt

; C compiler for the PICmicro family
; ************  24. Dec 2008  13:15  *************

	processor  16F628
	radix  DEC

	__config 0x3F10

PORTA       EQU   5
TRISA       EQU   133
PORTB       EQU   6
TRISB       EQU   134
RP0         EQU   5
RP1         EQU   6
CMCON       EQU   31
timer       EQU   32

	GOTO main
main
	BCF   3,RP0
	BCF   3,RP1
	CLRF  CMCON
	BSF   3,RP0
	CLRF  TRISB
	CLRF  TRISA
	BCF   3,RP0
	CLRF  PORTA
	CLRF  PORTB
	MOVLW .100
	MOVWF timer
m001	
    BCF   3,RP0     //1 uS
	BCF   3,RP1     //1 uS
	DECFSZ timer,1  //1 uS
	GOTO  m001      //2 uS
	
	BSF   PORTB,3
m002	GOTO  m002

	END
Jag får det att fördröjningen skulle bli:

Kod: Markera allt

Fördröjning = (timer * 5) + 2
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Tips:
http://www.piclist.com/techref/piclist/ ... /delay.htm

Men, all dylik fördröjning kommer att bli inexakt om du kör interrupt...
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Tack för länken.
Jo, men det behöver inte vara allt för exakt, och interruptrutinerna är ganska korta, så det ska nog gå.

Men tror du koden jag la upp kommer att ge ungefär den fördröjningen?
(Enligt mitt "samband": Fördröjning = (timer * 5) + 2 )
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Inlägg av blueint »

Om man säg har en timer. Och behöver en fördröjning på 400 ms och en på 1600 ms. Så kan man först sätta timern på 400 ms, och vid interrupt starta om den till 1200 ms. Dvs på samma princip som dom flesta operativsystem hanterar det på.

Alternativt så kan man i detta fallet köra 400 ms konsekvent (då 1200/400 = jämnt). Så att man vid varje interrupt kollar av en lista med events osv.

Beror lite förstås på hur just din uppkoppling ser ut ;)
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

Aha, ska kolla på det!
(Det senare alltså, dom andra delarna kräver "fasta" interrupt-tider, annars havererar dom.. )
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Inlägg av Swech »

alla timers upptagna säger du..
Vad gör de timrarna då? - finns det ingen av dem som snurrar som
du kan läsa av och använda till 2 saker ? d.v.s vad det nu är
den gör samt fungera som timer bas?

Swech
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Så kan man först sätta timern på 400 ms, och vid interrupt starta
> om den till 1200 ms.

Bättre att timern alltid går i 400 ms "fart", sedan får man enkelt räkna
interrupt för att få t.ex 1200 ms. Så länge som det går "jämt upp" (d.v.s
att t.x 1200/400 blir ett jämt heltal) så är det ju skitenkelt...
net4all
Inlägg: 538
Blev medlem: 7 februari 2007, 12:06:34

Inlägg av net4all »

TMR0 - Genererar bla PWM till motorer, sensor-styrning, genom interrupt
TMR1 - Läsa av IR puls
TMR2 - Skapa IR pwm puls

Precis som både du(Swech) och bluint sa så kanske det går att höja "interruptfrekvensen" så att TMR0 kan styra denna funktion också.

TMR0 räknar som sagt "runt runt" och ger interrupt.

Tittar på det nu. :)

EDIT: Precis som sodjan sa...

EDIT2: Har uppstått andra problem, tar det eventuellt i en annan tråd.
Fördröjningsproblemet är dock löst(Med TMR0 och sedan räkna interrupt)
Skriv svar