Sida 1 av 2

Använda PICens tajmer för att bestämma displayens uppdate

Postat: 17 augusti 2008, 20:03:10
av AndersG
Har haft en loop och bara dunkat ut mAh/V/A på displayen. Nackdelen är givetvis att uppdateringsfrekvensen blir beroende av hur ofta processorn interruptas. Har en 16F690 och 4MHz.

Om jag i stället ligger och loopar på en flagga som sätts av en tajmerinterrupt så kan jag inte åstadkomma glesare intervall med TMR2 än 16*16*255 =65250us, dvs 65ms. Med TMR1 är maximala 8*65535=0,5s

Vill jag ha ännu glesare får jag låta interrupten räkna ned en räknare, eller hur?

Postat: 17 augusti 2008, 20:15:01
av sodjan
Om du behöver *längre* intervall så kan du har en liten räknare
i ISR'en och uppdatera efter ett visst antal interrupt.

Det här är inget "problem" utan helt normalt och vanligt.

Postat: 17 augusti 2008, 21:12:49
av Marta
För det första, är det en LCD med kontroller som skall uppdateras, eller är det en muxad LED-display där Ditt program hanterar scanningen? Antar det är en LCD, annars vore en tid på 20ms per "varv" ungefär max vad det tål.

Sätt en flagga när uppgifterna ändrats, alternativt utför uppdateringssubrutinen. Allt beroende på hur det hlea är arrangerat.


Det är en mycket udda lösning att skicka om data till en LCD på det sättet med bara en timer. Finns antagligen bättre sätt.

Postat: 17 augusti 2008, 21:50:30
av AndersG
Det är en LCD. Får väl ta till en räknare, men då jag testade köra med en tajmerint så fungerade det då jag körde kopplat fast i Pickit och med en 555 som matade pulser, men blankvägrade då jag pluggade i den i breadboardet.... Körde ett varv ovh hängde sig sedan. Antagligen ngt jag glömt initiera, men vad??

Koden:

Kod: Markera allt

ourloop

; remaining code goes here
		btfss	prtflag,1			; Do we need to print?
       goto    ourloop            	; no, loop forever
									; Yes, print
		bcf		prtflag,1			; and clear print flag
isr:

Kod: Markera allt

;
; This is the handler for other interrupts
other_int
	banksel	PIR1
	btfsc   PIR1,TMR1IF     ; If Timer 1 caused the interrupt, handle it.
	bsf		prtflag,1
	banksel	PIR1
	BCF 	PIR1,TMR1IF 		; Clear flag and continue.
Initieringen:

Kod: Markera allt

        CLRF    TMR1L            ; Clear Timer1 register
		CLRF	TMR1H
        BSF     STATUS, RP0     ; Bank1
        bsf     INTCON,PEIE     ; Enable peripheral interrupts
        CLRF    PIE1            ; Mask all peripheral interrupts except
        bsf     PIE1,TMR1IE     ; the timer 1 interrupts.
        BCF     STATUS, RP0     ; Bank0
        CLRF    PIR1            ; Clear peripheral interrupts Flags
        movlw   B'00110000'     ; Set Postscale = 16, Prescale = 16

       movwf   T1CON
        BSF     STATUS, RP0     ; Bank1


       BSF     T1CON,TMR1ON    ; Timer1 starts to increment
; ***********************************************************************************
; END OF CODE to initialize Timer 2
; ***********************************************************************************


    bsf       OPTION_REG, INTEDG   ; interrupt on positive
    banksel   IOCA
    bsf       IOCA, IOCA0          ; Interrupt on change port A register, bit 0
	bsf       IOCA, IOCA4          ; Interrupt on change port A register, bit 4
    banksel   INTCON
    bcf       INTCON, INTF         ; clear interrupt flag
    bsf       INTCON, INTE         ; mask for external interrupts
    bsf       INTCON, GIE          ; enable interrupts
    bsf       INTCON, RABIE        ; enable interrupt on change

Postat: 17 augusti 2008, 22:08:46
av bearing
Det kan va något med bankerna. Vi ser inte vilken bank som är aktiv i 'ourloop' och heller inte vilken bank registret 'prtflag' ligger i.

