saft

Cи В Bascom

1 сообщение в этой теме

saft    0

Приветствую уважаемые форумчане.

Если кто знает С, пожалуйста, помогите понять код:

Код:
#define DDR_SPI DDRB
#define DD_SS 2
#define DD_MOSI 3
#define DD_MISO 4
#define DD_SCK 5
#define SPE 6
#define MSTR 4
#define SPR0 0
#define SPIF 7

void SPI_MasterInit()
{
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);//настраиваем на выход
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);//вкл SPI, ведущий, частота fck/16
}

//функция передачи байта
void SPI_MasterTransmit(char cData)
{
SPDR = cData;//начинаем передачу
while(!(SPSR & (1<<SPIF)));//ждем пока передача завершится
}

unsigned int ReceiveADC()
{
unsigned char adcMSB=0;
unsigned char adcLSB=0;
unsigned int adc=0;

PORTB &= ~(1<<DD_SS);
SPI_MasterTransmit(0x00);
adcMSB=SPDR;
SPI_MasterTransmit(0x00);
adcLSB=SPDR;
PORTB |= (1<<DD_SS);
//собираем битовыми операциями наши данные	
adcMSB &= 0b00011111;
adc = adcMSB;
adc<<=5;
adcLSB>>=3;
adc |= adcLSB;
return adc;
}

Т.е. переведу я сам на Bascom, я немогу его понять. Вообще это код управления АЦП MCP3001.

