Ik ben bezig met het programmeren van een ATTiny2313.
Hij is nu zo geprogrammeerd dat hij om de seconde een led aan/uit zet.
Echter doet tie dit nu om de 5seconden (ongeveer).
Er is dus iets fout met de timing.
Hij was geprogrammeerd zoals die uit de fabriek komt: Intern kristal
Dus ik dacht ik doe er een extern kristal aan. Maar het helpt niet, ik denk dat hij het externe kristal negeerd en gewoon z'n interne gebruikt, om dat op te lossen moet ik iets met de fusebits doen gok ik?
Misschien is dit een overbodige oplossing en kan het ook gewoon met intern kristal...?
Maar hoe?
Moet ik misschien de XTAL1 & 2 aan de ground hangen o.i.d. als ik het interne kristal gebruik?
Dit had ik ook al geprobeerd maar hielp ook niet, herkent iemand mijn problemen?
WilToyo
Maak me niet gek, ik ben al gek.
ALs je een extern kristal gebruikt moet je de AVR dat vertellen via de fusebits.
Laat je code eens zien, het interne kristal is dan wel niet heel erg nauwkeurig. Maar een ledje 1 sec laten knipperen moet wel lukken.
Lees de datasheet, en met name het stukje over clocks.
Daar kun je lezen welke fusebits je moet setten om een extern kristal te gebruiken, en, nog veel belangrijker, welk fusebit je moet clearen om ervoor te zorgen dat de oscillator niet gedeeld wordt door 8. ( De CKDIV8 fuse)
In welke taal programmeer je?
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Een fabrieksnieuwe ATtiny2313 draait op z'n interne 8MHz-oscillator, met het CKDIV8-fusebit actief. De werkelijke frequentie bedraagt bijgevolg 1MHz.
De eenvoudigste manier om op 8MHz te draaien, bestaat er in CKDIV8 softwarematig uit te schakelen:
int main(void)
{
CLKPR = (1 << CLKPCE);
CLKPR = 0; // Schakel CKDIV8 uit
// enz...
Wis je een extern kristal gebruiken, dan zal je de fuse-bits moeten aanpassen.
@Hagdos Waarom mag hij niet door 8 gedeeld worden? Dat heeft toch geen effect op de tijd?
Programmeertaal is C/C++ (Arduino IDE).
void setup() {
pinMode(0, OUTPUT);
}
void loop() {
digitalWrite(0, HIGH);
delay(1000);
digitalWrite(0, LOW);
delay(1000);
}Dus ik denk niet dat jullie hier veel aan hebben...
+
Ik heb deze fuse bit calculator gevonden: http://www.engbedded.com/fusecalc/
Maar welke moet ik kiezen:
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Het is misschien beter om hem gewoon op z'n interne klok te laten lopen.
Met een extern kristal is het toch niet opgelost...
Maar het lijkt alsof de microcontroller gewoon traag is?
Dan zou je denken dat het aan de oscillator/kristal o.i.d. ligt omdat dat met de tijd enzo te maken heeft, maar misschien zit het probleem daar niet?
+
PROBLEEM OPGELOST

Ik moest eerst een bootloader installeren/branden...
En nu werkt het wel, met hulp van dit bericht: http://arduino.cc/forum/index.php/topic,67607.msg497450.html#msg497450
EricP
mét CE
Intern kristal
Dus ik dacht ik doe er een extern kristal aan. Maar het helpt niet, ik denk dat hij het externe kristal negeerdt en gewoon z'n interne gebruikt, om dat op te lossen moet ik iets met de fusebits doen gok ik?
Eh... Voor jouw begrip... Die dingen hebben geen intern Xtal. Wel een RC oscillator.
Die controller die doet loopt wel op wat je instelt. Staat je clock wel goed gedefinieerd in de software? Ding zal toch ergens moeten berekenen hoeveel waste clocks er voor 1000ms (gok ik) nodig zijn...
Op 15 augustus 2011 15:26:44 schreef Stijntjhe:
@Hagdos Waarom mag hij niet door 8 gedeeld worden? Dat heeft toch geen effect op de tijd?
Dat hangt af van hoe je je code schrijft. Als je in assembler schrijft, en de hoeveelheid klokcycli in 1 seconde hebt uitgerekend, dan maakt het nogal uit of de uC op 8 of op 1 MHz draait.
In jouw geval zou het inderdaad niets uit moeten maken, omdat de compiler dat voor je uitrekent.
[Bericht gewijzigd door Hagdos op (11%)]
De compiler rekent het goed voor je uit, aangenomen dat je kloksnelheid die je aan de compiler vertelt (bv. F_CPU) overeenkomt met de echte kloksnelheid.