smac писал(а):Число 111 - это Вы на корпусе SMD резистора прочитали? Если да, то это не 111 Ом, а 110. В любом случае, и 110 и 111 Ом подойдет.Kots писал(а):Делаю AVR910, но неоказалось резисторов на 100ом. Есть на 111, такой подойдёт?
Мелкие вопросы по МК и ПЛИС.
Сендвич всегда падает хлебом вниз.
- Реклама
имеет 4-е цифры в маркировкеиз ряда Е192
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
- Сообщения: 24
- Зарегистрирован: Пн сен 07, 2009 18:49:16
Есть маленький вопрос. Начал разбираться с USART (Mega 16). В даташите написано, что он может работать в режиме многопроцессорной связи (достигается путем установки MPCM =1 в UCSRA). Не понятно одно - где хранится адерес контроллера, с котым он будет сравнивать принятый от внешнего устройства адрес??? Должен же быть какой нибудь адресный регистр.
- Реклама
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
- Сообщения: 1
- Зарегистрирован: Сб окт 24, 2009 16:52:56
Вобщем, учусь по книге Ревич "Практическое программирование микроконтроллеров 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}В итоге у меня куча эррорс. Что не так
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Дык какие ошибки-то? Дословно приведите.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
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)
Ребят, подскажите что может быть причиной тому, что микропроцессор сыплет в терминал кучу мусора? Скорости проверены - код для этого сгенерировал CVAVR2 сам, я ничего не трогал. Скорость процессора тоже проверил - все как надо, но в терминал выводятся тонны непонятной ахинеи, среди которой изредка проскакивает нужная информация...
Я думал это какие-то наводки - укоротил провода до нескольких сантиметров - не помогло...
Что можно сделать? Что это может быть?
Спасибо.
Я думал это какие-то наводки - укоротил провода до нескольких сантиметров - не помогло...
Что можно сделать? Что это может быть?
Спасибо.
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
*связь глюканула, сорри*
Последний раз редактировалось -=MindHunteR=- Вс окт 25, 2009 16:48:19, всего редактировалось 1 раз.
Подключение:

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

Прога:
Код: Выделить всё
#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);
}Жопа в том, что прога и схема не моя - я повторил и видимо у разработчика это работает, потому как терминал он юзал для нивелирования системы..... То есть проблема где-то не в тексте и не в подключении... Но, черт возьми, где-же...?
Большое спасибо!
- Сообщения: 6
- Зарегистрирован: Вс окт 25, 2009 13:10:04
Подскажите, пожалуйста.
Пытаюсь скомпилировать код в 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
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
В протеусе код компилировать не приходилось, но точно можно сказать одно: чтобы эти костанты определялись, надо в начале программы подключить файл. Например в VMLab это делается так:
Код: Выделить всё
.include "D:\vmlab\include\m8def.inc"Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Нет конечно, через преобразователь на MAX232 (он работает номано - замыкал Rx на Tx - ниче не фонит).Pooher писал(а):2 -=MindHunteR=-
Не очень понятно, как осуществлено подключения МК к COM порту. Не уж то на прямую?
- Сообщения: 4435
- Зарегистрирован: Сб мар 07, 2009 20:44:36
Народ, а какие номиналы нужны для вот такого аналогового обвяза для ШИМ?

Имею ввиду номинал конденсатора и резистора. Мне надо для светодиода.
И еще. Когда делают делитель из переменных резисторов для АЦП, какие номиналы брать и по какой схеме подключать?
Имею ввиду номинал конденсатора и резистора. Мне надо для светодиода.
И еще. Когда делают делитель из переменных резисторов для АЦП, какие номиналы брать и по какой схеме подключать?
Не умеешь - не берись, но не взявшись не научишься...
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
- Сообщения: 4435
- Зарегистрирован: Сб мар 07, 2009 20:44:36



