Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помощь начинающим


Помощь начинающим

Сообщений 1 страница 23 из 23

1

На данный момент такая задача: прочитать данные на выходе регистра одним портом и отобразить их на другом порту.

В BASCOM проблемы не составило, с Бейсиком дружим давно...
Возможно, немного коряво, на скорую руку, но рюшечки будем потом развешивать...
В Proteus соорудить схему и привязать к BASCOM-у - тоже справился...  :)

Результат: на выходе постоянно на одном пине - "0"...

Ситуация чайниковская, но уже голову сломал...
Что я где недоглядел, ткните, плиз...

Ссылка

Отредактировано Nord (2016-01-27 21:34:10)

0

2

Ваши функции вообще не нужны.
В главном цикле достаточно одной строчки:  Portb = Pind

+1

3

вывести в порт -  PORTx = ....

прочитать из порта -  PINx = ....

0

4

Спасибо откликнувшимся.
Где-то недочитал...
Попробовать смогу уже только вечером...

ЗЫ. Нескромное предложение: создать раздел для начинающих ("Песочница", etc)...
Уж слишком контрастно выглядят "чайниковские" вопросы в данном разделе... ;)

0

5

radan написал(а):

Ваши функции вообще не нужны.В главном цикле достаточно одной строчки:  Portb = Pind

Мне нужно отследить изменение положения выключателя, а у МК глаз нету, вот и делаю их ему таким образом. ;)
К тому же их будет три (переключателя, не глаза)... ;)

Поэтому введено запоминание последнего положения переключателя и XOR с прочитанным в данный момент состоянием.
Если положение не изменилось, то опрашиваем дальше, если изменилось - принимаем меры.

0

6

А кто может помочь с "переводом" с Си на Бейсик данной программы ?
Это из семплов Протеуса...
Я в Си полный профан  :blush: , а есть необходимость попасть внутрь...
Попытки как-то разгадать эту "шараду" при помощи хелпов по Си и трансляторов только взорвали мозг...  :crazy:

/********************************
FILE NAME:        S_AD.c
CHIP TYPE:        ATMEGA16
CLOCK FREQUENCY:  8MHZ
IDE:              VSMStudio
COMPILER:         AVR-GCC
TIME:             September 2010
********************************/
#include <avr/io.h>
#include <util/delay.h>

#define uchar unsigned char
#define uint  unsigned int

// Low level port/pin definitions
#define sbit(x,PORT) (PORT) |= (1<<x)
#define cbit(x,PORT) (PORT) &= ~(1<<x)
#define pin(x,PIN)   (PIN)&(1<<x)

// Pins definition
#define out   PORTA
#define s_ss  sbit(4,PORTB)
#define c_ss  cbit(4,PORTB)

volatile uchar data;
volatile long i;

int main(void)   
{ // Initialize Stack Pointer
   SPL = 0x54;
   SPH = 0x04;
   // Initialize ports
   DDRA = 0xff;
   PORTA = 0;
   // Initialize SPI
   DDRB = 0x90;  // SCK & $SS are outputs and SDO as input
   SPCR = 0x53;  // SPI enabled, Master mode, SCK=Fosc/128
   SPSR &= 0xfe; // Normal SPI speed.
   while(1)
    { c_ss;                         // Select the TLC549
      SPDR = 0;
      while(!(SPSR & (1<<SPIF)));   // Wait for reception complete
      data = SPDR;                  // get data from SPI data register
      out = ~data;                  // Invert all bits
      s_ss;                         // Disable TLC549
      _delay_ms(50);
    }
}

0

7

Config SPI

SPIIN

SPIOUT

0

8

sasha_1973 написал(а):

Config SPI, SPIIN, SPIOUT

Спасибо за участие, но это мне немного дало в понимании листинга Си...   :(

0

9

Nord написал(а):

но это мне немного дало в понимании листинга Си

это настройка SPI

в исходнике есть комменты

Вам дали ссылки на "как сделать в Bascom"

0

10

sasha_1973 написал(а):

это настройка SPI
            в исходнике есть комменты
            Вам дали ссылки на "как сделать в Bascom"

Спасибо, будем копать...  :tired:
Понимаю, что вам уже сложно говорить на одном языке с "чайником" в некоторых вопросах...

Отредактировано Nord (2016-01-29 22:27:16)

0

11

Пошел с АЦП другим путем - через порт А.
Оказалось все гораздо проще и избавился заодно от двух корпусов... ;)

0

12

Третий день туплю...
Помогите, плиз - в чем моя затыка ?!  :O
Заранее прошу не кидаться помидорами из-за кода, просто у меня такая привычка: все расписывать, а потом оптимизировать... ;)

При выставлении на переключателях одинаковых битов выходные значения начинаю дублироваться...
Собственно, проще увидеть в работе, чем описать...  Все в архиве по ссылке.
В переключателях реализован код Грея (сверху вниз).

