Страница 1 из 1
ATtiny13: откуда этот дребезг
Добавлено: Пт июл 17, 2009 16:55:06
fox15
Привет господа Кошаки
Не могу понять, откуда "дребезг" ?
С тестового устройства (AT89S8253) подаются импульсы с частотой 52.74 Гц на ATtiny13 ножка PB3 "PINB3_bit", программа в цикле опрашивает эту ножку и выдает то, что на ней на выход "PORTB0_bit" ножка PB0. Вот собственно сам коТ программы, просто тестовая программка.
// MCU: ATtiny13
// Dev.Board: EasyAVR5A
// Oscillator: Internal Clock 4.8000 MHz
// SW: mikroC PRO for AVR
// PINB3_bit - D1 (CH1)
// PORTB0_bit - D2 (CH2)
void main()
{
// Port B initialization
DDRB = 0b00000001; // set PORTB as Output PB0
PORTB = 0b00000000; // clear PORTB
while (1)
{
PORTB0_bit = PINB3_bit;
}
}
В прикрепленном файле данные с осциллографа, D1 и D2 с анализатора, CH1 и CH2 - "живые" сигналы.
Я так понимаю должно быть CH1=CH2 и D1=D2, ан нет
Почему такая несправедливость ?

Добавлено: Пт июл 17, 2009 20:37:09
ARV
мне так вообще непонятно, что это за конструкция
PORTB0_bit = PINB3_bit; это на каком таком диалекте Си вы пишите?
я бы сделал так:
Код: Выделить всё
while(1) {
if(PINB & (1<<PB3))
PORTB |= (1<<PB0);
else
PORTB &= ~(1<<PB0);
}
а если вы пишите на CodeVision CVAVR, то наверное так:
Добавлено: Пт июл 17, 2009 21:42:14
BCluster
mikroC PRO for AVR
ужос ужос, спасите меня от этава ))))
такого диалекта и я не знаю )
Но сделайте как ARV говорит. это универсально
Добавлено: Пт июл 17, 2009 21:43:58
fox15
Да дело не в этом это просто синтаксис MicroC.
Я использую отладочный стенд EasyAVR5A от Mikroelektronika мне удобно пользоваться этим компилятором.
Я могу написать эту конструкцию и подругому, дело не в этом, это ничего неизменит.
Вот собственно егошная библиотека гласит:
sbit PORTB0_bit at PORTB.B0;
Непонятно почему контроллер так себя ведет ?
Если в цикле я присвою чистую 1, то на выходе будет соответственно высокий уровень и без всякого дребезга, а стоит подать импульсы, так на тебе.

Добавлено: Пт июл 17, 2009 21:50:35
fox15
.....
ужос ужос, спасите меня от этава ))))
такого диалекта и я не знаю )
Но сделайте как ARV говорит. это универсально
.....
Ну чего здесь ужасного-то ?
Ужас это когда компилятор непонимает драйвера USB программатора, кроме как программаторов COM и LPT.
И что мне предлагаете ?
MicroC компилирует и прошивает сразу, все пучком, синтаксис дело привычки, конечно им его еще отлаживать и отлаживать.
Но дело не в синтаксисе
Добавлено: Пт июл 17, 2009 22:04:12
DrWatson
А общий провод тестового устройства и Tiny13 соединить не забыли? и какой длины сигнальный провод, все-таки у прямоугольника оочень широкий спектр, провод и резонировать на ВЧ может и отраженный сигнал по нему туда сюда бегать будет.
Добавлено: Пт июл 17, 2009 22:12:15
ARV
fox15 писал(а):Вот собственно егошная библиотека гласит:
sbit PORTB0_bit at PORTB.B0;
ваша беда в том, что вы пользуетесь фичами своего компилятора, которые далеко отстоят от стандартных конструкций Си - поэтому вас многие просто не понимают. я вот не понимаю, что это за объявление и к чему оно приведет. посмотрите в листинг, что получается из этого оператора в ассемблерных командах - наверняка сразу поймете, в чем дело.
имхо, чем больше фич, тем больше проблем. чем ближе к простому - тем меньше проблем.
Добавлено: Пт июл 17, 2009 22:28:27
fox15
ARV писал(а):
посмотрите в листинг, что получается из этого оператора в ассемблерных командах - наверняка сразу поймете, в чем дело.
имхо, чем больше фич, тем больше проблем. чем ближе к простому - тем меньше проблем.
Вот он коТ:
main:
LDI 27, 255
OUT 93, 27
LDI 27, 0
OUT 94, 27
;GPWM.c,9 :: void main()
;GPWM.c,12 :: DDRB = 0b00000001; // set PORTB as Output PB0
LDI 27, 1
OUT 55, 27
;GPWM.c,13 :: PORTB = 0b00000000; // clear PORTB
LDI 27, 0
OUT 56, 27
;GPWM.c,15 :: while(1)
L_main0:
;GPWM.c,17 :: PORTB0_bit = PINB3_bit;
SBIS 54, 3
CBI 56, 0
SBIC 54, 3
SBI 56, 0
;GPWM.c,18 :: PORTB.B0 = PINB.B3;
SBIS 54, 3
CBI 56, 0
SBIC 54, 3
SBI 56, 0
;GPWM.c,19 :: }
JMP L_main0
;GPWM.c,21 :: }
L_endmain:
JMP L_endmain
; end of _main
Судя по листингу обе конструкции совершенно идентичные
PORTB0_bit = PINB3_bit;
PORTB.B0 = PINB.B3;
Добавлено: Пт июл 17, 2009 23:39:10
OBIVAN
Беру на себя смелость сказать что Ваш компилятор не правильно строит низкоуровневые команды ибо как мне кажется двойная перепроверка состояния вывода является избыточной.
Добавлено: Сб июл 18, 2009 00:54:26
fox15
OBIVAN писал(а):Беру на себя смелость сказать что Ваш компилятор не правильно строит низкоуровневые команды ибо как мне кажется двойная перепроверка состояния вывода является избыточной.
Да пёс с ним, компилятор непричем, при исследовании сигнала выяснилось, что идут всплески скважностью 240 нс и размахом всего 240 мВ и этого хватает для срабатывания. Сразу я незаметил, т.к. такие незначительные всплески анализатор и я считали обычной помехой (анализатор я когда-то настроил на CMOS логику вот он и незаметил 240 мВ), а у меня просто опыта нету, т.к. только только начал с этим возиться.
Сигналы эти я формировал на другом стенде, (AT89S8253) контроллер примитивный и ШИМ формировался чисто программно, стало быть эти ели заметные провалы - издержки программных задержек алгоритма формирования ШИМ
На рисунке видно выбросы, на них реагирует D2 и после настройки анализатора реагирует D1
Вообщем сам виноват
Тема закрыта

Добавлено: Сб июл 18, 2009 19:46:56
ARV
fox15 писал(а):Судя по листингу обе конструкции совершенно идентичные
PORTB0_bit = PINB3_bit;
PORTB.B0 = PINB.B3;
кстати, и совершенно идентичные первому варианту кода, более традиционному.