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 »

> Nu börjar jag bli riktigt uppgiven med det här projektet.

Jaha du :-)

Du kan börja med att svara/kommentera de tips du får. T.ex när jag skrev :

> Läs på i databladet kapitel PORTB om analoga funktioner.
> Du ska sannolikt stänga av ADC och/eller komparatorer...

Hart du gjort det ?

Du skrev :
> Antar att det är någon komparator eller A/D inställning

Ja men så kolla upp det då !! Vad är problemet ?
Anta inte, se till att du är säker...
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

Hart du gjort det ?

Japp, AD biten är avslagen.. Komparatorerna är avslagna. Har hållt på o labbat lite med 5volten, vetifan om de hjälpte eller va ett samanträffande, nu lever han hur som helst.

> Läs på i databladet kapitel PORTB om analoga funktioner.
Portb har inga analoga in/ut. Ska räcka med "clrf PORTB" så ska hela portb ställas som utgångar.

Gav upp för stunden med AD-omvanlingen, började tappa lusten för alltihop, får bli i ett senare skede. :D Har nu iallfall lyckats skapa en timer som som räknar upp från 0-77 på två displayer.. binärt för tillfället men de kanske man får fart på. HAr hållt på o testat med lite olika hastigheter, räkna varannan siffra osv. Känns som man börjar fatta lite vad man gör för något.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Känns som man börjar fatta lite vad man gör för något.

Perfekt.

> Ska räcka med "clrf PORTB" så ska hela portb ställas som utgångar.

Ska nog vara "clrf TRISB" där, eller hur ? Samt att man är i rätt minnes-bank,
så klart...

> Gav upp för stunden med AD-omvanlingen,

OK, som du vill. Men om du vill ha lite hjälp så måste vi se vad du har gjort.
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

Till att börja med måste jag säga att de är skit kul att någon engagerar sig och försöker hjälpa till.

>Ska nog vara "clrf TRISB" där, eller hur ? Samt att man är i rätt minnes-bank,
så klart...

Slarvig felskrivning, men så långt är jag med.


>OK, som du vill. Men om du vill ha lite hjälp så måste vi se vad du har gjort.

Japp tar de till senare, spelar väll inte nån igentlig roll om man börjar i fel ände? :D Blir lite mer labbande men de är nog bara bra.

Dessvärre så får jag inte nån vidare flyt i bcd konverteringen. Just nu räknar den binärt upp till b'00011111'= d31. (sitter bara 5st lysdioder på plattan). Men så fort jag blandar in "sublw" eller "subwf" så börjar räknaren räkna baklänges eller i helt konstiga steg. Vad händer igentligen om man har 5 och drar av 10. C biten i STATUS registret blir 1 ett. Men värdet i W kan väll aldrig ligga kvar som negativt?

exempel:

Kod: Markera allt

        banksel portb 
		incf	count			;lägg till "ett" i räknaren.
		movlw	b'00001010'
		subwf	count
		btfsc	status, C		;Om det EJ går, hoppa över nästa
		goto	cp

		movlw	b'00001010'
		addwf	count
		movfw	count
		movwf	portb			;flytta värdet till portb
		goto	clear 

Lägger upp hela koden så kanske det blir mer överskådligt.

Kod: Markera allt

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

tio		EQU	0x013
Count	EQU	0x014

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


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

;*************************************************************** 

MAIN    CODE 

start 

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

        banksel trisa 
        movlw	b'00111111'		
		movwf    trisa 			;porta =ingångar
        clrf    trisb 			;portb =utgångar
        clrf    trisc 			;portc =utgångar


        banksel t1con 
        movlw   b'00110001' 	;hastighet samt ON
        movwf   t1con 
        
        banksel pie1 
        movlw   b'00000001' 
        movwf   pie1              ; Tillåt avbrott från Timer 

		banksel intcon
		movlw	b'11000000'
		movwf	intcon      	;Tillåt avbrott
loop 
        goto loop                 ; Vänta på avbrott... 
  


interrupt  CODE 

interrupt

input
		btfss	porta, 0		;Ingång1 hög= Skippa nästa
		goto	input			;vänta på ingång1 ska bli hög

        banksel portb 
		incf	count			;lägg till "ett" i räknaren.
		btfss	status, C
		goto	cp				;Om det EJ går, gå till cp

		movfw	count
		movwf	portb			;flytta värdet till portb
		goto	clear

cp
		clrf	count			;detta la jag mest till för att se om
		clrf	portb			;count någon gång blev full.
		movlw	b'00001001'		;samt tänder 2utgångar
		addwf	portb			;på portb

input2

		btfsc	porta, 0		;Ingång1 låg=skippa nästa
		goto	input2			;vänta på att ingång1 ska bli låg
	   clrf    portb
      goto	clear			;ingång1=låg, gå till clear
clear
        banksel pir1 
        bcf     pir1, tmr1if     ;töm avbrottsflaggan. 

        retfie 


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

Inlägg av mr_fatise »

NU skäms jag nästan lite, samtidigt som jag skrev inlägget så la jag till lite förklaringar i koden, o snyggade till ite. Helt plötsligt funkar det. Räknaren räknar upp till 9 och stannar där. Tills man sätter ingång1 låg nån hundradel. Sedan börjar allt om.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> så la jag till lite förklaringar i koden, o snyggade till ite.
> Helt plötsligt funkar det.

