Отговори на тема  [ 45 мнения ]  Отиди на страница Предишна  1, 2, 3
Tiny1616 и XC8 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Tiny1616 и XC8
линукса за ембед периферия е по-гаден от ардуино ... MMU пречи и забавя, а и scheduler-а не е баш RTOS
Концепцията иде нейде от posix и ++, но малко са я прецакали с времето ( или подобрили - беш ли мааму )
а и пишеш ли на С++ за ембед - друг начин няма...
Интернет ( IoT ) ... той е еднакво бавен навсякъде :D

Цитат:
Младежта масово пише на микропитон, луа и тем подобни за ембедед

аз такива бози видях, че ардуино е просто черешка от торта :D

или:
- Това не е Про !!!
- а кое точно е Про? ... тишина

_________________
main[-1u]={1};


Пет Апр 04, 2025 2:14 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Tiny1616 и XC8
BTW:
не знам защо някой се "сърди" на некой пич дето е портнал чип в Ардуино
или написал някъв "полезен" код за интерфейс, сензор ... етц
при условие, че нито един производител на чип, модул или платка не е дал една стинка за "подобрения"

a и тези някой дори не знаят какво има "под капака" на MCU... като софт и хард

_________________
main[-1u]={1};


Пет Апр 04, 2025 3:21 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Tiny1616 и XC8
Ами прав си, не е за сърдене, но стимулира паразитите ....сега ако трябва да съм честен детето е свършило не малко работа която най-вероятно нямаше как аз да свърша просто защото отдавна щеше да им е свършил бюджета. Те двама юнака са работили, някакво украинче което е успяло да подбере подходящите ледове и да подкара DC-DC което в доста икономично, и един местен младеж който пък е направил доста рисърч свързан с материалите, а те са специфични. Сега украинчето е залегнало на low power режимите, не успяло и да подкара читаво imu-то, а тукашния младеж го е докарал до където е. Е има какво да се оправя по платката а и зарядното, но ардуиното му е секнало устрема, или по-скоро неговото незнание, но то е стимулирано и от ардуиното. Ако не беше ардуиното щеше да се наложи да чете Дейта лийта и да осъзнае какво прави wdt.


Пет Апр 04, 2025 3:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: Tiny1616 и XC8
Не се ли поддържа този процесор от MPLAB X
Прикачени файлове:
tiny.jpg
tiny.jpg [ 226.86 KiB | Прегледано 2101 пъти ]

_________________
https://github.com/slav4ocom/


Последна промяна slav4o.com на Пет Апр 04, 2025 3:50 pm, променена общо 1 път



Пет Апр 04, 2025 3:39 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Tiny1616 и XC8
ToHu - барни го малко - земи парите и бегай :D
( ако можеш - вземи повече )

исках да кажа, че Ардуино си е нормален код
ся, "писачи" и "разбирачи" - разни... :wink:

_________________
main[-1u]={1};


Пет Апр 04, 2025 3:41 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Tiny1616 и XC8
Не казвам, че не е нормален, ама върви намери кое какво прави, в смисъл как работи sleep. Функцията, пипа ли хардуер не пипа ли, кои периферии пипа, къде се указва ...сега не и помня името да ти кажа как с еказваш, ама тя май само една. Сега това атини има регистри които казват какво върви и не в различните повер режими, нещо сетива ли ги тоя регистри, и др. такива. Аз не намерих читаво описание, може и толкова да съм търсил, може да съм предубеден, ама като търсих описание на функцията само алабализми прочетох които са ясни по подразбиране.

А за парите, не съм гледал колко им е бюджета, ама едва ли ще е повече от 15-20к което е на границата само за занимавката с овърмолдинга и технологията, трябва да видя с колегата какъв бюджет са сложили. Та за тая простотия са дали 10 часа, 3 от които отидоха във възстановяване на съсипана платка, някой беше поил с поялник за улуци...


Пет Апр 04, 2025 4:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Tiny1616 и XC8
21 век - първото срещнато "тенеке" и динозавър, който ме мързи да чете PDF

- познаваш ли attiny1616
...
- дай пример за мигане на светодиод 100 пъти -> sleep -> събуждане от RTC след 60 секунди




Ардуино
Код:
#include <avr/sleep.h>
#include <avr/power.h>

// Пин за светодиода (PA0 е пин 0 в Arduino за ATtiny1616)
const int ledPin = 0;

