Första försöket med wisp648 och 16f648
Första försöket med wisp648 och 16f648
Ja.. jag har enligt vad xwisp2w säger fått laddat över koden till en 16f648.
Koden är en blink a led kod.
Problemet är att jag inte riktigt har fattat hur jag skall göra uppkopplingen av min 16f648 för att jag skall kunna testa programmet!
pullup på mclr?
annat jag bör tänka på??
kan någon snabbt visa ett chema på hur jag bör koppla upp kretsen???
Koden är en blink a led kod.
Problemet är att jag inte riktigt har fattat hur jag skall göra uppkopplingen av min 16f648 för att jag skall kunna testa programmet!
pullup på mclr?
annat jag bör tänka på??
kan någon snabbt visa ett chema på hur jag bör koppla upp kretsen???
I princip behövs det inte mer än vad som behövs för att kunna
programmera kretsen. Om xwisp2w sa att programmeringen gick bra,
så ska åprogrammet också kunna köras direkt.
I alla fall om du valde intern oscillator. Annars så kan det behövas
en kristall och ett par kondingar, men det blir rena spekulationer eftersom
vi inte har en aning just nu hur din kod såg ut...
Om då låter Wisp648'an vara ansluten så ser den till att MCLR har
rätt nivå för att köra programmet. Annars (om du kopplar bort den)
så ska den anslutas till 5V genom att motstånd (så som kapitlet
om reset i databladet beskriver).
Om du har valt att ha LVP påslaget i din CONFIG (vilket snarast är
att betrakta som ett programeringsfel), så måste pinnen (PGM) vara
kopplat till GND (gärna genom ett motstånd).
För ett du även ska *se* att det körs, så behövs det naturligstvis
en LED och ett motstånd...
programmera kretsen. Om xwisp2w sa att programmeringen gick bra,
så ska åprogrammet också kunna köras direkt.
I alla fall om du valde intern oscillator. Annars så kan det behövas
en kristall och ett par kondingar, men det blir rena spekulationer eftersom
vi inte har en aning just nu hur din kod såg ut...
Om då låter Wisp648'an vara ansluten så ser den till att MCLR har
rätt nivå för att köra programmet. Annars (om du kopplar bort den)
så ska den anslutas till 5V genom att motstånd (så som kapitlet
om reset i databladet beskriver).
Om du har valt att ha LVP påslaget i din CONFIG (vilket snarast är
att betrakta som ett programeringsfel), så måste pinnen (PGM) vara
kopplat till GND (gärna genom ett motstånd).
För ett du även ska *se* att det körs, så behövs det naturligstvis
en LED och ett motstånd...

