Börjat pyssla med assambler och behöver lite tips.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
cosmox
EF Sponsor
Inlägg: 3856
Blev medlem: 6 januari 2004, 02:11:54
Ort: Hjälteby - Tjörn

Börjat pyssla med assambler och behöver lite tips.

Inlägg av cosmox »

Hejsan,

Jag fick hem boken "Microcontrollers" av Lars Bengtsson här om dagen och har nu satt igång att pyssla lite.

I första kapittlet bygger man och programmerar en enkel AND grind. Detta har jag fått att fungera utan några större problem och jag tror mig förstå vad som verkligen händer i koden.

Nu till min fråga:
Som övningar till detta exempel ska man konstruera en OR-grind med hjälp av de instruktioner som man byggde upp AND-grinden med. Jag även har lyckats få detta att fungera men jag har ju ingen som kan kontrollera att det jag gjort verkligen är det korrekta sättet att göra det på. Jag skulle uppskatta mycket om någon tog sig lite tid att titta på det samt kanske ge råd på andra sätt problemet kan lösas.

Lite information om uppkopplingen för de som inte har boken.

PIC:en är uppkopplad utan kristall och använder ett RC-nät (R=10k och C=100pF) på pin 16. Detta ger enligt författaren en klockfrekvens (Fosc) på ca 600KHz. På RB0 samt RB1 är två strömbrytare (SPDT) kopplade (dessa växar mellan VDD och VSS). På RB5 är en LED kopplad via en resistor på 100ohm (i boken, jag använder 220ohm).

Min koppling ser ut så här:
Bild

Här är flödesschemat för koden:
Bild

Och slutligen, koden:

Kod: Markera allt

        list            p = 16F84A      ;Processor PIC16F84A.
        #define         status 3        ;Status registret.
        #define         rp0 5           ;Bankselect bit. 
        #define         trisb 86        ;TRISB.
        #define         portb 6         ;Port B.

        org             0

        bsf             status,rp0      ;Välj bank 1 (Bit set).
        movlw           3               ;00000011, flytta "3" till W. (Move Litteral to W)
        movwf           trisb           ;Flytta W till TRISB. (Move W to F)
        bcf             status,rp0      ;Välj bank 0 (Bit Clear).
        bcf             portb,5         ;Pin 5 på Port B = 0. (Bit Clear).
main:
        btfss           portb,0         ;Testa pin 0 på Port B. Om 1, hoppa över nästa instruktion. (Bit Test, Skip If Set).
        goto            or1             ;Gå till OR1.
        bsf             portb,5         ;Pin 5 på Port B = 1. (Bit Set).
        goto            main            ;Gå till huvudloop.
or1:
        btfss           portb,1         ;Testa pin 1 på Port B. Om 1, hoppa över nästa instruktion. (Bit Test, Skip If Set).
        goto            off             ;Gå till off.
        bsf             portb,5         ;Pin 5 på Port B = 1. (Bit Set).
        goto            main            ;Gå till huvudloop.
off:
        bcf             portb,5         ;Pin 5 på Port B = 0 (Bit Clear)
        goto            main            ;Gå till huvudloop
        end
	
Jag har valt att vara lite överförklarande i koden. Detta för att min hjärna ska komma ihåg vad förkortningarna betyder, där av har jag skrivit det i paranteser.

Kom gärna med förslag. Eftersom att detta är "mitt" första ASM program så har jag säkert inte tänkt på allt.

EDIT: Fixade ett fel i schemat.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av Icecap »

Du gör klassiska och grava fel!
Alla register ÄR redan definierat, att DU definiera dom är ett allvarligt fel!

Inkludera bara filen som hör till processorn, sedan är allt klart. Detta gör även att du kan migrera till andra processorer utan att få trubbel.

Och att börja med PIC16F84 är, som så ofta skrivit, dumt, dyrt och förlegad sedan länge. Om boken jobbar med denna processor kan jag till viss del förstå detta men det är då en föråldrat bok.

