Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ChipKiller »

2 qmix ... вот простой пример на WinCupl

Код: Выделить всё

Device g16v8a; /* тип мелкосхемы */
   
pin 2 in1;   /* соответствие пинов входам */
pin 3 in2;   
pin 4 in3;   
pin 5 in4;   

pin 12 out1; /* то же для выхода */

/* логика работы */
out1 = (in1 & !in2 & !in3) # in4;

.. как видите логика работы уместилась в одной строке
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Chip115 »

Всем привет! Разбираюсь с UARТ, посему хотелось бы заиметь исходник на сях, где бы производилась настройка и передача данных по UART. контроллер silabs C8051F410
не поделитесь?:)
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
DJ_Kiridza
Мучитель микросхем
Сообщения: 458
Зарегистрирован: Пн дек 13, 2010 13:01:59
Откуда: Украина
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение DJ_Kiridza »

Всем привета.
Народ, помогайте: собрал девайс, а он глючит... вобщим по-порядку:
Собираю МИДИ-клаву на основе оставшейся от дохлого совкового синтезатора пятиоктавной клавы и ATMega16L (в планах динамическая, но пока хотя-бы заработало "без динамики").
Сама ATMega16L досталась в копусе TQFP-44, собрал пока на макетке.
- К АТМеге повесил кварц на 8Мгц и кондёры на 18pF (по букварю от 12 до 22 для такого кварца), корпус кварца не заземлял (боюсь перегреть сам кварц), фьюзы поставил CKSEL=1111 CKOPT=1 SUT=11
- Кнопка ресет через резак подтянута к плюсу и кондёр на 1мкф чтоб гасить дребезг.
- Нога AVCC запитана от плюса через катушку которая (должна быть) 33мкГн и кондёр на 102 к минусу (по букварю 10мкГн и 100нФ... но болие адекватной подходящей катушки под рукой небыло, эта мне досталась от цепей питания вай-фай роутера, там стоял преобразователь АХ3001, а по букварю к ней положена катушка на 33мкГн)... хотя АЦП пока не юзаю, он нужен будет в будущем...
- запитал схему от старого совкового БП от калькулятора МК-52 (5В, но немного скачет +/- 0,01В, хотя иногда проваливается), в самом БП большой кондёр + на макетке поставил на 220мкФ (понимаю что мало, будем исправлять!)
- прошивку писал на АСМе в АВР Студио 4, а заливал через "5-проводов" из-под КодВижн АВР, фьюзы выставлял тоже вижн-ом
- MIDI-адаптер собрал на неизвестном оптроне, выпаяном из дохлого АТХ-компутерного БП (проверил тестером и батарейками - оптрон живой) в дип-копусе с четырмя ногами. Со стороны светодиода оптрона плюс - на плюс питания питания МК через резак на 300 Ом, минус - на TXD (PD0) Atmeg'и, с "второй" стороны оптрона одна нога на минус (пин 5 МИДИ порта), вторая на MIDI-IN (пин 15 порта) и подтянута резаком на 2К3 к плюсу (пин 8 порта).

В прошивке:
- USART работает на частоте f/15 выходит 31.25 Кб/с (как-раз миди стандарт) 8 бит + 1 старт-бит + 1 стоп-бит
- Timer/Counter0 с делителем 1024, прерывание по переполнению
- еще опрос ног, но его пока не трогаем, проблема в следующем:

По прерыванию от таймера, если UDR пустой - пишем в него 0xFE (в терминологии МИДИ - комманда Active Sensing - поддержание связи). Смотрю на компе програмкой midimonitor. В программе выбираю свою звуковуху, всё как надо, убираю фильтры (в т.ч. Active Sensing) и что я вижу...:

Сигнал в компьютер поступает, но в основном это не Active Sensing (0xFE), а STOP (0xFC), также иногда получаю 0xF8.
Тоесть как, допустим из всей чреды подымающихся столбиков МИДИ-сообщений в мониторе вижу что подымается слово STOP и его код 0xFC, но среди него проскакивает единичное или повторяющееся Active Sensing с кодом 0xFE... иногда оно может повторяться скажем 10-20 раз подряд, иногда среди десятка Active Sensing проскакивает один-два STOP'а, иногда "группы сообщений" Active Sensing проскакивает одна за другой, но в основном (на глаз 80% получаемых сообщений) - это 0xFC = STOP... также иногда проскакивает единичное или несколько подрят 0xF8 (не помню какая это миди комманда, не суть важно)...

..т.е. выходит что вместо 1111 1110 я получаю в компьютере 1111 1100 и иногда 1111 1000...

понимаю что могут быть причины в гуляющем питании, хотя китайский вольтметр ухваченый крокодилами за полюса питания на работающей плате показывает достаточно стабильную картинку... может врет?
Может такое быть из-за несоответсвующей букварю на атмегу катушке на 33мкГн?, - думаю на время отладки её вобще закоротить (ногу AVCC кинуть напрямую на +5)... может кондёры на кварце глючат, или ёмкость не подходит... или сам кварц подгулявший? По-ходу может какую калибровку можно/нужно в АТМеге выставить? Суть проблемы (я так понимаю) в том что АТМега "выставляет" последний ноль, пока комп "еще читает предыдущую 1", хотя могу и ошибаться

кто что может посоветовать?
зарание пасиб что пеерчитали ввесь описаный выше бред и дали адекватные советы... :)
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Chip115 писал(а):Всем привет! Разбираюсь с UARТ, посему хотелось бы заиметь исходник на сях, где бы производилась настройка и передача данных по UART. контроллер silabs C8051F410

Чем не нравятся файлы F41x_UART0_Interrupt.c и F41x_UART_STDIO.c из ...\SiLabs\MCU\Examples\C8051F41x\UART ? :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ARV »

DJ_Kiridza, я практически на 100% без капельки уверен, что ни питание, ни дроссель на AVCC, ни кварц не являются причиной ваших проблем. первые два вообще не могут повлиять (точнее, могут, но тогда б у вас вообще ничего не пахало бы, а раз что-то работает - не они виноваты), а третий - сомневаюсь просто, т.к. кварцы на относительно невысокие частоты стабильно запускаются и свое отрабатывают.

все-таки проблема мне видится в программе вашей... но где именно - это к кашпировскому :)

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

для отладки начните с того, чтобы заблокировать все части программы, кроме тупой выдачи Active Sensing через заданные интервалы времени, как положено. как только это заработает, тогда постепенно видоизменяйте до полной работоспособности...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Chip115 »

Gudd-Head писал(а):
Chip115 писал(а):Всем привет! Разбираюсь с UARТ, посему хотелось бы заиметь исходник на сях, где бы производилась настройка и передача данных по UART. контроллер silabs C8051F410

Чем не нравятся файлы F41x_UART0_Interrupt.c и F41x_UART_STDIO.c из ...\SiLabs\MCU\Examples\C8051F41x\UART ? :)


Всем. Мне бы что нить по проще для начала. Без всяких наворотов просто пнуть текст на ком порт и в терминале прочесть данные.

вот из описания тех примеров

How To Test:
//
// 1) Ensure that jumpers are placed on J27 of the C8051F410 target board
// that connect the P0.4 pin to the TX signal, and P0.5 to the RX signal.
// 2) Ensure that the serial cable is connected to the RS232 connector
// on the target board.
// 3) Specify the target baudrate in the constant <BAUDRATE>.
// 4) Open Hyperterminal, or a similar program, and connect to the target
// board's serial port.
// 5) Download and execute code on an 'F41x target board.
// 6) Type up to 64 characters into the Terminal and press Enter. The MCU
// will then print back the characters that were typed

как я понял, это для отладочной платы,которой у меня нет. вот это что они хотят? Type up to 64 characters into the Terminal and press Enter
На компе жму интер и ничего нет. В общем труба и ничего не ясно. Вот и хотел посмотреть на прогу других людей ))
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Chip115 писал(а):как я понял, это для отладочной платы,которой у меня нет.