Программно читает то, что есть, тут ничего придумать...
ИМХО, надо как-то решать аппаратно...
Уже кучу разного рода микрух пришпандоривал... ;) Только заморочки начинаются...

http://www.fayloobmennik.net/5732004

0

13

Mrshilov написал(а):

Ничего удивительного. Порты переключателями закорачиваются.

Это я и сам вижу... ;)
Что предложите для выхода из положения ?

Дополнено:
Вопрос решен. Развел их на разные порты.

Отредактировано Nord (2016-02-03 08:59:57)

0

14

Добрый день
Только начинаю изучать Bascom-упёрся в проблему...
прикрутил к обычным часикам динамич.индикацию на 4-х значном семисегм. индикаторе- в протеусе выводит на индикатор только одно число-или минуты или часы.,причём в конце панели . Что  присваиваю переменной W-то и выводит, в начале 00
Как вывести одновременно и часы и минуты?

Код:
$regfile = "attiny2313.dat"
$crystal = 4000000


Config Pina.0 = Input
Config Pina.1 = Input

Config Sda = Portb.1
Config Scl = Portb.0

Config Portd = Output

Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Config Portb.5 = Output
Config Portb.6 = Output
Config Portb.7 = Output




Dim Seco As Byte
Dim Mine As Byte
Dim Hour As Byte
Dim A As Byte
Dim B As Byte

Dim W As Word
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer




  Do
I2cstart
I2cwbyte &HD0
I2cwbyte &H00
I2cstart
I2cwbyte &HD1
I2crbyte Seco , Ack
I2crbyte Mine , Ack
I2crbyte Hour , Nack
I2cstop





Seco = Makedec(seco)
Mine = Makedec(mine)
Hour = Makedec(hour)



If Hour = 24 Then
  Hour = 0
End If

If Mine = 60 Then
Mine = 0
End If

If Pina.1 = 0 Then
Incr Mine
 Mine = Makebcd(mine)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte Mine
I2cstop
Waitms 50
End If




If Pina.0 = 0 Then
Incr Hour
Hour = Makebcd(hour)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte Hour
I2cstop
Waitms 50
End If

                                                     'íà÷àëî äèíàìèêè

W = Mine





 M1 = W
         M2 = M1
         M3 = M1
         M4 = M1

         M1 = M1 / 1000                                     'îáðàáîòêà ïåðâîãî ÷èñëà
         N1 = Abs(m1)



         M2 = M2 Mod 1000                                   'îáðàáîòêà âòîðîãî ÷èñëà
         M2 = M2 / 100
         N2 = Abs(m2)



         M3 = M3 Mod 100                                    ' îáðàáîòêà òðåòüåãî ÷èñëà
         M3 = M3 / 10
         N3 = Abs(m3)




         M4 = M4 Mod 10                                     ' îáðàáîòêà ÷åòâåðòîãî ÷èñëà
         N4 = Abs(m4)



  Portb.2 = 1                                               'çàæèãàåì ïåðâîå ÷èñëî

      Select Case N1
         Case 0 : Portd = &B11000000
         Case 1 : Portd = &B11111001
         Case 2 : Portd = &B10100100
         Case 3 : Portd = &B10110000
         Case 4 : Portd = &B10011001
         Case 5 : Portd = &B10010010
         Case 6 : Portd = &B10000010
         Case 7 : Portd = &B11111000
         Case 8 : Portd = &B10000000
         Case 9 : Portd = &B10010000


      End Select
     Waitms 1

Portb.2 = 0
Portb.3 = 1                                                 'çàæèãàåì âòîðîå ÷èñëî


      Select Case N2
         Case 0 : Portd = &B11000000
         Case 1 : Portd = &B11111001
         Case 2 : Portd = &B10100100
         Case 3 : Portd = &B10110000
         Case 4 : Portd = &B10011001
         Case 5 : Portd = &B10010010
         Case 6 : Portd = &B10000010
         Case 7 : Portd = &B11111000
         Case 8 : Portd = &B10000000
         Case 9 : Portd = &B10010000
      End Select

       Waitms 1
 Portb.2 = 0
Portb.3 = 0
Portb.4 = 1                                                 'çàæèãàåì òðåòüå ÷èñëî


      Select Case N3
         Case 0 : Portd = &B11000000
         Case 1 : Portd = &B11111001
         Case 2 : Portd = &B10100100
         Case 3 : Portd = &B10110000
         Case 4 : Portd = &B10011001
         Case 5 : Portd = &B10010010
         Case 6 : Portd = &B10000010
         Case 7 : Portd = &B11111000
         Case 8 : Portd = &B10000000
         Case 9 : Portd = &B10010000
      End Select

       Waitms 1
 Portb.2 = 0
Portb.3 = 0
Portb.4 = 0

