flat assembler
Message board for the users of flat assembler.
Index
> Non-x86 architectures > macro to code for PIC Goto page 1, 2 Next |
Author |
|
edfed 15 Oct 2008, 12:07
hello, do you think it is possible to use fasm and a macro include to code for PIC16f876 for example?
instructions are only 35, all on a fixed size, 14 bits. it is because i try to code uswing MPLAB ide, and it is boring, it don't have the same syntax as fasm. [edit] the answer is YES, definitivelly YES!! just look here: http://board.flatassembler.net/topic.php?p=126261#126261 then, you can definitively kick the MPLAB compiler, and Horrible syntax. Last edited by edfed on 02 Mar 2011, 12:51; edited 1 time in total |
|||
15 Oct 2008, 12:07 |
|
revolution 15 Oct 2008, 13:00
Sure, it can probably be done with macros, although I haven't specifically looked into it, so maybe not also.
But even if it can be done I think the more important thought is what about all the debug info that you lose? The MPLAB debugger/simulator/ICE/assembler package is nicely complete. Something that a set of fasm macros could never hope to duplicate. Also, perhaps you can consider creating fasmpic. Just take the fasmarm source code as the starting point and start coding. I would love to see another version of fasm done in this way. |
|||
15 Oct 2008, 13:00 |
|
shoorick 31 Oct 2008, 06:10
i have not programming ARM and PIC, but 8080 and 8049. 8049 i've been programming with SBASM, while for 8080 i've wrote macros, but think they are not safe, as they replace some x86 instructions, but do not protect against occasional usage of some wrong combinations or x86 instructions, which stay intouched.
also, it is interesting, how to write macro for instruction, which uses # in parameter, like this: Code: ADD A,#$12 - is such thing present in fasmarm? i'll make look in there! |
|||
31 Oct 2008, 06:10 |
|
edfed 31 Oct 2008, 07:28
Quote: also, it is interesting, how to write macro for instruction, which uses # in parameter, like this: it is not a pb as i plan to use the same syntax as fasm, then, no #, no $ nothing like mplab syntax. i just need to learn fasm macroinstructions and then, create the macro to have x86 instructions PIC compiled using fasm. |
|||
31 Oct 2008, 07:28 |
|
shoorick 31 Oct 2008, 07:47
in this case yes, but if you plan to use existing source or share own - then pb will appear
in 8080 macros i have used parameters directly, while # is special symbol - i have not study fasm macro language too deep yet. 8080 assembler is very easy to implement with macros - mnemonic says exactly what parameters are (unlike x86 or say z80). in other case it is necesary to parse parameters to know their type to choose valid opcode. ++++++++++++++ i see this instruction in fasmarm readme - maybe it will help to do the same: Code: eor r0,r5,#0xfffffffc Last edited by shoorick on 31 Oct 2008, 08:01; edited 1 time in total |
|||
31 Oct 2008, 07:47 |
|
revolution 31 Oct 2008, 07:50
shoorick wrote:
|
|||
31 Oct 2008, 07:50 |
|
shoorick 31 Oct 2008, 08:07
already see....
maybe you're right. it's not hard to replace all "#$" with "$". i just though about compatibility with existing sources. but do i need to think hard about this compatibility if i have about 5 of these 8035/48/49, and then do i realy need to think about writing macro maybe SBASM will be enough to make 30-bytes binary regards! |
|||
31 Oct 2008, 08:07 |
|
edfed 31 Oct 2008, 15:56
it's not hard to replace #$ by nothing.
just see the fasm syntax, the C syntax, the french syntax, etc etc .. one interresting question is: why some assembler wants #$ before a number? note that a number always start with a number, then, who had this fool idea? maybe someone that found so simple ( not very serious if you are a brainfuckin scientist) to use it, and invented a strange thing like #$ but recenter the discution now. the problem is not to use existing code for pic without modifications, but to use my dear x86 syntax, using conditional macroinstructions to generate the good hexadecimal string. today, i've implemented: Code: cli sti iret ret jmp and as i don't use fasm to compile for now, i use the poor mpasm syntax. then, as i don't know if there is a conditional macro and totally don't care, i invented poor mnemonics: Code: movr ; do it register to register andr addr subr orr ;and will try to invent retp ; return with parameter ; because it don't exists in x86, but can be found if for example you write mov eax,parameter ret i insist, the goal is not to be compatible with existing source, all have to be re-writen. my favourite game is to reinvent the weel everydays in a new way |
|||
31 Oct 2008, 15:56 |
|
revolution 31 Oct 2008, 16:10
edfed wrote: my favourite game is to reinvent the weel everydays in a new way |
|||
31 Oct 2008, 16:10 |
|
edfed 03 Nov 2008, 17:19
another interresting feature of fasm & picmacro:
instead of editng asm file with mplabide and compile with mpasmwin, only one program is needed to do both. fasmw. please note that fasmw.exe is only 9 letters but mplabide.exe + mpasmwin.exe are together 24 letters, then, fasm use less memory than mpxxxxxxx.exe family. f9 or ctrl+f9 compile ( cannot execute?) compile as a .HEX file. can be done by hand, but i prefer to use fasm. |
|||
03 Nov 2008, 17:19 |
|
edfed 20 Feb 2011, 01:05
finally, i tried just to generate binary words using macros.
and finally, hxd can convert in .HEX 16 file to go under icprog. i transfered OK a first test code. but the led connected to GPIO5 don't turn on... then, i should work a little more on the code to obtain my first blinking led, coded and compiled with fasmw, converted with hxd (for the moment) and transfered with icprog... not an easy way, but if it can give good results, it will be very cool. Code: ;PIC 12F675 instruction set ; ;ADDWF f, d Add W and f 1 00 0111 dfff ffff C,DC,Z ;ANDWF f, d AND W with f 1 00 0101 dfff ffff Z ;CLRF f Clear f 1 00 0001 1fff ffff Z ;CLRW - Clear W 1 00 0001 0xxx xxxx Z ;COMF f, d Complement f 1 00 1001 dfff ffff Z ;DECF f, d Decrement f 1 00 0011 dfff ffff Z ;DECFSZ f, d Decrement f, Skip if 0 1(2) 00 1011 dfff ffff ;INCF f, d Increment f 1 00 1010 dfff ffff Z ;INCFSZ f, d Increment f, Skip if 0 1(2) 00 1111 dfff ffff ;IORWF f, d Inclusive OR W with f 1 00 0100 dfff ffff Z ;MOVF f, d Move f 1 00 1000 dfff ffff Z ;MOVWF f Move W to f 1 00 0000 1fff ffff ;NOP - No Operation 1 00 0000 0xx0 0000 ;RLF f, d Rotate Left f through Carry 1 00 1101 dfff ffff C ;RRF f, d Rotate Right f through Carry 1 00 1100 dfff ffff C ;SUBWF f, d Subtract W from f 1 00 0010 dfff ffff C,DC,Z ;SWAPF f, d Swap nibbles in f 1 00 1110 dfff ffff ;XORWF f, d Exclusive OR W with f 1 00 0110 dfff ffff Z ; ; ;BCF f, b Bit Clear f 1 01 00bb bfff ffff ;BSF f, b Bit Set f 1 01 01bb bfff ffff ;BTFSC f, b Bit Test f, Skip if Clear 1 (2) 01 10bb bfff ffff ;BTFSS f, b Bit Test f, Skip if Set 1 (2) 01 11bb bfff ffff ; ; ;ADDLW k Add literal and W 1 11 111x kkkk kkkk C,DC,Z ;ANDLW k AND literal with W 1 11 1001 kkkk kkkk Z ;CALL a Call subroutine 2 10 0aaa aaaa aaaa ;CLRWDT - Clear Watchdog Timer 1 00 0000 0110 0100 TO,PD ;GOTO a Go to address 2 10 1aaa aaaa aaaa ;IORLW k Inclusive OR literal with W 1 11 1000 kkkk kkkk Z ;MOVLW k Move literal to W 1 11 00xx kkkk kkkk ;RETFIE - Return from interrupt 2 00 0000 0000 1001 ;RETLW k Return with literal in W 2 11 01xx kkkk kkkk ;RETURN - Return from Subroutine 2 00 0000 0000 1000 ;SLEEP - Go into Standby mode 1 00 0000 0110 0011 TO,PD ;SUBLW k Subtract W from literal 1 11 110x kkkk kkkk C,DC,Z ;XORLW k Exclusive OR literal with W 1 11 1010 kkkk kkkk Z ; f = register adress, 7 bits ; d = destination, 1=reg, 0=W, 1 bit ; b = bit adress, 3 bits ; k = immediate value, 8 bits ; a = code adress, 11 bits REG=1 W=0 INDF1 equ 00h TMR0 equ 01h PCL equ 02h STATUS equ 03h .rp0 equ 5 .c equ 0 .dc equ 1 .z equ 2 FSR equ 04h GPIO equ 05h .5 equ 5 .4 equ 4 .3 equ 3 .2 equ 2 .1 equ 1 .0 equ 0 PCLATH equ 0ah INTCON equ 0bh PIR1 equ 0ch TMR1L equ 0eh TMR1H equ 0fh T1CON equ 10h CMCON equ 19h ADRESH3 equ 1eh ADCON03 equ 1fh al equ 20h ah equ 21h bl equ 22h bh equ 23h cl equ 24h ch equ 25h dl equ 26h dh equ 27h INDF1 equ 80h OPTION equ 81h PCL equ 82h STATUS equ 83h FSR equ 84h TRISIO equ 85h .5 equ 5 .4 equ 4 .3 equ 3 .2 equ 2 .1 equ 1 .0 equ 0 .input equ 1 .output equ 0 PCLATH equ 8ah INTCON equ 8bh PIE1 equ 8ch PCON equ 8eh OSCCAL equ 90h WPU equ 95h IOC equ 96h VRCON equ 99h EEDATA equ 9ah EEADR equ 9bh EECON1 equ 9ch EECON21 equ 9dh ADRESL3 equ 9eh ANSEL3 equ 9fh al equ 20h ah equ 21h bl equ 22h bh equ 23h cl equ 24h ch equ 25h dl equ 26h dh equ 27h macro addwf f,d {dw 0700h or (f and 07fh) or ((d and 1 )shl 7)} macro andwf f,d {dw 0500h or (f and 07fh) or ((d and 1 )shl 7)} macro clrf f {dw 0180h or (f and 07fh)} macro clrw {dw 0100h} macro comf f,d {dw 0900h or (f and 07fh) or ((d and 1 )shl 7)} macro decf f,d {dw 0300h or (f and 07fh) or ((d and 1 )shl 7)} macro decfsz f,d {dw 0b00h or (f and 07fh) or ((d and 1 )shl 7)} macro incf f,d {dw 0a00h or (f and 07fh) or ((d and 1 )shl 7)} macro incfsz f,d {dw 0f00h or (f and 07fh) or ((d and 1 )shl 7)} macro iorwf f,d {dw 0400h or (f and 07fh) or ((d and 1 )shl 7)} macro movf f,d {dw 0800h or (f and 07fh) or ((d and 1 )shl 7)} macro movwf f {dw 0080h or (f and 07fh)} macro nop {dw 0000h} macro rlf f,d {dw 0d00h or (f and 07fh) or ((d and 1 )shl 7)} macro rrf f,d {dw 0c00h or (f and 07fh) or ((d and 1 )shl 7)} macro subwf f,d {dw 0200h or (f and 07fh) or ((d and 1 )shl 7)} macro swapf f,d {dw 0e00h or (f and 07fh) or ((d and 1 )shl 7)} macro xorwf f,d {dw 0600h or (f and 07fh) or ((d and 1 )shl 7)} macro bcf f,b {dw 1000h or (f and 07fh) or ((b and 7 )shl 7)} macro bsf f,b {dw 1400h or (f and 07fh) or ((b and 7 )shl 7)} macro btfsc f,b {dw 1800h or (f and 07fh) or ((b and 7 )shl 7)} macro btfss f,b {dw 1c00h or (f and 07fh) or ((b and 7 )shl 7)} macro addlw k {dw 3e00h or (k and 0ffh)} macro andlw k {dw 3900h or (k and 0ffh)} macro call a {dw 2000h or (a and 7ffh)} macro clrwdt {dw 0064h} macro goto a {dw 2800h or (a and 7FFh)} macro iorlw k {dw 3800h or (k and 0ffh)} macro movlw k {dw 3000h or (k and 0ffh)} macro retfie {dw 0009h} macro retlw k {dw 3400h or (k and 0ffh)} macro return {dw 0008h} macro sleep {dw 0063h} macro sublw k {dw 3c00h or (k and 0ffh)} macro xorlw k {dw 3a00h or (k and 0ffh)} org 0 boot: goto @f nop nop nop org 4 interrupt: retfie @@: bsf STATUS,5 movlw 7 movf TRISIO,REG bcf STATUS,5 movlw 0 mainloop: bsf GPIO,5 addlw 1 btfss STATUS,2 goto mainloop bcf GPIO,5 @@: addlw 1 btfss STATUS,2 goto @b goto mainloop here, i see it is very easy to build a fixed size opcode ith fasm macro. but i don't have the blinking led for now, then.... |
|||
20 Feb 2011, 01:05 |
|
edfed 22 Feb 2011, 15:17
good news, but as i read the full post, it appears that only one post will be usefull here, the current one and next.
then, i think it will be the time to open a new post. i compiled a source code from the disassembly of a demo i found on internet. it makes blink a led on pin 0 of GPIO (portA) of a 12F675. i compared original binary with my compiled binary, and apparenttly, no problem, the compilation gives exactlly the same result. then, the parser macro itself is OK. Code: format binary as 'pic' ;PIC 12F675 instruction set ; ;ADDWF f, d Add W and f 1 00 0111 dfff ffff C,DC,Z ;ANDWF f, d AND W with f 1 00 0101 dfff ffff Z ;CLRF f Clear f 1 00 0001 1fff ffff Z ;CLRW - Clear W 1 00 0001 0xxx xxxx Z ;COMF f, d Complement f 1 00 1001 dfff ffff Z ;DECF f, d Decrement f 1 00 0011 dfff ffff Z ;DECFSZ f, d Decrement f, Skip if 0 1(2) 00 1011 dfff ffff ;INCF f, d Increment f 1 00 1010 dfff ffff Z ;INCFSZ f, d Increment f, Skip if 0 1(2) 00 1111 dfff ffff ;IORWF f, d Inclusive OR W with f 1 00 0100 dfff ffff Z ;MOVF f, d Move f 1 00 1000 dfff ffff Z ;MOVWF f Move W to f 1 00 0000 1fff ffff ;NOP - No Operation 1 00 0000 0xx0 0000 ;RLF f, d Rotate Left f through Carry 1 00 1101 dfff ffff C ;RRF f, d Rotate Right f through Carry 1 00 1100 dfff ffff C ;SUBWF f, d Subtract W from f 1 00 0010 dfff ffff C,DC,Z ;SWAPF f, d Swap nibbles in f 1 00 1110 dfff ffff ;XORWF f, d Exclusive OR W with f 1 00 0110 dfff ffff Z ; ; ;BCF f, b Bit Clear f 1 01 00bb bfff ffff ;BSF f, b Bit Set f 1 01 01bb bfff ffff ;BTFSC f, b Bit Test f, Skip if Clear 1 (2) 01 10bb bfff ffff ;BTFSS f, b Bit Test f, Skip if Set 1 (2) 01 11bb bfff ffff ; ; ;ADDLW k Add literal and W 1 11 111x kkkk kkkk C,DC,Z ;ANDLW k AND literal with W 1 11 1001 kkkk kkkk Z ;CALL a Call subroutine 2 10 0aaa aaaa aaaa ;CLRWDT - Clear Watchdog Timer 1 00 0000 0110 0100 TO,PD ;GOTO a Go to address 2 10 1aaa aaaa aaaa ;IORLW k Inclusive OR literal with W 1 11 1000 kkkk kkkk Z ;MOVLW k Move literal to W 1 11 00xx kkkk kkkk ;RETFIE - Return from interrupt 2 00 0000 0000 1001 ;RETLW k Return with literal in W 2 11 01xx kkkk kkkk ;RETURN - Return from Subroutine 2 00 0000 0000 1000 ;SLEEP - Go into Standby mode 1 00 0000 0110 0011 TO,PD ;SUBLW k Subtract W from literal 1 11 110x kkkk kkkk C,DC,Z ;XORLW k Exclusive OR literal with W 1 11 1010 kkkk kkkk Z ; f = register adress, 7 bits ; d = destination, 1=reg, 0=W, 1 bit ; b = bit adress, 3 bits ; k = immediate value, 8 bits ; a = code adress, 11 bits REG=1 W=0 INDF1 equ 00h TMR0 equ 01h PCL equ 02h STATUS equ 03h rp0 equ 5 c equ 0 dc equ 1 z equ 2 FSR equ 04h GPIO equ 05h PCLATH equ 0ah INTCON equ 0bh PIR1 equ 0ch TMR1L equ 0eh TMR1H equ 0fh T1CON equ 10h CMCON equ 19h ADRESH3 equ 1eh ADCON03 equ 1fh al equ 20h ah equ 21h bl equ 22h bh equ 23h cl equ 24h ch equ 25h dl equ 26h dh equ 27h INDF1 equ 80h OPTION equ 81h PCL equ 82h STATUS equ 83h FSR equ 84h TRISIO equ 85h input equ 1 output equ 0 PCLATH equ 8ah INTCON equ 8bh PIE1 equ 8ch PCON equ 8eh OSCCAL equ 90h WPU equ 95h IOC equ 96h VRCON equ 99h EEDATA equ 9ah EEADR equ 9bh EECON1 equ 9ch EECON21 equ 9dh ADRESL3 equ 9eh ANSEL3 equ 9fh al equ 20h ah equ 21h bl equ 22h bh equ 23h cl equ 24h ch equ 25h dl equ 26h dh equ 27h macro dw value {db (((value and 03f00h ) shr 8) and 0ffh),(value and 0ffh)} macro addwf f,d {dw 0700h or (f and 07fh) or ((d and 1 )shl 7)} macro andwf f,d {dw 0500h or (f and 07fh) or ((d and 1 )shl 7)} macro clrf f {dw 0180h or (f and 07fh)} macro clrw {dw 0100h} macro comf f,d {dw 0900h or (f and 07fh) or ((d and 1 )shl 7)} macro decf f,d {dw 0300h or (f and 07fh) or ((d and 1 )shl 7)} macro decfsz f,d {dw 0b00h or (f and 07fh) or ((d and 1 )shl 7)} macro incf f,d {dw 0a00h or (f and 07fh) or ((d and 1 )shl 7)} macro incfsz f,d {dw 0f00h or (f and 07fh) or ((d and 1 )shl 7)} macro iorwf f,d {dw 0400h or (f and 07fh) or ((d and 1 )shl 7)} macro movf f,d {dw 0800h or (f and 07fh) or ((d and 1 )shl 7)} macro movwf f {dw 0080h or (f and 07fh)} macro nop {dw 0000h} macro rlf f,d {dw 0d00h or (f and 07fh) or ((d and 1 )shl 7)} macro rrf f,d {dw 0c00h or (f and 07fh) or ((d and 1 )shl 7)} macro subwf f,d {dw 0200h or (f and 07fh) or ((d and 1 )shl 7)} macro swapf f,d {dw 0e00h or (f and 07fh) or ((d and 1 )shl 7)} macro xorwf f,d {dw 0600h or (f and 07fh) or ((d and 1 )shl 7)} macro bcf f,b {dw 1000h or (f and 07fh) or ((b and 7 )shl 7)} macro bsf f,b {dw 1400h or (f and 07fh) or ((b and 7 )shl 7)} macro btfsc f,b {dw 1800h or (f and 07fh) or ((b and 7 )shl 7)} macro btfss f,b {dw 1c00h or (f and 07fh) or ((b and 7 )shl 7)} macro addlw k {dw 3e00h or (k and 0ffh)} macro andlw k {dw 3900h or (k and 0ffh)} macro call a {dw 2000h or ((a/2) and 7ffh)} macro clrwdt {dw 0064h} macro goto a {dw 2800h or ((a/2) and 7FFh)} macro iorlw k {dw 3800h or (k and 0ffh)} macro movlw k {dw 3000h or (k and 0ffh)} macro retfie {dw 0009h} macro retlw k {dw 3400h or (k and 0ffh)} macro return {dw 0008h} macro sleep {dw 0063h} macro sublw k {dw 3c00h or (k and 0ffh)} macro xorlw k {dw 3a00h or (k and 0ffh)} macro null {dw 3fffh} and lets compile this file, working on real hardware. Code: include 'p12fxx.inc' start: goto @f null null null @@: movlw 0ffh movwf 21h movlw 0ffh movwf 22h bcf 21h,0 call initGP.2 @@: movlw 5 call @f bsf 23h,0 call initGP.1 movlw 5 call @f bcf 23h,0 call initGP.1 goto @b goto $ @@: movwf 24h movf 24h,W movwf 25h movlw 64h movwf 26h movlw 0Ah goto @f @@: movwf 27h movlw 7Fh movwf 28h mainloop: movf 26h,W movwf 2Ah .1: movf 25h,W movwf 29h .2: movlw 17h .3: addwf 28h,W btfsc STATUS,c goto .3 decfsz 29h,REG goto .2 decfsz 2Ah,REG goto .1 decfsz 27h,REG goto mainloop return initGP: .1: goto @f @@: movf 23h,W movwf GPIO ;PORTA return .2: goto @f @@: movf 21h,W dw 65h ;TRIS PORTA return i just can't find the exact mnemonic for 65h opcode, assumed to be TRIS PORTA, but i don't find the reference in pic datasheet... just for the fun, i tested to increase the speed of the blink, and it works, the led blinktwice faster after changing just a single value in the code, then, yeah, i am very happy!!! the original file was disassembled with icprog, maybe it is a 16F84 specific instruction, and undocumented in later MCU. the method to flash the PIC is simple, but a little boring: open binary file with hxd copy the hexadecimal field paste it in a icprog buffer set fuses and oscillator calibration value flash device using RCD programmer as JDM device and it is ok. but the goal is to have: 1: compile 2: flash device directlly from fasm menu. this goal tend to be very hard to do for me, then, i will just consider this next todo list for the moment: 1: .HEX conversion 2: sections creation, because pic files needs to contain the content of every memory zones. program eeprom, data eeprom, fuses, and oscillator calibration value. 3: the complete set of labels about the target MCU. 4: and later, X86 based macro instruction, to code with our dear old X86 mnemonics. |
|||
22 Feb 2011, 15:17 |
|
shoorick 22 Feb 2011, 16:43
there is the ready hex2bin convertor (converts in both directions) - search inet.
will you continue with x51 and AVR? |
|||
22 Feb 2011, 16:43 |
|
edfed 23 Feb 2011, 00:51
found a solution, just load file as .bin under icprog, it is possible, reverse byte order or not (depend on the macro dw used for that )
i've also found a way to know instruction set as recognised by icprog it appears that there are 2 undocumented instructions macro option {dw 0062h} macro tris reg {dw 0060h and reg} ;reg=1,5,6 or 7 microchip says to don't use these instruction to be compatible with future products... but who cares? if it works on you target, use them because it will save you 2 instructions (bank switch forward and back). i tested tris GPIO with succes on 12F675. and there are 4 nop in total opcodes 0, 20h, 40h and 60h apparently, the instruction set of all pic 14 bits is the same. then, the include file is named now pic14.inc for other MCU/CPU, i have a SEGA megadrive (68000+Z80), some 6809, and other things. for the programming, i also need to do a parallel eprom programer (27C512, etc...). i son't know what MCU to use, i still need to do something with PIC before to think about programming other device. i am curious to program for ARM, X51 or any assembler based component. Last edited by edfed on 02 Mar 2011, 12:54; edited 1 time in total |
|||
23 Feb 2011, 00:51 |
|
Dex4u 23 Feb 2011, 01:47
Great work edfed, it would be great to use fasm for PIC, let me know if you have a basic board layout and i build one and help you test and debug.
I would like to code a DexOS port. |
|||
23 Feb 2011, 01:47 |
|
shoorick 23 Feb 2011, 05:53
edfed wrote: i also need to do a parallel eprom programer (27C512, etc...). if you do not have a lot of UV EPROMs, i would suggest you to make adaptor to use flash instead of them to not boring yourself with erasing, like on the picture below (it is 32 pin adapter, but you will need 28 pin, unused address pins of plcc socket connect to the ground). also, flash programming is a bit easier then UV EPROMs, as flash has internal timing. _________________ UNICODE forever! Last edited by shoorick on 31 Jan 2016, 19:59; edited 1 time in total |
|||
23 Feb 2011, 05:53 |
|
edfed 23 Feb 2011, 16:24
i have mainly uvproms, but i think they will become components for some artwork, because it is a little obsolete.
i have some flash proms from PC mother boards, then, it is the best compromise if i want to do some advanced things like disasm a BIOS ROM... flash it...things like that. about the pic14bit.zip file, it can be found here: http://fool.codercat.org/pic14bit.zip this file is huge, then i cannot put it here. there is a program to draw PCB inside (sprint layout), with the icsp file at "sprint/macro/interface.icsp.lay' maybe it will be interresting to present the project as plain html file, with illustrations and downloads links. Last edited by edfed on 25 Sep 2011, 21:34; edited 1 time in total |
|||
23 Feb 2011, 16:24 |
|
edfed 24 Feb 2011, 15:41
today, just tested to make some better led management and code cleaning...
apparentlly, the code generated by HLL for pic is... say nothing it is better: then, lets go for the last code: Code: include 'pic14.inc' start: goto @f nop nop nop @@: movlw 0ffh ;set all bits to 1 movwf 21h movlw 0ffh ;what for? i don't know movwf 22h ; but can save 2 instrucitons bcf 21h,0 ;clear bits corresponding to the pin to use as outputs bcf 21h,4 bcf 21h,5 movf 21h,W tris GPIO ;give it to GPIO controler, tris is undocumented, but i think is equivalent to movf TRISIO in bank 1, without the need to switch a bank @@: movlw 1 call delay bsf 23h,0 ;white led ON call GP.out movlw 1 call delay bcf 23h,0 ;white led OFF call GP.out movlw 1 call delay bsf 23h,4 ;green led ON call GP.out movlw 1 call delay bcf 23h,4 ;green led OFF bsf 23h,5 ;red led ON call GP.out movlw 1 call delay bcf 23h,5 ;red led OFF call GP.out goto @b goto $ ;is that needed? can save 1 word if deleted GP: .out: movf 23h,W ;load reg 23h in W movwf GPIO ;then, store it in GPIO return delay: movwf 2Ah ;load reg 2Ah with delay in W .1: clrf 29h ;reg 29h = 0 then, 256 times .2: clrf 28h ;idem reg 28h .3: decfsz 28h,REG ;count 256 times goto .3 decfsz 29h,REG ;count 256 times goto .2 decfsz 2Ah,REG ;count delay times goto .1 return compiles in 98 bytes, then, 49 instructions, blink 3 leds. @@: white led only on GP0 during one time ;GP0 blank during one time (dead time) green led only one time ;GP4 red led only one time ;GP5 blank one time goto @b the valid configuration is obtained by hand in icprog, and a save as gives this file:
Last edited by edfed on 24 Feb 2011, 16:39; edited 1 time in total |
|||||||||||
24 Feb 2011, 15:41 |
|
edfed 24 Feb 2011, 16:34
just for the fun, compiles in less than 70 bytes, 35 instructions, 2 macros
and use x86 register names for the delay routine. Code: include 'pic14.inc' macro timer d {movlw d call delay} macro gpout o {movlw o movwf GPIO} start: movlw 1100'1110b tris GPIO goto @f align 8 @@: timer 255 gpout 0000'0001b timer 255 gpout 0000'0000b timer 255 gpout 0001'0000b timer 255 gpout 0010'0000b timer 255 gpout 0000'0000b goto @b delay: movwf al .1: clrf ah .2: decfsz ah,REG goto .2 decfsz al,REG goto .1 return it is the return of asm size optimisation. next to do, provide a complete file for the icprog program, with fuses data eeprom and oscal values. next next: use timer, watchdog, ADC, pwm, interrupts... etc. and drive 40 leds with just 5 pins ((N*N-N)*2) and implement fool8 in data eeprom. note: i've made an error, option is not 0063h but 0062h. |
|||
24 Feb 2011, 16:34 |
|
Goto page 1, 2 Next < Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.