resten vill jag lämna därhän, det är bra att du har börjat och jag hoppas att du kommer att lära dig mycket men också att du kommer att använda moderna processorer och inte bara 15 år gamla modeller.
cosmox
EF Sponsor
Inlägg: 3856
Blev medlem: 6 januari 2004, 02:11:54
Ort: Hjälteby - Tjörn

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av cosmox »

Tack för snabbt svar!

Alla register ÄR redan definierat, att DU definiera dom är ett allvarligt fel

Ok, det visste jag inte.
Så det räcker med att jag använder:

Kod: Markera allt

        list            p = 16F84A      ;Processor PIC16F84A.

Kod forts.....
i början av min kod?

Vart hittar jag en förteckning över alla definitioner?
Eller är de alltid samma som i databladet?

Anledningen till att jag använder PIC16F84A är att den används i boken samt att jag har den hemma. När jag blivit mer bekant med assambler kommer jag använda modernare modeller.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av Swech »

Alltså..... varför hoppar ni alltid på processorer med > 5 år på nacken, när de tillhör samma familj?
En PIC 16F84 går utmärkt att börja på... Sen att det finns nyare är ju ingen nyhet.
Litegrand som att lära dig köra bil på en volvo från 1980.. glöm det.. måste vara senaste årsmodellen
eftersom den har krockkuddar, gps mm mm mm....
Sen är det naturligtvis så att om man måste köpa bilen och senaste årsmodellen är billigare än volvon från 1980 så
är det ju dumt att inte köpa den nyaste...

Cosmox är inte direkt ute efter att koda USB applikationer första kvällen..

OK.. starta nu inte ett gammal - ny processor krig bara. :D

Koden.. som ICEcap säger...
Samma typ av nybörjarfel som vi alla har gjort..
Ju mindre hårdkodade siffror destå lättare blir det att felsöka och förstå programmet

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

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av sodjan »

Kolla gärna lite snabbt på någon av mina exempelkoder.
Speciellt (eftersom du har missat det) "#include....".
T.ex : http://www.jescab.se/HD44780.html, bara för att ta en högen.

Lite annat smått och gott...

> bsf status, rp0

Kolla upp BANKSEL (antingen i dokumentatione eller i min exempelkod).

> movlw 3

gör det till en vana redan från början att alltid koda konstanter med radix.
Alltså "movlw d'3', om det är decimalt 3 du menar.
OK, just i detta fall "tre" alltid "tre", men generellt sett. :-)

Och gör det även till en vana att alltid väljda det radix som ger
tydligast kod. T.ex b'00110011' om det gäller ett kontrollregister där
bitarna har olika funktioner. Ofta ger i och för sig BSF/BCF mot de olika
bitarna tydligare kod, det får du känna av från fall till fall.

Skriv inte "Bit clear" som kommentar till instruktionen "Bit Clear File"... :-)

Skriv inte "Gå till off" som kommentar till "goto off". Vad 17 tillför det ? det
blir ju bara sak två gånger.

En ren formatteringsfråga. Skriv inte långa kommentarer som radbryts.
Och lägg in lite "luft" så att det blir snyggt och lättläst. Alltså t.ex :

Kod: Markera allt

main:
        btfss           portb,0         ; Testa pin 0 på Port B. Om 1,
                                        ; hoppa över nästa instruktion.

        goto            or1             ; Gå till OR1.
        bsf             portb,5         ; Pin 5 på Port B = 1. (Bit Set).
        goto            main            ; Gå till huvudloop.

or1:
        btfss           portb,1         ; Testa pin 1 på Port B. Om 1,
                                        ; hoppa över nästa instruktion.

        goto            off             ; Gå till off.
Sen så går det antagligen att göra samma sak med något färre instruktioner,
men det har kanske mindre betydelse (just nu i alla fall)... :-)
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av Icecap »