// Настройка на RTC за 60 секунди
void setupRTC() {
  RTC.PITCTRLA = 0; // Изключи PIT, ако е активен
  while (RTC.STATUS & RTC_CTRLABUSY_bm); // Изчакай RTC да е готов

  // Избор на 32.768 kHz осцилатор
  RTC.CLKSEL = RTC_CLKSEL_INT32K_gc;

  // Период: 60 секунди при 1.024 kHz (32.768 kHz / 32)
  RTC.PER = 61439; // 60 * 1024 - 1

  // Активиране на RTC с прекъсване
  RTC.CTRLA = RTC_PRESCALER_DIV1_gc | RTC_RTCEN_bm;
  RTC.INTCTRL = RTC_OVF_bm; // Прекъсване при препълване
}

// Мигане на светодиод 100 пъти
void blinkLED() {
  for (int i = 0; i < 100; i++) {
    digitalWrite(ledPin, HIGH); // Включване
    delay(100);                 // 100 ms
    digitalWrite(ledPin, LOW);  // Изключване
    delay(100);                 // 100 ms
  }
}

void setup() {
  pinMode(ledPin, OUTPUT); // Настройка на PA0 като изход
  blinkLED();              // Първоначално мигане
  setupRTC();              // Настройка на RTC

  // Настройка на sleep режим
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Power-down режим
  sleep_enable();
 
  // Активиране на прекъсванията
  sei();
}

void loop() {
  sleep_cpu();  // Влизане в sleep за 60 секунди
  blinkLED();   // След събуждане мига отново
}

// Обработчик на прекъсване от RTC
ISR(RTC_CNT_vect) {
  RTC.INTFLAGS = RTC_OVF_bm; // Изчистване на флага
}


по по най
Код:
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>

// Закъснение (грубо, за пример)
void delay_ms(uint16_t ms) {
    for (uint16_t i = 0; i < ms; i++) {
        for (uint16_t j = 0; j < 4000; j++) { // Примерно за 20 MHz
            asm("nop");
        }
    }
}

// Настройка на RTC за събуждане след 60 секунди
void setup_rtc(void) {
    while (RTC.STATUS & RTC_CTRLABUSY_bm); // Изчакване RTC да е готов

    // Избор на 32.768 kHz осцилатор, разделен на 32 (1.024 kHz)
    RTC.CLKSEL = RTC_CLKSEL_INT32K_gc;

    // Период за 60 секунди: 60 * 1024 = 61440 цикъла
    RTC.PER = 61439; // 61440 - 1 (брои от 0)

    // Активиране на RTC с прекъсване при препълване
    RTC.CTRLA = RTC_PRESCALER_DIV1_gc | RTC_RTCEN_bm;
    RTC.INTCTRL = RTC_OVF_bm; // Прекъсване при препълване
}

// Мигане на светодиод 100 пъти
void blink_led(void) {
    PORTA.DIRSET = PIN0_bm; // PA0 като изход
    for (uint8_t i = 0; i < 100; i++) {
        PORTA.OUTSET = PIN0_bm; // Включване на светодиода
        delay_ms(100);          // 100 ms включен
        PORTA.OUTCLR = PIN0_bm; // Изключване на светодиода
        delay_ms(100);          // 100 ms изключен
    }
}

int main(void) {
    // Настройка на RTC
    setup_rtc();

    // Мигане на светодиода 100 пъти
    blink_led();

    // Настройка на sleep режим: Power-down
    SLPCTRL.CTRLA = SLPCTRL_SMODE_PDOWN_gc | SLPCTRL_SEN_bm;

    // Активиране на глобалните прекъсвания
    sei();

    while (1) {
        // Влизане в sleep режим за 60 секунди
        sleep_cpu();

        // След събуждане: мигане отново 100 пъти
        blink_led();
    }
}

// Обработчик на прекъсване от RTC
ISR(RTC_CNT_vect) {
    RTC.INTFLAGS = RTC_OVF_bm; // Изчистване на флага
}


ако не стане ... ще прочета PDF :D

_________________
main[-1u]={1};


Пет Апр 04, 2025 6:16 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Tiny1616 и XC8
На мен не ми е проблем да го разпиша, а те това според мен е ардуино функция set_sleep_mode(SLEEP_MODE_PWR_DOWN), поне гледам че я изпозлват в ардуино кода и точно за нея не намерих какво точно прави. Иначе ето какво предлага тенекето :

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

// Watchdog Timer interrupt service routine.
// This ISR is called when the watchdog timer expires.
// Its sole purpose is to wake the MCU from sleep.
ISR(WDT_INT_vect)
{
// Nothing is required here.
// The interrupt simply wakes the MCU.
}

