Newbee och 16f877a, lite starthjälp behövs.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
xenonfire
Inlägg: 144
Blev medlem: 4 april 2004, 14:12:42
Ort: Skaraborg

Newbee och 16f877a, lite starthjälp behövs.

Inlägg av xenonfire »

Hej.
Nu är man tillbaka igen och fattar ingen ting. Känner mej som IQ fiskmås.
Jag vill verkligen lära mej detta med PIC men jag kommer inte i gång.
Tycker det är svårt att få tag på matrial till att komma i gång.

Har under dagen byggt upp grunden på en labb-platta. Hittat en hexfil på nätet som jag sedan har programmerat in med hjälp av min programmerare.
http://www.voti.nl/blink/index_1.html#16F871

Med hjälp av denna hex-fil så har jag fått en lysdiod att blinka.
Och alla rekommenderar till att programmera i C, men jag kommer inte i gång. Språket som dom använder på sidan är skrivet i JAL.

Jag har tankat hem MPLAB och kollat på Jescab´s hemsida.
Där står det hur man skall börja att lägga upp allt.
Men det finns inga filer upplagda på Jescabs sida som jag har hittat och som kan hjälpa mej med att komma i gång med själva programmeringen.
Jag skulle vilja ha ett enkelt grundprogram att titta på skrivet i C och klart för MPLAB.

Om man har en tom *.asm fil i MPLAB kan man skriva C direkt där eller hur funkar det?

Finns det någon som har hjälpa mej att göra så att man får ut en *.hex fil ur MPLAB så att man kan få en lysdiod att blinka?

Jag har kört fast och skallen värken. :shock:
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Om du har laddat ner den fria versionen av MPLAB så kan du inte skriva i C eftersom den inte innehåller någon kompilator för programspråket C. Om du vill skriva i C måste du ladda ner demoversionen av MPLAB® C18, som tydligen ska funka i 60 dagar...
Hur som helst, om du aldrig "testat" PIC eller någon annan mikrokontroller förut så tycker jag att du definitivt ska börja i assembler även fast alla rekommenderar C! ..och jag tror andra här på forumet håller med mig.

Det första jag hittade på google ang. blinka led med MPLAB i c:
http://www.sprut.de/electronic/pic/c/c18/c18.html
Hoppas du kan tyska bättre än mig! 8)
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag har tankat hem MPLAB och kollat på Jescab´s hemsida.
> Där står det hur man skall börja att lägga upp allt.

Du har antagligen hittat min grunduppsättning av MPLAB. OK.

> Men det finns inga filer upplagda på Jescabs sida som jag har hittat och
> som kan hjälpa mej med att komma i gång med själva programmeringen.

På min "wish-list" finnsn att lägga upp några demon, men men...

Jag tycker inte du ska görda det onödigt svårt på en gång och
blanda in C i det hela redan nu. Kör med vanlig assembler ett tag tills
du börjar bli lite säkrare på PIC arkitekturen (något år eller så).

> Om man har en tom *.asm fil i MPLAB kan man skriva C direkt där eller hur funkar det?

I ASM filer skrivar man assembler.

> Finns det någon som har hjälpa mej att göra så att man får ut en *.hex
> fil ur MPLAB så att man kan få en lysdiod att blinka?

Jag ska slänga ihop ett exempel till en 877A, återkommer lite senare...

Personligen tycker jag att 877A (eller någon annan 40-pinnare) är lite
"klumpig" att börja labba med. 40-pinnarna är svårare att hantera på
labbplattan och det blir mindre utrymme över för annat.

16F682A (18-pinnar) är nog standard kretsen för nybörjare...
Användarvisningsbild
xenonfire
Inlägg: 144
Blev medlem: 4 april 2004, 14:12:42
Ort: Skaraborg

Inlägg av xenonfire »

Okej, då skall jag hålla mej till assembler så länge.
Enligt som jag har läst här på forumen så är det bättre att börja med en stor krets som har allt och inte köra fast på en mindre.
Att kretsen är stor gör inget, jag har stor labb-platta.*ler

Något enkelt programexempel i assembler, typ blinkade diod vore trevligt.
Har visserligen en fungerande Hex, men man vill förstå funktionen oxå.

Sagt det förr och säger det igen, Grymt snabba svar i detta forum!!!!!
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, här är ett fungerande exempel för 16F877A.