Очень надо. Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: Zabar31
       
      Всех приветствую! Вообщем ситуация такая - (сейчас будет предыстория) стал понемногу интересоваться МК и набрел на статью о подключении экрана нокии 3310 к атмеге8. Вот она http://cxem.net/mc/mc201.php  Сказать что заинтриговало - ничего не сказать... к тому же автор в комментариях написал, что можно поочередно выводить изображения, и таким образом создать анимацию. Так вот, к чему я, была у меня монохромная моторолла и на ней был прикольный "скринсейвер" с рыбками, теперь который я хочу воссоздать. Надписей "Hello, world!" я не планирую, а только чистый вывод изображений.
      Теперь сама суть моего обращения на форум.
      1) Так как в Bascom я начинающий, решил идти по пути наименьшего сопротивления, то есть немного подправив код в проэкте, предоставленный автором статьи. Подправить то я его подправил, но вот правильно ли... Вообщем мне бы хотелось чтобы знающие люди проверили бы мой код. Хотя Bascom компилирует код без проблем.
      Вот исходный код:
      Вот мой код: (на одинаковость стека изображений не обращайте внимания, мои в процессе воссоздания, а мне нужна проверка самого принципа вывода изображений, который я написал)
      Таким образом я хочу выводить изображения поочередно с интервалом в 1 секунду.
      2)Еще более интересующий меня вопрос - если открыть даташит на атмега8, то там написано, что флеш памяти для программ 8 кб. Но вот что интересно и вводит меня в ступор. Если просто взять проэкт автора статьи и скомпилировать его в .hex, то получаем: Bascom пишет при компиляции "Flash used - 55%", то есть как бы половина атмеги пустая, но вот выходной файл .hex имеет размер 13кб. Вот я и не могу понять как даже авторский проэкт в 13кб прошивается в атмегу с 8кб? Магия наверное. Скомпилировав "свой" проэкт, я получаю  "Flash used - 66%" и файл на 15кб. Вот и возник такой вопрос - это нормально и так и должно быть? А если нет - то как правильно скомпилировать?
      Так как пока проверить код в железе нет возможности (еще едет), вот к Вам, знающим людям, за помощью и обращаюсь. Ниже прикрепляю видеофайл с  компиляцией проэкта автора статьи в Bascom.
       clip0002.avi
       
    • Автор: Evolvent
      Всем привет! Столкнулся с проблемой что не работает переменная double. Зачем она мне нужна?  Есть  устройство для измерения емкости и индуктивности .Вот его схема и статья о нем http://radiokot.ru/circuit/digital/pcmod/57/
      Я решил не повторять полностью ее, а сделать свою плату с ЖК дисплеем. Казалось бы формула расчета емкости и индуктивности проста, но там есть F2   и в собранном устройстве частота в контуре 450кГц .  В переменную SINGLE  F2  тупо не влазит, а в DOUBLE  не получается даже почти любое число поместить. На дисплее либо бред, либо 0, либо Infinity .  Помогите пожалуйста разобраться
    • Автор: a_sergeevich
      Уже есть тема для Бейсика, асм это само сабой, а вот по Си темки нету, поэтому я и решил её создать.
      В данной теме хотелось бы рассматривать вопросы программирования на языке Си, а т.к компиляторов для этого языка и для PIC-ов довольно много то я предлагаю рассматривать тут два самых распространённых это HI-TEC PICC и microC.
      Почему именно они, спросит кто-то ? Просто данные компиляторы-среды две полные противоположности и вот в чём заключается их эта противоположность.
      microC - это то, что нужно для быстрой разработки, куча библиотек на все случаи жизни, ну и самое главное самый лучший мануал на русском языке, который больше похож на пособие для тех кто с нуля начинает программировать на Си для PIC.
      HI-TEC PICC - это инструмент для тех кто предпочитает всё писать сам, досконально во всём разобравшись, т.к данный компилятор в своём составе имеет минимум уже готовых библиотек и всё надо писать ручками Мануал на него краткий почти без примеров.
      Короче каждый сам решит для себя, что ему ближе. Мне ближе microC, но сейчас я изучаю и HI-TEC.
      И так, что нужно тому кто решил освоить программирование на Си для PIC:
      1.Желательно иметь сам контроллер, я предлагаю на эту роль избрать PIC16F877 т.к в нём есть вся нужная переферия, русский даташит, но можно и PIC16F628, у него правда нету АЦП, что является всё-таки минусом.
      2.Сами компиляторы: microC тут: http://a_sergeevich.nxt.ru/microC.zip в архиве две версии компилятора стандарт и про, а также мануал на русском. Предлагаю всем пользоваться про-версией.
      HI-TEC PICC берём тут: http://a_sergeevich....CC_V8.05PL1.zip , а мануал тут: http://a_sergeevich....ru/picc_env.pdf
      3.Для первого времени ну и вообще желательно иметь Proteus, тут версия 7.5SP3: http://a_sergeevich....teus 7.5SP3.zip внимание некотырые антивирусы ругаются на кряк.
      Это то, что нужно для начала, всё остальное каждый приобретёт исходя из потребностей.
      А теперь просьба ко всем, для облегчения дальнейшего общения:
      1.Выкладываете свой код, комментируйте его или описывайте, что он делает. Если вопрос касается работы какой-то части кода, которая вам не понятна ( например, если разбираетесь в чужом) то лучше вопрос задать в виде, сначала как сами понимаете,работу данного куска кода, а потом, где ошибка в моих рассуждениях. Всё это ускорит получение помощи по вашему вопросу более компетентными коллегами с форума.
      Сам я также пока учусь, пробую, всё, что у меня есть по данной теме я выложу, чуть позже, а пока читаем мануалы, выбираем, что по душе, ну и начинаем творить, предлагать какие-то интересные идеи для совместной разработки.
      Давайте, чтобы у нас как в песне: вместе весело шагать по просторам ну, а песню напевать лучше хором
    • Автор: Артемон
      Всем привет. Просьба посодействовать в исправлении кода для термометра. Так как сам я в этом новичек, то код собирал из трех чужих проектов. Реализация такова, подключение термопары через микруху Max6675 к Atmega и вывод данных на LCD экран. В архиве прилагаю проект Atme Studio 7 и принт скрин из Протеуса. Ошибка заключается в неправильных показаниях температуры

      Test1.rar
      Вот код, чтоб не скачивать проект.

      #define F_CPU 1000000UL #include <util/delay.h> #include <avr/io.h> #include "max6675.h" #include "LCD.h" uint16_t gettemp(void); //Funktionsdeklarationen void initavr(void); //gettemp () returns absolute Temperature in Temp * 4 °C - in 1/4°-steps // uint16_t gettemp(void){ //Temperatur holen. uint8_t bit = 0, bitnr = 12; //Variablen uint8_t foo1 = 0; uint16_t Rohdata = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen bit = 15 - foo1; //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if((bit <= 14) && (bit >= 3)){ //Einfach mal die 12 relevanten von den 16 Bits ausfiltern if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... bitnr--; //zдhlen wir runter... Rohdata |= (1 << bitnr); // und schieben eine 1 an bit x }else{ //WENN dem NICHT so ist, dann... bitnr--; //zдhlen wir runter... Rohdata &= ~(1 << bitnr); //und schieben eine 0 an bit x } }else{ //weis au nimmer, was das soll. bitnr = 12; } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return Rohdata; //Das ist doch mal was ;D } // getTC() returns 0 if Thermocouple is not connected, 255 if thermocuple is connected // (to enable this feature T- must be connected to GND) uint8_t getTC(void){ //Temperatur holen. //Variablen uint8_t TC = 0; uint8_t foo1 = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if(foo1 == 2){ //das 3. bit ist fьr uns relevant. if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... TC = 0; }else{ //WENN dem NICHT so ist, dann... TC = 255; } } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return TC; //Das ist doch mal was ;D } //Initiates the MAX6675 and IO-pins void init_6675(void){ //AVR initialisieren SO_DDR &= ~(1 << SO); CS_DDR |= (1 << CS); SCK_DDR |= (1 << SCK); //IOs setzen SO_Port |= (1<<SO); //Pullups an. (Wichtig fьr MAX6675, der kann nicht anders, hab ich festgestellt... CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. SCK_Port &= ~(1 << SCK); //SCK LO } int main(void) { init_port();// инициализируем порт ЖКИ lcd_init();// инициализируем ЖКИ init_6675(); while (1) { char buffer[8]; int temp; temp = gettemp(); temp /=4; lcd_gotoxy(0,0);//перемещаем курсор в верхний левый угол sprintf(buffer, "t=%i\xdf\C ", temp); // так как тут не плавающая запятая то числа с запятой записываются так %i.%i, код градуса записывается так \xdf lcd_putstring(buffer); } }
      вставляете код пользуйтесь тегами [CОDE][/CОDE] редактора сообщений, кнопка <>
    • Автор: Bohdan
      Доброго времени суток.
      Нет ли у кого-нибудь библиотеки или проекта для часов реального времени на ds1302 (не путать c 1307) под среду разработки Bascom AVR. Будет здорово, если с русскими комментами.
  • Сообщения

    • О чем и говорилось ранее. Кажущаяся усложненность такой схемы, (по сравнению с одиночным компаратором), компенсируется легкой её настройкой.
    • Интересное изделие, 4 Ампера не хватает для запитки "пары реле"... У Вас где-то 4,5Вх4А=18 Ватт выделятся должно, ищите по запаху. Или проверьте потребление от ИИП. Если "просадка"  (кстати, в какой точке? на выводах Mean Well? или где-то на плате? две большие разницы...) не зависит от подключенной нагрузки, значит, с большой вероятностью, Ваш Mean Well неисправен. Или на плате косяк. Сколько потребляет Ваша плата?
    • Первая схема - просто выпрямитель с вольтметром - амперметром, срисовано с ошибкой. Вторая - тиристорный регулятор мощности, видимо по первичке трансформатора, типа такого: Я бы эту порнуху выкинул, и собрал нормальную схему.
    • Относительно чего, какой шины делались измерения? Вот это вообще не понял:  
    • Колл-бак функция HAL_ADC_ConvCpltCallback() вызывается при окончании каждого преобразования, для всех каналов одна и та же. А функция HAL_ADC_GetValue(hadc1) просто перекладывает готовый результат преобразования в массив adcResult[], она не вызывает новое преобразование. Поэтому, чтобы отличить результат какого канала лежит в АЦП, нужно завести переменную-индекс, которая будет увеличиваться на 1 при каждом вызове HAL_ADC_ConvCpltCallback(). И этот индекс будет индексом массива результатов. После преобразования всех каналов этот индекс надо сбросить в 0, чтобы в следующий раз начать с начала массива. Признак последнего канала - флаг окончания сканирования каналов ADC_FLAG_EOS. uint8_t index = 0; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc1)   { if (__HAL_ADC_GET_FLAG(hadc1, ADC_FLAG_EOC))    {   adcResult[index] = HAL_ADC_GetValue(hadc1);    index++;   } if (__HAL_ADC_GET_FLAG(hadc1, ADC_FLAG_EOS))     {   index=0; } }  
    • У меня в детстве, в начале 90-х, был двухкассетный Samsung, наподобие того, что на картинке (чуть-чуть другого дизайна). Тоже белый и чисто корейский - отцу знакомые из Финки подогнали... Тогда это был "попсатас" жуткий - после "Весны"... С перезаписью, с автостопом, с приемником и встроенным микрофоном! Аппаратец, кстати, до сих пор живет на даче - кассет уже не играет, а радио - только так...
    •   В Охотском море тоже