А в чём фишка такой конструкции?
Код: Выделить всё
void main () {
__CONFIG(WDTDIS & INTIO & UNPROTECT & BORDIS & MCLRDIS & LVPDIS);ПОЗЖЕ: Сорри - я невнимательный, забыл про PEIE = 1;
Код: Выделить всё
void main () {
__CONFIG(WDTDIS & INTIO & UNPROTECT & BORDIS & MCLRDIS & LVPDIS);Никакой фишки или принципиальной разницы нет. Компилятор (HI-TECH, за другие не знаю) найдет конфигурацию и там, и тут. Попался пример с такой конструкцией, вот и выложил.Chettuser писал(а): А в чём фишка такой конструкции?Я обычно ставлю перед main.Код: Выделить всё
void main () { __CONFIG(WDTDIS & INTIO & UNPROTECT & BORDIS & MCLRDIS & LVPDIS);
проблема перейдет в значение OCR=255?Ничегонеработает писал(а):Сделать инверсный PWM и грузить регистр инвертированным кодом.
К сожалению так и произошло. Теперь при Duty Cycle = 100% (OCR=255) ножка таймера постоянно отваливается в ноль - в итоге напряжение гуляет в районе 4.63В. =О_о=Мастер Ломастер писал(а):проблема перейдет в значение OCR=255?Ничегонеработает писал(а):Сделать инверсный PWM и грузить регистр инвертированным кодом.
Да, перейдет в другую, при Duty Cycle = 100% будут короткие провалы в ноль. Тут уж приходится выбирать. В большинстве случаев принципиальнее отсутствие иголок при Duty Cycle = 0%, так как это должно соответствовать полностью выключенному состоянию. А вот максимальное заполнение редко используется, так как в большинстве случаев проименяется программная цифровая калибровка шкалы ШИМ, и максимальное выдаваемое значение соответствует не 100%, а порядка 90% ШИМ. Ведь нужно иметь запас на разброс компонентов.Мастер Ломастер писал(а):проблема перейдет в значение OCR=255?
Что её разбирать в Интернете, если она черным по белому описана в datasheet: "If the OCR2 is set equal to BOTTOM, the output will be a narrow spike for each MAX+1 timer clock cycle. Setting the OCR2 equal to MAX will result in a constantly high or low output (depending on the polarity of the output set by the COM21:0 bits.)".FireHawk писал(а):Что самое обидное, в интернете сотни примеров и туториалов PWM на атмеге. И нигде никто не разбирает такую проблему.
Код: Выделить всё
void ShiftREG_74595(temp)
{ int n = 1; // Позиция бита 1..8
while (n <= 128)
{ CLOCK = 1; // Начало строба
DATA = n && temp; // Бит данных
DATA = 0;
DelayUs (10);
CLOCK = 0; // Конец строба
n <<= 1; }
LOAD = 1;
DelayUs (50);
LOAD = 0;
return;
}Код: Выделить всё
DATA = n && temp;НужноChettuser писал(а):почему то (у меня такое ощущение) конструкцияработает неправильно.Код: Выделить всё
DATA = n && temp;
Почему?
Код: Выделить всё
DATA = n & temp;Код: Выделить всё
EMU8086 GENERATED LISTING. MACHINE CODE <- SOURCE.
noname.bin_ -- emu8086 assembler version: 4.08
[ 25.09.2011 -- 21:42:41 ]
===========================
[LINE] LOC: MACHINE CODE SOURCE
===========================
[ 1] 0000: B8 06 00 mov ax,6h
[ 2] 0003: 8B D8 mov bx,ax
[ 3] 0005: BE 06 60 mov si,6006h
[ 4] 0008: 89 1C mov [si],bx
[ 5] 000A: CC int 3
[ 6] :
===========================
===========================Код: Выделить всё
mov ax,6h
mov [6005h],axКод: Выделить всё
void ShiftREG_74595(unsigned char temp)
{
unsigned char mask = 1; // Позиция бита 1..8
do{
DATA = mask & temp; // Бит данных
CLOCK = 1; // Начало строба
DelayUs (10);
CLOCK = 0; // Конец строба
mask <<= 1;
}while(mask);
DATA =0;
LOAD = 1;
DelayUs (50);
LOAD = 0;
}Народ обычно пользует Bochs и QEMU (вроде так они пишутся)... Но я давно уже на ассемблере под ПК не программировал, работа не с ним связана, так что не особо в курсах.Chip115 писал(а):Не посоветуете программу по эмуляции процессора i80386 ?