AVR Studio 6 a _delay_ms() - zpoždění trvá daleko méně

Zdravím.
Ze zvědavosti jsem odložil PICy, nainstaloval AVR studio 6, zakoupil AVRISP MkII, koupil MEGA8A, napsal jednoduchý prográmek na ledku (v simulátoru šlape), ale když jsem jej přes programátor nahnal do megy, ejhle, led bliká, ale delay trvá daleko méně, než požadovaných 500ms. Optimalizace (-O1), v čipu pojistkou navolen vnitřní RC oscilátor 1MHz. Nevíte někdo, co může být špatně? Díky za odpovědi.

[code]
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>

int main(void)
{
DDRB = 0xFF ;
while(1)
{
PORTB = 0x00 ;
_delay_ms(500);
PORTB = 0x01 ;
_delay_ms(500);
}
}[/code]

:arrow_right: administrator: přejmenováno z "AVR Studio 6 a _delay_ms()"

Jestli nedošlo k nechtěnému přepsání kalibrační konstanty oscilátoru (high byte signatury), to může dost změnit frekvenci. Hodilo by se zpětně načíst a zkontrolovat pojistky (zda se opravdu zapsaly) a kalibrační konstantu (pravděpodobně by neměla mít hodnoty 0x00 ani 0xff).

Zdravím. I kdyby se kal. konstanta přepsala (ona se nepřepsala), zajímavé je to, že když změním tu hodnotu 500ms na cokoliv jiného, leze z toho stále stejný kmitočet.

Jak máš nastavení pojistky? Mělo by být nastaveno: lfuse na 0xE1 a hfuse na 0xD9.

Nevím jak to překládá AVR Studio, u WinAVR 2010 se nad 262 ms (pro 1 MHz) používá upravený algoritmus, kdy se čítají tiky 1/10 ms, protože jinak by přetekl čítač u16 nad 65K. Možná se v AVR Studiu omezí hodnota čítače na 65K, pak by to čekalo max. 262 ms. Poznalo by se to tak, že se namísto _wait_ms(500) uvede dvakrát _wait_ms(250), zda se to tím nespraví.

myslim ze som pouzival aj dlhsie casove intervaly, len neviem ci na tak malej frekvencii. No ale ked to slo na vyssej, malo by to ist aj na nizsej.
A ked tam das napr 300 tak to kmita spravne ?
PS: prekladam v AVRStudiu…
//edit: este ma tak napadlo, ci nemas nieco zle zapojene, a ci sa ti nahodou neresetuje MCU koly chybe v zapojeni. To by potom vlastne MCU nevykonaval program, ale by to bola HW chyba…

Ahoj.
Zkousel jsem AvrStudio 6 s timto programatorem a nespolupracuje to spolu korektne. Nekdy se nahraje program spravne nekdy se vubec nenahraje a i pri verify flash tvrdi ze je tam spravne. Overenim dragonem jsem zjistil ze tam program obcas neni vubec.
Zkus pouzit pro tento programator AvrStudio 4. S funci delay_ms neni problem do nastaveni 2000 ms, potom uz to blbne.

Zdravím.
Děkuji všem za rady, přeinstaloval jsem celé AVR studio 6 včetně driveru programátoru a … sláva!!! :laughing: Už to běhá. Vyzkoušel jsem _delay_ms(500) nejprve pro 1MHz a následně 8MHz interního oscilátoru a v obou případech šlape. Jenom bych se chtěl zeptat ještě na jinou věc. U PICů jsem mohl nadefinovat konkrétní PIN jednočipu a pak jej oslovovat v programu definovaným názvem. Příklad:

define led RB0

… a pak šlo pin ovládat následně…
led = 0 ;

Jde něco podobného u AVR?

Pro DragonSoul: Zdravím. O tomhle jsem četl na stránkách Atmelu, radili programátor upgradovat. To jsem pro jistotu provedl. Mám rovněž dragona (1. verzi) a jednočip prázdný nebyl. Otázkou je, co tam bylo či naopak nebylo.

Aby měřily delay funkce správně, musejí být optimalizace nastaveny na -Os (optimize for size).
Přímá manipulace s pinem jak jsi naznačil není v C (avr toolchain) možná. Lze si nadefinovat strukturu (bitové pole), pak by to bylo něco jako PORT.B7 = 1, ale to bude nejspíš přeloženo jako RMW (pomalejší než sbi/cbi).
Lepší způsob je makro:
#define SETBIT(PORT, BIT) ((PORT) |= 1 << (BIT))
nebo rovnou
#define BIT_HIGH (PORTB |= 1 << PB2)
#define TSTBIT (PORTB & (1 << PB2))
(bitové operace překládá toolchain správně pomocí sbi/cbi - jednotaktově).

V AVR studiu 4 používám toto :

#define LED PORTB, PB3

a následně zapínám/vypínám pin takto :
sbi LED
cbi LED

Ale je to assembler. Céčko jsem na AVRko ještě nepoužil.

Možná by fungovalo i LED = 0.

Nefungovalo.
Jediné způsoby v toolchainu jsou ty, které jsem zmínil výše.
Na začátku kódu (nebo v jiném souboru) si je třeba vytvořit makra a ty pak použít.
Makro:#define SETBIT(PORT, BIT) ((PORT) |= 1 << (BIT)) #define CLRBIT(PORT, BIT) ((PORT) &= ~(1 << (BIT)))
Použití:

SETBIT(PORTB, PB2); CLRBIT(PORTC, PC3);

Pozor na to, sbi i cbi netrvají jeden ale dva takty !!

Podíval jsem se teď do datasheetu AVR instrukcí a to je zajímavé, píšou že SBI a CBI trvají 2 takty, ale u XMega jen 1 takt a pak ještě 1 takt u Reduced Core tinyAVR, čili jestli dobře chápu tak všechna Atmel AVR Tiny (?).

Asi se to týká jenom Attiny4,5,9,10. Viz en.wikipedia.org/wiki/Atmel_AVR_instruction_set.
V případě nejistoty mrknout do datašítu.