Anoniem
Hallo,
Ik heb in mijn attiny 2313 het volgende programma geladen:
http://expand.xs4all.nl/avr/circuit1.html
Wanneer ik het programma run is de delay echter geen 500ms zoals zou moeten zijn, maar eerder 7 seconden! ik heb in mijn makefile de cpu frequentie defined dus dat zou geen probleem moeten zijn, tijdens het compileren geeft hij ook geen errors aan. Ik maak gebruik van het winavr pakket (dat wil dus zeggen gcc-avr).
Iemand suggesties?
Heb je de fuses gecontroleert?
CLKDIV8 staat die aan?
Zet die dan uit of verander uw Fosc naar 1000000
Deze fuse deelt uw frequentie met 8.
Robin
Marcel
AVR C tutorial http://expand.xs4all.nl/avr
Het probleem zit in de makefile. Een ATtiny2313 draait vanuit de fabriek op 1MHz. De F_CPU in de makefile zou dus op 1000000 moeten staan.
Nu je de CKDIV8 fuse uit hebt gezet draait de AVR op 8MHz, maar ook dan klopt de F_CPU 16000000 (16MHz) die in de makefile staat niet. Het zou 8000000 moeten zijn.
Anoniem
Dus standaard staat de clkdiv8 aan? die de standaard frequentie van 8mhz deelt door 8 zodat je een 1 mhz krijgt?.
Of heb ik het nu helemaal verkeerd. Het zou toch ook verder geen kwaad moeten kunnen om de cpu-snelheid te wijzigen? ik ga er vanuit dat de C-library's de timing dan gewoon corrigeren (althans, de cpu draait nu op 16mhz, als in de makefile, en clkdiv8 staat uit. en de timing is nu wel goed)
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Dus standaard staat de clkdiv8 aan? die de standaard frequentie van 8mhz deelt door 8 zodat je een 1 mhz krijgt?
Helemaal juist.
Je kan die CLKDIV8 ook softwarematig (in je programma) uitschakelen. De werkwijze staat in de datasheet beschreven.
Daarnaast kan je --moest dat nodig zijn-- de AVR heel wat sneller laten draaien op zijn interne oscillator, door de waarde van OSCCAL naar wens te verhogen. Doe dit niet, als je gebruik wil maken van intern EEPROM - dat geeft problemen.
Marcel
AVR C tutorial http://expand.xs4all.nl/avr
Op 16 december 2008 19:55:15 schreef Peter Rus
f heb ik het nu helemaal verkeerd. Het zou toch ook verder geen kwaad moeten kunnen om de cpu-snelheid te wijzigen? ik ga er vanuit dat de C-library's de timing dan gewoon corrigeren (althans, de cpu draait nu op 16mhz, als in de makefile, en clkdiv8 staat uit. en de timing is nu wel goed)
De CPU snelheid kan je gerust wijzigen, maar je moet dat wel doorgeven aan de C library zodat die er rekening mee kan houden. Dat doe je met die F_CPU constante.
Weet je zeker dat de CPU nu op 16MHz draait? Dat kan alleen als je gebruik maakt van een externe klok. De interne gaat niet hoger dan 8MHz. Je kan daar zoals Pros aangeeft met OSCCAL nog wel zowel positief als negatief van afwijken, maar niet 16MHz.
Anoniem
Maar wat ik me dan afvraag:
Is het in het algemeen beter om clkdiv8 gewoon op zn default te laten staan (aan dus) en mn cpu frequentie op 8mhz in te stellen in de makefile (zodat ie dus eigenlijk op 1 mhz draait?)
of
clkdiv8 uitzetten en in de makefile de ware frequentie in te stellen.
in andere woorden: gaan de meeste programmeurs uit van een clkdiv8 = 1 ?
(ik krijg natuurlijk wel in plaats van een led die 1 seconde aan is/1 seconde uit een led die 8 seconden aan is en 8 seconden uit bij de eerste methode, wat me niet wenselijk lijkt, maar ik zou graag wat verduidelijking willen)
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Je kan daar zoals Pros aangeeft met OSCCAL nog wel zowel positief als negatief van afwijken, maar niet 16MHz.
Ik haal hier 12.4MHz.
@Peter Rus: het hangt er allemaal van af, wat de AVR precies moet doen, en hoe snel het moet gaan. Om een LED wat te laten knipperen maakt het allemaal niet zoveel uit. Plaats in je Makefile (of in je programma) wat de werkelijke frequentie is. De delay-routines worden dan automagisch aangepast.
Bij gebruik van de UART doe je er beter aan, een kristal te gebruiken. En CKDIV8 uit te schakelen.
Ook als het allemaal heel snel moet gaan, is een kristal aanbevolen. Dan kan je tot 20MHz gaan.
Moet het snel gaan, maar is de preciese frequentie minder belangrijk (geen gebruik v/d UART) en heb je de EEPROM niet nodig, dan kan je met OSCCAL wat spelen om "gas te geven".
Wat de programmer betreft: een snelle klok is steeds OK. Enkel als je de AVR heel traag wil laten draaien (om zuinigheidsredenen) moet de programmer daar rekening mee houden. Bij avrdude --in combinatie met een bitbang-programmer-- doe je dat met de optie "-i delay", waarbij "delay" opgegeven wordt in microseconden.
f heb ik het nu helemaal verkeerd. Het zou toch ook verder geen kwaad moeten kunnen om de cpu-snelheid te wijzigen? ik ga er vanuit dat de C-library's de timing dan gewoon corrigeren (althans, de cpu draait nu op 16mhz, als in de makefile, en clkdiv8 staat uit. en de timing is nu wel goed)