Japp, brukar hjälpa i 9 fall av 10... :-) :-)

> Men värdet i W kan väll aldrig ligga kvar som negativt?

Tja, "negativt" och "negativt". Det beror på vad man menar med "negativt"...

W är ju bara 8 bitar, hur man själv väljer att definiera dessa är upp till
dig (d.v.s den som skriver programmet). Processorn i sig vet ingenting om
"negativa" värden.

Antingen tolkar man W som "unsigned" d.v.s med värdena 0 -> 255.
Och då finns det naturligtsvis inga "negativa" värden.

Eller så tolkar man det som "signed" d.v.s med värderna -126 -> +127.
D.v.s att om bit7 (den åttonde biten) är "1" så är värdet negativt.

Man kan se på W som en ring, där 255 + 1 = 0 och 0 - 1 = 255 (om man
räknar "unsigned").

Den enda som C-biten i STATUS talar om, är om man fick "overflow"
(vid addition) eller "borrow" (vid subtraktion). D.v.s att W inte "räckte till"
för den operation man gjorde. Då kan man använda C-biten för att justera
nästa byte (om man har ett värde som är 16, 24 eller fler bitar stort.

En annan sak är att SUBxx instruktionerna fungerar lite "baklänges".
Kolla ordentligt i vilken ordning subtraktionen görs.
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

>Japp, brukar hjälpa i 9 fall av 10...

Helt galet, hade suttit bra många timmar, sen helt plötsligt så funkar de perfekt.

>Man kan se på W som en ring, där 255 + 1 = 0 och 0 - 1 = 255 (om man
räknar "unsigned").

Ahh, nu e jag med i resonemanget. Kan förklara varför det flög omkring lite konstiga siffror kanske.

NU har jag iallfall kopplat upp 2st binär->BCD omvandlare som driver två 2st 7seg. Räknar nu från 0-99. Börjar få lite klämm på de här tror ja, ska labba lite mer ed ingångarna sen är det nog dax o ge sig på den där jäkla AD-delen iallfall.
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Att snygga till lite hjälper ingen!
Ta rätt på vad du ändrade så att du inte gör om misstaget i framtiden.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Att snygga till lite hjälper ingen!

Att hålla sin kod "ren och snygg" hjälper alltid, skulle jag vilja säga.
Helt klart att föredra framför motsatsen... :-)

Men jag kan hålla med om att det kan vara lite frustrerande det bara
"hoppar igång" så där utan vidare... :-)
BoF
EF Sponsor
Inlägg: 222
Blev medlem: 7 oktober 2006, 16:43:37

Inlägg av BoF »

Skulle bli lite orolig om det bara så där hoppar igång!
Vill veta vad jag har gjort för fel i alla lägen.
Senast redigerad av BoF 11 mars 2007, 05:50:51, redigerad totalt 1 gång.
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

>Ta rätt på vad du ändrade så att du inte gör om misstaget i framtiden.

hehe, har lite aningar om vad de kan vart.. verkar va lite huxflux med "addlw" och "movlw".


>Att hålla sin kod "ren och snygg" hjälper alltid, skulle jag vilja säga.
Helt klart att föredra framför motsatsen...

Inte alltid så lätt vill jag säga.. :D

Men nu har iallfall, de obegripliga skett. Har labbat o bråkat som en ren sate hela dan känns de som. Provade precis att skriva över koden för 2000 gången, pajar säkert snart! Ta mig fan så hände iallfall de otroliga, ett konstigt värde kom upp på displayen. Tänkte mest att de är som vanligt, de som inte va som vanligt var att värdet ändrade sig när man vred poten på AN0.

Helt jäkla otroligt, 2 veckor tog de :D Nu ska jag bara snygga till koden? :?
mr_fatise
Inlägg: 93
Blev medlem: 22 september 2004, 03:24:49

Inlägg av mr_fatise »

HAr labbat lite för att få en lite segare uppdateringsfrekvens. Just nu så är den så ininorden snabb så att siffrorna rätt var det är bara kan stå o flippra mellan två värden, verkar inte spela nån roll om man höjer upp impedansen eller hänger på nå kondingar.

Finns det något lätt sätt att slöa ner hela opperationen.Utan att använda Timer1? Vill helst köra utan interrupt!

Grymmt kul att man fått ut ett resultat. Måste även tacka alla för den enorma hjälp jag fått.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

Gör en fördröjningsloop på lämpligt ställe.

Eller ännu bättre, ta tjuren vid hornen och lär Dig använa interrupt. Förr eller senare kommer Du att behöva det.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

En fördröjning kommer inte att ta bort "flipprandet", det gör bara att det
flipprar långsammare. I alla lägen med analog -> digital omvandling
så får man gränslägen där det *alltid* kommer att slumpmässigt
växla mellan två värden.

Det du kan göra är att bygga in en utjämning i programvaran som ger
en hysteres ("deadband") så att det krävs en större förrändring av mätvärdet
för att det ska slå igenom på displayen.

Sen förstår jag inte vad som är problemet med interrupt. Det gör oftast
koden snyggare och förenklar hela applikationen.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Inlägg av Marta »

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. Då hjälper det att lägga in t.ex. en halv sekunds fördröjning mellan varje uppdatering.
Skriv svar