Inget fel i att använda PIC16F84... om man råkade ha den liggande. Men har man köpt den är det en dålig handel, hade man tagit t.ex. en PIC16F628A hade man fått intern oscillator (färre yttre komponenter), UART (väldig bra när man har fått lite erfarenhet och faktisk vill skriva ut värden istället för att blinka en lampa) och hade man vald t.ex. PIC16F88 hade man varit framtidssäkrad en bra bit fram med AD-omvandlare osv.

Grejen är att man kan släppa billigare undan, få mycket mer för pengarna och ha att göra i mycket längre tid med en nyare processor.
Användarvisningsbild
Glenn
Inlägg: 36772
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av Glenn »

16F628A är dessutom billigare än 16F84A :)

Fast jag använder fortfarande 16F84A ibland, av den enkla anledningen att jag säkert har ett tiotal liggandes.
cosmox
EF Sponsor
Inlägg: 3856
Blev medlem: 6 januari 2004, 02:11:54
Ort: Hjälteby - Tjörn

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av cosmox »

Tack för alla svar :)

Jag har nu lärt mig att använda "banksel" istället för det jag gjorde innan. Tack Sodjan!
Det tog ett tag innan jag fattade att man var tvungen att använda versaler eftersom det är det i .inc filen..
Det kanske går att ändra på något vis (jag såg att Sodjan körde med små bokstäver) men det funkar så länge.
Jag får error 302 viket jag har förstått inte är så farligt utan bara en påminnelse om att man bytt bank.?

Nu håller jag på med kapitel två och behöver använda portb 0-3 som ingångar och 4-7 som utgångar.
Jag har gjort så här för att byta bank samt lagra b'00001111' i TRISB.

Kod: Markera allt

	movlw		b'00001111'		;Flytta h'0x0F till W
	banksel		TRISB			;Byt till bank 1, TRISB
	movwf		TRISB			;Flytta data från W till TRISB
Det känns som det skulle finnas ett smidigare sätt men jag har bara lärt mig fem instruktioner än så länge.

Jag använder nu även #include för att slippa alla #define som jag hade förut.

Skriv inte "Gå till off" som kommentar till "goto off"
Jag vet faktiskt inte varför jag gjorde det då jag vet mycket väl vad den instruktionen gör.

Är det förresten någon som vet varför tabbarna inte hänger med när jag kopierar från MPLAB till mina kod inlägg? Det förra editerade jag i notepad :)
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av bos »

1. banksel behöver inte skrivas med versaler. Troligen har du nån inställning för case sensitivity nånstans i MPLAB. Gå till Project-menyn, välj Build Options och sen Project. Välj fliken MPASM Assembler och kryssa i "disable case sensitivity". Det kanske funkar, jag vet inte (du har inte skrivit vilken IDE du sitter i, så jag vill inte gissa längre än såhär).

2. Jag tror du menar warning 302, inte error. Hur som helst är det inget att bry sig om så länge du använder 'banksel' rakt igenom. Att få den varningen i tid och otid är dock lite jobbigt, så lägg till 'errorlevel -302' längst upp i din kod.

3. Att dina tabbar blir trasiga beror med väldigt stor annolikhet att du valt just tabbar som tabstopp. Varför man helst vill ha mellanslag istället för tabs har du själv fått se nu. Du ändrar detta genom att högerklicka fönstret med din källkod, välja Properties, välja fliken 'ASM file types' och se till att 'Insert spaces' är valt istället för 'Insert tabs'.
cosmox
EF Sponsor
Inlägg: 3856
Blev medlem: 6 januari 2004, 02:11:54
Ort: Hjälteby - Tjörn

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av cosmox »

Tack bos :)

Jag hade inte aktiverat "Disable case senetivity". Nu funkar det fint. Jag använder version 8.40 av MPLAB.

Finns det någon särskild anledning till att man vill skilja på små och stora bokstäver?