Ну и что? Там что, как-то по-другому инициализируется УАПП и пересылаются данные? Всё расписано подробно и с комментами. Тем более, для инициализации есть утилита Configuration Wizard.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Chip115 »

Да, но я прошиваю и ничего нет. тишина полнейшая. Что тогда сделать надо что бы передать текст ? Использовать fprint ?
Если сравнивать с атмелом, не на С51, то там должен быть какой то регистр из которого байт передается. Да?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
DJ_Kiridza
Мучитель микросхем
Сообщения: 458
Зарегистрирован: Пн дек 13, 2010 13:01:59
Откуда: Украина
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение DJ_Kiridza »

2 ARV
пасиб за ответ... коды работы с USART не приводил чтоб не перегружать и без того громоздкий пост, для начала хотел исключить "железные нюансы"...
Сам код я прогонял в АВР студио и смотрел по регистрам - всё работает как часы... приводить всю программу тоже не хотел потому что там много всего - опрос пинов портов мк, высчитывание кода нажатой клавиши, генерация миди-сообщений о включении/выключекнии той или иной клавиши, буфер для очереди сообщений выдаваемых через USART и т.д. и т.п.
Но основной цикл всего этого не цепляет, вот то, что конкретно по работе с USART:

вначале кода
.equ ActvSens = 0xFE

и прерывания
.cseg
.org 0x0000
rjmp RESET ;Reset Handler
.org OVF0addr
rjmp Timer_int ;Timer0 Overflow Interrupt Vector Address
.org UDREaddr
rjmp USARTClear ;UART Data Register Empty Interrupt Vector Address
.org UTXCaddr
rjmp UART_Tx_ok ;UART Transmit Complete Interrupt Vector Address
.org ADCCaddr
rjmp ADC_Int ;ADC Interrupt Vector Address


из них ресет понятно, переполнение таймера привожу ниже, опустошение юсарта - это для вывода очередного сособщения из очереди (записаного в буфер в памяти) и далее два последних не исспользую пока - это забил в шапку на будущее..

сразу под ним:
RESET:
; тут начинается инициализация стека
; потом все подготовительные операции
; настройка портов, таймеров и т.п.

;Инициализация стека
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp


инициализацию всех портов не привожу там все просто, толькот то что касается трансмитера (косвенно)

Инициализация порта D:
;
ldi temp, 0x0D
out DDRD, temp ;Порт D на смешаный ввод/вывод
ldi temp, 0x0D
out PORTD, temp ;Включаем подтягивающие резисторы на входах


и ниже по тексту, сразу за портами инициализация USART (31,25 Кбит/с)
;USART.Mode=32125,N,1(8Mhz)
ldi temp,0x00 ;U2x=0
out UCSRA,temp
ldi temp,(1<<TXEN);Tx_Enable
out UCSRB,temp
ldi temp,(1<<URSEL)|(3<<UCSZ0);Asink+8Bit(Parity_Dsbl,Stp_Bit_1)
out UCSRC,temp
ldi temp,0x00
out UBRRH,r16
ldi temp,0x0F
out UBRRL,temp
;+ первая посылка
ldi temp,ActvSens
out UDR,temp


За юсартом:

;Инициализация таймера 0
ldi temp,0x00
out TCNT0,temp
ldi temp,0x00
out OCR0,temp
ldi temp,(5<<CS00);Clk(8Mhz)/1024
out TCCR0,temp
ldi temp,0x00
out TIFR,temp
ldi temp,(1<<TOIE0);Timer_OverFlow_int
out TIMSK,temp

ну и
sei ; разрешаем прерывания

талее тело программы не привожу, т.к. в свете вышеописаного оно не рассматривается, вот прерывание по таймеру:

Timer_int: ;Active Sensing посылается передатчиком (статус-байт 0xFE (0FEh)) если передачи нету и/или буфер пустой
SBIS UCSRA,5 ;если там и так есть что передавать
RJMP TimerIntEnd ;выходим
ldi temp,ActvSens ;иначе - выгружаем комманду 0xFE
out UDR,temp ;и выплевываем через USART
TimerIntEnd:
reti

Собственно всё, в процессе выдачи именно 0xFE больше ничего не учавствует...

З.Ы. Сам полный листинг исходников тоже прикреплояю, но это мой первый в жизни код, написаный для первого в моей жизни микроконтроллера, так что ногами сильно не пинайте за ламерство... коменты писал для себя...
Вложения
TEST1.asm
листинг того что у меня вышло
(11.52 КБ) 326 скачиваний
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Chip115 »

не могу понять как работает программа? когда происходит прерывание? В отладчике постоянно крутится в главном цикле и не переходит в подпрограмму обработки прерывания .

Код: Выделить всё

//----------
// F41x_UART0_Interrupt.c
//----------
// Copyright 2006 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// This program demonstrates how to configure the C8051F410 to write to and read
// from the UART interface. The program reads a word using the UART interrupts
// and outputs that word to the screen, with all characters in uppercase
//
// How To Test:
//
// 1) Ensure that jumpers are placed on J27 of the C8051F410 target board
//    that connect the P0.4 pin to the TX signal, and P0.5 to the RX signal.
// 2) Ensure that the serial cable is connected to the RS232 connector
//    on the target board.
// 3) Specify the target baudrate in the constant <BAUDRATE>.
// 4) Open Hyperterminal, or a similar program, and connect to the target
//    board's serial port.
// 5) Download and execute code on an 'F41x target board.
// 6) Type up to 64 characters into the Terminal and press Enter.  The MCU
//    will then print back the characters that were typed
//
//
// Target:         C8051F41x
// Tool chain:     Raisonance / Keil
// Command Line:   None
//
// Release 1.1 / 11 MAR 2010 (GP)
//    -Tested with Raisonance
//
// Release 1.0
//    -Initial Revision (SM)
//    -5 JUN 2007
//


//----------
// Includes
//----------

#include <compiler_defs.h>
#include <C8051F410_defs.h>                 // SFR declarations
#include <stdio.h>

//----------
// Global CONSTANTS
//----------

#define SYSCLK      24500000           // SYSCLK frequency in Hz
#define BAUDRATE        9600           // Baud rate of UART in bps

//----------
// Function PROTOTYPES
//----------

void SYSCLK_Init (void);
void UART0_Init (void);
void PORT_Init (void);
void Timer2_Init (int);

//----------
// Global Variables
//----------

#define UART_BUFFERSIZE 64
unsigned char UART_Buffer[UART_BUFFERSIZE];
unsigned char UART_Buffer_Size = 0;
unsigned char UART_Input_First = 0;
unsigned char UART_Output_First = 0;
unsigned char TX_Ready =1;
static char Byte;

//----------
// MAIN Routine
//----------

void main (void)
{
   PCA0MD &= ~0x40;                    // WDTE = 0 (clear watchdog timer
                                       // enable)
   PORT_Init();                        // Initialize Port I/O
   SYSCLK_Init ();                     // Initialize Oscillator
   UART0_Init();

   EA = 1;


   while(1)
   {
      // If the complete word has been entered via the terminal followed by
      // carriage return
      if((TX_Ready == 1) && (UART_Buffer_Size != 0) && (Byte == 13))
      {
         TX_Ready = 0;                 // Set the flag to zero
         TI0 = 1;                      // Set transmit flag to 1
      }
   }
}

//----------
// Initialization Subroutines
//----------

//----------
// PORT_Init
//----------
//
// Return Value : None
// Parameters   : None
//
// Configure the Crossbar and GPIO ports.
//
// P0.4   digital   push-pull    UART TX
// P0.5   digital   open-drain   UART RX
//
//----------

