Всем привет!
подскажите, как из числа получить последовательность бит для пересылки в сдвиговый регистр.
С самой пересылкой проблем нет.
Но вот с переводом самого числа в последовательность бит - проблема. Ничего не приходит в голову.
Набор констант не подходит.
Нужно именно конвертировать в биты
Физически в большинстве машин биты не адресуются.
В сдвиговые регистры КОНТРОЛЛЕРА пересылаются БАЙТЫ или СЛОВА, в зависимости от разрядности машины и потребности.
Сам сдвиговый регистр и есть АППАРАТНЫЙ преобразователь слова/байта в последовательность бит.
Таким преобразователем на борту контроллеров является ЛЮБОЙ последовательный интерфейс.
UART, SPI, IIC
Можно организовать ПРОГРАММНЫЙ последовательный вывод в любой бит порта посредством маскирования этого бита в этом порту.
Тогда используется операция СДВИГА.
Сдвиг - маска с содержимым порта - вывод в порт.
Но на самом деле выводится ЦЕЛОЕ СЛОВО ИЛИ БАЙТ.
Просто остальные биты сохраняются прежними.
Ну или к аппаратному SPI подключить регистр, тогда вообще проблем не будет
К слову, если в примере от Леонид Иванович требуется биты слать "ногами вперед" (сначала мдалшие), то нужно вместо 0x80 написать просто 0x1, и сдвиг поменять на правый (>>).
спасибо, буду пробовать.
Про сдвиги я как-то не подумал... обошелся банальным делением.
Программированием контроллеров не занимался... вот решил первую программу написать для регулятора Никитина.
Последний раз редактировалось vksam Чт июл 25, 2013 11:30:21, всего редактировалось 1 раз.
volatile char allow=0,i=0,holdr=0b00000000,took[15],toggl=2,intru=0;
void interrupt()//ISR when interrupt occurs
{
if(INTCON.INT0IF==1)
{
INTCON=0X0;delay_us(1000);//disable the interrupt and delay of 1000us
for(i=0;i<13;i++)//taking input
{
took[i]=portb.f0;
delay_us(1778);
}allow=1;//allow flag to 1, indicating that we have received all data
}
}
void main()
{
unsigned char j;
TRISB=0XFF;TRISC=0X0;//portb input and portc output
portc=0;
delay_ms(2000);//stabilize the device
INTCON=0b10010000;//enable the interrupt int0
INTCON2.INTEDG0=0;//for falling edge
while(1)
{
while(allow==0);//when allow flag is 0 then be in this loop for ever.
if(took[1]!=toggl)//check the T bit i.e toggle bit with previous one.
{
if(toggl==2)toggl=took[1];
//check the fist line of code,we assigned toggl as 2,
//if toggl==2 then take real T bit into it
j=5;
for(i=7;i<13;i++)//convert array to variable for
easy comparison with command
{
took[i]=took[i]<<j ;
holdr=holdr|took[i];took[i]=0;
j--;
}
if(holdr==1)portc.f1=~portc.f1;//comparing
if(holdr==2)portc.f2=~portc.f2;
if(holdr==4)portc.f3=~portc.f3;
if(holdr==5)portc.f4=~portc.f4;
if(holdr==6)portc.f5=~portc.f5;
}
holdr=0;allow=0;
portc.f7=1;delay_ms(200);portc.f7=0;
INTCON=0b10010000;
INTCON2.INTEDG0=0;
}
}
Разницы особой нет. Код будет отличаться только работой с таймером и внешним прерыванием. Перевести этот код под свой компилятор и МК проблем не составит, тем более, что код отлично прокомментирован.
Разницы особой нет. Код будет отличаться только работой с таймером и внешним прерыванием. Перевести этот код под свой компилятор и МК проблем не составит, тем более, что код отлично прокомментирован.
Дошло дело до макетной сборки.
И появился очередной глупый вопрос.
Если использую порт A для вывода в сдвиговый регистр - на выходе ничего. Не работает. Хотя протеус моделирует
Но если использовать порт В - все хорошо. На индикаторе получаю то что нужно.
В чем может быть причина? Спойлер
Если один порт рабтает, а другой нет, значит нужно курить даташит на предмет разницы этих портов. Благо даташиты у микрочипа отличные. А лень и метод тыка ни к чему хорошему не приведут. Нужно читать, читать и ещё раз читать....
ЗЫ: А протеус не есть инструмент для проверки правильного написания программ. Нельзя ему на столько доверять. Удостовериться в правильности есть только один способ - проверить на железе.
Ну протеус в данном случае не причем , Mid Range он нормально симулирует.
А PORTA надо сделать цифровым - отключите компараторы . Записать в CMCON 0x07 .
И как ALex верно заметил - читать , читать и читать