Portb.5 = 1                                                 'çàæèãàåì ÷åòâåðòîå ÷èñëî


      Select Case N4
         Case 0 : Portd = &B11000000
         Case 1 : Portd = &B11111001
         Case 2 : Portd = &B10100100
         Case 3 : Portd = &B10110000
         Case 4 : Portd = &B10011001
         Case 5 : Portd = &B10010010
         Case 6 : Portd = &B10000010
         Case 7 : Portd = &B11111000
         Case 8 : Portd = &B10000000
         Case 9 : Portd = &B10010000
      End Select

       Waitms 1
     Portb.5 = 0


     Loop


    End                                                     'end program

Отредактировано Hot (2016-02-14 16:25:47)

0

15

Чтобы небыло кракозяблей, копируйте в русской раскладке.

Hot написал(а):

Как вывести одновременно и часы и минуты?


Посмотрите здесь

0

16

смотрел ,нужного ответа не нашёл
Нужно в одну двух-байтную переменную засунуть две однобайтовые
применяя функции(makeint) на выходе ерунда
мож не туда копаю?

0

17

Используйте overlay.

0

18

Hot написал(а):

смотрел ,нужного ответа не нашёл Нужно в одну двух-байтную переменную засунуть две однобайтовые применяя функции(makeint) на выходе ерунда мож не туда копаю?

А может пересмотреть изначальное использование переменных, а тогда не придется "две в одну" вкорячивать ?

0

19

Hot написал(а):

смотрел ,нужного ответа не нашёл

Вы нарно шутить изволите

Вот вообще готовый вариант

0

20

пасипки... будем разбираться))

0

21

Столкнулся с такой проблемой - ноги ОСхх заняты, а есть необходимость на ATmega16 реализовать всего один канал ШИМ...

Освободить порт не могу, у него постоянная задача...
Переложить ее на другой порт, разбив по времени задачи тоже не получится, будет каша в работе периферии...

Пока выход нахожу только в уходе от ATmega16 на ххх128, там достаточное количество портов...  :)
Или в использовании внешнего корпуса управляемого генератора, как уже самый последний вариант (не хотелось бы)...

Есть ли возможность как-то "перенаправить" события ОСхх на другие порты (парочка ног на А имеется) ?
В имеющихся примерах такого не встретил, везде задействованы ноги ОСхх...

Отредактировано Nord (2016-02-15 17:48:00)

0

22

Nord написал(а):

Есть ли возможность как-то "перенаправить" события ОСхх на другие порты (парочка ног на А имеется) ?


Только с помощью програмного ШИМ

0

23

Доброго времени суток.
Хочу обработать сигнал.
http://s7.uploads.ru/t/mnwB2.jpg

Никак не могу считать код - ну это позже.
преамбулу я отлавливаю вот такой код

Код:
 
$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 80
$swstack = 80
$framesize = 80
$baud = 9600

'$lib "mcsbyte.lbx"
Config Pind.2 = Input                                       'От приемника на пин прерывания int0
Config Portb.5 = Output                                     ' светодиод
Config Timer0 = Timer , Prescale = 64                       '16000000/64=250000 Hz
Config Int0 = Rising
Stop Timer0
Enable Timer0
Enable Int0
Enable Interrupts
On Timer0 Tikers                                            'для расчета времени
On Int0 R433                                                'сигнал с приемника

Dim Byt As Byte                                             '
Dim F As Byte                                               ' рабочая переменная для массива
Dim Mass(66) As Byte                                        ' массив
Dim A As Word                                               'переменная расчета времени
Dim Rflag As Bit                                            'флаг начала приема кода
Dim Start_flag As Bit                                       'флаг начала приема кода
Dim Flag As Byte                                            'переменная для преамбулы
'#####################################################################

Do                                                          '
   If Start_flag = 1 Then
      Portb.5 = 1
      Wait 1
      Portb.5 = 0
      Start_flag = 0
   End If
Loop
End                                                         '

'###########################################################################

Tikers:                                                     '
   Timer0 = 253                                             '250000/(256-253)=83333,33 Hz (12 us)
   Incr A
   If A >= 20000 Then                                       '
      A = 0
      Stop Timer0
   End If
Return
'#######################################################################

R433:

   'Start Timer0                                             '

   If Start_flag = 0 Then
      Start Timer0
      If Flag < 12 Then
         If A >= 57 And A <= 60 And Flag > 0 Then
            Incr Flag
          Else
            Flag = 1
         End If
      'Stop Timer0
      End If
      If Flag = 12 Then
         'Stop Timer0
         Flag = 0
         Start_flag = 1
         Rflag = 1
      End If
      A = 0
    Else

  End If
  'Stop Timer0
  Return

А теперь вопрос.
1. Если я включаю таймер в прерывынии R433 до проверки - программа выполняет чтото еще (тоесть пауза в основном цикле не 1 с а больше.
2. Если я останавливаю таймер в коце прерывания R433 - то код вообще не работает.

Да и сигнал не чистый, ну тоесть когда сигнал идет он чистый, а когда нет - то импульсы постоянно идут хаотично (снимаю с приемника от сигнализации)

Отредактировано Альфред (2016-02-19 13:27:28)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помощь начинающим