Attiny13 Software Uart Bascom
I did not find much information about how can you calculate the time using timer1 on Atiny 85. All tutorials are dealing with timer0, Timer 1 is a particular one is not compatible with others, It has precallers from 1/2-1/16384 Synchronous Clocking Mode. The problem is that about any prescaler I chose lets say on internal clock 8Mhz with normal formula. (1/clock)*prescaler=Timer tick.I get totally different timing than one expected.I load the time on OCR1A and toggle some pins the time is much less. I cleared before TCCR1=0 so does not have other prescaler set.
The USI module can be used to implement SPI, TWI (also known as I 2 C) and UART serial interfaces. This post describes how to implement a simple UART receiver using the USI module. Arduino Software Serial Library. The Arduino core for ATtiny includes a Software Serial library which implements a serial UART interface.
Can you give me a hint on what is going on?I did not find any info on how to calculate timing on timer 1.It seems different than normal timer0 I can manually trial and error tweak for the value I need but this is not professional. If you want accurate timing, say for sampling a serial UART input, then you are much better off using the hardware to reset the counter as there will be no lag. If you reset the counter inside your interrupt service routine then you are going to have to account for the drift introduced by running the code. The ISR preamble takes about 42 CPU cycles to execute; there is overhead to execute the interrupt, disable global interrupts and to save registers. So in your example the counter reset is apx 43 CPU cycles after the compare match. So after the initial two toggles, the pin is being toggled every 93 (50 + 43) CPU clock cycles. Code lag on executing a timed action can be fine, e.g.
Toggling the pin 45 CPU cycles after a compare match that triggers an interrupt every 100 cycles would still give you a pin that toggled every 100 cycles. However introducing code lag into the reset of your counter changes the actual timing.
Well we know 'baby sitting' on servo is wasting time. Updating every ms, so is good to have separated board and microcontroller to controlling the servo. Unfortunately, servo controller out there is just over kill, and pricey.
So this is where the idea come from. Download video upin ipin bangau oh bangau mp3. Using ATTiny13 or ATTiny 13A (anything that at least has min 1KB flash and 64 Bytes Internal SRAM will works ) This design using single layer PCB (bottom layer only) and the firmware only has 0,1 ms resolution.
As i build this for proof of concept only, when i have time, i'll update the firmware and the PCB with double layer so i can put led for power indicator and RX indicator. The reason why i only using 0,1 ms is because the reliability for UART. The UART is very poor, its about 70% hit rate. So for using this, make sure you send the command at least 3 times.
Its because this board only using internal clock, and bitbanging UART, since ATTiny13 does not has hardware USART/UART. The UART technique is developed by Eric Evenchick. And if you take a look of his you even can use Half-duplex software UART single pin operation for this module. The command for this module only using UART. You can connect the RX pin to your arduino or other microcontroller TX pin. It has 2 type of command. The first one is single update servo command, and the second one is for updating all servo on the same time.
If you playing with by Benjamin Gray you would using the second command for updating all the servo for pointing your MeArm to the point that you want instead of only one by one. Because the firmware is beta version, you have to trial n error to add some delay for each character, so the communication miss rate is decreased (especially for 2nd command for updating all the servos). This is the sample command communication for updating the servo: 1st type (single update servo command): sent_string( 'A10'); //sent servo A valuesent_string( '!' ); //sent command to move the servo _delay_ms( 200); //wait for servo movement using delay for reliable communication sample: sent_string( 'A');_delay_ms( 1); //give a breath for the bit bang UARTsent_string( '1');_delay_ms( 1); //give a breath for the bit bang UARTsent_string( '0');_delay_ms( 1); //give a breath for the bit bang UARTsent_string( '!' ); //sent command to move the servo_delay_ms( 200); //wait for servo movement another sample: //sent value for all servos and move the servos sent_string( 'A10B15C10D20!' ); /*from command above, if any miss communication of one or more servos value, the another value that received will be processed*/ 2nd type (updating all the servo) sent_string( 'A10B15C10D20*') //sent value for 5 servos and move the servos /*with asterisk '*' (star) command, if any missed value all servos will not executed*/ nb: • Because of hit rate UART less than 70% there is good for you to repeat the command 3-5 times. • With a proper delay for each character being sent, i found the hit rate is among 95%.