Помогите с attiny13a (глючит, если сменить частоту 6к->9.6М)
Добавлено: Пн мар 25, 2013 13:24:45
Привет коты
Есть простенькая схемка: тинька, степап до 5В, светодиод, кнопка и моторчик с ключом.
Все хорошо работало на частоте 600кГц. Но мне не нравился ВЧ писк от мотора (ШИМ), решил поднять частоту тиньки до 9.6МГц.
Прошил фьюзы, подправил makefile, все прошилось, но вот беда, стало все глючить. Постучишь по попроводкам - и тинька то ресетнется, то прервется... в общем крайне не стабильно работает. Я уже и провода поменял все, и плату новую с более толстыми дорожками и экраном под тинькой развел, и степап убирал (думал он шумит) и все равно, на 600кГц работает как часы, на 9.6 - не работает (точнее не стабильно очень).
Заметил, если в программе убрать прерывания, то работает хорошо, но как же кнопка? Мне бы управлять )))
Помогите разобраться, почему так происходит? Писал на С в WinAVR 20100110
Логика:
мотор должен стартануть быстро, потом снизится до какого-то порога и постепенно раскручиваться - и так бесконечно, пока не сядет батарейка (контроль за напряжением тоже есть). Ну и по нажатию кнопки упростил до того, что светик мигает...
Если закоментить PCMSK = _BV(BUTTON_INT); - то в железе работает (кроме кнопки)
Есть простенькая схемка: тинька, степап до 5В, светодиод, кнопка и моторчик с ключом.
Все хорошо работало на частоте 600кГц. Но мне не нравился ВЧ писк от мотора (ШИМ), решил поднять частоту тиньки до 9.6МГц.
Прошил фьюзы, подправил makefile, все прошилось, но вот беда, стало все глючить. Постучишь по попроводкам - и тинька то ресетнется, то прервется... в общем крайне не стабильно работает. Я уже и провода поменял все, и плату новую с более толстыми дорожками и экраном под тинькой развел, и степап убирал (думал он шумит) и все равно, на 600кГц работает как часы, на 9.6 - не работает (точнее не стабильно очень).
Заметил, если в программе убрать прерывания, то работает хорошо, но как же кнопка? Мне бы управлять )))
Помогите разобраться, почему так происходит? Писал на С в WinAVR 20100110
Спойлер
Программу упростил до самого простого:Логика:
мотор должен стартануть быстро, потом снизится до какого-то порога и постепенно раскручиваться - и так бесконечно, пока не сядет батарейка (контроль за напряжением тоже есть). Ну и по нажатию кнопки упростил до того, что светик мигает...
Если закоментить PCMSK = _BV(BUTTON_INT); - то в железе работает (кроме кнопки)
Код: Выделить всё
/*****************************************************
Set clock and other fuses
600kHz
avrdude -p attiny13 -P usb -c avrisp2 -U lfuse:w:0x29:m -U hfuse:w:0xff:m
9,6MHz
avrdude -p attiny13 -P usb -c avrisp2 -U lfuse:w:0x3A:m -U hfuse:w:0xff:m
*****************************************************/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/eeprom.h>
#define RED _BV(PB2)
#define GREEN _BV(PB1)
#define MOTOR _BV(PB0)
#define BUTTON PB4
#define BUTTON_INT PCINT4
#define OCRA_LOW 235
#define OCRA_STEP 1
#define UP 1
#define DOWN 0
volatile uint8_t button_state = UP;
ISR(PCINT0_vect)
{
if (!bit_is_set(PINB,BUTTON))
{
PORTB ^= RED;
button_state = DOWN;
}
else
{
button_state = UP;
}
}
int main(void)
{
DDRB = RED|GREEN|MOTOR;
//----------------TIMER--------------
TCCR0A =
_BV(WGM00)|_BV(WGM01)|// Fast-PWM mode
_BV(COM0A1);//|_BV(COM0A1); //Set OC0A on Compare Match, clear OC0A at TOP
TCCR0B = _BV(CS00);//|_BV(CS02);// таймер работает без предделителя
GIMSK = _BV(PCIE);
PCMSK = _BV(BUTTON_INT);
asm("sei"); // Разрешаем прерывания
TCCR0A |= _BV(COM0A1);
while (1) {
OCR0A = 0xff;
_delay_ms(60);
for(OCR0A = OCRA_LOW; OCR0A < 0xff; OCR0A++)
{
_delay_ms(200);
}
}
TCCR0A &= ~(_BV(COM0A1))
}