Курс: программирование AVR, учимся "с нуля"

 
1 2 3 4 5 6 7 12

Yuran

опытный

termostat, 30.06.2004 10:28:04 :
 


Вопрос, зачем отключается питание то? %))
толи чтобы юзать UART спокойно?
 
?? Tosha_443 #30.06.2004 14:34
+
-
edit
 

Tosha_443

втянувшийся
А я у себя рпи опросе по 1-wire настраиваю НОГУ порта а не весь порт. при этом не гаснут индикаторы :), а прерывания тушить надо при считывании 1-wire, чтобы софтово выставленные тайминги не портились.
[I] segment = ~heat; /* send complement[segment] /
delay_ms(1); /
delay a while /
segment = 0xff; /
off LED /
// if ((PORTD & 0x10) == 0) /
if key pressed P3.4 became low /
// key = i; /
save key position to key variable /
digit>>=1; /
next digit */

надо бы delay_ms(1) после segment = 0xFF ставить, а то может в PINx кака получиться
да и вообще не дело это - выключать PORTB.
имеет смысл проработать код.
1. не перестраивать PORTD.1 на выход(для 1-wire input- остальное сделает функция опроса DS1820).
2. не дергать по чем зря вывод на сегменты(вывод статической инфы лучше гашения индикатора).
может где неправ - поправьте.
Не ошибается тот, кто ничего не делает  
+
-
edit
 

-=ELF=-
-ELF-

новичок
попробовал по прерыванию, хочу для примера по рибытию символа через UART менять индикацию светодиода, но что-то нифига не выходит, код ниже.

#include <90s2313.h>

interrupt [8] void rx_interrupt(void)
{
PORTB.0 = ~PORTB.0;
}

interrupt [10] void tx_interrupt(void)
{
PORTB.1 = ~PORTB.1;
}

void main(void)
{
PORTB.0=0;
PORTB.1=0;
DDRB=0xFF;
DDRD=0x00;
UBRR=12;
UCR=0x18;
while (1)
{
};
}

попробовал поменять UCR=0x18 на UCR=0xD8 (11011000), не работает.
в скомпилированном ASM коде есть кусок:

.ESEG
.ORG 0

.DSEG
.ORG 0x80

а не должно ли быть что-то вроде
.ESEG
.ORG 0

.ORG 0x07
rjump UART_TxC
reti
rjump UART_RxC

.DSEG
.ORG 0x80

???


 
Это сообщение редактировалось 01.07.2004 в 04:09
+
-
edit
 
Вот, что ответил автор на вопрос:

> Question. How to make, that indicators were not switched off on 0,2s.


Yes, the problem was caused by reading data from DS1820. It takes time
more than 100ms. So at that time AVR will not scan the display.

To modify it, the easiest way is to add the external latch, suppose we
need two digits LED, then you can add the BCD to seven decoder with two
chips. The latch will make display stable while DS1820 was read!
 
BG Реконструктор #01.07.2004 10:13
+
-
edit
 
-=ELF=-, 30.06.2004 22:13:51 :
попробовал по прерыванию, хочу для примера по рибытию символа через UART менять индикацию светодиода, но что-то нифига не выходит, код ниже.
 


Я пологаю, что он всегда светится? :)
 
?? Tosha_443 #01.07.2004 10:34
+
-
edit
 

Tosha_443

втянувшийся
.ESEG -это сегмент EEPROM.
нужен .CSEG-Code Segment
.DSEG - data Segment

.CSEG
.ORG 0

.INCLUDE "333333.vec"
.INCLUDE "333333.inc"

// 3333333.vec

;INTERRUPT VECTORS
RJMP __RESET
RJMP 0
RJMP 0
RJMP 0
RJMP 0
RJMP 0
RJMP 0
RJMP _rx_interrupt
RJMP 0
RJMP _tx_interrupt
RJMP 0
твой листинг откомпиленный.
codevision Manual — for interrupt driven serial communication CodeWizard automatically redefines putchar() and getchar() function
Не ошибается тот, кто ничего не делает  
Это сообщение редактировалось 01.07.2004 в 12:08
?? Tosha_443 #01.07.2004 12:23
+
-
edit
 

Tosha_443

втянувшийся
[AndySa:],01.07.2004 08:15:59
Вот, что ответил автор на вопрос:

> Question. How to make, that indicators were not switched off on 0,2s.


Yes, the problem was caused by reading data from DS1820. It takes time
more than 100ms. So at that time AVR will not scan the display.

To modify it, the easiest way is to add the external latch, suppose we
need two digits LED, then you can add the BCD to seven decoder with two
chips. The latch will make display stable while DS1820 was read!
 