// Configure the system clock:
// Use the internal 16 MHz oscillator, then divide by 16 for a 1 MHz system clock.
void init_clock(void)
{
// Note: The ATtiny1616 is shipped with its internal oscillator enabled.
// To change the prescaler, set the prescaler enable bit (PEN) and the division factor.
// The constant CLKCTRL_PDIV_DIV16_gc selects division by 16.
// (Check your device header files to be sure these macros match your version.)
CLKCTRL.MCLKCTRLB = CLKCTRL_PDIV_DIV16_gc | CLKCTRL_PEN_bm;
}

// Setup the Watchdog Timer to generate an interrupt every ~1 second.
void init_wdt(void)
{
// The watchdog can be configured with various periods. Here we assume that
// WDT_PERIOD_1SEC_gc selects a ~1 second timeout.
// The WDT_WINDOW_OFF_gc turns off any windowed mode so that the timer simply runs.
// WDT_ENABLE_bm turns on the watchdog.
WDT.CTRL = WDT_PERIOD_1SEC_gc | WDT_WINDOW_OFF_gc | WDT_ENABLE_bm;
}

// Optionally disable unused peripherals to save power.
// (For each module you are not using, disable its clock or power if possible.)
// For example, if you are not using the ADC you might disable it as shown below.
// (Uncomment and adjust as needed for your application.)
// void disable_peripherals(void)
// {
// // Example: Disable ADC if not used.
// ADC0.CTRLA = 0;
// // Other peripherals (like timers, USART, TWI, etc.) can be disabled similarly.
// }

int main(void)
{
// Disable global interrupts while configuring the system.
cli();

// Initialize system clock with prescaler.
init_clock();

// Optionally, disable unused peripherals to save power.
// disable_peripherals();

// Set sleep mode to deep power-down.
// On ATtiny1616, deep sleep is typically the power-down mode.
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();

// Setup watchdog timer for a ~1 second wakeup period.
init_wdt();

// Enable global interrupts.
sei();

// Main loop: the MCU will sleep, and each watchdog interrupt will wake it up.
while (1)
{
// Enter sleep mode. The MCU will resume here after the watchdog timer interrupt.
sleep_cpu();

// (Optional) Place any code here that you want executed immediately after wakeup.
// For a low-power design, you might simply loop back into sleep.
}

// Code should never reach here.
return 0;
}

Но регистрите не са верни, отделно чака прекъсване от WDT а такова няма. Аз напоследък редовно го тествам каква глупост ще сътвори, казах му че WDT няма прекъсване, помисли помисли, и го напрви с друг таймер ... твоето само ли се сети да изпозлва RTC или ти му подсказа ?


Пет Апр 04, 2025 6:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Tiny1616 и XC8
виж тва
рег ги има в ПДФ. но незнам дали е верно


Код:
// Настройка на WDT за рестарт след 8 секунди
void setupWDT() {
  CCP = CCP_IOREG_gc; // Отключване на защитени регистри
  WDT.CTRLA = WDT_PERIOD_8KCLK_gc; // 8 секунди
  while (WDT.STATUS & WDT_SYNCBUSY_bm); // Изчакване на синхронизация
}


wdt_reset(); // "Ритаме кучето" - нулираме WDT

Код:
// Проверка на причината за рестарта
void checkResetCause() {
  uint8_t resetFlags = RSTCTRL.RSTFR; // Четем флаговете за рестарт

  // Проверяваме конкретни причини
  if (resetFlags & RSTCTRL_WDRF_bm) {
    // Рестарт от WDT
    blinkLED(5); // 5 бързи мигания за WDT рестарт
  } else if (resetFlags & RSTCTRL_PORF_bm) {
    // Power-on Reset
    blinkLED(2); // 2 мигания за захранване
  } else if (resetFlags & RSTCTRL_SWRF_bm) {
    // Software Reset
    blinkLED(3); // 3 мигания за софтуерен рестарт
  }

  // Изчистваме флаговете след проверка
  RSTCTRL.RSTFR = resetFlags; // Записваме същите стойности, за да ги нулираме
}

_________________
main[-1u]={1};


Пет Апр 04, 2025 7:29 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Tiny1616 и XC8
Цитат:
твоето само ли се сети да изпозлва RTC или ти му подсказа

първо го събуди с пин
после му казах дай от RTC

_________________
main[-1u]={1};


Пет Апр 04, 2025 7:35 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Tiny1616 и XC8
така било по-коректно

