From 885b0d4ee0421bfc08ead3540bfbdc1294e0c97a Mon Sep 17 00:00:00 2001 From: 0x007E Date: Fri, 5 Apr 2024 12:30:06 +0200 Subject: [PATCH] Initial commit --- .github/workflows/build.yml | 68 +++ .gitignore | 33 + LICENSE | 674 +++++++++++++++++++++ README.md | 75 +++ images/UPDI-Adapter_Bottom.jpg | Bin 0 -> 18589 bytes images/UPDI-Adapter_Top.jpg | Bin 0 -> 16431 bytes images/UPDI.png | Bin 0 -> 9349 bytes images/UPDI.svg | 3 + images/atmelstudio.png | Bin 0 -> 29595 bytes images/microchip-studio-avr-dude.png | Bin 0 -> 8586 bytes images/microchip-studio-external-tools.png | Bin 0 -> 12765 bytes images/win-hardware-manager.png | Bin 0 -> 17934 bytes library/adc/adc.c | 72 +++ library/adc/adc.h | 145 +++++ library/adc/main.c | 60 ++ library/spi/main.c | 60 ++ library/spi/spi.c | 89 +++ library/spi/spi.h | 124 ++++ library/system/main.c | 37 ++ library/system/system.c | 35 ++ library/system/system.h | 53 ++ library/twi/main.c | 108 ++++ library/twi/twi.c | 126 ++++ library/twi/twi.h | 98 +++ library/uart/main.c | 132 ++++ library/uart/uart.c | 252 ++++++++ library/uart/uart.h | 181 ++++++ 27 files changed, 2425 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 images/UPDI-Adapter_Bottom.jpg create mode 100644 images/UPDI-Adapter_Top.jpg create mode 100644 images/UPDI.png create mode 100644 images/UPDI.svg create mode 100644 images/atmelstudio.png create mode 100644 images/microchip-studio-avr-dude.png create mode 100644 images/microchip-studio-external-tools.png create mode 100644 images/win-hardware-manager.png create mode 100644 library/adc/adc.c create mode 100644 library/adc/adc.h create mode 100644 library/adc/main.c create mode 100644 library/spi/main.c create mode 100644 library/spi/spi.c create mode 100644 library/spi/spi.h create mode 100644 library/system/main.c create mode 100644 library/system/system.c create mode 100644 library/system/system.h create mode 100644 library/twi/main.c create mode 100644 library/twi/twi.c create mode 100644 library/twi/twi.h create mode 100644 library/uart/main.c create mode 100644 library/uart/uart.c create mode 100644 library/uart/uart.h diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..e6d40c2 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,68 @@ +name: build-firmware + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +env: + TOOLCHAIN: "3.7.0.1796" + DFP: "ATtiny_DFP.2.0.368" + DEVICE: "attiny1606" + + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Install zip + run: sudo apt-get install -y zip + - name: install-build-tools + run: | + wget https://ww1.microchip.com/downloads/aemDocuments/documents/DEV/ProductDocuments/SoftwareTools/avr8-gnu-toolchain-${{ env.TOOLCHAIN }}-linux.any.x86_64.tar.gz + tar -xf *.tar.gz + - name: install-dfp-package + run: | + wget http://packs.download.atmel.com/Atmel.${{ env.DFP }}.atpack + unzip *.atpack -d ./DFP + - name: build-tiny0-firmware + run: | + mkdir build + ./avr8-gnu-toolchain-linux_x86_64/bin/avr-gcc -g -x c -O1 -mmcu=${{ env.DEVICE }} -std=gnu99 -B ./DFP/gcc/dev/${{ env.DEVICE }} -I ./DFP/include -c ./library/system/system.c -o ./system.o + + for dir in ./library/*/ + do + name=${dir%*/} + echo "Building ${name##*/}" + + cp ./system.o ./library/${name##*/}/system.o + + ./avr8-gnu-toolchain-linux_x86_64/bin/avr-gcc -g -x c -O1 -mmcu=${{ env.DEVICE }} -std=gnu99 -B ./DFP/gcc/dev/${{ env.DEVICE }} -I ./DFP/include -c ./library/${name##*/}/main.c -o ./library/${name##*/}/main.o + ./avr8-gnu-toolchain-linux_x86_64/bin/avr-gcc -g -x c -O1 -mmcu=${{ env.DEVICE }} -std=gnu99 -B ./DFP/gcc/dev/${{ env.DEVICE }} -I ./DFP/include -c ./library/${name##*/}/${name##*/}.c -o ./library/${name##*/}/${name##*/}.o + + if [ ${name##*/} = "system" ]; then + ./avr8-gnu-toolchain-linux_x86_64/bin/avr-gcc -g -mmcu=${{ env.DEVICE }} -B ./DFP/gcc/dev/${{ env.DEVICE }} -I ./DFP/include -o ./library/${name##*/}/${name##*/}.elf ./library/${name##*/}/main.o ./library/${name##*/}/${name##*/}.o + else + ./avr8-gnu-toolchain-linux_x86_64/bin/avr-gcc -g -mmcu=${{ env.DEVICE }} -B ./DFP/gcc/dev/${{ env.DEVICE }} -I ./DFP/include -o ./library/${name##*/}/${name##*/}.elf ./library/${name##*/}/main.o ./library/${name##*/}/${name##*/}.o ./library/${name##*/}/system.o + fi + + ./avr8-gnu-toolchain-linux_x86_64/bin/avr-objcopy -j .text -j .data -O ihex ./library/${name##*/}/${name##*/}.elf ./build/${name##*/}_demo.hex + ./avr8-gnu-toolchain-linux_x86_64/bin/avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex ./library/${name##*/}/${name##*/}.elf ./build/${name##*/}_demo.eep + + done + + tar -czvf build.tar.gz ./build + zip -r build.zip ./build + + - name: upload-tiny0-firmware + uses: actions/upload-artifact@v4 + with: + name: attiny1606-demo + path: | + ./build + build.tar.gz + build.zip + retention-days: 5 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6ab5cbd --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +## Ignore Atmel Studio temporary files and build results +# https://www.microchip.com/mplab/avr-support/atmel-studio-7 + +# Atmel Studio is powered by an older version of Visual Studio, +# so most of the project and solution files are the same as VS files, +# only prefixed by an `at`. + +# Visual Studio 2015/2017 cache/options directory +.vs/ + +#Build Directories +[Dd]ebug/ +[Rr]elease/ + +#Build Results +*.o +*.d +*.eep +*.elf +*.hex +*.map +*.srec + +#User Specific Files +*.atsuo + +# Project files +*.atsln +*.cproj +*.xml + +# Solution files +*.atsln \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2a72711 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +[![Version: 1.0 Release](https://img.shields.io/badge/Version-1.0%20Release-green.svg)](https://github.com/0x007e/tiny0) ![Build](https://github.com/0x007e/tiny0/actions/workflows/build.yml/badge.svg?branch=main) [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) + +# ATTiny 0/1/2 series peripheral libraries + +This project includes some easy to use libraries. They can be found in the [library](./library/) directory. They are designed for the ATTiny 0/1/2 series for fast initializing `system clock`/`twi`/`uart`/`spi`/`analog` hardware parts of the ATTiny controllers. Every library has a `main.c` where a description how to use the library can be found. + +--- + +# UPDI Programming with `avr-dude` + +## Serial-UPDI Hardware + +For Programming the device with `serialupdi` a `USB/UART` bridge is necessary and a simple adapter pcb. + +[USB/UART Bridge from RS-Components](https://at.rs-online.com/web/p/entwicklungstools-kommunikation-und-drahtlos/7916390?gb=s) + +![UPDI Adapter bottom](./images/UPDI.png) + +| Top | Bottom | +|:---------:|:-------:| +|![UPDI Adapter top](./images/UPDI-Adapter_Top.jpg) | ![UPDI Adapter bottom](./images/UPDI-Adapter_Bottom.jpg) | + +## UPDI programming (over USB/UART) with Microchip Studio + +Download Avr Dude [`avrdude-v?.?-windows-x64.zip`](https://www.microchip.com/mplab/avr-support/atmel-studio-7) and [Microchip Studio 7](https://www.microchip.com/mplab/avr-support/atmel-studio-7) + +Copy avr-dude to a preferred path (e.g. `C:\Tools\avrdude`) and setup external tools in Microchip Studio 7. + +![External Tools in Microchip Studio](./images/microchip-studio-external-tools.png) + +![Setup AVR Dude in Microchip Studio](./images/microchip-studio-avr-dude.png) + +``` bash +# Title +AVR Dude t1606 FLASH +# Command +C:\Tools\avrdude\avrdude.exe +# Arguments !PORT! +-c serialupdi -p t1606 -b 57600 -P COM? -U flash:w:"$(TargetDir)$(TargetName).hex":a -v + +# Arguments +``` + +``` bash +# Title +AVR Dude t1606 FLASH + EEPROM +# Command +C:\Tools\avrdude\avrdude.exe +# Arguments !PORT! +-c serialupdi -p t1606 -b 57600 -P COM? -U flash:w:"$(TargetDir)$(TargetName).hex":a -U eeprom:w:"$(TargetDir)$(TargetName).eep":a -v + +# Arguments +``` + +> Important: It is necessary to setup the right COM-Port! + +![Windows Hardware Manager](./images/win-hardware-manager.png) + +Now projects can be programmed with `avr-dude` and `serialupdi` after the project was built. + +![Windows Hardware Manager](./images/atmelstudio.png) + +--- + +## Software + +Additional software that needs to be installed: + +* [Microchip Studio 7](https://www.microchip.com/mplab/avr-support/atmel-studio-7) +* [TeraTerm](https://teratermproject.github.io/index-en.html) +* [AVRdude](https://github.com/avrdudes/avrdude/releases) + +--- + +**R. GAECHTER** \ No newline at end of file diff --git a/images/UPDI-Adapter_Bottom.jpg b/images/UPDI-Adapter_Bottom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ab90fc15e313fd9d1bf41456f9ffb07e60209de GIT binary patch literal 18589 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 MGb2D56OWtwAMj){;s5{u literal 0 HcmV?d00001 diff --git a/images/UPDI-Adapter_Top.jpg b/images/UPDI-Adapter_Top.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58b1931deb1cbc2b04591934b81f66ecc490727c GIT binary patch literal 16431 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 literal 0 HcmV?d00001 diff --git a/images/UPDI.png b/images/UPDI.png new file mode 100644 index 0000000000000000000000000000000000000000..08107136d3f67d89e2370c42711e17fdd0bd165c GIT binary patch literal 9349 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 Pqz$1guOU~7wg~wjBrWQU literal 0 HcmV?d00001 diff --git a/images/UPDI.svg b/images/UPDI.svg new file mode 100644 index 0000000..6c9636a --- /dev/null +++ b/images/UPDI.svg @@ -0,0 +1,3 @@ + + +
USB
USB
UART
3V3
UART...
TX
TX
470R
470R
UPDI
UPDI
GND
GND
1k
1k
RX
RX
FT232
FT232
RX
RX
TX
TX
TX
TX
RX
RX
Adapterplatine
Adapterp...
\ No newline at end of file diff --git a/images/atmelstudio.png b/images/atmelstudio.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c364d528b43cde1c9d8f7d102a938c54446349 GIT binary patch literal 29595 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 K=AO71{Qm&Hy)vBu literal 0 HcmV?d00001 diff --git a/images/microchip-studio-avr-dude.png b/images/microchip-studio-avr-dude.png new file mode 100644 index 0000000000000000000000000000000000000000..033d3a7acde7215ce32ade119b4bde011fd151af GIT binary patch literal 8586 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�&X2`lEi1r<(;ItiAS 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 10-Bit + // ADC_RESSEL_8BIT_gc -> 8-Bit + #define ADC_RESOLUTION ADC_RESSEL_8BIT_gc + #endif + + #ifndef ADC_CAPACITANCE + // 0 -> Recommended for reference voltage values below 1V + // 1 -> Recommended for higher reference voltages + #define ADC_CAPACITANCE 1 + #endif + + #ifndef ADC_REFERENCE + // ADC_REFSEL_INTREF_gc -> Internal reference + // ADC_REFSEL_VDDREF_gc -> VDD reference + #define ADC_REFERENCE ADC_REFSEL_VDDREF_gc + #endif + + #ifndef ADC_PRESCALER + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! The prescaler settings should be setup !!! + // !!! to a value that the ADC clock is between !!! + // !!! 50 - 1500 kHz (for fully 10 bit mode) !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + // +-----------------------------------+ + // | Prescaler | + // +---------------------+-------------+ + // | ADC_PRESC_DIV2_gc | F_PER / 2 | + // | ADC_PRESC_DIV4_gc | F_PER / 4 | + // | ADC_PRESC_DIV8_gc | F_PER / 8 | + // | ADC_PRESC_DIV16_gc | F_PER / 16 | + // | ADC_PRESC_DIV32_gc | F_PER / 32 | + // | ADC_PRESC_DIV64_gc | F_PER / 64 | + // | ADC_PRESC_DIV128_gc | F_PER / 128 | + // | ADC_PRESC_DIV256_gc | F_PER / 256 | + // +---------------------+-------------+ + #define ADC_PRESCALER ADC_PRESC_DIV64_gc + + #endif + + #ifndef ADC_INIT_DELAY + // +-----------------------------+ + // | ADC CLK delay before conv. | + // +-----------------------+-----+ + // | ADC_INITDLY_DLY0_gc | 0 | + // | ADC_INITDLY_DLY16_gc | 16 | + // | ADC_INITDLY_DLY32_gc | 32 | + // | ADC_INITDLY_DLY64_gc | 64 | + // | ADC_INITDLY_DLY128_gc | 128 | + // | ADC_INITDLY_DLY256_gc | 256 | + // +-----------------------+-----+ + #define ADC_INIT_DELAY ADC_INITDLY_DLY0_gc + #endif + + #ifndef ADC_SAMPLE_DELAY_VARIATION + // ADC_ASDV_ASVOFF_gc -> OFF + // ADC_ASDV_ASVON_gc -> ON + #define ADC_SAMPLE_DELAY_VARIATION ADC_ASDV_ASVOFF_gc + #endif + + #ifndef ADC_SAMPLE_DELAY + // Value -> 0 - 15 + #define ADC_SAMPLE_DELAY 8 + #endif + + #ifndef ADC_SAMPLE_LENGTH + // Value -> 0 - 31 + #define ADC_SAMPLE_LENGTH 8 + #endif + + // Definition of ADC processing (Enabled = Interrupt/Disabled = Polling) + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! Interrupts are not included in this library !!! + // !!! The interrupt vector should be placed in the !!! + // !!! main.c file !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + // #ifndef ADC_ADIE + // #define ADC_ADIE + // #endif + + #include + + enum ADC_Accumulation_t + { + ADC_Sample_None=ADC_SAMPNUM_ACC1_gc, + ADC_Sample_2=ADC_SAMPNUM_ACC2_gc, + ADC_Sample_4=ADC_SAMPNUM_ACC4_gc, + ADC_Sample_8=ADC_SAMPNUM_ACC8_gc, + ADC_Sample_16=ADC_SAMPNUM_ACC16_gc, + ADC_Sample_32=ADC_SAMPNUM_ACC32_gc, + ADC_Sample_64=ADC_SAMPNUM_ACC64_gc + }; + typedef enum ADC_Accumulation_t ADC_Accumulation; + + enum ADC_Channel_t + { + ADC_CH0=ADC_MUXPOS_AIN0_gc, + ADC_CH1=ADC_MUXPOS_AIN1_gc, + ADC_CH2=ADC_MUXPOS_AIN2_gc, + ADC_CH3=ADC_MUXPOS_AIN3_gc, + ADC_CH4=ADC_MUXPOS_AIN4_gc, + ADC_CH5=ADC_MUXPOS_AIN5_gc, + ADC_CH6=ADC_MUXPOS_AIN6_gc, + ADC_CH7=ADC_MUXPOS_AIN7_gc, + ADC_CH8=ADC_MUXPOS_AIN8_gc, + ADC_CH9=ADC_MUXPOS_AIN9_gc, + ADC_CH10=ADC_MUXPOS_AIN10_gc, + ADC_CH11=ADC_MUXPOS_AIN11_gc, + ADC_INTREF=ADC_MUXPOS_INTREF_gc, + ADC_GND=ADC_MUXPOS_GND_gc + }; + typedef enum ADC_Channel_t ADC_Channel; + + void adc_init(void); + void adc_channel(ADC_Channel channel); + void adc_accumulation(ADC_Accumulation samples); + void adc_disable(void); + + #ifndef ADC_ADIE + unsigned int adc_read(void); + unsigned int adc_average(unsigned char samples); + #endif + +#endif /* ADC_H_ */ \ No newline at end of file diff --git a/library/adc/main.c b/library/adc/main.c new file mode 100644 index 0000000..48338ed --- /dev/null +++ b/library/adc/main.c @@ -0,0 +1,60 @@ +/* ----------------------------------------- +* G.Raf^engineering +* www.sunriax.at (github.com/0x007e) +* ----------------------------------------- +* Platform: Independent +* Hardware: ATTiny406/1606/... +* ----------------------------------------- +* Version: 1.0 Release +* Author: G.Raf +* Description: +* Sample for initializing A/D converter +* ----------------------------------------- +*/ + +#define F_CPU 20000000UL + +// System libraries +#include +#include + +// User libraries +#include "adc.h" +#include "../system/system.h" + +int main(void) +{ + // Define output port + PORTC.DIRSET = PIN3_bm | PIN2_bm | PIN1_bm | PIN0_bm; + + // Initialize clock system + system_init(); + + // Initialize A/D converter + // Resolution: 10 bit + // Samplerate: 156.25ksps + adc_init(); + + // Select A/D channel 1 (PA1) -> 10k potentiometer + adc_channel(ADC_CH1); + + while (1) + { + // Write converted value to PORTC + // PORT only has 4 Bit so the lower bits are thrown away + PORTC.OUT = (adc_read()>>6); + + // To build an average there are two possible solutions + // Use 10 samples and build an average in software: + PORTC.OUT = (adc_average(10)>>6); + + // Accumulate 8 samples in hardware: + adc_accumulation(ADC_Sample_8); + + PORTC.OUT = (adc_read()>>6); + + adc_accumulation(ADC_Sample_None); + + _delay_ms(100); + } +} \ No newline at end of file diff --git a/library/spi/main.c b/library/spi/main.c new file mode 100644 index 0000000..31a5cc8 --- /dev/null +++ b/library/spi/main.c @@ -0,0 +1,60 @@ +/* ----------------------------------------- +* G.Raf^engineering +* www.sunriax.at (github.com/0x007e) +* ----------------------------------------- +* Platform: Independent +* Hardware: ATTiny406/1606/... +* ----------------------------------------- +* Version: 1.0 Release +* Author: G.Raf +* Description: +* Sample for initializing spi bus +* ----------------------------------------- +*/ + +#define F_CPU 20000000UL + +// System libraries +#include +#include + +// User libraries +#include "spi.h" +#include "../system/system.h" + +int main(void) +{ + // Define input port + PORTB.DIRCLR = PIN3_bm | PIN2_bm | PIN1_bm | PIN0_bm; + PORTB.PIN0CTRL = PORT_PULLUPEN_bm; + PORTB.PIN1CTRL = PORT_PULLUPEN_bm; + PORTB.PIN2CTRL = PORT_PULLUPEN_bm; + PORTB.PIN3CTRL = PORT_PULLUPEN_bm; + + // Define output port + PORTC.DIRSET = PIN3_bm | PIN2_bm | PIN1_bm | PIN0_bm; + + // Initialize clock system + system_init(); + + // SPI Initialization + // Mode: Master + // Direction: MSB + // Transfer: SPI_Rising/SPI_Rising + // + // Details can be found in spi.c + spi_init(SPI_MSB, SPI_Rising, SPI_Rising); + + while (1) + { + // Use a simple loopback mode (connect MOSI to MISO) + // to check the function of the SPI bus. There are 4 Switches + // connected to PORTB (3:0). If one or more switches are + // pressed the status LEDs on PORTC should remain the status + // of the switches. If the connection between MOSI and MISO + // is removed the status LEDs should all be HIGH (active) + // because of the activated pull-up on MISO!!! + PORTC.OUT = spi_transfer(~(0x0F & PORTB.IN)); + _delay_ms(1000); + } +} \ No newline at end of file diff --git a/library/spi/spi.c b/library/spi/spi.c new file mode 100644 index 0000000..ef4a7bb --- /dev/null +++ b/library/spi/spi.c @@ -0,0 +1,89 @@ +/* ----------------------------------------- + * G.Raf^engineering + * www.sunriax.at (github.com/0x007e) + * ----------------------------------------- + * Platform: Independent + * Hardware: ATTiny406/1606/... + * ----------------------------------------- + * Version: 1.0 Release + * Author: G.Raf + * Description: + * Library for initializing spi bus + * ----------------------------------------- + */ + +#include "spi.h" + +void spi_init(SPI_Direction direction, SPI_Polarity setup, SPI_Phase sample) +{ + #ifdef SPI_ALTERNATE_PORT + PORTMUX.CTRLB = PORTMUX_SPI0_ALTERNATE_gc; + #endif + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! SPECIAL FUNCTION !!! + // !!! If during initialisation SS !!! + // !!! pin is LOW, SPI controller !!! + // !!! will be configured as slave. !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + PORTA.DIRCLR = SPI_MOSI | SPI_MISO | SPI_SCK | SPI_SS; + PORTA.SPI_MISO_PINCTRL = PORT_PULLUPEN_bm; + PORTA.SPI_SS_PINCTRL = PORT_PULLUPEN_bm; + + SPI0.CTRLA = SPI_MASTER_bm + #ifdef SPI2X + | SPI_CLK2X_bm + #endif + + #ifdef SPI_CLOCK + | SPI_CLOCK + #endif + | ((0x01 & direction)<<6); + + SPI0.CTRLB |= ((0x01 & setup)<<1) | ((0x01 & sample)<<0); + + #ifdef SPI_SPIE + SPI0.INTCTRL |= SPI_IE_bm; + #endif + + SPI0.CTRLA |= SPI_ENABLE_bm; + + // Setup SCK, MOSI and SS as output + // PORT configuration gets overwritten from SPI controller + PORTA.DIR |= SPI_MOSI | SPI_MISO | SPI_SCK | SPI_SS; +} + +#ifndef SPI_SPIE + + void spi_select(SPI_Select mode) + { + switch(mode) + { + case SPI_Enable : PORTA.OUTCLR = SPI_SS; break; + default : PORTA.OUTSET = SPI_SS; break; + } + } + + unsigned char spi_transfer(unsigned char data) + { + SPI0.DATA = data; + + while (!(SPI0.INTFLAGS & SPI_IF_bm)) + { + ; + } + return SPI0.DATA; + } + +#endif + +void spi_disable(void) +{ + // Disable SPI + SPI0.CTRLA &= ~SPI_ENABLE_bm; + PORTA.DIRCLR = PIN4_bm | PIN3_bm | PIN2_bm | PIN1_bm; + + #ifdef SPI_SPIE + SPI0.INTCTRL &= ~SPI_IE_bm; + #endif +} \ No newline at end of file diff --git a/library/spi/spi.h b/library/spi/spi.h new file mode 100644 index 0000000..7066027 --- /dev/null +++ b/library/spi/spi.h @@ -0,0 +1,124 @@ +/* ----------------------------------------- + * G.Raf^engineering + * www.sunriax.at (github.com/0x007e) + * ----------------------------------------- + * Platform: Independent + * Hardware: ATTiny406/1606/... + * ----------------------------------------- + * Version: 1.0 Release + * Author: G.Raf + * Description: + * Header for initializing spi bus + * ----------------------------------------- + */ + +#ifndef SPI_H_ +#define SPI_H_ + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! When device is configured as !!! + // !!! slave the system clock has to !!! + // !!! be 4 times higher then the !!! + // !!! SPI clock f_CPU > 4 * f_SPI !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + //#ifndef SPI2X // Double speed mode + //#define SPI2X + //#endif + + #ifndef SPI_CLOCK + // +------------------------------+-------+------+ + // | SPI2X | 0 | 1 | + // +------------------------------+-------+------+ + // | SPI_PRESC_DIV4_gc -> F_PER | / 4 | / 2 | + // | SPI_PRESC_DIV16_gc -> F_PER | / 16 | / 8 | + // | SPI_PRESC_DIV64_gc -> F_PER | / 64 | / 32 | + // | SPI_PRESC_DIV128_gc -> F_PER | / 128 | / 64 | + // +------------------------------+-------+------+ + #define SPI_CLOCK SPI_PRESC_DIV4_gc + + #endif + + //#ifndef SPI_ALTERNATE_PORT + //#define SPI_ALTERNATE_PORT + //#endif + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! When using the alternate port !!! + // !!! pins have to be modified! !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + #ifndef SPI_PORT + #define SPI_PORT PORTA + #endif + + #ifndef SPI_MOSI + #define SPI_MOSI PIN1_bm + #endif + + #ifndef SPI_MISO + #define SPI_MISO PIN2_bm + #define SPI_MISO_PINCTRL PIN2CTRL + #endif + + #ifndef SPI_SCK + #define SPI_SCK PIN3_bm + #endif + + #ifndef SPI_SS + #define SPI_SS PIN4_bm + #define SPI_SS_PINCTRL PIN4CTRL + #endif + + // Definition of SPI processing (Enabled = Interrupt/Disabled = Polling) + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! Interrupts are not included in this library !!! + // !!! If interrupts are used, disable the polling !!! + // !!! by uncommenting the next lines !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + //#ifndef SPI_SPIE // SPI Interrupt based processing + // #define SPI_SPIE + //#endif + + #include + + enum SPI_Direction_t + { + SPI_MSB=0, + SPI_LSB + }; + typedef enum SPI_Direction_t SPI_Direction; + + enum SPI_Edge_t + { + SPI_Rising=0, + SPI_Falling + }; + typedef enum SPI_Edge_t SPI_Polarity; + typedef enum SPI_Edge_t SPI_Phase; + + enum SPI_Select_t + { + SPI_Disable=0, + SPI_Enable + }; + typedef enum SPI_Select_t SPI_Select; + + enum SPI_Status_t + { + SPI_Received=0, + SPI_Collision, + SPI_None + }; + typedef enum SPI_Status_t SPI_Status; + + void spi_init(SPI_Direction direction, SPI_Polarity setup, SPI_Phase sample); + void spi_disable(void); + void spi_select(SPI_Select mode); + + #ifndef SPI_SPIE + unsigned char spi_transfer(unsigned char data); + #endif + +#endif /* SPI_H_ */ \ No newline at end of file diff --git a/library/system/main.c b/library/system/main.c new file mode 100644 index 0000000..605bcbc --- /dev/null +++ b/library/system/main.c @@ -0,0 +1,37 @@ +/* ----------------------------------------- + * G.Raf^engineering + * www.sunriax.at (github.com/0x007e) + * ----------------------------------------- + * Platform: Independent + * Hardware: ATTiny406/1606/... + * ----------------------------------------- + * Version: 1.0 Release + * Author: G.Raf + * Description: + * Sample for initializing system clock + * ----------------------------------------- + */ + +#define F_CPU 20000000UL + +// System libraries +#include +#include + +// User libraries +#include "system.h" + +int main(void) +{ + // Define signal port + PORTA.DIR = PIN1_bm; + + // Initialize clock system + system_init(); + + while (1) + { + PORTA.OUTTGL = PIN1_bm; + _delay_ms(1000); + } +} \ No newline at end of file diff --git a/library/system/system.c b/library/system/system.c new file mode 100644 index 0000000..88491e7 --- /dev/null +++ b/library/system/system.c @@ -0,0 +1,35 @@ +/* ----------------------------------------- + * G.Raf^engineering + * www.sunriax.at (github.com/0x007e) + * ----------------------------------------- + * Platform: Independent + * Hardware: ATTiny406/1606/... + * ----------------------------------------- + * Version: 1.0 Release + * Author: G.Raf + * Description: + * Library for initializing system clock + * ----------------------------------------- + */ + +#include "system.h" + +void system_init(void) +{ + CCP = CCP_IOREG_gc; + CLKCTRL.MCLKCTRLA = SYSTEM_CLOCK; + while(!(CLKCTRL.MCLKSTATUS & SYSTEM_CLOCK_BIT)) + { + ; + } + + #ifdef SYSTEM_PER_CLOCK_PRESCALER + CCP = CCP_IOREG_gc; + CLKCTRL.MCLKCTRLB = SYSTEM_PER_CLOCK_PRESCALER | CLKCTRL_PEN_bm; + #endif + + #if SYSTEM_CLOCK == CLKCTRL_CLKSEL_OSC20M_gc + CCP = CCP_IOREG_gc; + CLKCTRL.OSC20MCTRLA = CLKCTRL_RUNSTDBY_bm; + #endif +} \ No newline at end of file diff --git a/library/system/system.h b/library/system/system.h new file mode 100644 index 0000000..133a602 --- /dev/null +++ b/library/system/system.h @@ -0,0 +1,53 @@ +/* ----------------------------------------- + * G.Raf^engineering + * www.sunriax.at (github.com/0x007e) + * ----------------------------------------- + * Platform: Independent + * Hardware: ATTiny406/1606/... + * ----------------------------------------- + * Version: 1.0 Release + * Author: G.Raf + * Description: + * Header for initializing system clock + * ----------------------------------------- + */ + +#ifndef SYSTEM_H_ +#define SYSTEM_H_ + + #ifndef SYSTEM_CLOCK + // +-----------------------------+--------------------+------+--------+ + // | SYSTEM_CLOCK | SYSTEM_CLOCK_BIT | Type | Freq. | + // +-----------------------------+--------------------+------+--------+ + // | CLKCTRL_CLKSEL_OSC20M_gc | CLKCTRL_OSC20MS_bm | Int. | 20 MHz | + // | CLKCTRL_CLKSEL_OSCULP32K_gc | CLKCTRL_OSC32KS_bm | Int. | 32 kHz | + // | CLKCTRL_CLKSEL_EXTCLK_gc | CLKCTRL_EXTS_bm |Ext. | ?? | + // +-----------------------------+--------------------+------+--------+ + #define SYSTEM_CLOCK CLKCTRL_CLKSEL_OSC20M_gc + #define SYSTEM_CLOCK_BIT CLKCTRL_OSC20MS_bm + #endif + + #ifndef SYSTEM_PER_CLOCK_PRESCALER + // +------------------------------+------+ + // | Possible definitions | | + // +------------------------------+------+ + // | // undefine -> F_CPU | / 1 | + // | CLKCTRL_PDIV_2X_gc -> F_CPU | / 2 | + // | CLKCTRL_PDIV_4X_gc -> F_CPU | / 4 | + // | CLKCTRL_PDIV_8X_gc -> F_CPU | / 8 | + // | CLKCTRL_PDIV_16X_gc -> F_CPU | / 16 | + // | CLKCTRL_PDIV_32X_gc -> F_CPU | / 32 | + // | CLKCTRL_PDIV_64X_gc -> F_CPU | / 64 | + // | CLKCTRL_PDIV_6X_gc -> F_CPU | / 6 | + // | CLKCTRL_PDIV_10X_gc -> F_CPU | / 10 | + // | CLKCTRL_PDIV_24X_gc -> F_CPU | / 24 | + // | CLKCTRL_PDIV_48X_gc -> F_CPU | / 48 | + // +------------------------------+------+ + #define SYSTEM_PER_CLOCK_PRESCALER CLKCTRL_PDIV_2X_gc + #endif + + #include + + void system_init(void); + +#endif /* SYSTEM_H_ */ \ No newline at end of file diff --git a/library/twi/main.c b/library/twi/main.c new file mode 100644 index 0000000..2f20363 --- /dev/null +++ b/library/twi/main.c @@ -0,0 +1,108 @@ +/* ----------------------------------------- +* G.Raf^engineering +* www.sunriax.at (github.com/0x007e) +* ----------------------------------------- +* Platform: Independent +* Hardware: ATTiny406/1606/... +* ----------------------------------------- +* Version: 1.0 Release +* Author: G.Raf +* Description: +* Sample for initializing twi bus +* ----------------------------------------- +*/ + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// Hardware setup +// +// +-----+ +// | P | +// +-----------+ D +-------+ AT24C02 +// | A | I | | +-----------+ +// | T +-----+ +---+ +> VCC ---- VCC <+ | E | +// | I | P | | | | E | +// | N | O |+++ +++| P | +// | Y | R || | 10k 10k | || R | +// | * | T || | | || O | +// | 0 | B |+++ +++| M | +// | 6 | | | | | | +// | | | |-> PB1 -- SDA <-+ | | +// | | | +-> PB0 -- SCL <-- | | +// | +---+ -> GND -- GND <- | | +// +~~~~~~~~~~~~~~~~~~~~~~~~~+ +-----------+ +// +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#define F_CPU 20000000UL + +// EEPROM settings +#define SLAVE_ADDR 0x42 // TWI_Slave address of the EEPROM +#define EEPROM_ADDR 0xF0 // EEPROM memory address +#define EEPROM_DATA 0xF0 // EEPROM test data + +// System libraries +#include +#include + +// User libraries +#include "twi.h" +#include "../system/system.h" + +int main(void) +{ + // Define input port + PORTB.DIRCLR = PIN1_bm | PIN0_bm; + + // Enable pull-up on SCL and SDA if no external pull-ups are present. + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! INFORMATION !!! + // !!! If the pullup resistor on !!! + // !!! SCL/SDA has a very high !!! + // !!! resistance, it could be !!! + // !!! necessary to slow down the !!! + // !!! TWI clock speed or manually !!! + // !!! mount 10k resistors between !!! + // !!! SCL -> VCC and SDA -> VCC !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //PORTB.PIN0CTRL = PORT_PULLUPEN_bm; + //PORTB.PIN1CTRL = PORT_PULLUPEN_bm; + + // Define output port + PORTC.DIRSET = PIN0_bm; + + // Initialize clock system + system_init(); + + // Initialize TWI + // Mode: Master + // Speed: 100kHz + // + // Details can be found in twi.c + twi_init(); + + // EEPROM WRITE routine + twi_start(); + twi_address(SLAVE_ADDR, TWI_Write); + twi_set(EEPROM_ADDR); + twi_set(EEPROM_DATA); + twi_stop(); + _delay_ms(5); + + while(1) + { + unsigned char data; + + // EEPROM READ routine + twi_start(); + twi_address(SLAVE_ADDR, TWI_Write); + twi_set(EEPROM_ADDR); + twi_start(); + twi_address(SLAVE_ADDR, TWI_Read); + twi_get(&data, TWI_NACK); + twi_stop(); + + // Check if data written to EEPROM is same as data that was received + if(EEPROM_DATA == data) + PORTC.OUTSET = PIN0_bm; + } +} \ No newline at end of file diff --git a/library/twi/twi.c b/library/twi/twi.c new file mode 100644 index 0000000..a55bdac --- /dev/null +++ b/library/twi/twi.c @@ -0,0 +1,126 @@ +/* ----------------------------------------- + * G.Raf^engineering + * www.sunriax.at (github.com/0x007e) + * ----------------------------------------- + * Platform: Independent + * Hardware: ATTiny406/1606/... + * ----------------------------------------- + * Version: 1.0 Release + * Author: G.Raf + * Description: + * Library for initializing twi bus + * ----------------------------------------- + */ + +#include "twi.h" + +void twi_init(void) +{ + TWI0.MBAUD = (unsigned char)TWI_BAUD_RATE(F_TWI); + TWI0.MCTRLA = (1<>1)) + #endif + + #ifndef TWI_PRESCALE // TWI TWSR register prescaler (0-3) + #define TWI_PRESCALE 0 + #endif + + #ifndef TWI_WRITE // TWI write command + #define TWI_WRITE 0x00 + #endif + + #ifndef TWI_READ // TWI read command + #define TWI_READ 0x01 + #endif + + // Definition of TWI processing (Enabled = Interrupt/Disabled = Polling) + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // !!! Interrupts are not included in this library !!! + // !!! If interrupts are used, polling will be !!! + // !!! disabled !!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + //#ifndef TWI_TWIE // TWI Interrupt based processing + // #define TWI_TWIE + //#endif + + #include + + enum TWI_Operation_t + { + TWI_Write=TWI_WRITE, + TWI_Read=TWI_READ + }; + typedef enum TWI_Operation_t TWI_Operation; + + enum TWI_Acknowledge_t + { + TWI_NACK=0, + TWI_ACK + }; + typedef enum TWI_Acknowledge_t TWI_Acknowledge; + + enum TWI_Status_t + { + TWI_None=0, + TWI_NAck, + TWI_Ready, + TWI_Arbitration, + TWI_Error + }; + typedef enum TWI_Status_t TWI_Status; + + void twi_init(void); + void twi_disable(void); + TWI_Status twi_status(void); + + #ifndef TWI_TWIE + void twi_start(void); + void twi_stop(void); + TWI_Status twi_address(unsigned char address, TWI_Operation operation); + TWI_Status twi_set(unsigned char data); + TWI_Status twi_get(unsigned char *data, TWI_Acknowledge ack); + #endif + + +#endif /* TWI_H_ */ \ No newline at end of file diff --git a/library/uart/main.c b/library/uart/main.c new file mode 100644 index 0000000..3bfd0ba --- /dev/null +++ b/library/uart/main.c @@ -0,0 +1,132 @@ + +/* ----------------------------------------- +* G.Raf^engineering +* www.sunriax.at (github.com/0x007e) +* ----------------------------------------- +* Platform: Independent +* Hardware: ATTiny406/1606/... +* ----------------------------------------- +* Version: 1.0 Release +* Author: G.Raf +* Description: +* Sample for initializing uart +* ----------------------------------------- +*/ + +#define F_CPU 20000000UL + +// System libraries +#include +#include +#include + +// User libraries +#include "uart.h" +#include "../system/system.h" + +// Static test variables for printf +static unsigned int x = 123; // Numeric +static unsigned char a = 'A'; // Character +static unsigned char str[] = "Test"; // String +static double z = 123.43; // Floating Point + +int main(void) +{ + // Initialize UART + // Baud: 9600 + // Parity: None + // Stopbit(s): 1 + uart_init(); + + // Put a single char without printf + uart_putchar('0'); + uart_putchar('x'); + uart_putchar('0'); + uart_putchar('0'); + uart_putchar('7'); + uart_putchar('E'); + uart_putchar('\n'); + uart_putchar('\r'); + + // Print a String + printf("Hello, world!\n\r"); + + // Print different variables + printf("Variables -> %d, %c, %s\n\r", x, a, str); + + // Linker parameter necessary: + // -> Libraries: libprintf_flt + // -> General: Use vprintf + // -> Miscellaneous: -Wl,-u,vfprintf -lprintf_flt -lm + printf("Variable y: %f\n\n\r", z); + + while (1) + { + // Scan for a char blocking + UART_Data status; + uart_putchar(uart_getchar(&status)); + + // Scan for a char non-blocking + printf("\n\rPress a key to abort: "); + + for (unsigned char i=0; i < 50; i++) + { + uart_putchar('+'); + + char temp; + + if(uart_scanchar(&temp) == UART_Received) + { + break; + } + } + uart_putchar('\n'); + uart_putchar('\r'); + + // Make a request from console + printf("Please enter a number: "); + unsigned int zahl1; + + if(scanf("%3u", &zahl1) == 1) + { + printf("\n\n\rThe result of %u * 5 equals: %u\n\n\r", zahl1, (zahl1 * 5)); + } + else + { + uart_clear(); + printf("\n\rInput error!\n\n\r"); + } + + printf("Please insert 10 characters: "); + char test[11]; + + if(scanf("%10s", test) != 0) + { + printf("\n\n\rInput result: %s\n\n\r", test); + } + else + { + uart_clear(); + printf("\n\rInput error!\n\n\r"); + } + + printf("Please enter a decimal number: "); + float zahl2; + + // Linker parameter necessary: + // -> Libraries: libscanf_flt + // -> General: Use vprintf + // -> Miscellaneous: -Wl,-u,vfscanf -lscanf_flt -lm + if(scanf("%f", &zahl2) == 1) + { + printf("\n\n\rThe result of %f * 5.23 equals: %f\n\n\r", zahl2, (zahl2 * 5.23)); + } + else + { + uart_clear(); + printf("\n\rInput error!\n\n\r"); + } + + _delay_ms(1000); + } +} \ No newline at end of file diff --git a/library/uart/uart.c b/library/uart/uart.c new file mode 100644 index 0000000..6206149 --- /dev/null +++ b/library/uart/uart.c @@ -0,0 +1,252 @@ +/* ----------------------------------------- + * G.Raf^engineering + * www.sunriax.at (github.com/0x007e) + * ----------------------------------------- + * Platform: Independent + * Hardware: ATTiny406/1606/... + * ----------------------------------------- + * Version: 1.0 Release + * Author: G.Raf + * Description: + * Library for initializing uart + * ----------------------------------------- + */ + +#include "uart.h" + +#if UART_STDMODE > 0 + // Initialize FILE stream + #if !defined(UART_TXCIE) && !defined(UART_UDRIE) && !defined(UART_RXCIE) && UART_STDMODE == 1 + static FILE std_uart = FDEV_SETUP_STREAM(uart_printf, uart_scanf, _FDEV_SETUP_RW); + #elif !defined(UART_TXCIE) && !defined(UART_UDRIE) && UART_STDMODE == 2 + static FILE std_uart = FDEV_SETUP_STREAM(uart_printf, NULL, _FDEV_SETUP_WRITE); + #elif !defined(UART_RXCIE) && UART_STDMODE == 3 + static FILE std_uart = FDEV_SETUP_STREAM(NULL, uart_scanf, _FDEV_SETUP_READ); + #endif +#endif + +#if !defined(UART_RXCIE) && !defined(UART_TXCIE) && !defined(UART_UDRIE) + #if UART_HANDSHAKE > 0 + static UART_Handshake uart_handshake_sending = UART_Ready; + #endif +#endif + +void uart_init(void) +{ + // UART PORT settings + #ifdef UART_ALTERNATE_PORT + PORTMUX.CTRLB = PORTMUX_USART0_ALTERNATE_gc; + #endif + + UART_PORT.DIRSET = UART_TX_PIN; + UART_PORT.DIRCLR = UART_RX_PIN; + + // Check if hardware flow control is enabled + #if UART_HANDSHAKE == 2 + // Setup RTS (output)/CTS (input) + UART_HANDSHAKE_PORT.DIRSET = UART_HANDSHAKE_RTS; + UART_HANDSHAKE_PORT.DIRCLR = UART_HANDSHAKE_CTS; + #endif + + // Check which bit sampling mode should be activated + #if UART_SAMPLE == 1 + USART0.CTRLB |= (UART_SAMPLE<<1); // Setup 8 samples/bit + #else + USART0.CTRLB &= ~(UART_SAMPLE<<1); // Setup 16 samples/bit + #endif + + USART0.BAUD = (unsigned int)UART_BAUD_RATE(BAUDRATE); + USART0.CTRLC = (0x03 & (UART_DATASIZE - 5)); // Setup data size + + #if UART_PARITY > 0 + USART0.CTRLC |= (0x30 & ((UART_PARITY + 1)<<4)); // UART_Parity Mode + #endif + + #if UART_STOPBITS > 1 + USART0.CTRLC |= (0x08 & (UART_STOPBITS<<3)); // Setup stop bits + #endif + + // Interrupt control + USART0.CTRLA = 0x00; + + // Enable transmitter/receiver + USART0.CTRLB |= USART_TXEN_bm | USART_RXEN_bm; + + // Receiver interrupt setup + #ifdef UART_RXCIE + USART0.CTRLA |= USART_RXCIE_bm; + #endif + + // Transmitter interrupt setup + #if defined(UART_TXCIE) && !defined(UART_UDRIE) + USART0.CTRLA |= USART_TXCIE_bm; + #endif + + // Transmitter interrupt setup + #if !defined(UART_TXCIE) && defined(UART_UDRIE) + USART0.CTRLA |= USART_DREIE_bm; + #endif + + #if !defined(UART_TXCIE) && !defined(UART_UDRIE) && (UART_STDMODE == 1 || UART_STDMODE == 2) + stdout = &std_uart; + #endif + + #if !defined(UART_RXCIE) && UART_STDMODE == 1 || UART_STDMODE == 3 + stdin = &std_uart; + #endif +} + +void uart_disable(void) +{ + USART0.CTRLB &= ~(USART_TXEN_bm | USART_RXEN_bm); + USART0.CTRLA &= ~(USART_RXCIE_bm | USART_TXCIE_bm | USART_DREIE_bm); +} + +#if !defined(UART_TXCIE) && !defined(UART_UDRIE) + char uart_putchar(char data) + { + // Wait until last transmission completed + while (!(USART0.STATUS & USART_DREIF_bm)) + { + ; + } + USART0.TXDATAL = data; // Write data to transmission register + + return 0; // Return that there was no fault + } + + #if (UART_STDMODE == 1 || UART_STDMODE == 2) + int uart_printf(char data, FILE *stream) + { + return uart_putchar(data); + } + #endif + +#endif + +#if !defined(UART_RXCIE) + UART_Data uart_scanchar(char *data) + { + // If data has been received + if(USART0.STATUS & USART_RXCIF_bm) + { + // Check if an error during receiving data occurred + if(uart_error_flags() != UART_None) + { + *data = 0; + return UART_Fault; + } + + #if UART_HANDSHAKE == 1 + if (*data == UART_HANDSHAKE_XON) + { + uart_handshake_sending = UART_Ready; + return UART_Empty; + } + else if (*data == UART_HANDSHAKE_XOFF) + { + uart_handshake_sending = UART_Pause; + return UART_Empty; + } + #endif + + *data = USART0.RXDATAL; + + #if defined(UART_RXC_ECHO) && !defined(UART_TXCIE) && !defined(UART_UDRIE) + // Send echo of received data to UART + uart_putchar(*data); + #endif + + return UART_Received; + } + return UART_Empty; + } + + char uart_getchar(UART_Data *status) + { + char data; + + // Wait until data has been received or an error occurred + do + { + *status = uart_scanchar(&data); + } while (*status == UART_Empty); + + return data; + } + + #if (UART_STDMODE == 1 || UART_STDMODE == 3) + int uart_scanf(FILE *stream) + { + UART_Data temp; + + return (int)uart_getchar(&temp); + } + + void uart_clear(void) + { + clearerr(stdin); // Clear error on stream + getchar(); // Remove character from stream + } + + UART_Error uart_error_flags(void) + { + // UART_Frame error + if(USART0.RXDATAH & USART_FERR_bm) + { + USART0.RXDATAL; // Clear UART data register + return UART_Frame; // Return NUL + } + // Data UART_Buffer overflow error + else if(USART0.RXDATAH & USART_BUFOVF_bm) + { + USART0.RXDATAL; // Clear UART data register + return UART_Overrun; // Return NUL + } + // UART_Parity error + else if(USART0.RXDATAH & USART_PERR_bm) + { + USART0.RXDATAL; // Clear UART data register + return UART_Parity; // Return NUL + } + return UART_None; + } + #endif +#endif + +#if !defined(UART_RXCIE) && !defined(UART_TXCIE) && !defined(UART_UDRIE) + #if UART_HANDSHAKE > 0 + UART_Handshake uart_handshake(UART_Handshake status) + { + if(status == UART_Ready) + { + #if UART_HANDSHAKE == 1 + uart_putchar(UART_HANDSHAKE_XON); + #elif UART_HANDSHAKE == 2 + UART_HANDSHAKE_PORT &= ~(1< + #include + + void uart_init(void); + void uart_disable(void); + + #if !defined(UART_TXCIE) && !defined(UART_UDRIE) + char uart_putchar(char data); + + #if UART_STDMODE == 1 || UART_STDMODE == 2 + int uart_printf(char data, FILE *stream); + #endif + #endif + + #if !defined(UART_RXCIE) + char uart_getchar(UART_Data *status); + UART_Data uart_scanchar(char *data); + UART_Error uart_error_flags(void); + + #if UART_STDMODE == 1 || UART_STDMODE == 3 + int uart_scanf(FILE *stream); + void uart_clear(void); + #endif + #endif + + #if !defined(UART_TXCIE) && !defined(UART_UDRIE) && !defined(UART_RXCIE) + #if UART_HANDSHAKE > 0 + UART_Handshake uart_handshake(UART_Handshake status); + #endif + #endif + +#endif /* UART_H_ */ \ No newline at end of file