Stdlib for Atmel AVR AT90S series.
This is a project with the purpose of providing fast and easy use of the microcontrollers when writting small/medium size programs.
This 'library' consists of two files. The "AVR_stdlib.inc" and the "AVR_stdlib.asm". The first file has all the required definitions and macros, while the second file has all the codes for the functions. The inc file must be included into the source before any macros of the library are used, and the asm file after (normally at the end of the source). For each macro used the preprocessor of assembler is instructed to include in the source the required asm code for them. Thus the program memory space required is limited to the minimum.
New revision with some code optimizations for speed, fug fixes, and new functions for the EEPROM to write data in it, and for the SRAM to use the data segment for constants and variables. Also support for AT90S1200 was removed as its limited stack would create a lot of problems when using the library. Use AT90S2313 or SMDs if space matters.
New revision with a few bug fixes and also new UART functions added. Now you can read and write from/to the UART bytes in hex form. Each byte is converted to and from ASCII. Also sone new macros to configure interrupt triggering are available.
The current revision (20000822) includes macros for using the UART, the EEPROM, and configuring the controller. The most important feature is the variable declaration. This way the programmer doesn't have to care what registers are used by each sub-function or macro to keep them from mixing up. When a variable is declared the assembler searches the available registers for an unused one and then assigns the name to it. At the end for the variable's scope another macro must be used to unassign the register so the it can be used later. There is a limit of variables declared depending upon the available registers and if X,Y,Z are used (if __USE_XYZ__ is defined while compiling then the registers R26 to R31 are used for variables and not as the X,Y,Z pairs). Also wrappers for mnemonics like 'cpi','ldi' etc are included to transparently distinguish when an immediate or not, capable register is used and then use the proper mnemonics.
Not all of the functions and macros have been verified for proper operation. If anyone find any errors in the code then email me with the problem, quoting the revision of the library and the version of avra used. Include output dumps of the errors if possible.
If anyone wants to contribute in the development of this library by writing more functions/macros then just send send them to me and I will add them to the next revision.
Anyone is free to use this 'library' in his coding and all I want is just an acknowledgement.
moufa.asm (an example program that prints something to the serial port with only 3(!) lines of code)
Requires: avra assembler by John Anders Haugum.
Total functions available:
*NOTE* Use int and related macros only inside other macros and only at the beginning of the program to define custom variables. The scope of each variable is limited to the 'line of sight' between the declarations and undeclarations. Temporary variables not recommended for use by the called functions inside their scope.
*NOTE* The printEE/FL functions use the Z pair. So either make the caller function to use the X/Y pairs if needed or push and pop the Z pair before and after the library call.
- CB : carriage back
- Time specific:
- delay10us : delay for 10us
- putEEc var1(EE addr high),var2(EE addr low),var3 : write character $var3
- to EEPROM at address ($var1)($var2)
- putEEci EEaddress,var : write character $var to EEPROM at address $EEaddress
- [get,put]SRvar[X,Y,Z] SRaddress,var : write byte from $var to Data Segment
- (SRAM) address $SRaddress
- CR : carriage return
- LF : line feed
- NULL : zero
- printHex var : print the hex represention of $var
- printHexi x : print the hex representation of byte x
- getHex var : get a byte from the UART in hex form and store it to $var
- setint[0,1][ll,fe,re] : set INT0/1 low level/falling edge/rising edge triggered
- Compile-time definitions
- __CPU__ : define the CPU type used
- __CPU_KHZ__ : define the CPU core frequency
- __USE_XYZ__ : free XYZ double registers for use
- __UART_UBRR__ : set the UART baud rate (value depending upon core frequency)
- Variable specific
- int var : declare a byte variable
- i_int var : declare a byte variable (use immediate register)
- word var1,var2 : declare a word from two bytes
- i_word var1,var2 : declare a word from two bytes (use immediate registers)
- free var : undeclare a byte variable
- freew var1,var2 : undeclare a worf of two bytes
- Command wrappers
- g[sbci,subi,cpi,andi,ori,ldi,sbr,cbr] : mnemonic wrappers to automatically
- distinguish if the operand registers are immediate or not, and
- act accordingly
- sp_init : initialize stack pointer
- suspend : suspend the controller
- powerdown : powerdown the controller
- ensleep : enable SLEEP mode
- dissleep : disable SLEEP mode
- uart_init : initialize UART with __UART_UBRR__
- [en,dis]u[r,t]x : enable/disable RX/TX IRQ
- [en,dis][rx,tx,udr]irq : enable/disable RX/TX/UDR IRQ
- [get,put]c var : read/write character from/to the UART to/from $var
- putci x : write character x to the UART
- printEEstr EEaddress : print a NULL terminated string from the
- EEPROM starting at address $EEaddress
- printFLstr FLASHaddress : print a NULL terminated string from the
- FLASH memory starting at address $FLASHaddress
- Time specific
- mdelay x : delay for x ms
- delay1ms : delay for 1 ms
- [en,dis]int[0,1] : enable/disable INT0/INT1 IRQ
- getEEc var1(EE addr high),var2(EE addr low),var3 : read a character
- from the EEPROM at address ($var1)($var2) and store it to $var3
- getEEci EEaddress,var : read a character from the EEPROM at address
- $EEaddress and store it to $var
- getFLc var1(FLASH addr high),var2(FLASH addr low),var3 : read a
- character from the FLASH memory at address ($var1)($var2) and
- store it to $var3
- getFLci FLASHaddress,var : read a character from the FLASH memory at
- address $FLASHaddress and store it to $var