void PORT_Init (void)
{
   P0MDOUT |= 0x10;                    // Enable UTX as push-pull output
   XBR0     = 0x01;                    // Enable UART on P0.4(TX) and P0.5(RX)
   XBR1     = 0x40;                    // Enable crossbar and weak pull-ups
}

//----------
// SYSCLK_Init
//----------
//
// Return Value : None
// Parameters   : None
//
// This routine initializes the system clock to use the internal oscillator
// at its maximum frequency.
// Also enables the Missing Clock Detector.
//----------

void SYSCLK_Init (void)
{
   OSCICN = 0x87;                      // configure internal oscillator for
                                       // 24.5MHz
   RSTSRC = 0x04;                      // enable missing clock detector
}

//----------
// UART0_Init
//----------
//
// Return Value : None
// Parameters   : None
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//----------

void UART0_Init (void)
{
   SCON0 = 0x10;                       // SCON0: 8-bit variable bit rate
                                       //        level of STOP bit is ignored
                                       //        RX enabled
                                       //        ninth bits are zeros
                                       //        clear RI0 and TI0 bits
   if (SYSCLK/BAUDRATE/2/256 < 1) {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON |=  0x08;                  // T1M = 1; SCA1:0 = xx
   } else if (SYSCLK/BAUDRATE/2/256 < 4) {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01
      CKCON |=  0x01;
   } else if (SYSCLK/BAUDRATE/2/256 < 12) {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   } else if (SYSCLK/BAUDRATE/2/256 < 48) {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   } else {
      while (1);                       // Error.  Unsupported baud rate
   }

   TL1 = TH1;                          // init Timer1
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;
   TR1 = 1;                            // START Timer1
   TX_Ready = 1;                       // Flag showing that UART can transmit
   IP |= 0x10;                         // Make UART high priority
   ES0 = 1;                            // Enable UART0 interrupts
}

//----------
// Interrupt Service Routines
//----------

//----------
// UART0_Interrupt
//----------
//
// This routine is invoked whenever a character is entered or displayed on the
// Hyperterminal.
//
//----------

void UART0_Interrupt (void) interrupt 4
{
   if (RI0 == 1)
   {
      if( UART_Buffer_Size == 0)  {      // If new word is entered
         UART_Input_First = 0;    }

      RI0 = 0;                           // Clear interrupt flag

      Byte = SBUF0;                      // Read a character from UART

      if (UART_Buffer_Size < UART_BUFFERSIZE)
      {
         UART_Buffer[UART_Input_First] = Byte; // Store in array

         UART_Buffer_Size++;             // Update array's size

         UART_Input_First++;             // Update counter
      }
   }

   if (TI0 == 1)                   // Check if transmit flag is set
   {
      TI0 = 0;                           // Clear interrupt flag

      if (UART_Buffer_Size != 1)         // If buffer not empty
      {
         // If a new word is being output
         if ( UART_Buffer_Size == UART_Input_First ) {
              UART_Output_First = 0;  }

         // Store a character in the variable byte
         Byte = UART_Buffer[UART_Output_First];

         if ((Byte >= 0x61) && (Byte <= 0x7A)) { // If upper case letter
            Byte -= 32; }

         SBUF0 = Byte;                   // Transmit to Hyperterminal

         UART_Output_First++;            // Update counter

         UART_Buffer_Size--;             // Decrease array size

      }
      else
      {
         UART_Buffer_Size = 0;            // Set the array size to 0
         TX_Ready = 1;                    // Indicate transmission complete
      }
   }
}

//----------
// End Of File
//----------
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ChipKiller »

Chip115 писал(а):не могу понять как работает программа? когда происходит прерывание? В отладчике постоянно крутится в главном цикле и не переходит в подпрограмму обработки прерывания
... прерывание происходит при RI0 == 1 или ТI0 == 1, т.е. при окончании приема или передачи байта.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ploop »

Господа, вкладывайте, пожалуйста, большие простыни кода в файлы, раз спойлеров форум не поддерживает.
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Chip115 »