Sodjan:
Jag försökte kompilera din blinkaled-kod som du har på din sida rätt av. men jag får detta felmeddelande när jag försöker köra den i mpsim:
vad tror du det beror på??
Jag försökte kompilera din blinkaled-kod som du har på din sida rätt av. men jag får detta felmeddelande när jag försöker köra den i mpsim:
Kod: Markera allt
CORE-E0002: Stack under flow error occurred from instruction at 0x000000
Aha, OK. *den* koden...
Det är främst för att visa på skillnaderna mellan abs och reloc kod.
Jag har inte kollar att den är 100% korrekt för övrigt.
Jag tror inte att den fungerar rakt av med senare versioner av MPLAB.
Prova denna istället :
Det är främst för att visa på skillnaderna mellan abs och reloc kod.
Jag har inte kollar att den är 100% korrekt för övrigt.
Jag tror inte att den fungerar rakt av med senare versioner av MPLAB.
Prova denna istället :
Kod: Markera allt
;**********************************************************************
; Enkelt blink-a-led, 16F628A. *
; *
;**********************************************************************
; Files required: P16F628A.INC *
; 16F628A.LNK *
; *
;**********************************************************************
list p=16f628A
#include <p16f628A.inc>
__CONFIG _DATA_CP_OFF & _CP_ON & _LVP_OFF & _BODEN_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLRE_ON
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.
;***************************************************************
MAIN CODE
start
banksel cmcon
movlw h'07'
movwf cmcon ; Stäng av ADC.
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 med hela PORTA!
banksel pir1
bcf pir1, tmr1if ; återställ avbrotts flagga.
retfie
end
jag försöker ta mig vidare... tänkte försöka kolla om en pinne är hög eller låg.
För att få pinnen hög eller låg tänkte jag använda mig av en vanlig tryckknapp. Hur bör jag koppla den?? ska jag hålla pinnen hög genom ett motstånd och sedan när jag trycker på knappen sätta pinnen direkt mot "jord" eller hur bör man göra... vad bör det va för värden på motstånden?!
För att få pinnen hög eller låg tänkte jag använda mig av en vanlig tryckknapp. Hur bör jag koppla den?? ska jag hålla pinnen hög genom ett motstånd och sedan när jag trycker på knappen sätta pinnen direkt mot "jord" eller hur bör man göra... vad bör det va för värden på motstånden?!
> ska jag hålla pinnen hög genom ett motstånd och sedan när jag trycker på knappen sätta pinnen direkt mot "jord"
Ja, eller tvärtom. Beror på om du vill ha 1 eller 0 när ingen trycker...
> vad bör det va för värden på motstånden?!
Inte kritiskt. Allt mellan 10K och 1M lär fungera.
Kom också ihåg att alla knappar studsar en hel del. Kan vara
viktigt beroende på vad din kod gör...
Ja, eller tvärtom. Beror på om du vill ha 1 eller 0 när ingen trycker...
> vad bör det va för värden på motstånden?!
Inte kritiskt. Allt mellan 10K och 1M lär fungera.
Kom också ihåg att alla knappar studsar en hel del. Kan vara
viktigt beroende på vad din kod gör...
tvärt om... hur menar du då?? att håll den låg genom ett motstånd och genom knappen sätta pinnen mot 5v+??? eller skall motståndet alltid vara på + sidan???
detta är koden jag tänkte köra:
detta är koden jag tänkte köra:
Kod: Markera allt
;**********************************************************************
; This file is a basic code template for object module code *
; generation on the PIC16F648A. This file contains the *
; basic code building blocks to build upon. *
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler and linker (Document DS33014). *
; *
; Refer to the respective PIC data sheet for additional *
; information on the instruction set. *
; *
;**********************************************************************
; *
; Filename: xxx.asm *
; Date: *
; File Version: *
; *
; Author: *
; Company: *
; *
; *
;**********************************************************************
; *
; Files required: P16F648A.INC *
; *
; *
; *
;**********************************************************************
; *
; Notes: *
; *
; *
; *
; *
;**********************************************************************
list p=16F648A ; list directive to define processor
#include <p16F648A.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT
; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.
;***** VARIABLE DEFINITIONS (examples)
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
pclath_temp RES 1 ; variable used for context saving
delay_var RES 1 ; variable used for delay counter
;**********************************************************************
RESET_VECTOR CODE 0x0000 ; processor reset vector
goto start ; go to beginning of program
INT_VECTOR CODE 0x0004 ; interrupt vector location
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into W register
movwf pclath_temp ; save off contents of PCLATH register
; isr code can go here or be located as a call subroutine elsewhere
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
MAIN_PROG CODE
start
; remaining code goes here
banksel trisb
clrf trisb
banksel trisa
clrf trisa
bsf trisa, 0
banksel portb
test
movlw b'01010101'
movwf portb
test1
btfss porta, 0
goto test1 ; loop forever, remove this instruction, for test only
movlw b'10101010'
movwf portb
test2
btfsc porta, 0
goto test2
goto test
; initialize eeprom locations
EE CODE 0x2100
DE 0x00, 0x01, 0x02, 0x03
END ; directive 'end of program'
> att håll den låg genom ett motstånd och genom knappen sätta pinnen mot 5v+?
Exakt !
Men det är vanligare att ha en pullup och switch till GND.
Om du använder en PIC som har inbyggda "weak pullup" på några
pinnar så kan du spara in det externa motståndet.
> eller skall motståndet alltid vara på + sidan???
Motståndet "drar" åt ett håll och switchen åt det andra. Och som sagt,
pull *up* är det vanligaste av anledningar som går lite utanför
den här tråden...
> detta är koden jag tänkte köra:
OK, sätt en kommentar på varje rad så vet man vad du vill att de ska göra.
Men allt mellan "interrupt" och "main code" kan plockas bort, den kommer i alla
fall aldrig att köras eftersom du inte använder interrupt.
Sen så kommer det i alla fall inte att fungera.
Läs på på sidan "PORT A" i databladet. Speciellt om CMCON.
Och kolla kodexempel 5-1 på samma sida. Du har nog slarvat över
den där sidan lite, det är en av de viktigaste sidorna i databladet och det
som står där *måste* vara kristallklart, annars får du problem....
Exakt !
Men det är vanligare att ha en pullup och switch till GND.
Om du använder en PIC som har inbyggda "weak pullup" på några
pinnar så kan du spara in det externa motståndet.
> eller skall motståndet alltid vara på + sidan???
Motståndet "drar" åt ett håll och switchen åt det andra. Och som sagt,
pull *up* är det vanligaste av anledningar som går lite utanför
den här tråden...
> detta är koden jag tänkte köra:
OK, sätt en kommentar på varje rad så vet man vad du vill att de ska göra.
Men allt mellan "interrupt" och "main code" kan plockas bort, den kommer i alla
fall aldrig att köras eftersom du inte använder interrupt.
Sen så kommer det i alla fall inte att fungera.
Läs på på sidan "PORT A" i databladet. Speciellt om CMCON.
Och kolla kodexempel 5-1 på samma sida. Du har nog slarvat över
den där sidan lite, det är en av de viktigaste sidorna i databladet och det
som står där *måste* vara kristallklart, annars får du problem....
