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

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26685
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

På 628/648 är det ingen A/D-omvandlare och därmed ingen ADCONx register. Det är inte sådär himla många portar heller vilker förklarar TRISC, TRISD och TRISE.

_CPD_OFF ska heta _DATA_CP_OFF
_WRT_OFF ska heta _WDT_OFF (lite osäker om det är samma, kolla datablad)
Användarvisningsbild
Xerbee
Inlägg: 179
Blev medlem: 27 april 2004, 17:43:44

Inlägg av Xerbee »

>På 628/648 är det ingen A/D-omvandlare och därmed ingen ADCONx register.

Nehe? Tar jag bort den här delen bara då eller?

Kod: Markera allt

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

>Det är inte sådär himla många portar heller vilker förklarar TRISC, TRISD och TRISE.

Tog bort dom ur koden bara

> _WRT_OFF ska heta _WDT_OFF (lite osäker om det är samma, kolla datablad)

På samma rad finns ju redan _WDT_OFF ska _WRT ändras eller bort?


Har försökt hitta det i databladet men då det här är första bladet jag läser för en PIC så har jag ingen aning om var jag kan tänkas hitta det. Gjorde en sökning samt skummade igenom det. Kan inte hitta något som verkar ha med det här att göra.
Användarvisningsbild
Icecap
Inlägg: 26685
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Ta bort _WRT, den har inget med _WDT att göra kom jag på.

Och kod-delen med att stänga ADC är det bara att ta bort.... fast det är lite skumt: jag brukar ställa den till 0x07 när jag inte använder ADC alls, 0x06 indikerar att ADC:ns ena ingång används?

Men om det inte används ADC alls är det bara att kasta dessa instruktioner.
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Jag brukar kör med följande rad...

__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC


byt ut

code:
--------------------------------------------------------------------------------
_XT_OSC
--------------------------------------------------------------------------------

mot

code:
--------------------------------------------------------------------------------
_INTRC_OSC_NOCLKOUT
--------------------------------------------------------------------------------

då kör du med den interna oscillatorn på 4MHz :)
Användarvisningsbild
Xerbee
Inlägg: 179
Blev medlem: 27 april 2004, 17:43:44

Inlägg av Xerbee »

Ändrade till

__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT

Och då kompilerar den en .hex till mig. Skickade över den och lampan lyser! Woho, framsteg iallafall. Frågan är nu, varför blinkar den inte?

Har kopplat enligt http://www.voti.nl/blink/pics/b-628-i-150.gif

Och hela koden ser ut såhär nu

Kod: Markera allt

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


   list      p=16f648a
   #include <p16f648a.inc>
   
    ;__CONFIG   _CP_OFF & _DEBUG_OFF & _WRT_OFF & _DATA_CP_OFF & _LVP_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
	
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT  

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 trisa
        clrf    trisa
        clrf    trisb			; 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 
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

För __CONFIG se slutet av INC filen för processorn (tillsammans med
rellevant avsnitt i databladet, så klart).

LED'en sitter på PORTA, alltså ska du läsa kapitlet om PORTA (surprice ! :-) )
Speciellt "Note 2" i den grå rutan och kodexemplen i "Example 5-1".
Lägg sedan till det som är rellevant i ditt fall (två kodrader från Exempel 5.1).

Det är det som jag ser på rak arm utan att testa koden...
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

håller med ojsan här: det är sällan nödvändigt att börja med avbrott i en nybörjarlektion. Har läst mängder med artiklar, introduktionsböcker osv (visserligen gäller detta mest x86 och inte PIC asm) och ingen tar upp avbrott först och det finns det anledningar till.
Jag säger inte att avbrott i sin enklaste form (som i dom flesta fall med PIC) är svårt utan snarare att det finns viktigare saker att ta upp först.

Men (även om inte ojsan antyder något annat) så är den kod du har skrivet sodjan helt klart väldigt nära optimal ur säkert både hastighet och storleks perspektiv.
Användarvisningsbild
Xerbee
Inlägg: 179
Blev medlem: 27 april 2004, 17:43:44

Inlägg av Xerbee »

>Lägg sedan till det som är rellevant i ditt fall (två kodrader från Exempel 5.1).

Har klurat på det lite och försökt läsa mig till vilka rader som saknas.

Hur jag än gör får jag den bara till att blinka en gång i början och sen inget mer. Klarar inte att läsa mig till det heller då jag inte har en aning om vad något gör och databladet gör mig inte klokare, allt är ju helt nytt så man har ingen aning om vad dom menar med allt.