Postat: 18 augusti 2008, 09:44:06
av AndersG
Men det skumma är: Varför fungerar den då den sitter i PICKit, men inte annars? Men du kan ha rätt, skall kolla mera noga, det blev sent i går.

Postat: 18 augusti 2008, 12:03:35
av ahlsten
PICKit kanske levererar en klockfrekvens alt. har en kristall och när det gäller "annars" så finns det ingen? Eller så går den kanske på intern RC-oscillator när den inte sitter i PICKit, på en annan frekvens...

Postat: 18 augusti 2008, 12:27:27
av Marta
Som föregående talare skrev, någon konfigurationsbit. Kan även vara t.ex. LVP som är vald. Det blir någon kapacitiv koppling som gör att den slutar funka när den flytande pinnen påverkas.

Gå igenom alla configbitar en och en, sätt dem explicit i det läge Du vill ha dem. Läs datablad om Du inte försåtr någon av dem och utgå aldrig från att grundvärdet kommer att fungera. Det gördet inte! Gäller bl.a. LVP.

Postat: 18 augusti 2008, 12:45:32
av AndersG
Kan mycket väl vara det, nu har jag:
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

men enligt INC-filen så har inte 16F690 LVP?

Hur är det annars, då TMR1 rullar över, måste man nolla TMR1L/TMR1H manuellt?

Postat: 18 augusti 2008, 12:55:53
av sodjan
> så har inte 16F690 LVP?

Korrekt.

> Hur är det annars, då TMR1 rullar över, måste man nolla TMR1L/TMR1H manuellt?

Nej. Det är just det som "rullar över" innebär...

> _MCLRE_OFF

Om du inte alldeles nödvändigt behöver den där extra I-pinnen,
så kan det vara enklare/säkrare att köra med _MCLRE_ON (och ett
externt pullup motstånd). I alla fall under felsökningsprocessen...

Postat: 18 augusti 2008, 13:49:21
av AndersG
Nej. Det är just det som "rullar över" innebär...
I varje fall för en konventionell räknare ;) Var litet osäker på hur det var i en PIC. Tack för den verifieringen!
Om du inte alldeles nödvändigt behöver den där extra I-pinnen,
så kan det vara enklare/säkrare att köra med _MCLRE_ON (och ett
externt pullup motstånd). I alla fall under felsökningsprocessen...
Jag har ett "low pin count demo board" och såvitt jag kan se på schemat är MCLR pullupat via 10k och det finns dessutom en brytare där... hm...

Exemplen som använder denna brytare funkar ej så man kör PICkit från MPLAB, men väl separat. Kanske vi har skillnaden där? Skall testa _MCLRE_ON.

Postat: 18 augusti 2008, 15:17:18
av Marta
Hur är det med avkopplingen av matningsspänningen? Sådana där konstiga saker där det funkar på ett ställe, men inte ett annat, kan bero på bl.a. usel matningsspänning.

Är där pull-up/down på alla pinnar när den sitter i utvecklingskortet, medan detta saknas på labbplattan? Montera i så fall motsvarande och se även efter i programkod och konfiguration så ALLA oanvända pinnar inte kan påverka något.

Postat: 18 augusti 2008, 16:53:22
av AndersG
Hur är det med avkopplingen av matningsspänningen? Sådana där konstiga saker där det funkar på ett ställe, men inte ett annat, kan bero på bl.a. usel matningsspänning.
Den är duktigt avkopplad.
Är där pull-up/down på alla pinnar när den sitter i utvecklingskortet, medan detta saknas på labbplattan? Montera i så fall motsvarande och se även efter i programkod och konfiguration så ALLA oanvända pinnar inte kan påverka något.
Jag flyttar inte PICen, utan hela kortet.[/quote]

Postat: 18 augusti 2008, 17:49:41
av sodjan
Bilder ?

Postat: 18 augusti 2008, 17:58:36
av AndersG
_MCLRE_ON
Den var det! Då jag ändrade den så fungerar det.

Postar litet bilder i projekttråden:
http://elektronikforumet.com/forum/view ... hp?t=28031

Tror jag kastar mig på soffan en stund och läser på om MCLR och liknande...