From: SourceForge.net <no...@so...> - 2006-06-20 15:41:18
|
Bugs item #1500467, was opened at 2006-06-04 13:13 Message generated for change (Comment added) made by kein0r You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1500467&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: pic16 target Group: non bugs >Status: Open Resolution: Invalid Priority: 5 Submitted By: kein0r (kein0r) Assigned to: Raphael Neider (tecodev) Summary: Missing banksel for function parameter Initial Comment: Since the sdcc-users mailinglist seems to be not working i post this bug again here. Found a small but really annoying bug in the pic16 port of the sdcc. sdcc is compiled from svn. The Problem: All Register in the pic16 are 12Bits. Writing to these registers must either be via the W register and a "bank select" first or with the movff command. When i write the following function (this function doesn't make any sense, its just to demonstrate the problem): void func1 (char a, unsigned int b, char c, unsigned int d) { SPBRG = a; SPBRG = (char) b; INTCON = c; INTCON = (char) d; } The values a, and c are written correct to the register because sdcc generates code like: movff r0x00, SPBRG and movff r0x02, INTCON but for the two int values sdcc, generates: movf r0x01, W movwf SPBRG without any bankselect first. glink then generates the following assembler code out of it: movwf 0xaf, 0 The register SPBRG is *not* 0xaf but 0xfaf but since movwf can only handle addresses up to 0xff there must be either a bank select before or the movff command must be used. My problem is that i want to use a few external functions which are defined like the one above. ---------------------------------------------------------------------- >Comment By: kein0r (kein0r) Date: 2006-06-20 15:41 Message: Logged In: YES user_id=1212013 Sorry had much work and it took me quite some time to figure out exactly where the error lies. Its either in the code generated by sdcc or a bug in gpasm. For testing i defined a function like: void set_spbrg (unsigned int spbrg) { SPBRG = spbrg; // 48MHz => 57.600 baud (BRGH = 1) __asm MOVFF r0x00, _SPBRG __endasm; } Without the __asm block the program doesnt work, cause sdcc generates MOVF r0x00, W MOVWF _SPBRG With the __asm block the programm works. The Problem is that unsinged int is used in many picv16 lib i.e. in serial_open, which wont work with this bug. Version SDCC : avr/pic16 2.5.6 #4243 (Jun 20 2006) (UNIX) gpasm-0.13.3 beta gplink-0.13.3 alpha ---------------------------------------------------------------------- Comment By: kein0r (kein0r) Date: 2006-06-20 15:41 Message: Logged In: YES user_id=1212013 Can you confirm this still exists in 2.5.6? ---------------------------------------------------------------------- Comment By: Raphael Neider (tecodev) Date: 2006-06-06 07:34 Message: Logged In: YES user_id=1115835 If I am not mistaken, SDCC is right here. Reasoning: The PICs sport an access bank, which redirects accesses to registers 0x00..0x7F (upper bound device dependent) to bank 0 and accesses to 0x80..0xff (lower bound device dependent) to bank 0xf (thats 0xf80..0xfff). >From your code snippet I gather that the "movwf 0xaf, 0" uses the access bank feature (trailing ", 0") and thus needs not select bank 15 manually. The same holds for the r0xXX, as they are also allocated into the access bank (bank 0, hopefully we never reach the device dependent limit ;-)). Regards, Raphael ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1500467&group_id=599 |