Skrivning av första assembler kod! kört fast

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jaha, OK. Så att den multiplexar alldeles för fort.
Det absolut enklast är att sätta upp ett timer-interrupt
med ett lämligt intervall så går det "automatiskt"...
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

>En fördröjning kommer inte att ta bort "flipprandet", det gör bara att det
flipprar långsammare.

Skulle nästan duga om de växlade långsamare, nu står det och totalflippar i många lägen.

>Det du kan göra är att bygga in en utjämning i programvaran som ger
en hysteres ("deadband")

Nåt slags dödband vore nod det allra bästa, ska söka o klura lite.

>Sen förstår jag inte vad som är problemet med interrupt. Det gör oftast
koden snyggare och förenklar hela applikationen.

Har aldrig hållt på med interuppt, verkar lite smått krångligt, ska ägna lite tid.

>Jjag tror inte han menar det vanliga felet +/- 1, utan att detta i kombnation med en jättehög uppdaeringsfrekvens gör att den visar hieroglyfer istället för att växla mellan två tydbara siffror.

Exaktlamento, ska se om jag kan få in nån timer med interuppt, verkar kanske inte för omöjligt. Ska kolla runt lite på info om dödband med, en kombination av båda vore nog allra bäst.
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

En liten fuskis man kan göra är ju annars en 555a på nån ingång, känns som jag behärskar de bättre. :D Verkar inte va för krångligt med interrupt, ska prova o bygga nån simpel blinka kod med interrupt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Exaktlamento, ska se om jag kan få in nån timer med interuppt,

Här är en kod som kör en rutin styrt av ett interrupt från Timer1.
Det är för 877A, som är väldigt lik din 876A.

I detta fall är det för att blinka-en-LED, men du kan antingen snabba upp
intervallet (eller kanske byter till Timer0) så att du får ett intervall
som bättre passar för multiplex av dispayerna. Man vill väl i normalt
ha en "blink" frekvens på ca 100 Hz för att det inte ska blinka.

Det mest intressanta i koden är antagligen uppsättningen av timer1
och interrupt register, T1CON, PIE1 och INTCON.

Kod: Markera allt

;**********************************************************************
;   Enkelt blink-a-led, 16F877A.                                       *
;                                                                     *


	list      p=16f877A
	#include <p16f877A.inc>
	
	__CONFIG   _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

RESET_VECTOR    CODE    0x000     ; processor reset vector
	    goto    start             ; go to beginning of program


INT_VECTOR      CODE    0x004     ; interrupt vector location
        goto    isr_routine       ; goto main interrupt service routine.
        

;***************************************************************
MAIN    CODE

start

        banksel adcon1
        movlw   h'06'
        movwf   adcon1            ; Stäng av ADC.

        banksel trisa
        clrf    trisa
        clrf    trisb
        clrf    trisc
        clrf    trisd
        clrf    trise             ; Alla pinnar = utgångar.

        banksel t1con
        movlw   b'00110001'
        movwf   t1con             ; Se datablad...
        
        banksel pie1
        movlw   b'00000001'
        movwf   pie1              ; Enable avbrott från TMR1.

        banksel intcon	
        bsf     intcon, peie
        bsf     intcon, gie       ; Enable avbrott...

loop
        goto loop                 ; Vänta på avbrott...
 


ISR_ROUTINE  CODE

isr_routine

        banksel portb
        comf    porta            ; Blinka !!

        banksel pir1
        bcf     pir1, tmr1if     ; clear avbrotts flagga.

        retfie



		END
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

>Här är en kod som kör en rutin styrt av ett interrupt från Timer1.
Det är för 877A, som är väldigt lik din 876A.

ahh tackar, nu är denna infogad i koden! Verkar va rätt för de funkar rätt bra. Tetade de olika hasigheterna lite, "1:8 prescale value" verkar nästan bäst, rätt segt men temperaturen kommer ändå inte skena direkt fort så de blir nog skit bra!

Nu e de bara o försöka få ihop den analoga delen med någorlunda möjlighet till kalibrering. Har hittat några andra koder o de verkar rejält överkurs och ha någon typ av digital kalibrering.

>Man vill väl i normalt
ha en "blink" frekvens på ca 100 Hz för att det inte ska blinka.

Spelar väll ingen roll när LED-displayerna körs direkt statiskt så att säga! Tar bara värdet från ADCn, räknar om de till BCD och rakt ut på utgångarna!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Ja jo, jag trode att displayerna också multiplexades.
Så det är alltså bara ADC avläsningen du vill "slöa ner" lite,
ja då spelar det inte så stor roll, så klart. Displayen kommer
ju alltid att vara stabil med direkt drivning...
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

