attiny85 en de 32768khz oscillator om de seconden

De upload van bootloader en de code doe ik via Arduino ISP alternativePin 9 gebruik ik als external clock voor de attiny85 om te programmeren/uploaden.

Nadat ik dit gedaan heb zoals hier ook is besproken knippert mijn led om de +/- 5 sec ipv om de seconden.

Wie kan me uitleggen wat ik fout doe of waar ik op moet letten??

Dit is de code en de fuses:

fuses:

attiny85-20.name=ATtiny85 (external 32kHz clock)
attiny85-20.bootloader.low_fuses=0xe6
attiny85-20.bootloader.high_fuses=0xdf
attiny85-20.bootloader.extended_fuses=0xff
attiny85-20.upload.maximum_size=8192
attiny85-20.build.mcu=attiny85
attiny85-20.build.f_cpu=32768L
attiny85-20.build.core=arduino:arduino
attiny85-20.build.variant=tiny8

code:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

// ATtiny25/45/85 Pin map
//                        +-\/-+
// Reset/Ain0 (D 5) PB5  1|o   |8  Vcc
//       Ain3 (D 3) PB3  2|    |7  PB2 (D 2) Ain1
//       Ain2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1
//                  GND  4|    |5  PB0 (D 0) pwm0 <-- connect resistor and LED here
//                        +----+
//#define BAUD_RATE 1200L
#define ledPin PB1
#define F_CPU 32768 // 32.768 KHz clock

volatile boolean led_state = 0; // LED state on/off variable

void setup() {
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
 
sei(); // Turn on interrupts
 
// Set prescaler to 128 to give exactly 1 second before an overflow occurs.
// 128 prescaler x 256 timer bits / 32768 clock = 1 second
sbi(TCCR1, CS13);
 
// Enable timer 1 overflow interrupt
sbi(TIMSK, TOIE1);


}


void loop() {
	
	
	DDRB = (1<<ledPin); // Set LED as an output
	PORTB |= ((1<<PB2) | (1<<PB1)); // Turn on pull-up resistors on other ports to save power
	
	while(1) {
		
		if (led_state == 1) { 
			PORTB |= (1<<ledPin); // Turn on LED
		}
		else { 
			PORTB &= ~(1<<ledPin); // Turn off LED
		}
		
		set_sleep_mode(SLEEP_MODE_IDLE); // Set sleep mode as idle
		sleep_mode(); // System sleeps here		
	}
}

// Timer 1 interrupt
ISR(TIMER1_OVF_vect) {
	led_state = !led_state; // Change led state to be the opposite of what it is
}

2 andere vragen:
waar kan ik in arduino de upload speed regelen zodat de upload goed gaat met de 32.768 crystal?
Mag ik de bootloader uploaden met een andere clocksnelheid en hierna de 32.768 crystal plaatsen waarvoor de code ook is geschreven?

Ik zou die ledstate veranderen direct na sleep() dus niet in die interrupt service routine. Of het helpt? geen idee.

hogere upload wordt lastig. Dan zou je eerst de clock bits weer op internal RC moeten zetten, dan uploaden en daarna nog eens een keer apart de fuses dat ie weer op external crystal werkt.

Zelf gebruik ik een eigen programmer met een grafisch scherm om de programmer aan te sturen. Dus los compileren en dan de HEX file apart laden wat wel weer met die Arduino IDE wat lastig gaat (ik werk zelf met Eclipse).

Omdat ik elke seconden precies wil hebben gebruik ik die 32.768khz crystal. De state zal dus elke seconden via de interrupt moeten veranderen en niet achter de sleep() in de main while loop. Of bedoel je iets anders?

Omdat na upload de fuses voor de 32khz geset worden kan ik niet met een hogere snelheid uploaden, maar juist alleen met een lagere. De attiny 'praat' niet meer op een hogere snelheid met arduino. Vraag me af of dit kan in arduino....?

Maar wat ik helemaal niet snap is dat het niet na elke seconden blinkt........

Waar denk je dat de Arduino zijn eerste volgende instructie uitvoert? direct na de sleep(). En daar jij precies 1 seconde wil..... hoop ik wel dat je een hoge kwaliteit kristal hebt..

vwb. het programmeren.... ik heb nooit begrepen waarom men zich de ellende op zijn hals haalt om ingewikkeld te doen om tinies te programmeren met een UNO terwijl je voor minder dan 10 euri een programmer hebt met gewoon losse software. Dan bepaal jij de fuses en niet de IDE.

nicoverduin:
Dan bepaal jij de fuses en niet de IDE.

Bedoel je dat mijn IDE de fuses waarschijnlijk niet goed brand ?

creamers:
Wie kan me uitleggen wat ik fout doe of waar ik op moet letten??

Anyone?

Heb het gevonden:

cbi(TCCR1, CS10);
cbi(TCCR1, CS11);
cbi(TCCR1, CS12);
sbi(TCCR1, CS13);

De anderen ook setten geeft het juiste resultaat.

Mooi dat het is opgelost maar wat ik bedoelde met de fuses is het volgende:

  • In de IDE kun je de code compileren en/of uploaden. Tutti.

  • Daarnaast zet de IDE de hex file op een ongelofelijk onhandige plek waar 90% van de gebruikers het nooit terug zullen vinden.

  • Er zijn veel betere oplossingen (betere IDE's) waarmee je stukken beter kan ontwikkelen. Denk aan Eclipse, Atmel Studio en visual studio (deze laatste dacht ik). Ik werk graag met de Eclipse omgeving omdat ik van daaruit EN Arduino programma's kan ontwikkelen, maar ook programma's voor 32bits en JAVA en nog veel meer (ingebakken versiebeheer, documentatie generatie). En het is open source. Jantje heeft een uitstekende plug geschreven voor de Arduino en daar kan de standaard IDE op geen enkele wijze aan tippen.

  • In de "betere" IDE's heb je toegang tot de HEX file en kun je ervoor kiezen om een aparte programmer te nemen voor het programmeren van o.a. de Atmel processoren. Die kun je gewoon vanuit je scherm aansturen. Dus laad de hex file, zet de fuses als je die wilt programmeren en upload die handel. Moet je er 10 doen, dan doe je dat 10x met een druk op de knop.

  • die programmer's kosten geen drol meer en werken prima (ebay).

Ik weet het.... zo kan je met de Arduino allerlei functies uitvoeren..... maar dat geeft mij af en toe het gevoel van een zwitsers zakmes van de Action.... Het ziet er een beetje uit als een multifunctioneel stukje gereedschap maar... het mes is bot, de schroeverdaaier breekt in de punt.... De inbus sleutel breekt af.... Het is het dus ....net....... niet.