Jag förstår att om jag lägger till _WDT_ON så går Watchdog Timer igång och jag kan läsa mig till vad den gör på ett ungefär. Men jag vet inte om jag behöver den för att min lysdiod ska blinka!

Finns det någon väldigt väldigt basic manual/guide på vad olika kommandon gör som man kan läsa? T.ex movwf, movlw, bsf, clrf? Kanske bara är jag som är dum men har faktiskt ingen aning om hur jag ska fixa det här...
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Tyvärr kan jag inte ge någon bra förklaring på enskilda kommandon eftersom jag håller mig till AVR istället för PIC, men en sak som de (och många andra uC) har gemensamt är att de har Watchdog-timer.
Kortfattat: En watchdog är precis vad det betyder, en vakthund som ser till att allt är som det ska! Tyvärr så är hunden lite väl nojjig, så man måste med jämna mellanrum säga till den att "allt är normalt, don't panic". Gör man inte det så reagerar hunden och reset:ar hela processorn. Vitsen med en watchdog är att man i ett större/komplext program medvetet kontaktar hunden. OM man av någon anledning fastnar i en evig while-loop och watchdog-timern löser ut så startar åtminstonde uC:n om.
SÅ: i ett blinka-led-program, som i princip är bombsäkert, så behövs inte någon watchdog, så om du har den aktiverad så kan det var den som är problemet. Dioden hinner tändas, men sen löser timern ut, processorn startar om.. osv osv..

När det gäller assemblerinstruktionerna är nog det bästa att att kika i manualen för PIC:arna, där finns en lista med alla kommandon och dess funktion.
Annars kanske den här sidan är till hjälp:
http://www.mikroelektronika.co.yu/engli ... 0_Uvod.htm

Oj.. vad mycket jag skrev... och inget speciellt konkret heller. Gonatt för idag! :?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Har klurat på det lite och försökt läsa mig till vilka rader som saknas.

OK, plocka fram databladet och slå upp sidan med PORTA.
I den grå rutan står det att RA0-3 är komparatoringångar efter reset.
I exempel 5-1 finns det två rader där komparatorerna stängs av och
pinnarna sätts som digitala I/O. MOVLW h'07' och MOVWF CMCON. Se
kommentartexten på samma rader i exemplet. Så lägg till detta i din kod :

Kod: Markera allt

start

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

        banksel cmcon        <<==
        movlw  h'07'         <<==
        movwf  cmcon         <<==

        banksel t1con
        movlw   b'00110001'
        movwf   t1con             ; Se datablad...

  
Banksel *kanske* inte behövs, om man kollar upp det. Men med banksel
vet man att det alltid fungerar...

Watchdog är avstängd ("WDT_OFF" i __CONFIG), och låt det vara så !
Finns ingen igentlig anledning att ha BrownOut "på" heller, så byt
gärna "_BODEN_ON" till "_BODEN_OFF"

> Finns det någon väldigt väldigt basic manual/guide på vad olika
> kommandon gör som man kan läsa? T.ex movwf, movlw, bsf, clrf?

Japp, det finns en beskrivning en bit in i varje datablad.

Sedan finns den ett kapitell i "Midrange Reference Manual" med en fylligare
beskrivning av instruktionerna. Gå till www.microchip.com, kolla under
"Reference Manual" i rutan "Support". Leta reda på " Instruction Set -
PICmicro Mid-Range MCU Family". Ladda ner !
Den har en hel sida/instruktion istället för 4 instruktioner/sida (i databladet).
Ofta upp till 4 exemepl till varje instruktion med olika "fall".

För övrigt är det bara "hard work". Läsa, testa, fundera, läsa mera o.s.v...
Finns *inga* genvägar. Och naturligtsvis, fråga här !
Användarvisningsbild
Xerbee
Inlägg: 179
Blev medlem: 27 april 2004, 17:43:44

Inlägg av Xerbee »

Tack! Ska iväg nu men hinner med en snabb fråga. Varför skrev du

Kod: Markera allt

movlw  h'07'
istället för

Kod: Markera allt

movlw 0x07
som det står i databladet? Står säkert i databladet så hinner ingen svara innan jag är hemma igen har jag lite att läsa :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Därför att det är ett mer konsekvent sätt stt skriva hex, bin, okt
och ascii värden. h'xx', b'xxxxxxxx', o'xxx', a'X'.

Står inte i databladet, utan i MPASM manualen.
Skriv svar