ATTiny85

Čau,
mam docela zapeklitý problém s ATTiny85.
Po nahrání programu program nepracuje tak jak má, registry mam nastavené správně.
Když nastavuji digitální výstup na log.1 tak i po jejím znegování, je stále v tom samém stavu. Stejně tak, když chci toggle portu tak to nic nedělá.
Já nechápu kde je zakopaný pes, mcu jsou nové, koupené před 3 týdny.Předtím jsem psal firmware pro projekt do stejného typu MCU, ale starého 5 let na kterém jsem dříve pracoval skrze Arduino UNO v ISP režimu a vypaloval do něj bootloader. Jenže projekt jsem chtěl přemigrovat na nové MCU a hle, firmware se nahraje i smaže, ale prostě MCU nepracuje :frowning:
Co se týče prostředí, tak používám MPLAB X 5.35 pod linuxem a PicKIT4.
Docela mi vrtá hlavou, kde bude problém.
Setkal jste někdo s tímto jevem u ATTiny85??
Postuji i primitivní zkušební kód:

#include <avr/io.h>
#define F_CPU   1000000
#include <util/delay.h>

FUSES = {
	0x42, // LOW{SUT_CKSEL=INTRCOSC_8MHZ_6CK_14CK_0MS, CKOUT=CLEAR, CKDIV8=SET}
	0xDF, // HIGH{BODLEVEL=DISABLED, EESAVE=CLEAR, WDTON=CLEAR, SPIEN=SET, DWEN=CLEAR, RSTDISBL=CLEAR}
	0xFF, // EXTENDED{SELFPRGEN=CLEAR}
};

LOCKBITS = {
	0xFF, // LOCKBIT{LB=NO_LOCK}
};

int main(void) {    
    OSCCAL = 0x00;
    CLKPR = 0x00;
    MCUCR = 0x00;
    MCUSR = 0x00;
    WDTCR = 0x00;
    GIMSK = 0x20;
    GIFR = 0x20;
    PCMSK = 0x1;
    GTCCR = 0x00;
    TCCR0A = 0x00;
    TCCR0B = 0x00;
    
    DDRB |= (1<<PB4);
    DDRB |= (1<<PB3);
    DDRB |= (1<<PB2);
    DDRB |= (1<<PB1);
    DDRB &= ~(1<<PB0);
    
    PORTB |= (1<<PB4);
    PORTB |= (1<<PB3);
    PORTB |= (1<<PB2);
    PORTB |= (1<<PB1);    
    PORTB |= (0<<PB0);
    
    while(1){
        _delay_ms(500);
        PORTB = (PORTB^(1<<PB1));
        
    }   
    
}

Ještě doplním, že překladač používám AVR-GCC s optimalizací v S módu a zapojení mam spíchlé v nepájivém poli.

Ahoj.
Já osobně bych ten “jednoduchý” program zredukoval. Co jsem pochopil tak chceš každých 500ms překlopit výstup na Pinu PB1.
Udělal bych to takto

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

#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define FLIPBIT(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))

int main(void) {
SETBIT(DDRB,1);
while(1){
SETBIT(PORTB,1);
_delay_ms(500);
CLEARBIT(PORTB,1);
_delay_ms(500);

}   

}
[/code]

Pokud tento program stále nebude fungovat, tak je otázka, jak to programuješ. PB1 totiž slouží jako MISO programovací pin. Je nutno programátor odpojit po naprogramování.
Můžeš poslat celkové zapojení, tzn LEd + odpor + napájení + programátor?
Zkus prodloužit i časy delay. Možná je CPU clock nastavený jinak a bliká to tak rychle, že to okem nevidíš.

Čauves,
nakreslím a postnu.
Jinak díky za to zjednodušení :slight_smile:
Mj. to rozblikání LED je jen ilustrační, pracuji na jiném projektu, který fungoval a zničehonic fungovat přestal. Proto jsem rozpojil kompletně zapojení v nepájivém poli a přepopijl to. Jinak to nakreslím v KiCADu a postnu.

Zjednodušil bych to ještě trochu víc, ale v Atmel Studiu mi to funguje i v té úplně původní variantě.

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

#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define FLIPBIT(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))

int main(void) {
SETBIT(DDRB,1);
while(1){
SETBIT(PINB,1);
_delay_ms(500);
}
} [/code]

A v kódu není chyba - skutečně zapisuju do PINB - viz. datasheet.

  1. bych doporučil na OSCCAL vůbec nesahej.
  2. zápis do registru CLKPR tak, jak ho máš v programu je Ti k ničemu. Totéž platí i zápisu do WDTCR - opět viz. datasheet

Nu, tak tento kód nefunguje - LED svítí cca polovičním jasem, ale nebliká. A když jsem odpojil pickit4 tak LED zhasla stejně tak po odpojení pouze MISO. Nakreslím schéma a postnu ho sem. Jinak zapojení pro programování je ISP, pinout dle user´s guide pickit4. Je mi divné, že na MCU starém 5 let jsem rozběhl projekt, na kterém pracuji a chtěl jsem ho nahrát do nového. Je to záhada. Zase kdyby definitivně odešli ty MCU, tak do nich nenahraju firmware a ani HEX skrze IPE. Ale nakreslím a postnu schéma.