1. Konfigurera och skapa ett tomt projekt i MPLAB enligt min sida.
2. Kopiera in koden i en ny/tom ASM fil med valfritt namn.
3. Lägg till ASM filen till projektet.
4. Lägg till "Linker script" 16F877A.LKR till projektet (om du inte gjorde det i punkt 1 ovan).
5. kör "build all".
6. Skicka över HEX filen med hjälp av din programmerare.

Kolla gärna också MAP filen !
Speciellt hur var1/var2 resp var3/var4 är allokerade !
Jämför med minnesmappen i databladet...

Koden är inte så snygg och det är blandat svenska och engelska.
Vill du ha *snygg* kod kostar det 675:-/tim... :-)

Kod: Markera allt

;**********************************************************************
;   Enkelt blink-a-led, 16F877A.                                      *
;                                                                     *
;**********************************************************************
;    Files required:  P16F877A.INC                                    *
;                     16F877A.LNK                                     *
;                                                                     *
;**********************************************************************


	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.
        

;***************************************************************
My_vars         udata

var_1           res 1   ; en variablel...
var_2           res 1   ; en variablel till...

My_vars2        udata_shr

var_3           res 1   ; en variablel i "unbanked RAM"
var_4           res 1   ; en variablel till i "unbanked RAM"

;***************************************************************
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 porta
        comf    porta            ; Blinka !!

        banksel pir1
        bcf     pir1, tmr1if     ; clear avbrotts flagga.

        retfie



		END


Kod: Markera allt

MPLINK 4.03, Linker
Linker Map File - Created Thu Jul 13 20:44:32 2006

                                 Section Info
                  Section       Type    Address   Location Size(Bytes)
                ---------  ---------  ---------  ---------  ---------
             RESET_VECTOR       code   0x000000    program   0x000002
               INT_VECTOR       code   0x000004    program   0x000002
                   .cinit    romdata   0x000005    program   0x000004
                     MAIN       code   0x000007    program   0x000030
              ISR_ROUTINE       code   0x00001f    program   0x00000e
                  .config       code   0x002007    program   0x000002
                  MY_VARS      udata   0x000020       data   0x000002
                 MY_VARS2      udata   0x000070       data   0x000002



                              Program Memory Usage 
                               Start         End      
                           ---------   ---------      
                            0x000000    0x000000      
                            0x000004    0x000025      
                            0x002007    0x002007      
            36 out of 8453 program addresses used, program memory utilization is 0%



                              Symbols - Sorted by Name
                     Name    Address   Location    Storage File                     
                ---------  ---------  ---------  --------- ---------                
              ISR_ROUTINE   0x00001f    program     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                     LOOP   0x00001e    program     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                    START   0x000007    program     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                    VAR_1   0x000020       data     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                    VAR_2   0x000021       data     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                    VAR_3   0x000070       data     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                    VAR_4   0x000071       data     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm



                              Symbols - Sorted by Address
                     Name    Address   Location    Storage File                     
                ---------  ---------  ---------  --------- ---------                
                    START   0x000007    program     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                     LOOP   0x00001e    program     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
              ISR_ROUTINE   0x00001f    program     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                    VAR_1   0x000020       data     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                    VAR_2   0x000021       data     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                    VAR_3   0x000070       data     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
                    VAR_4   0x000071       data     static C:\DATA\proj\Blink-a-LED\16F877A\blink-a-led.asm
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

tjaa... vill man använda avbrott i ett exempel för nybörjare, så visst, okey... :roll:
xenonfire: Bli inte skrämd av sodjans kod.. det behövs egentligen inte sådär mycket för att blinka en LED, men det är klart det mest eleganta sättet att göra det på! =) Men som sagt... avbrottsrutiner ingår först i en senare kurs om PIC-programmering! :)
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Det där förstår jag inte alls !
Det går knappast att göra det med mindre kod.

Variabelallokeringarna kan plockas bort, de var bara exempel...

De första 9 raderna av main (efter start) är generell initiering och
behövs oavsett hur själva blinkningen går till.

De följande 6 kommandona är för att "starta" TMR1 avbrottet.