ploop писал(а):Господа, вкладывайте, пожалуйста, большие простыни кода в файлы, раз спойлеров форум не поддерживает.

Да, хорошо.

По теме... А каково назначение этой программы? НУ что бы показать как юарт работает - эт ясно. Почему то одни нули идут. Ладно. Еще по ковыряюсь,если что , еще Вас по дастою тупыми вопросами ))
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
DJ_Kiridza
Мучитель микросхем
Сообщения: 458
Зарегистрирован: Пн дек 13, 2010 13:01:59
Откуда: Украина
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение DJ_Kiridza »

привета еще раз...
если кто читал два моих предыдущих поста - с описаловом железа и трабли и с описаловом и прикрепленным кодом, в общим:
вчера вечером вместо кода 0xFE написал 0х00, ну чтобы по тамеру выплевывать через юарт, у меня миди монитор стал показывать вот такую картинку:
E0 00 00 Pitch bend
E0 00 00 Pitch bend
E0 00 00 Pitch bend
E0 00 00 Pitch bend
E0 00 00 Pitch bend
E0 00 00 Pitch bend
...

т.е. может быть такое что проблема не в прошивке/железе а в способе принятия информации компом?
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ARV »

DJ_Kiridza, я заметил, что в обработчике прерываний вы не сохраняете контекст: temp и SREG минимум... возможно, в прерывании таймера SREG вы и не портите, а в других прерываниях? да и temp у вас используется в основном коде, а в прерывании-то его содержимое портится... не в этом ли причина?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
DJ_Kiridza
Мучитель микросхем
Сообщения: 458
Зарегистрирован: Пн дек 13, 2010 13:01:59
Откуда: Украина
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение DJ_Kiridza »

2 AVR
Да, вы прави относительно temp и SREG, но вопервых - при входе в прерывание то флаг "глобального разрешения прерывания" снимается, и устанавливается после выхода из прерывания, если его вручную не устанавливать (а я не устанавливаю) - то вложеных прерываний не должно быть, да и некому у меня больше (пока) перывать, касательно темпа - мне важно её содержимое в большинстве своём не больше чем 1-2 "хода", хотя вчера я, перечитывая свой код, немного оптимизировал его (убрал местами повторения) и, вчастности, сократил процедуру обработки прерывания по таймеру:
Timer_int:
SBIS UCSRA,5
reti
out UDR,ActvSns
reti


ActvSns - это регистр r8, в котором я храню свое 0xFE (ну или 0х00 в последнем "опыте") и больше нигде в другом месте этот регистр не трогаю...

З.Ы. может впору завести отдельную темя для моего случая??
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

DJ_Kiridza писал(а):Timer_int:
SBIS UCSRA,5
reti
out UDR,ActvSns
reti

Wtf? Что за два reti подряд???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ARV »

Gudd-Head писал(а):
DJ_Kiridza писал(а):Timer_int:
SBIS UCSRA,5
reti
out UDR,ActvSns
reti

Wtf? Что за два reti подряд???
почему подряд? один без вывода в UDR, другой после вывода... только вот привычка писать номер бита вместо его имени не позволяет понять, когда же именно UDR обновляется...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

ARV писал(а):почему подряд?

Разве МК дойдёт до второго reti?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
DJ_Kiridza
Мучитель микросхем
Сообщения: 458
Зарегистрирован: Пн дек 13, 2010 13:01:59
Откуда: Украина
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение DJ_Kiridza »

только вот привычка писать номер бита вместо его имени не позволяет понять, когда же именно UDR обновляется...
- ну извините - это мой первый в жизни код... малоопытный я пока :) - это "UART Data Register Empty" (UDRE)

2 Gudd-Head
SBIS UCSRA,5 проверяет установлен ли флаг (бит) №5 в порту UCSRA, если бит установлен то выполнится
reti,
который сразу под проверкой, если бит не установлен, но первый reti пропустится, и выполнится сначала
out UDR,ActvSns
а потом второй
reti
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
Ответить

Вернуться в «Разные вопросы по МК»