Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
18.01.2010, 18:50
|
#1
|
Частый гость
Регистрация: 09.04.2009
Сообщений: 23
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
AVR и LCD
Написал схемку подсоединения LCD к AT90S2313 через два сдвиговых регистра. Делал с одним на тиньку2313 все работает в протеусе отлично. А тут не в какую. Я бы предположил что ошибка в самой схеме, но преподаватель друга(которому делал работу) сказал что не хватает какого то куска кода в программе для работы второго регистра. И чего то это меня завело в тупик. Подскажите пожалуйста в чем глюк.
Код:
#include ‹90s2313.h›
#define C PORTB.0
LCD_Write_byte (char byte, char RS)
{
int j;
PORTB.1=1;
C=1;
C=0;
PORTB.1=0;
C=1;
C=0;
PORTB.1=0;
C=1;
C=0;
PORTB.1=RS;
C=1;
C=0;
for (j=7;j›=0;j--)
{
PORTB.1=(byte››j)&0b00000001;
C=1;
C=0;
}
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
static int s=0;
s++;
switch (s)
{
case 1: LCD_Write_byte(0x38,0);
case 2: LCD_Write_byte(0x0C,0);
case 3: LCD_Write_byte(0x06,0);
case 4: {if (PIND.0==1) LCD_Write_byte(0x31,1); break;}
case 5: {if (PIND.1==1) LCD_Write_byte(0x32,1); break;}
case 6: {if (PIND.2==1) LCD_Write_byte(0x33,1); break;}
case 7: {if (PIND.3==1) LCD_Write_byte(0x34,1); break;}
case 8: {LCD_Write_byte(0x01,0); s=3; break;}
}
}
void main(void)
{
DDRD=0xFF;
DDRB=0xFF;
DDRD.0=0;
DDRD.1=0;
DDRD.2=0;
DDRD.3=0;
PORTD=0x00;
PORTB=0x00;
PORTD.0=1;
PORTD.1=1;
PORTD.2=1;
PORTD.3=1;
TCCR0=0x04;
TCNT0=0x00;
TIMSK=0x02;
#asm("sei")
}
|
|
|
|
18.01.2010, 19:26
|
#2
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: AVR и LCD
Сообщение от FlashAck
|
Я бы предположил что ошибка в самой схеме, но преподаватель друга(которому делал работу) сказал что не хватает какого то куска кода в программе для работы второго регистра.
|
Всего хватает. Но вот программа схеме не соответствует. Для сброса регистров единичка должна пройти через 14 сдвигов по регистру, а у Вас их всего 12.
И в данных есть разрыв - вывод 13 первого регистра не подключен к индикатору, т.е. для вывода 8-ми бит данных нужно 9 сдвигов.
RW индикатора можно просто заземлить, все равно чтение из него реализовать не получится.
Про неоптимальность использованных как программных, так и аппартных решений я промолчу...
|
|
|
|
18.01.2010, 19:29
|
#3
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: AVR и LCD
Не вдаваясь ни в схему, ни в алгоритм, скажите мне, при каких условиях s может быть равно 2, например ???
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
static int s=0;
s++;
switch (s)
{
case 1: LCD_Write_byte(0x38,0);
case 2: LCD_Write_byte(0x0C,0);
|
|
|
|
18.01.2010, 19:33
|
#4
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: AVR и LCD
Сообщение от urry
|
Не вдаваясь ни в схему, ни в алгоритм, скажите мне, при каких условиях s может быть равно 2, например ???
|
При втором прерывании от таймера будет.
После первого = 1, после второго 2 и т.д.
А вот сброс s не предусмотрен....
|
|
|
|
18.01.2010, 19:46
|
#5
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: AVR и LCD
После первого = 1, после второго 1 и т.д.
|
|
|
|
18.01.2010, 19:47
|
#6
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: AVR и LCD
Сообщение от baiderin
|
После первого = 1, после второго 1 и т.д.
|
Обоснуйте.
|
|
|
|
18.01.2010, 20:05
|
#7
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: AVR и LCD
static int s=0;
s++;
|
|
|
|
18.01.2010, 20:13
|
#8
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,725
Сказал спасибо: 2,424
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Re: AVR и LCD
Виноват,не осознал, что она static.
|
|
|
|
18.01.2010, 20:13
|
#9
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: AVR и LCD
Сообщение от baiderin
|
static int s=0;
s++;
|
Ну и??
Если бы было
Код:
|
static int s;
s = 0;
s++; |
То бы и не росло. Однако инициализация СТАТИЧЕСКОЙ переменной выполняется только ОДИН раз.
|
|
|
|
18.01.2010, 21:27
|
#10
|
Частый гость
Регистрация: 09.04.2009
Сообщений: 23
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: AVR и LCD
Сообщение от kison
|
Всего хватает. Но вот программа схеме не соответствует. Для сброса регистров единичка должна пройти через 14 сдвигов по регистру, а у Вас их всего 12.
И в данных есть разрыв - вывод 13 первого регистра не подключен к индикатору, т.е. для вывода 8-ми бит данных нужно 9 сдвигов.
RW индикатора можно просто заземлить, все равно чтение из него реализовать не получится.
Про неоптимальность использованных как программных, так и аппартных решений я промолчу...
|
Насчет аппаратных решений так надо. Посылая не байтами а тетрадами можно было сделать и с одним сдвиговым. И надо не 14, а 13 потому что 13 первого регистра переходит автоматом в 3й второго(т.к. автоматически то надо не 9 сдвигов а все таки восемь). Единственное что у мню 12 а не 13. поэтому я это учел и добавил после цикла в процедуре записи C=0;C=1;, но все равно не помогает.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:58.
|
|