если в функции опроса DS1820 убрать PORTB=0xFF то индикатор не будет выключаться.перед опросом ДС1820 имеет смысл жестко определять 1-wire ногу:
PORTD.1=1;
DDRD.1=0;
(уже наступал на грабли, хорошо, что не детские :) )
Не ошибается тот, кто ничего не делает  
+
-
edit
 

-=ELF=-
-ELF-

новичок
Реконструктор, 01.07.2004 09:13:48 :
-=ELF=-, 30.06.2004 22:13:51 :
попробовал по прерыванию, хочу для примера по рибытию символа через UART менять индикацию светодиода, но что-то нифига не выходит, код ниже.
 


Я пологаю, что он всегда светится? :)
 


наоборот, он не светится :)
 
+
-
edit
 

-=ELF=-
-ELF-

новичок
2 Tosh_443 - я читал мануал, получается что после компиляции надо редактировать ASM код и перекомпилировать ?
Если не сложно, попробуй у себя что-нибудь с прерываниями UART в CodeVision.
 
?? Tosha_443 #01.07.2004 17:37
+
-
edit
 

Tosha_443

втянувшийся
-=ELF=-, 01.07.2004 12:29:17 :
2 Tosh_443 - я читал мануал, получается что после компиляции надо редактировать ASM код и перекомпилировать ?
Если не сложно, попробуй у себя что-нибудь с прерываниями UART в CodeVision.
 


CodeWizard'ом попробуй. он мне вот что сгенерил:
/*********************************************
This program was produced by the
CodeWizardAVR V1.24.0 Standard
Automatic Program Generator
© Copyright 1998-2003 HP InfoTech s.r.l.

e-mail:office@hpinfotech.ro
Author : Tosha
Chip type : AT90S2313
Clock frequency : 4,000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*********************************************/
#include <90s2313.h>
#define RXB8 1
#define TXB8 0
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// UART Receiver buffer

#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

unsigned char rx_wr_index,rx_rd_index,rx_counter;
// This flag is set on UART Receiver buffer overflow

bit rx_buffer_overflow;

// UART Receiver interrupt service routine

