Erelce
**** De beschikbare ruimte van een werkplek is omgekeerd evenredig met de grootte van deze werkplek **** AVR-Oefeningen op Electronics 4 Fun
Om een analoge servo te sturen wil ik op pin2 (OC1A) van een Attiny861 een Fast PWM signaal genereren.
Maar door de vele Timers raak ik de pedalen kwijt om de juiste instellingen te maken.
Het komt er eigenlijk op neer om dezelfde instellingen over te zetten van een Attiny2313 naar een Attiny 861, omdat ik ook nog enkele analoge ingangen nodig heb.
onderstaande code is deze van de Attiny2313 die ik op de 861 wil,
#ifndef F_CPU
#define F_CPU 1000000UL // 1Mhz
#endif
#include <avr/io.h>
#include <util/delay.h>
#define OPEN PB5
#define DICHT PB0
int main()
{
// timer1: fast pwm, clear OC1B on match
TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10);
// timer1: fast pwm, ctc top=OCR1A, clk/1
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10);
OCR1A = 20000; // 20msec.
OCR1B = 1000; // 1 msec.
DDRB |= (1 << PB4); // PB4/OC1B as output
DDRB &= ~(1 << OPEN)|(1 << DICHT); // PB5 en PB0 als input
PORTB |= (1 << OPEN)|(1 << DICHT); // Pull-Up aan PB5 en PB0
uint16_t servo; // servo timing in usec.
int16_t open = 1000;
int16_t dicht = 2000;
....
EDIT:
zoiets heb ik voorlopig al voor de Attiny861,
//(OC1A)PB1 - pin 2 als output
DDRB |=(1<<PB1);
//enable PWM with comparator OCR1A
TCCR1A |= (1<<COM1A1) | (1<<COM1A0) | (1<<PWM1A);
//1MHz clock aan -> T = 1µsec.
TCCR1B |= (1<<CS10);
//fast PWM mode
//TCCR1D -> WGM11=0 dus niet gebruiken?
OCR1C = 20000; // cyclus servosignaal = 20000 µsec.= 20msec,(50Hz)
OCR1A = 1000: // 1 msec. naar servo
...
moet PLLCSR ook ingesteld worden?
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Er is een appnote voor de migratie van de attiny2313 naar de attiny261. Document AVR504.
-edit:start-
oeps: Het is de ATtiny26 naar ATtiny261
Er is dus vast ook een appnote voor de 2313 naar de ATtiny26.
-edit:end-
De stack initialisatie is bijvoorbeeld iets anders. Het hele clock devider system is gewijzigd, daar heb je nu denk ik last van.
Dus effe het docje opzoeken op de Atmel site.
Er is ook nog AVR531 om van de ATtiny261 naar de ATtimy261A te migreren.
-edit- Ik heb nog eens gekeken of er een migration appnote is direct tussen die bovenste twee maar ik kan er helaas geen vinden.
[Bericht gewijzigd door henri62 op (12%)]
Erelce
**** De beschikbare ruimte van een werkplek is omgekeerd evenredig met de grootte van deze werkplek **** AVR-Oefeningen op Electronics 4 Fun
Besluit:
De ATtiny261/461/861 beschikt maar over één 8bit/16bit Timer/counter. (TCNT0).
Als je deze als 16 bit counter wil gebruiken moet je bit TCW0 in TCCR0A aanleggen en compare registers OCR0A en OCR0B vormen dan samen ook één 16 bit compare register.
Aangezien deze 16 bit registers( TCNTOH/L en OCR0B/A) slechts over één 8 bit databus beschikken moet er via een TEMP register van en naar deze registers gelezen of geschreven worden.
Hierbij is het ook beter om de interrupt af te leggen en de gegevens die in het SREG register staan voorlopig te bewaren en na het lezen of schrijven van de 16 bit TCNTH/L en OCR0B/A, deze opgeslagen SREG waarden terug in het SREG register te steken en de interrupt terug aan te leggen.
Aangezien er met Timer0 geen software fast PWM voorzien is, is dit IC dus niet geschikt om een 16 bit software PWM toe te passen voor een servo en zal ik hiervoor dus een andere AVR moeten kiezen.
In de doc staan mooie code voorbeelden hoe je moet schrijven en lezen in deze registers.
Ook was de voorlopige code die ik eerst gevonden hed verkeerd omdat TimerCounter1 een 10bit/8bit register is en geen 16bit register.
OCR1C = 20000; // cyclus servosignaal = 20000 µsec.= 20msec,(50Hz)OCR1A = 1000: // 1 msec. naar servo