Ja, det var "warning" jag menade. Lite irriterande, istället för att jag får 302 nu så får jag en 205 istället :roll: Fast det är ju inte lika många som förut.

EDIT: Du hade även rätt angående tabbarna :)
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av Icecap »

Anledningen till att skilja mellan versaler och gemener är att kan kan namnge två olika variabler/labels till samma namn men med olika versal/gemen utan att de krockar.

Själv vill jag ha den funktion igång men kunde aldrig hitta på att döpa labels/variabler på det vis, de ska ha tydliga och unika namn, alltid! Orsaken till att jag vill ha denna funktion aktiv är att om något går fel i källkodfilen och en bit förstörs (klantighet/editorfel) kan man riskera att det blir så att det som är kvar är de rätta tecken fast "fel" på versal/gemen.

Utan den funktion (hårt koll) kan detta slinka igenom och bli skitsvår att hitta.

Men smak och tycke...
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av persika »

Det har berörts lite redan i denna tråd, angående kommentarer.
Kommentarer ska besvara frågan "varför".

I stället för:

Kod: Markera allt

        bcf             portb,5         ;Pin 5 på Port B = 0. 
Så:

Kod: Markera allt

        bcf             portb,5         ; Släck lysdioden
Nerre
Inlägg: 27257
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av Nerre »

Nu skrev han ju "Jag har valt att vara lite överförklarande i koden. Detta för att min hjärna ska komma ihåg vad förkortningarna betyder, där av har jag skrivit det i paranteser." och då tycker jag det är lite väl hårt att såga hans kommentarer.

Han visar ju att han VET att han kommenterar för mycket, och att han kommenterar som "anteckningar" för sig själv snarare än förklaringar för nån annan.

Många nybörjare brukar ju inte kommentera alls.


Själv brukar jag ofta skriva kommentarerna innan jag skriver koden, jag skriver så att säga ett pseudoprogram med kommentarer och sen lägger jag in kod som gör det som kommentarerna beskriver.
cosmox
EF Sponsor
Inlägg: 3856
Blev medlem: 6 januari 2004, 02:11:54
Ort: Hjälteby - Tjörn

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av cosmox »

Icecap: Ok, det var det jag misstänkte. Jag tror att jag håller mig till "case insensitive" i början.

Nerre: Det var ett ganska intressant tillvägagångssätt. Jag antar att det är fråga om större program då?


Jag satt ganska länge inatt med ett problem som finns i boken.
Man ska koppla fyra knappar och en 7-seg LED display till uCn och få displayen att visa den binära data som finns på Port A (där knapparna sitter alltså). Hur man ska göra detta får man klura ut helt själv vilket jag uppskattar då det kräver en hel del tankekraft då man bara fått hjälp med koden till ett program innan.

Är det normalt att ett sådant program blir ganska långt om man bara använder de instruktioner jag har lärt mig hittills?
Instruktionerna är: BCF, BSF, BTFSS, MOVLW, MOVWF, GOTO, SWAPF.

Jag har en fråga ang btfss. Kan den bara utföra check på enstaka bitar eller går det att göra på nibbles och bytes också?

En annan fråga. Jag behöver använda en byte i GPR. GPR0...osv finns inte deklarerat i min .inc fil. Ska den göra det? Är det bra att ha GP registren där i? Hur lägger man till det på bästa sätt?

Var det förresten korrekt att använda "banksel" på det vis jag skrev innan?
Nerre
Inlägg: 27257
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Börjat pyssla med assambler och behöver lite tips.

Inlägg av Nerre »

Nä, några "större" program skriver jag nästan aldrig, det är små husbehovsgrejer.

Jag programmerar inte särskilt mycket utan måste ofta kolla upp syntax och grejer, och då är det liksom enklare att skriva vad programmet ska göra först och sen fylla på lite i taget med kod som ger önskat resultat.

(Men lika ofta så slänger jag ihop småhack som jag ett par månader senare knappt fattar hur de funkar:-)
Skriv svar