Koden för att "blinka" (ISR'en) är 3 instruktioner och 2 direktiv !

Alternativet är med programloopar, men det blir knappast
mindre kod, och inte speciellt enklare att förstå.

Interrupt är inte någon "överkurs", det är en central del av även de mest
enkla program, så att fuska sig runt det är bara att lura sig själv.

Jag menar, koden använder bara ** 7 ** olika instruktioner och 2-3 st
assembler direktiv !
Kan man inte lära sig *det här*, så ska man nog pyssla med något annat...

> det behövs egentligen inte sådär mycket för att blinka en LED,

OK, hur mycket behövs då ?
Släng ihop ett exempel så får vi se !
Användarvisningsbild
xenonfire
Inlägg: 144
Blev medlem: 4 april 2004, 14:12:42
Ort: Skaraborg

Inlägg av xenonfire »

Jag har lyckats göra en hexfil och programmerat in den i kretsen med ett fungerande resultat nu.

Tackar dej så hemskt mycket för din support Sodjan!!!!

Nu har jag ett grundprogram att labba med.
Lär bli en sen natt nu..*hehe
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Om du vill göra varianter på samma tema, så är det
koden i "isr_routine" du kan labba med. T.ex att ersätta
"comf porta" med något annat.

Notera att "comf porta" igentligen "blinkar" med alla 8 bitar
i porta, men det var enklast att göra så.

Men kan ersätta "comf" med en av "rotate" instruktionerna för
"rullande ljus" med flera lysdioder.

Vill du ha mer kontroll över hastigheten på blinkningarna
så har TMR2 bättre möjligheter till det. Lite mer att "sätta upp" dock,
det var därför jag tog TMR1 i första exemplet.

Om du gör något där du behöver ett par variabler, så har du
exempel på hur du allokerar dessa i min kod. Om du använder
"udata_shr" så behöver du inte bry dig om banking (via banksel)
för dessa. Det är dock bara 16 bytes som ligger i "un-banked RAM",
för övriga RAM behövs banksel, så att rätt bank är inställd.

Men, kör på lite så klarnar nog det mesta med tiden... :-)
Användarvisningsbild
xenonfire
Inlägg: 144
Blev medlem: 4 april 2004, 14:12:42
Ort: Skaraborg

Inlägg av xenonfire »

Hej.
Som sagt det blev en sen natt i natt.
Jag kom på att alla utgångar i portA blinkade.
Började labba med att flytta blinkandet till andra portar och även blinka med fler portar samtidigt. ( Detta är så löjligt enkla grejer för er, men för ett simpelt newbee så är detta med alla banker och kommandon en helt ny värld)

Nu när man har en fungerande asm fil så kan man börja labba lite.
Så jag testar att få till rinnande ljus och mixtra med timers.

Än en gång, ett stort tack för all hjälp! :wink:
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Nu när man har en fungerande asm fil så kan man börja labba lite.

Precis. Det brukar vara halv jobbet, att få en bas-struktur som fungera
med _CONFIG, de olika CODE och UDATA segmenten o.s.v.

Sedan kan man fokusera mer få själva funktionen i progrmmet...

> Jag kom på att alla utgångar i portA blinkade.

Japp. Det var p.g.a av att det finns en COMF (Complement File-register)
instruktion (som alltså inverterar alla bitar). Tyvärr finns det inte
motsvarande för en enstaka bit, då får man använda BCF och BSF och
ha en test på om biten var satt eller inte...
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Sodjan:
Ok, jag skulle väl ha varit tydligare.. med "sådär mycket" så menar jag inte kodmängd i bytes, utan snarare "så komplicerat". Att lära sig saker kan ju vara som att gå i en trapp... jag föredrog små trappsteg och du (Sodjan) hade större trappsteg helt enkelt! :)
De flesta blinka-led-program jag har sett ser ut ungfär såhär (pseudo):

Kod: Markera allt

main:
   [Sätt bit/port hög]
   pause_ms(100);
   [Sätt bit/port låg]
   pause_ms(100);
   goto main
>>Tyvärr finns det inte motsvarande för en enstaka bit, då får man använda BCF och BSF och ha en test på om biten var satt eller inte...

Det finns inte EN ensam maskininstruktion för att göra det, men med två instruktioner kan du toggla en enskild bit utan att påverka de andra:

Kod: Markera allt

movlw    B'00001000' ;toggle bit3
xorwf    flags,F
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Men det där är betydligt mer kod än vad jag hade.
Hur ser pause koden ut ??? Den har väl ca 8-10 instruktioner gissar jag.

Dessutom saknar du helt CONFIG, initiering av portar, bortkoppling
av analoga funktioner m.m.

Men helt rätt att xorwf kan användas där !
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

För att citera mig själv: med "sådär mycket" så menar jag inte kodmängd i bytes, utan snarare "så komplicerat".
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Och när du vill visa ett enklare program, så är det en stympad
pseudo-kodsnutt där en massa saknas !

Det är väl fullkomligt självklart att man med ett hemsnickrat
"pseudo-språk" kan göra vad som helst "enkelt"...

Mitt program var komplett med allt som behövs för att assemblera OK...
Skriv svar