#pragma savereg-
interrupt [UART_RXC] void uart_rx_isr(void)
{
char status,data;
#asm
push r26
push r27
push r30
push r31
in r26,sreg
push r26
#endasm
status=USR;
data=UDR;
if ((status & (FRAMING_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
#asm
pop r26
out sreg,r26
pop r31
pop r30
pop r27
pop r26
#endasm
}
#pragma savereg+

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the UART Receiver buffer

#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// UART Transmitter buffer

#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
unsigned char tx_wr_index,tx_rd_index,tx_counter;

// UART Transmitter interrupt service routine

#pragma savereg-
interrupt [UART_TXC] void uart_tx_isr(void)
{
#asm
push r26
push r27
push r30
push r31
in r26,sreg
push r26
#endasm
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
#asm
pop r26
out sreg,r26
pop r31
pop r30
pop r27
pop r26
#endasm
}
#pragma savereg+

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the UART Transmitter buffer

#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((USR & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// Standard Input/Output functions

#include <stdio.h>

// Declare your global variables here

char qwe[10]={1,2,3,4,5,6,7,8,9};
void main(void)
{
// Declare your local variables here


// Input/Output Ports initialization

// Port B initialization

PORTB=0x00;
DDRB=0x00;

// Port D initialization

PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization

TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1H=0x00;
OCR1L=0x00;

// External Interrupt(s) initialization

GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

// UART initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity

// UART Receiver: On

// UART Transmitter: On

// UART Baud rate: 115200

UCR=0xD8;
UBRR=0x01;

// Analog Comparator initialization

ACSR=0x80;
// Global enable interrupts

#asm("sei")
while (1)
{ // Place your code here
puts(qwe);
};
}
прерывание возникает при переполнении буфера. в AVRStudio 4 проверял - возникает! в CodeVision насколько я понял прерывания UART используются только при приеме/передаче данных. :unsure: ну в процедуру прерывания еще никто не запрещал чего-нибудь вставить :)
Не ошибается тот, кто ничего не делает  
+
-
edit
 

AndySa

новичок
Tosha_443, 01.07.2004 11:23:57 :
если в функции опроса DS1820 убрать PORTB=0xFF то индикатор не будет выключаться.перед опросом ДС1820 имеет смысл жестко определять 1-wire ногу:
PORTD.1=1;
DDRD.1=0;
(уже наступал на грабли, хорошо, что не детские :) )
 


Не выходит, моргает также, но еще цифры зажигаютя по одной в том числе...
 
+
-
edit
 

-=ELF=-
-ELF-

новичок
у тебя код сгенерирован немного по другому, может потому что, у тебя CV 1.24.0, а у меня 1.24.2c.

посмотрел я немного файлы проекта, все-же если добавлять interrupt, то он прописывается в файл "проект.vec", а при компиляции добавляется, полностью готовый компилированный код в "проект.lst"

ведь пример кода с interrupt приведенный на прошлой странице по идее должен работать, если я правильно понимаю,
я использую прерывания 8 и 10. Значит для 8int как только что-то принимается по UART, то должно сработать прерывание и начать выполнять код ниписанный в теле функции, обработки прерывания. Для 10int тоже самое - но на передачу. У меня там стоят всего лишь PORTB.0=~PORTB.0 (для наглядности, т.е. срабатывает или нет), судя по тому что реакция на светодиоде никакая, тои прерывания или не работают или незнаю..


*прерывание возникает при переполнении буфера. в AVRStudio 4 проверял - *возникает! в CodeVision насколько я понял прерывания UART используются *только при приеме/передаче данных. ну в процедуру прерывания еще никто *не запрещал чего-нибудь вставить
^^^^^^^^^^^^^^^^
ну я что делаю, беру сгенерированный код и вырезаю от туда все лишнее, ведь там получается, что по прерыванию мы данные кидаем в буфер, а мне это не надо, я просто удаляю эту часть и получаю, тоже самое что и писал:
interrupt [UART_RXC] void uart_rx_isr(void) оно же interrupt [8] void uart_rx_isr(void)

может, мне ктонибудь сможет все-же помочь с
interrupt [UART_RXC] void uart_rx_isr(void) { PORTB.0=~PORTB.0 }
что-бы заработалло

проект добавил в ZIP'е, там же лежит в \generated\work-generated.c - это сгенерированный CV'ом v1.24.2c код с использованием прерывания UART
Прикреплённые файлы:
work.zip (скачать) [16,5 кБ]
 
 
 
+
-
edit
 
Ура! После недельного психологического триллера "Я против Федекс" я все-таки получил свой Zilog. Попробовал starter project (очень кстати пригодился ком-кабель от AVR программатора), написал свой, который зажигает единственный присутствующий светодиод.
И вот проблема. Программы работают в режиме отладки, а вот когда заливаю их во флэш кнопкой burn, после ресета программы почему-то не запускаются. Я догадываюсь, что наверное что-то не так делаю, а как правильно? Желательно подробно по этапам.
А вообще этот Zilog слишком крутой для меня. В жизни не смогу использовать и десятой части его возможности, да и сам никогда не соберу на нем ничего - просто плату такой точности сделать не смогу. Так что поиграю немного да приспособлю для какой-нибудь постыдно простой для такого МК задачи.

И по AVR вопрос. В BASCOM AVR есть функция getRC, которая выдает постоянную времени RC цепочки, подключенной к какому-нибудь порту. Точность нормальная, но результат выдается в неизвестных величинах и диапазон измерения меня не устраивает. Поскольку BASCOM у меня бесплатный, исходника этой функции у меня нет и изменить ничего я не могу. Кто-нибудь может написать это на ASM со сверхподробными комментариями, чтобы я мог подредактировать под свои нужды?
А вообще BASCOM это супер для таких лентяев как я, которые не очень хотят разбираться с железом, но хотят писать простые программы быстро. Столько всяких готовых функций в одном флаконе - мне явно под все нужды хватит.
 
?? Tosha_443 #02.07.2004 13:31
+
-
edit
 

Tosha_443

втянувшийся
-=ELF=-, 02.07.2004 00:00:23 :
у тебя код сгенерирован немного по другому, может потому что, у тебя CV 1.24.0, а у меня 1.24.2c.
 


а пароль на cvavr не подскажешь? (можно в почту, асю) :unsure:
Не ошибается тот, кто ничего не делает  
?? dimitry II #02.07.2004 13:59
+
-
edit
 

dimitry II

новичок
кто-нибудь помогите.

я написал прогу в codevision. она выводит показания АЦП на LCD, НО НЕ МОГУ ПРОЭМУЛИРОВАТЬ В VMLAB. На экране пусто, даже не выводит простые изображения, пробовал пользовать exempls'ами, но ничего непоучается, экран постой, что делать не знаю, просматривал примеры на vmlab, всё равно не понимаю , всё подключаю к portc.

заранее благодарен.dima_nikeevmail.ru
Завтра будет... Лучше.  

Yuran

опытный

dimitry II, 02.07.2004 12:59:56 :
кто-нибудь помогите.

я написал прогу в codevision. она выводит показания АЦП на LCD, НО НЕ МОГУ ПРОЭМУЛИРОВАТЬ В VMLAB. На экране пусто, даже не выводит простые изображения, пробовал пользовать exempls'ами, но ничего непоучается, экран постой, что делать не знаю, просматривал примеры на vmlab, всё равно не понимаю , всё подключаю к portc.

заранее благодарен.dima_nikeevmail.ru
 


А где прога то, чем помочь! =)
 
