Newbee och 16f877a, lite starthjälp behövs.
>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?
>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.
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.
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.
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.
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
__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

Ä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
__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
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...
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...
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.
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.
>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...
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...
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!
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!

> 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 :
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 !
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...
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 !
Tack! Ska iväg nu men hinner med en snabb fråga. Varför skrev du istället för 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 
Kod: Markera allt
movlw h'07'
Kod: Markera allt
movlw 0x07