Код:
void setupWDT() {
  // Изчакване, ако има синхронизация
  while (WDT.STATUS & WDT_STATUS_SYNCBUSY_bm);

  // Отключване на защитени регистри
  CCP = CCP_IOREG_gc;

  // Задаване на период (2 секунди)
  WDT.CTRLA = WDT_PERIOD_2KCLK_gc;

  // Изчакване за синхронизация (не е строго задължително тук, но е добра практика)
  while (WDT.STATUS & WDT_STATUS_SYNCBUSY_bm);
}


_________________
main[-1u]={1};


Пет Апр 04, 2025 7:42 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Tiny1616 и XC8
Е аз регистирте ги видях още преди да ми кажат че са го писали на ардуино, като ми казах акакъв им е пробелма първат работа беше да им отворя пдф и и да видя какви са му възможностите за приспиване и събуждане, ама не бях и разбрал, че изпозлват WDT докато не ми пратиха кода си. После видях че е с WDT и прочетох за WDT-то. Ся за не малко процесори WDT не ресетва а само изважда от sleep така, че ако не го прочете човек може и по инерция да го направи така. Ако аз го бях писал това сигурно щеше да ми е точно това първата мисъл по навик.
Четенето спестява чесане по главата и други места, ще ги видим, написах му как да си сетне RTC, написах му и как да мери вътрешния термометър, че наслагал някакви темристори външни ... но то като му гледам кода всичко е на части, код за сензора, код за IMU-то, код за спане, код за ледовете ... но не е събрал нищо на едно място ... да му мислят, искаха помощ помогнах, основната ми задача е друга, доста по предизвикателна ... от нея се чеша къде ли не, ще пусна друга тема по въпроса евентуално колегите с аутомотива и аероспейса може да имат някакъв подобен опит.


Пет Апр 04, 2025 8:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Tiny1616 и XC8
не знам дали е верен кода за термото

Код:
#include <avr/io.h>

void setup() {
  // Настройка на ADC
  VREF.CTRLA = VREF_ADC0REFSEL_1V1_gc; // Избор на 1.1V вътрешна референтна стойност
  ADC0.CTRLC = ADC_PRESC_DIV16_gc | ADC_REFSEL_INTREF_gc; // Делител на часовника и референтна стойност
  ADC0.CTRLA = ADC_ENABLE_bm | ADC_RESSEL_10BIT_gc; // Активиране на ADC, 10-битова резолюция
  ADC0.MUXPOS = ADC_MUXPOS_TEMPSENSE_gc; // Избор на канал за температурен сензор (0x1E)

  // Серийна комуникация за изход (по избор, ако използваш пин за Serial)
  Serial.begin(9600);
}

void loop() {
  // Старт на ADC преобразуване
  ADC0.COMMAND = ADC_STCONV_bm; // Започване на единично преобразуване
  while (ADC0.COMMAND & ADC_STCONV_bm); // Изчакване на завършване

  // Четене на резултата от ADC
  uint16_t adc_reading = ADC0.RES;

  // Четене на калибрационни стойности от Signature Row
  int8_t sigrow_offset = SIGROW.TEMPSENSE1; // Офсет (signed)
  uint8_t sigrow_gain = SIGROW.TEMPSENSE0;  // Усилване (unsigned)

  // Изчисление на температурата в Келвини
  uint32_t temp = adc_reading - sigrow_offset; // Прилагане на офсет
  temp *= sigrow_gain; // Умножение по усилването
  temp += 0x80; // Добавяне на 1/2 за правилно закръгляване
  temp >>= 8;   // Деление на 256 за получаване на Келвини
  uint16_t temperature_in_K = temp;

  // Преобразуване в Целзий (по избор)
  int16_t temperature_in_C = temperature_in_K - 273;

  // Извеждане на резултата (по избор)
  Serial.print("Температура (C): ");
  Serial.println(temperature_in_C);

  delay(1000); // Четене на всеки 1 секунда
}

_________________
main[-1u]={1};


Пет Апр 04, 2025 8:22 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Tiny1616 и XC8
Ами регистъра за сензора е верен, 1Е , референса се задава обаче от ControlC битове 4 и5 май бяха ... цял ден мина, пак много помня.


Пет Апр 04, 2025 8:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: Tiny1616 и XC8
начи ползва ADC1 :D
горе примера е за ADC0

PS: едно към едно го е копирал от ПФД :D


Прикачени файлове:
Untitled.png
Untitled.png [ 79.06 KiB | Прегледано 2052 пъти ]

_________________
main[-1u]={1};
Пет Апр 04, 2025 8:41 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 45 мнения ]  Отиди на страница Предишна  1, 2, 3

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни