smac писал(а):Число 111 - это Вы на корпусе SMD резистора прочитали? Если да, то это не 111 Ом, а 110. В любом случае, и 110 и 111 Ом подойдет.Kots писал(а):Делаю AVR910, но неоказалось резисторов на 100ом. Есть на 111, такой подойдёт?
Мелкие вопросы по МК и ПЛИС.
Сендвич всегда падает хлебом вниз.
- Реклама
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Есть маленький вопрос. Начал разбираться с USART (Mega 16). В даташите написано, что он может работать в режиме многопроцессорной связи (достигается путем установки MPCM =1 в UCSRA). Не понятно одно - где хранится адерес контроллера, с котым он будет сравнивать принятый от внешнего устройства адрес??? Должен же быть какой нибудь адресный регистр.
- Реклама
Вобщем, учусь по книге Ревич "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера"... Немного не понятно с арифметической частью, а именно действия над 16, 24... разрядными числами. Везде даются ссылки на аппноут, но не понятно в двойне...
Начнем со солжения:
-в Ревиче был приведен пример сложения двух 16р чисел:
" add RL1, RL2 ; мл. байты слагаемых
adc RH1, RH2 ; старшие, при условии... "
Пытался реализовать в АВР Студио: (запись вкратце)
В итоге у меня куча эррорс. Что не так
Начнем со солжения:
-в Ревиче был приведен пример сложения двух 16р чисел:
" add RL1, RL2 ; мл. байты слагаемых
adc RH1, RH2 ; старшие, при условии... "
Пытался реализовать в АВР Студио: (запись вкратце)
Код: Выделить всё
.equ a={любое число}
.equ b={любое число}
.def main1=R13
.def main2=R14
.def temp1=R15
.def temp2=R16
.def temp3=R17
.def temp4=R18
{регитсры R15:R16 - будут служить для записи числа а,
регитсры R17:R18 - b}
ldi main1, a
ldi temp1, low(main1)
ldi temp2, high(main1)
ldi main2, a
ldi temp3, low(main2)
ldi temp4, high(main2)
add temp1, temp3
adc temp2, temp4
{Результат записывается в регистр temp1:temp2}В итоге у меня куча эррорс. Что не так
Дык какие ошибки-то? Дословно приведите.den1988 писал(а):...
В итоге у меня куча эррорс. Что не так
Вообще сразу бросилось в глаза ldi main1, a - загрузить число напрямую в регистр, можно только начиная с r16 и ниже, с верхними регистрами команда ldi не работает.
ldi temp2, high(main1) - бессмыслица, с точки зрения ассмблера это эквивалентно ldi r16, high(r15), r15 - регистр а не число (хотя допускаю, что есть числовое определение r15). С помощью команды ldi можно загрузить только число в регистр, для пересылки между регистрами следует использовать команду mov.
В-общем читайте документ AVR Instruction Set, который без труда можно найти на сайте http://www.atmel.com
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
main1 и main2 определены как регистры (R13 и R14), поэтому к ним неприменимы операции LOW и HIGH -- эти операции возвращают соответственно младший и старший байты константы, а регистр константой не является. Ну и, как выше писалось, нельзя с помощью ldi загружать значения в регистры ниже R16.den1988 писал(а):Код: Выделить всё
.equ a={любое число} .equ b={любое число} .def main1=R13 .def main2=R14 .def temp1=R15 .def temp2=R16 .def temp3=R17 .def temp4=R18 ldi temp1, low(main1) ldi temp2, high(main1) ldi temp3, low(main2) ldi temp4, high(main2)
- -=MindHunteR=-
- Открыл глаза
- Сообщения: 62
- Зарегистрирован: Пн мар 23, 2009 16:20:56
- Откуда: From the Middle of Nowhere
- Контактная информация:
Глюки COM
Ребят, подскажите что может быть причиной тому, что микропроцессор сыплет в терминал кучу мусора? Скорости проверены - код для этого сгенерировал CVAVR2 сам, я ничего не трогал. Скорость процессора тоже проверил - все как надо, но в терминал выводятся тонны непонятной ахинеи, среди которой изредка проскакивает нужная информация...
Я думал это какие-то наводки - укоротил провода до нескольких сантиметров - не помогло...
Что можно сделать? Что это может быть?
Спасибо.
Я думал это какие-то наводки - укоротил провода до нескольких сантиметров - не помогло...
Что можно сделать? Что это может быть?
Спасибо.
- -=MindHunteR=-
- Открыл глаза
- Сообщения: 62
- Зарегистрирован: Пн мар 23, 2009 16:20:56
- Откуда: From the Middle of Nowhere
- Контактная информация:
*связь глюканула, сорри*
Последний раз редактировалось -=MindHunteR=- Вс окт 25, 2009 16:48:19, всего редактировалось 1 раз.
- -=MindHunteR=-
- Открыл глаза
- Сообщения: 62
- Зарегистрирован: Пн мар 23, 2009 16:20:56
- Откуда: From the Middle of Nowhere
- Контактная информация:
Подключение:

Прога:
Жопа в том, что прога и схема не моя - я повторил и видимо у разработчика это работает, потому как терминал он юзал для нивелирования системы..... То есть проблема где-то не в тексте и не в подключении... Но, черт возьми, где-же...?
Большое спасибо!

Прога:
Код: Выделить всё
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#define F_CPU 8000000UL // 8 MHz
#define BAUD_RATE 9600
void adcinit();
int getadc(uint8_t channel);
int uart_putchar (char c)
{
if (c == '\n')
uart_putchar('\r');
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return (0);
}
void UART_Init (void) {
//Enable TXEN im Register UCR TX-Data Enable
UCSRB=(1 << TXEN);
UBRRL=(F_CPU / (BAUD_RATE * 16L) - 1);
fdevopen (uart_putchar, NULL);
}
int main (void)
{
adcinit();
UART_Init();
DDRC = 0b00000000;
DDRB = 0b00000000;
PORTB = 0b00000000;
DDRD = 0b11100000; // 1=Output, 0=Input
PORTD = 0b11100000; //on
// пишем в терминал
printf("ok\n");
while (1==1) {
val=getadc(0);
// тут еще делается работа с переменными - убрал чтоб не мешалась
// ибо прога пашет супер, только глючит вывод на терминал
// ну и выводим в терминал
printf("%d %d %d \n",pwm,pwm_ctr,val);
}
}
void adcinit() {
// Activate ADC with Prescaler 16 --> 1Mhz/16 = 62.5kHz
//ADCSRA = _BV(ADEN) | _BV(ADPS2);
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1);
ADMUX= 0;
}
int getadc(uint8_t channel) {
// Select pin ADC0 using MUX
ADMUX = channel | _BV(REFS0) | _BV(REFS1);
//Start conversion
ADCSRA |= _BV(ADSC);
// wait until converstion completed
while (ADCSRA & _BV(ADSC) ) {}
// get converted value
return(ADCW);
}Жопа в том, что прога и схема не моя - я повторил и видимо у разработчика это работает, потому как терминал он юзал для нивелирования системы..... То есть проблема где-то не в тексте и не в подключении... Но, черт возьми, где-же...?
Большое спасибо!
Подскажите, пожалуйста.
Пытаюсь скомпилировать код в Proteus (targer processor Atmega8, code generation tool AVRSAM2, без флагов)
Пишутся ошибки вида Undefined symbol RAMEND, Undefined symbol SPL
В даташите Atmaga8 не указан цифренный адресс этих констант(может это не так называется)
Подскажите, пожалуйста
1. разве это корректная работа компилятора(что он не может опознать стандартные константы) ?
2. можно как то с помощью Proteus все таки скомпилить эту прогу ?
3. если нельзя с помощью Proteus , подскажите какой нибуть ASM компилятор для Atmega8
Спасибо
.org 0x0000
rjmp start
.org 0x000E
rjmp ADC_ISR
start:
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, 0xFF
out DDRD, r16
ldi r16, 0
out ADMUX, r16
ldi r16, 0b11101101
out ADCSR, r16
sei
loop:
rjmp loop
ADC_ISR:
push r16
in r16, SREG
push r16
push r17
in r16, ADCL
in r17, ADCH
lsr r17
ror r16
lsr r17
ror r16
com r16
out PortD, r16
pop r17
pop r16
out SREG, r16
pop r16
reti
Пытаюсь скомпилировать код в Proteus (targer processor Atmega8, code generation tool AVRSAM2, без флагов)
Пишутся ошибки вида Undefined symbol RAMEND, Undefined symbol SPL
В даташите Atmaga8 не указан цифренный адресс этих констант(может это не так называется)
Подскажите, пожалуйста
1. разве это корректная работа компилятора(что он не может опознать стандартные константы) ?
2. можно как то с помощью Proteus все таки скомпилить эту прогу ?
3. если нельзя с помощью Proteus , подскажите какой нибуть ASM компилятор для Atmega8
Спасибо
.org 0x0000
rjmp start
.org 0x000E
rjmp ADC_ISR
start:
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
ldi r16, 0xFF
out DDRD, r16
ldi r16, 0
out ADMUX, r16
ldi r16, 0b11101101
out ADCSR, r16
sei
loop:
rjmp loop
ADC_ISR:
push r16
in r16, SREG
push r16
push r17
in r16, ADCL
in r17, ADCH
lsr r17
ror r16
lsr r17
ror r16
com r16
out PortD, r16
pop r17
pop r16
out SREG, r16
pop r16
reti
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
В протеусе код компилировать не приходилось, но точно можно сказать одно: чтобы эти костанты определялись, надо в начале программы подключить файл. Например в VMLab это делается так:
Код: Выделить всё
.include "D:\vmlab\include\m8def.inc"Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- -=MindHunteR=-
- Открыл глаза
- Сообщения: 62
- Зарегистрирован: Пн мар 23, 2009 16:20:56
- Откуда: From the Middle of Nowhere
- Контактная информация:
Народ, а какие номиналы нужны для вот такого аналогового обвяза для ШИМ?

Имею ввиду номинал конденсатора и резистора. Мне надо для светодиода.
И еще. Когда делают делитель из переменных резисторов для АЦП, какие номиналы брать и по какой схеме подключать?
Имею ввиду номинал конденсатора и резистора. Мне надо для светодиода.
И еще. Когда делают делитель из переменных резисторов для АЦП, какие номиналы брать и по какой схеме подключать?
Не умеешь - не берись, но не взявшись не научишься...