No, tak tento kód také nefunguje:(
Na ty registry a jejich nulování si dám pozor.
jak už jsem psal výše, nakreslím a postnu schéma.
Jinak, používám pickit4 s MPLAB X a běžím na Linuxu, Atmel studio si instaluji na nový laptop s WIN. Marně přemýšlím, kde by mohla být chyba,
celé to zapojení mam spíchlé v nepájivém poli. Proměřoval jsem i odběr proudu, protože při připojení ventilátoru přes unipolár si bral 180 mA a LM317 měla 60 °C.

Abys mohl vyloučit chybu překladu, přikládám funkční přeložený .HEX soubor.

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

#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define FLIPBIT(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))

int main(void) {
SETBIT(DDRB,1);
while(1){
SETBIT(PINB,1);
_delay_ms(500);
}
} [/code]
Test_ATtiny85.hex (230 Bytes)

Super, jdu to otestova.
Akorát mi sem nejde nahrát pdf se schématem :-/

Hmm, tak hex jsem nahrál úspěšně přes IPE, ale s MCU to ani nehlo - LED nebliká.
teda to je mi záhada, co s tím může být. ješttě tu mam nový Atmega16, ale nechci ho použít a zbytečně oddělat. Co se týče verze AVR-GCC, tak mám dvě 5.4.0 a 3.5.0, s tím, že používám tu vyšší verzi, s ekterou to fungovalo.
je mi to fakt záhada co s tím může být :-/

Ještě to zkusím zítra přepsat a přeložit s XC8, pak uvidím kde bude problém. Pokud se nerozběhne ani po vygenerování .hex souboru z XC8 tak budou asi v pr…i MCU. Jinak fakt nevím, kde by mohl být problém :frowning:

Je to možná hloupost, ale zkus zapsat do definice rychlosti procesoru tohle :

#define F_CPU 1000000.0
nebo
#define F_CPU 1000000L

Druhá věc, kterou vyzkoušej je připojit RESET pin přes 1-10k (já normálně používám 4k7 - ještě ze zvyku z dob 8051) na VCC. Sice by měl mít interní pull-up, ale co když …

Tady by pomohlo, kdybys měl alespoň logickou sondu.

V nouzi si můžeš pomoci improvizovanou logickou sondu zapojením :
+5V -> LED -> LED -> 470R -> 470R -> LED -> LED -> GND

Takhle by to svítit nemělo. V případě, že Ti to při 5V bude svítit, přidávej do každé skupiny po jedné LEDce tak dlouho, až to svítit nebude. Připojením VCC nebo GND na prostředek (mezi odpory) se pak rozsvítí jedna nebo druhá skupina.

Když doprostřed mezi ty dva odpory připojíš pin procesoru, tak v případě, že kmitá (a je nakonfigurovaný jako výstupní), by měly svítit (blikat) střídavě oboje LEDky. Pokud nebliká a je přepnutý jako výstup, bude svítit jenom jedna skupina. No a pokud se procesor nerozběhl a pin je jako vstupní, pak by to mělo zůstat zhasnuté.

Logická sonda je v plánu,ale udělám to jak píšeš zítra.

Hmm, tak to vypadá spíše na problém s verzí MPLAB X IDE. Koupil jsem nové AtTiny861A, a IDE přepl do ISP režimu, vše zapojil tak jak má být a MPLAB X hlásí, že není přenutý v ISP, i když je. Je to verze 5.35 u verze 5.40 se při spuštění IDE zobrazí chybové hlášení s javou a nějakými moduly, které nejdou spustit i když se IDE spustí.
Při pořízení nového laptopu přejdi na win a Atmel studio 7, tak doufám, že tam pickit4 bude fungovat bez problémů. Zkusím s tím ještě nějak laborovat a když tak postřehy napíšu do jiného vlákna a diskuze.

pro “Faust”
prosim nepouzivej zbytecne citaci

OK

Podľa tohto by to malo fungovať (traslator) :

translate.google.com/translate?hl=sk&sl=en&u=https://www.avrfreaks.net/forum/pickit4-not-showing-atmel-studio-7&prev=search&pto=aue

Na starém laptopu s win0 Atmel Studio 7 Pickit4 detekoval, ale hlásil problém s modulem COMM, takže jsem to více neřešil. Budu pořizovat nový, výkonější laptop a tam to snad rozchodím. Jinak co se týče linuxu a MPLABu tak jsem s tím nehnul :frowning: Vypadá to spíš na problém ve zdrojácích MPLABu a upřímně by mne to ani nepřekvapilo, přijde mi nedotažené a šité horkou jehlou.

Poslyš, a co takhle hodit Pickit přes palubu a pořídit USBAsp programátor ? Podle webu autora nepotřebuje pro Linux ani ovladače (Linux neznám, takže musím věřit webu autora). Sice nejede přímo z Atmel Studia, ale dá se tomu pomoc - na Youtube je, jak ho zprovoznit jako externí tool. Dá se pořídit na Aliexpresu za cca 50,- Kč (nebo v Česku cca za 130,- Kč). Stavěl jsem ho kamarádovi - funguje pod Win 7 i Win 10 (nejen) s programem eXtremeBurner - ten je dokonce k dispozici i pro Linux. Podle datasheetů se dá program lehce doplňovat o čipy, které nejsou v seznamu. Neumí ale AVR s UPDI rozhraním a tuším, že ani AVR s TPI rozhraním. S UPDI rozhraním si neporadí ani můj ASIX Presto (a ASIX Forte za dvojnásobek ceny toho Presta kupovat opravdu nebudu). Na to ale lze jako programátor použít třeba ATtiny416-XNANO za necelých 300,- Kč a funguje i přímo z Atmel Studia.