Ni får ursäkta ett väldigt sent svar.. har haft fullt upp med annat så projektet har hamnat lite i skymm undan! Eller åtminstone rapporteringen om det!

>Så det är alltså bara ADC avläsningen du vill "slöa ner" lite,

Jupp, tror jag har fått någolunda klämm på Interruptet nu och visningen kan knappt bli bättre! Dessvärre så blev det stora problem med den analoga biten! Fick ut helt andra spänningar än vad som va beräknat. Har knåpat o knölat i ungefär 10 timmar med olika Opampar, GEsteg men aldrig fått några bra spänning och referensnivåer!

Men för 10minuter sedan tändes det en lampa! Givaren har en resistans mellan ca 800-2000ohm En spänningsdelning med givaren i serie in på AN0. Sedan använda sig av picens +Vref och -Vref!. med en pot på varje! Sen bara simulera givaren med ett 800ohms motstånd och trimma nollan. Därefter 2000ohm för att trimma maxpunkt! Fungerar kanon och med 4komponenter! Dumt att krångla till de!
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

Nu börjar det hela nästan fungera för bra för att jag ska tro på det. Monterade nyss dit en diod som tänds när temperaturen når över 105C.
Funderade på att få den att blinka också vi ett interupt från en annan timer eller nån flash effekt eller liknande.

Försökte använda mig av COMF men den verkar invertera hela porten vid varje interrupt, jag vill endast invertera en bit, inte hela porten. Ska klura på lite. Kanske skulle gå att lägga till 1 i ett register vid varje interuppt och sedan läsa av bit 0 i det registret. Känns som någon tatarlösning dock!
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Använd exklusiv eller för att invertera en bit med en etta i den position som skall inveteras..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> jag vill endast invertera en bit, inte hela porten.

Lite inom parentes, men PIC18 arkitekturen har en instruktion för det,
BTG ("Bit Toggle"). Liknar BSF/BCF, men "togglar" alltså biten...
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

>Lite inom parentes, men PIC18 arkitekturen har en instruktion för det,

Taskigt att det inte finns poå 16 serien!

Lyckades iaf få till de genom att adera en bit i ett register vid varje interrupt, och sedan läsa av bit 0 som då blir inverterad vid varje interupt, inte så snyggt med de fungerar dock! :D
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Ja, det är ju också en variant, till "priset" av ett extra register.
Annars kan man använda xorwf för att toggla en enskild bit.
hh
Inlägg: 322
Blev medlem: 9 maj 2006, 12:37:32
Ort: Karis, Finland

Inlägg av hh »

Ingen fråga, bara en liten historia.
Jag har tidigare använt PICar som billiga PLC:n i små projekt, främst med hjälp av JAL (som för övrigt är ett ganska finurligt - och väldigt dött - språk).

Nu tänkte jag i går i alla fall titta lite på riktig programmering, och sökte därför i går runt vad som kändes som hela internet för att hitta något enkelt, tydligt och fungerande program i assembler för 877A (som jag råkade ha liggande) att utgå ifrån.. Det är kanske inte så stora skillnader mellan kontrollrarna, men för en som nästan aldrig har haft något med assembler att göra är det första steget ganska stort.

Nåväl, till sist hamnade jag på EF, där jag naturligtvis borde ha börjat, och efter en natts experimenterande med Sodjans fina exempelkod ovan har jag nu förstört den med diverse PWM:ar och knapphanteringar och annat skoj. Närmast var det grundstrukturen för ett program som vållade problem, och även om jag fick peta lite för att få det att fungera i gpasm så var koden föredömligt tydlig i jämförelse med mycket annat på nätet.

Ett stort tack till Sodjan alltså för en god nystart på min PIC-karriär.

De där fyra-fem timmarna av ful 16f84-kod får man väl ta som avskräckande exempel... eller så får man bara tänka före nästa gång. :oops:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Trevligt att koden var till hjälp. :-)

En sak bara, om det nu ändå är en "nystart" så skulle du, för att ha riktigt
kul, kunna starta om med en lite modernare processor än 16F877A'an,
nämnligen 16F887. Det är i princip samma processor men med alla
moderna varianter av t.ex den interna oscillatorn (intosc) och en bättre
USART (EUSART). Den är inte bara bättre, den är även betydligt billigare...

Se : http://www.jescab.se/Prod_PIC.html
Skriv svar