The next episode is up! Learn about external interrupts in Arduino: kzbin.info/www/bejne/gGeUkIOBrrydrrc
@jerryocrow15 жыл бұрын
Your visual props and paper, clear voice and audio, pacing, sequencing, spiriling, and script are SO HELPFUL. You are a really good teacher. Whereever you work, you deserve a raise, promotion, and an assistant. Go get 'em tiger!
@S7udio13815 жыл бұрын
This is a great reference. Actually this is the first reference I found is comprehensive enough for me to understand the registers. Great job!
@codeman99-dev4 жыл бұрын
OOooof. This description is good. If you want great instructions, then watch Ben Eater's channel. There he designed an eight bit computer from scratch. He introduces each concept slowly and sometimes will make an intentional "mistake" along the way.
@sto27793 жыл бұрын
It's nice how you saved almost half the flash memory space, that's one nice perk of programming in a lower level language. It's just ridiculous how you did not mention literally that it will run much "faster" than Arduino "overhead". All in all, this is an excellent tutorial with zero confusion and explanation about making use of microcontroller registers using the bitwise operators.
@richardsalmon20466 жыл бұрын
Awesome video. That was the best explanation I've seen on the matter.
@ShawnHymel6 жыл бұрын
Thank you! Trying to figure out how to explain registers proved to be quite difficult. Glad to hear it helped!
@kennycho16823 жыл бұрын
It's amazing to see that what I'm learning in school actually relates to something really fascinating and useful. Well done!
@TroyFletcherKeyboards5 жыл бұрын
The 660 page monstrosity is what enthusiasts read and understood before meta languages and corporations made money making things more high level, easier to understand, and also slower and less efficient. Now you make videos explaining what a register is. Edit: Alright, I was kind of salty. This is a pretty good video that goes into depth and is quite understandable. Have a like.
@nderezic4 жыл бұрын
This perfectly demonstrates the benefits of more abstract programming languages: they are more readable and less prone to bugs. It also demonstrates benefits of avoiding abstract languages in microcontrollers. Damn! Now I need to rewrite all my code 😉
@jawadtahmeed6 жыл бұрын
Long before Arduino came, we MCU programmers had always been doing this. Took quite a while to learn all those bit banging, but it was worth the time spent. Anyway, good tutorial. :)
@ColinRichardson6 жыл бұрын
Another thing I found amazing, was the SPEED increase from doing multiple digital writes to being able to write multiple pins directly at once (as long as they are on the same port letter). It wasn't just "faster" it was Monumentally faster. When dealing with multiplexing Multiple 7 Segment LEDs, the "off segments went from having a ghost of the previous figures to being very sharp.
@ShawnHymel6 жыл бұрын
This is true. Manually working with registers saves you clock cycles in addition to program space.
@petercorrea2 жыл бұрын
This is the exact video I’ve been searching for to begin my bare metal journey. I wanna know all the tiny details in every nook and cranny.
@AhmadAsmndr4 жыл бұрын
one of the most advanced Arduino tut I have ever seen. thank you a lot.
@karlsangree467910 күн бұрын
Brilliant! I'm in the stage of shrinking Uno projects to the ATTiny85 chip and this was invaluable. That being said, I should have watched the entire video before trying the sample code. Especially the part where the pull up resistor was turned off and I spent a half hour wondering why my LED was coming on by itself lmao.
@luwang4044 жыл бұрын
feels like I'm enlightened! expecting more of this kind of videos! really really thankful to you!
@gabriellgardin5 жыл бұрын
The most wonderful thing I've seen in a long time.
@bascelik913 жыл бұрын
This is awesome! Please more tutorials on this topic. If you can,please add some references to books or so, so beginners can catch up on this topic. 👌👌
@rikkardo93594 жыл бұрын
I have never ever seen such a positive feedback command section before. It really is an iconic video!
@AlexanderBelikov4 жыл бұрын
If only I could hit Like every time I'm watching this video without dropping my previous one... Thank you!!
@valerienihsimsion18704 жыл бұрын
This is the best explanatory bit math lesson i ever followed. Thanks very much Sir.
@jesusesquibel41816 жыл бұрын
brilliant explanation. I look forward to seeing the follow-up video(s).
@favesongslist4 жыл бұрын
So good to have machine level programming being taught so well, hopefully this will help understanding of how micros work in reality rather than point and click abstraction it is for most programmers. Do you know of a good optimising compiler for Arduino, that can produce this level of optimised coding?
@martingentieu6850 Жыл бұрын
As an engineering student, this video was interesting and helpful ! Thank you.
4 жыл бұрын
Thanks for explenation. I have a question: how can we do bitwise operation if the button pin is (let say) pin 12 (PB5), and ledPin is pin 12 (PB4). I mean in digitalRead part. Do we still have to define ledPin as output ? (Because of DDRB =001000, all other pins exept 5, are inputs. )
@sathvikswaminathan79334 жыл бұрын
@10:40 it is a better practice to manipulate the DDR register value by using the OR logic. For example, DDRD = DDRD | B00100000; would be a better practice because digital pins 0 and 1 aren't supposed to be meddled with as they're used for serial communication.
@domedom22276 жыл бұрын
Awesome Video! Very cool Idea with the Containers to show how to set the bits
@chibuzordesmond39372 жыл бұрын
I watch for two minutes and I try to like only to see I’ve already liked.
@buildersmark6 жыл бұрын
Really good tutorial. As I'm new to all of this, it takes a bit to wrap around my head...
@beamertech14 жыл бұрын
Builder's Mark newbie here too. I watched and now I’m so confused I’m thinking I need to go back to the basics... wait. Where are the basics?
@BitsOfBoris5 жыл бұрын
GOD. That was so clearly put together. THANKS.
@ricsanders693 жыл бұрын
Brilliant...nothing against adafruit...but here is the beginning of you not having to depend on another library maker for code! As an an exercise you can look at the low-level libraries that are out there and it would look more like the code in the video...great for learning! :-D
@Abdelhamid_Helal4 жыл бұрын
Great explaination !. but could you explain the analogwrite and analogread funcutions ?
@randomrandom4206 жыл бұрын
That's funny. I'm writing down in my notebook as when I was at school. Thanks, professor!
@sebastiannicolasgiles36596 жыл бұрын
title should be: "level down your arduino code"
@SantuS0216 жыл бұрын
With subtitle: "Speed up your code to whole new level"
@ShawnHymel6 жыл бұрын
LOL that's fantastic. Love it!
@sebastiannicolasgiles36596 жыл бұрын
you mean "old level" ahaha
@galihtanu4 жыл бұрын
Level up i think ! Because much motlre dificult to trace and understanding.
@tybot62244 жыл бұрын
Haha you say old code but the Arduino IDE uses this method for programing the atmega32p board. PinMode() is one of the functions from the arduino IDE. This type of "old code" makes you arduino more efficient and accurate.
@sharingmylittleinsight2 жыл бұрын
all stuff get simpler with good analogy, thanks a lot sir
@bkriegsman28906 жыл бұрын
Nicely done, great example and pretty quick pace.
@chimpspecialist4 жыл бұрын
I can't possibly imagine a better tutorial. Okay, I probably could, but you came pretty darn close!
@turnerkirk19204 жыл бұрын
This is an UNBELIEVABLY AWESOME TUTORIAL!!! thank you thank you thank you thank you!!!
@1DR31N3 жыл бұрын
Awesome. A real expert who masters Arduino, and much more for sure.
@CAXRAMEDIA4 жыл бұрын
Useful video. We love it. Thanks SparkFun 🙏
@redboxup4 жыл бұрын
very well explained, thank you for putting so much effort!!!
@sovatnaphon93845 жыл бұрын
Thank you very much for your episode, but I am still having another trouble while trying to connect two sensor in one raspberry pi board. May you please help, especially changing the address!
@mxcollin955 жыл бұрын
Great video!!! Learned a ton from this video! I’ll definitely be downloading and saving this lesson! Thanks for explaining this. 👍
@milindmohapatra27455 жыл бұрын
Really helpful video. But I have a doubt. By manipulating registers, how can we generate pwm signals. Basically I am asking for the replacement of the "analogWrite()" function. Thank you for the help.
@alexdavidsantiago39553 жыл бұрын
The Arduino.h file has the bitRead, bitSet, bitClear, bitToggle, and bitWrite definitions that do all the bit shifting, we just enter the register and the bit
@galihtanu4 жыл бұрын
Please upload more about data register.
@JeremyHongelectronics6 жыл бұрын
Excellent video Shawn! Definitely was a good refresher for me. :)
@ShawnHymel6 жыл бұрын
Most welcome, and glad it helped!
@guardiangamer2695 Жыл бұрын
It was very nicely done
@TheExvitermini7 ай бұрын
Hello Sir, would it be possible to write a variable (integer for example) to one of the Arduino registers and then reading the register from a PLC using modbus (through RS485 shield)? Or, is it possible to write a variable from Arduino directly into a PLC register using modbus?
@emj-music2 жыл бұрын
This is awesome! Thank you for the amazing tutorial.
@Electrologia2 жыл бұрын
really great video, thanks a lot!
3 жыл бұрын
I like your videos and learn a lot. Appreciate for that.
@justinindustries4 ай бұрын
Wow, I didn't know you could do this with a arduino! What would be the point of using registers on code when it does the same thing as the normal code? Am I missing something here?
@martijnvangorp4 жыл бұрын
Very good explanation. Goodjob
@workethicrecords59016 жыл бұрын
Can't wait for part 2!
@calfee624 жыл бұрын
Profoundly useful information presented clearly. Thank you!
@sashamuller97434 жыл бұрын
really good job with all your videos they a treat to watch.
@MultsElMesco6 жыл бұрын
I finally understood registers. Great video!
@SandyNMS4 жыл бұрын
good at reducing memory usage thanks for the tutorial
@محمدقيسحسينفوزي3 жыл бұрын
Great video and useful ...
@inferno60125 жыл бұрын
this is good like really really good. I NEED MORE
@hirahaisadakeliye5 жыл бұрын
Nice video, I had experienced ur course on arduino helped me learn a lot if possible please come with another course on register programming on Udemy thanks for this video
@moinshaikh66843 жыл бұрын
Excellent tutorial! Thank you sir!
@asishreddy77293 жыл бұрын
I know this was a wonderful explanation. But I understood nothing. What am I missing and where do I learn it? I don't know how to interpret matter on data sheets and the terminology for starters.
@DerMarkus19824 жыл бұрын
Wait a moment! You are removing the pull-up resistor from PORTD (12:30 - 12:35). You might run into an issue here, making the Arduino unable to recognize that you release the button (input pin stays at 0V). Or am i interpreting this the wrong way? You have to set/clear ONLY the 32's position bit on PORTD when you turn the LED on/off...
@sumitthapa0014 жыл бұрын
Can you share the data sheet
@mmulisha1022 Жыл бұрын
What can be slightly confusing to new users, are when you are using IO pins that are not "inline" with the port Pins. Example IO pins 8 thru 13 are PINB 0 thru 5. So instead of defining the Variable as the IO pin you would want to define them as the PINB pins... So for a button hooked to IO pin 8 you would want variable as such const int bnt_pin = 0; Not const int bnt_pin = 8;
@shafiqalom84084 жыл бұрын
Awesome...make video on PWM control and Serial communication in Arduino by using Registers(port manipulation)...Advance Thanks...
@RyanNeufeld6 жыл бұрын
This was fantastic! Thank you. I learned a lot.
@chrisw14626 жыл бұрын
@17:00, you spend a bit of time determining the value of a bit. The AND isolates the bit, but that's as far as you need to go. Since it also ensures every other bit is '0', all you need to do is test for non-zero (usually the second fastest test in a microprocessor). i.e. If The shift you use to test for equal to '1' is unnecessary. "HIGH" and "LOW" are typically macros for non-zero and zero, respectively. If that's how the Arduino library defines them, you woudn't even have to change your If statement.
@jordanmusleh63053 жыл бұрын
I have a question how can I a 2 robot arm project and a motor vehicle project in one arduino uno is it possible to make it happen..?? I have been working on it for months and no use for it I don’t know if my codes is right or it won’t work ...please help me..!!
@jeffvoight65865 жыл бұрын
If you're trying to save space and execution time, just use PORTD = B0010000 & PORTD; Saves two instructions and 3 or 4 clock ticks.
@Ghost5724 жыл бұрын
Doing it by registers also makes accessing those input pins a lot faster, fairly sure the number I saw was ~56uS for DigitalWrite and using that register method brings it down to 5uS. I will find the name of the video and put it on this comment.
@rubikon76484 жыл бұрын
Excellent explanation i had met so far, thank you,
@shifter655 жыл бұрын
What are the little bins usually used for? Or were they made specifically for the purpose of illustrating bits? Can't think of anything that small needing a mini bin.
@meepk6335 жыл бұрын
Pills.
@massimookissed10234 жыл бұрын
They are often sold as containers for SMD components, although not-removing the components from their tape reel in the first place is a better way of storing them.
@testgearaddicts46074 жыл бұрын
YT channel 'Joop Brokking' posted this project in 2016. Arduino makes code "human readable", in that it makes sense to beginners. The Arduino IDE is great to get acquainted with embedded, I'm 100% stoked its out there, but to make it to the 'real world project level' you have to manipulate registers without the crazy 'Playground' overhead. If you want to be freed from GitHub, you will have to learn to read the data sheets yourself, and not expect others to do the work for you. Bottom line, an ATMega328 costs less than a buck ($1) and you can get 'Blinky' working for less than 1% of the available space using a better IDE.
@kifahzaidan45052 жыл бұрын
Hi, Thanks a lot, its really greate effort and great knowledge. i need to do a project for a preset position linear actuator with a DC motor abd a stepper motor, with Arduino Mega or UNO but i am not able to write the code and the scheme, can you please help. Regards
@incxxxx5 жыл бұрын
What for you wrote >>btn_pin in the first line of the loop at the end of the line: int btn= (PIND & (1 btn_pin; when we have: const int btn_pin=2 and int btn is already assigned: int btn= (PIND & (1
@arthasronald21863 жыл бұрын
Why the register codes completely doesn't work on my Arduino mega 2560? Is that because of pin issues?
@lycankarmah19764 жыл бұрын
Very great explanation. Thank you
@AdityaMehendale6 жыл бұрын
Hi Shawn, Awesome video, but three details that you skipped over in my opinion, (that are quite important for beginners): 1) the bit-shift to select the bit for ANDing or ORring is evaluated by the compiler while compiling and is not actually shifted by the processor-code in run-time (and therefore is exactly the same byte-code as an explicit 8-bit OR-mask): So _switches_port = switches_port [bitwiseAND] 1
@ShawnHymel6 жыл бұрын
1) I did not realize that the compiler actually optimizes the shifting operation. Can you tell me how this is done or point to some docs that explain it? 2) AVR uses the _BV() macro to make the code easier to read for shifting operations, which is why I show it at the end of the video. However, it's unique to the architecture/manufacturer, whereas knowing how to bit shift is more universal (which is why I showed it first).
@tiborbogi74576 жыл бұрын
You are right, if somebody wants quick short code , write it in assembly, AVR have SBR CBR instruction for bit setting or clearing.
@ShawnHymel6 жыл бұрын
tibor bogi aaah, that makes sense as to how the AVR compiler can optimize bit setting/clearing. It's been a long time since I've touched AVR assembly, so I had forgotten about those instructions!
@estebanacevedorivillas17996 жыл бұрын
I use int sw = PIND & ( 1 > boton; for read a digital port, but if I need Read an analog port witch registers what need to do?
@phoperdox_sore6 жыл бұрын
Never thought about that, thanks for making this this video!!!
@noealves84006 жыл бұрын
Awesome video. great work guys.
@lucianomaia94607 ай бұрын
amazing content, very well explained
@vigneshperiyasamy30192 жыл бұрын
0 FOR INPUT, 1 FOR OUTPUT? OR VICE VERSA . WILL IT CHANGE FOR EVERY uCS
@taranagnew4366 жыл бұрын
where can i find the pdf for it and can you put the mega register onto a arduino uno?
@ufohunter36886 жыл бұрын
I'm not clear as to why the Arduino compiler doesn't do this optimization by itself?
@ShawnHymel6 жыл бұрын
Remember that Arduino isn't a compiler, it's a framework that provides an abstraction layer for dealing with microcontroller functions (think of it like a collection of libraries). If you dig into the Arduino source code and look at the digitalWrite() function (github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring_digital.c ), you'll see that there a lot more checks and pieces of code than just flipping bits in a register. This is what abstraction does--it makes something easier to use at the expense of speed and code size.
@ufohunter36886 жыл бұрын
I come from the PIC world. Pretty much all the codes are direct register manipulation. digitalWrite() and digitalRead(), are too slow in that world too. TRIS and PORT are data direction and port registers in PICs. TRISA and PORTA are for port A as an example. Also, there is a compiler that Arduino uses. I don't remember the name, maybe avr-g++, but I know its open source.
@ShawnHymel6 жыл бұрын
Arduino uses whichever compiler is needed for the target microcontroller. If it's an AVR (such as the 328p), then it uses avr-g++. If it's an ARM core, then it might use something like arm-none-eabi-g++.
@ufohunter36886 жыл бұрын
Got it. Makes sense. Thanks.
@thenerdyouknowabout6 жыл бұрын
"32x8 General Purpose Registrers" - Good job MicroChip...
@ShawnHymel6 жыл бұрын
LOL you mean they forgot to put that it was 32x 8-bit registers? Because I know it's not supposed to be 256 registers :)
@JohnDo-j7z6 жыл бұрын
Thank you !! Thats what i am looking for :)
@AbdulRauf-le1el5 жыл бұрын
excellent lesson.
@jude88764 жыл бұрын
I LOVE THIS, THANK YOU SO MUCH!
@RoyvanLierop6 жыл бұрын
4m47s There are three possible states for a GPIO-pin, not two as told. A pin can be digital in, digital out or high impedance.
@ShawnHymel6 жыл бұрын
You are correct in that I did not mention high impedance mode, so thanks catching that. In AVR, high-Z is accomplished by setting the corresponding bits for DDRx and PORTx to 0, which is the same as setting the pin to input with no pull-up. So, while tri-state does exist for AVR, it's also considered an input mode. See section 1.3 in this excerpt from an AVR Primer book: bit.ly/2r2zZa1
@nedvedsimao1253 Жыл бұрын
very nice video. great work thank you sir
@taranagnew4366 жыл бұрын
where do you get the arduino base in 8:16?
@robertstrong1726 жыл бұрын
Reminds me of the peek and poke in my old Vic 20
@denispimentel76946 жыл бұрын
What's the difference between: DDRD|=(1
@ShawnHymel6 жыл бұрын
The |= operator says to bitwise OR the value to the left of the operator with the value to the right and then store the result back in the value on the left. It's known as a "compound assignment operator." For example: a |= b; is the same as writing: a = a | b; Hope that helps!
@danblankenship57445 жыл бұрын
@@ShawnHymel In the first example of his original question: DDRD|=(1
@ShawnHymel5 жыл бұрын
@@danblankenship5744 correct, you are telling the register to change its value in the second example.
@galihtanu4 жыл бұрын
Bitwise is amazing. 👍
@bigbamtv8112 Жыл бұрын
Clear teaching
@wajdibrahem76174 жыл бұрын
how can I write in RFM69HCW registers ?
@leggomypotato14843 жыл бұрын
Can someone explain why he is bit "shifting"? He says it's to retain changes made by other things while still changing the bit you want, but I can't comprehend how bit shifting accomplishes this for any case other than this specific function, which is better accomplished by just writing the bit... It sounds like a very good way to accidentally put 1's and 0's where they don't belong and disrupt other functions. WHY? You can just 'OR' it with B00000010