?? Tosha_443 #02.07.2004 14:25
+
-
edit
 

Tosha_443

втянувшийся
2 -=ELF=-
прерывание от передатчика возникает при окончании передачи (отправленном в UDR байте и задержке 3-5 мс).
приемник проверить неначем. :(
при передаче надо UDR=0xXX и подождать, пока он этот байт передаст, а если не ждать, то и прерывание не происходит. т.е. :
#include <90s2313.h>
#include <delay.h>

interrupt [UART_RXC] void rx_interrupt(void)
{
PORTB.0 = ~PORTB.0;
}

interrupt [UART_TXC] void tx_interrupt(void)
{
PORTB.1 = ~PORTB.1;
}

void main(void)
{
PORTB.0=0;
PORTB.1=0;
DDRB=0xFF;
DDRD=0x00;
UBRR=1;
UCR=0xD8;
#asm("sei");
while (1)
{UDR=0x45;
delay_ms(30);

};
}
по TX все работает!(проверено в AVRStudio 4.08)
Не ошибается тот, кто ничего не делает  

pokos

аксакал

Tosha_443, 02.07.2004 13:25:37 :
прерывание от передатчика возникает при окончании передачи
 


Не совсем правильно. Есть два прерывания - по окончанию передачи (TXC) и по приёму данных из UDR в сдвиговый регистр UART (UDRE). Обычно удобнее использовать UDRE, динамически его разрешая и запрещая.
 

AlexG

новичок
ГОГИ, 02.07.2004 08:34:15 :
И вот проблема. Программы работают в режиме отладки, а вот когда заливаю их во флэш кнопкой burn, после ресета программы почему-то не запускаются. Я догадываюсь, что наверное что-то не так делаю, а как правильно? Желательно подробно по этапам.
 


1) Ты точно заливаеш их во FLASH, а не в RAM?
2) Нужно пользоваться кнопкой Burn, а не Burn&Verify (эта работает неверно)

PS: Глюки софта и платы довольно разнообразны, я перечислил толко то что вспомнил сразу.
 
RU termostat #03.07.2004 02:12
+
-
edit
 

termostat

аксакал

ГОГИ, 02.07.2004 08:34:15 :
1) Программы работают в режиме отладки, а вот когда заливаю их во флэш ... почему-то не запускаются.

2) А вообще этот Zilog слишком крутой для меня. плату такой точности сделать не смогу.


3) BASCOM AVR getRC - исходника этой функции у меня нет и изменить ничего я не могу. Кто-нибудь может написать это на ASM


4) А вообще BASCOM это супер
 


1) читай инструкцию - при компиляции указывать надо для чего - для симулятора билдишь или для заливки в МК.

2) На самом деле нужно на твое изделие только разъемы напаять и в них втыкать маленькую платку с МК. Причем у разъемов можно припаивать лишь нужные выводы - так что не все так сложно.

3) Дык! ты откомпиль его и посмотри листинг в .asm - или .hex загрузи в VMLAB и прилепи кондер с резистором и смотри как там все работает. Чаще я встресал для RC цепей время в мкС - это как раз произведение кОм на нФ.

4) Эт точно. а сколько Апплик Ноутов - тоесть готовых устройств прилагается свободно! кстати там и эмуляция разной обвески есть но правда выглядит очень уж убого ...
RU termostat #03.07.2004 02:39
+
-
edit
 

termostat

аксакал

dimitry II, 02.07.2004 12:59:56 :
в codevision. на LCD НЕ МОГУ ПРОЭМУЛИРОВАТЬ В VMLAB.
 


Откомпилируй заново любой LCD проект из примеров CV и затем используй в VMLAB .hex файл - все дожно работать. проверено.

Вобщем не переделывай свой проект а сделай "с чистого листа" из примеров.
+
-
edit
 

-=ELF=-
-ELF-

новичок
закачал, сколько продержится незнаю, фтп сканером нашел, так-что если кому надо, лучше скачать сразу.
в архиве инсталлятор(генерирующий код для активации) без пароля и keygen - сам использую этот набор.
__ftp://195.161.67.162/Upload/cv1242c.rar

2 Tosha_443
вся проблема была в том, что я не знал, что надо использовать #asm("sei"), теперь буду знать. THX.
 
Это сообщение редактировалось 03.07.2004 в 03:59
RU termostat #03.07.2004 05:23
+
-
edit
 
RU termostat #03.07.2004 11:51
+
-
edit
 

termostat

аксакал

Вот кому нужно - проверен мной вывод на ЛСД в ВМЛАБ, тескт прог и компиляция в КодВижене. Сделано давно, но ни как не выложу в курс АВР.
Прикреплённые файлы:
 
1 2 3 4 5 6 7 12

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru