Stránka 2 z 2
Napsal: 06 úno 2020, 10:25
od FHonza
Když máš vloženou eeprom.h, tak použij metody z této knihovny. Viz
zde. A nezapisoval bych během přerušení.
V programu pak:
Kód: Vybrat vše
uint8_t EEMEM byte_v_eeprom;
...
uint8_t byte_v_programu = eeprom_read_byte(&byte_v_eeprom);
Napsal: 06 úno 2020, 22:11
od Zmije
FHonza má pravdu v tom, že operace, které můžou trvat dlouho, selhat, nebo potřebují přerušení by se v obsluze přerušení dělat neměly. V tomhle konrétním případě by to tolik vadit nemuselo, když se ta hodnota nastavuje málo kdy.
Nauč se formátovat kód, kdo to má pak přepisovat.
Napsal: 06 úno 2020, 22:52
od reher64
Dobře, to by snad neměl být problém přesunou.
Jak správně formátovat kód? Více méně vše co tu řešíme se učím, tak mne omluvte za chyby co dělám.
Napsal: 06 úno 2020, 23:39
od Zmije
Stylů formátování existuje více, některé jazyky jako třeba Python, make to mají dané už v základu většina to má spíš na libovůli uživatele tak jako C, ale aby v tom nebyl tolik nepořádek a dalo se v tom vyznat vzniklo několik ustálených konvencí. Já jsem použil jedno z nich, které je až na několik vyjímek podobné Linux kernel stylu. Existují i další, každé má své výhody a nevýhody. Nemá moc smysl hádat se o tom které je to pravé, zlaté pravidlo říká, že se má dodržovat to ve kterém je napsaná vetšina existujícího kódu.
Nejlépe se to naučíš napodobováním.
https://cs.wikipedia.org/wiki/Programovac%C3%AD_konvence
Napsal: 17 dub 2020, 12:58
od reher64
Zdravím Vás páni programátoři.
Musím to tu oživit a poprosit vás o pomoc.
Vše co jsem řešil, se mi povedlo s Vaší pomocí dořešit. Na stole v aplikaci to chodilo přesně dle mích představ, super.
Neměl jsem teď vůbec čas, ale už jsem se dostal k zapojení a bohužel narazil na problém. Zjistil jsem že na vstupu místo logické 1 je frekvence o změně 1ms z o na 1 Předpokládal jsem že by to vadit nemělo, jelikož by měl procesor spustit výstup až po detekci spodní hrany po cca 240 ms impulz tam bude proměný ale cca těch 200- 400ms. Jenže procesor mi reaguje neustále na pwm a drží mi stále seplý výstupy.
Je nějaká možnost jak sledovat to pwm a až když přijde log 0 dlouhá od těch 200ms a delší tak spustit to sepnutí výstupu ?
Kód: Vybrat vše
/*
* tripling attiny13.cpp
*
* Created: 18.1.2020 16:32:53
* Author : Diagnostika Salač
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#define BULHAR_CONST 8
volatile unsigned int set_cas_docas;
volatile unsigned int blinkr_levy, blinkr_pravy;
volatile char blinkr_levy_spusten, blinkr_pravy_spusten;
uint8_t set_cas_eeprom, set_cas;
ISR(TIM0_OVF_vect) // obsluha preruseni
{
if (!(PINB & ((1<<PB2) | (1<<PB4))))
{
set_cas_docas++;
}
else
{
if (set_cas_docas > BULHAR_CONST)
{
set_cas = set_cas_docas;
eeprom_update_byte ((uint8_t *)(0), (uint8_t)(set_cas)) ;
}
set_cas_docas = 0;
}
if (!(PINB & (1<<PB3)))
{
if (!blinkr_pravy_spusten)
{
if (blinkr_pravy++ > BULHAR_CONST)
{
blinkr_pravy = set_cas_eeprom;
blinkr_pravy_spusten = 1;
PORTB |= (1<<PB1);
blinkr_levy_spusten = 0;
}
}
} else if (!blinkr_pravy)
{
blinkr_pravy_spusten = 0;
}
if (blinkr_pravy > 0 && blinkr_pravy_spusten)
{
blinkr_pravy--;
}
else
{
PORTB &= ~(1<<PB1);
}
if (!(PINB & (1<<PB4)))
{
if (!blinkr_levy_spusten)
{
if (blinkr_levy++ > BULHAR_CONST)
{
blinkr_levy = set_cas_eeprom;
blinkr_levy_spusten = 1;
PORTB |= (1<<PB0);
blinkr_pravy_spusten = 0;
}
}
}
else if (!blinkr_levy)
{
blinkr_levy_spusten = 0;
}
if (blinkr_levy > 0 && blinkr_levy_spusten)
{
blinkr_levy--;
}
else
{
PORTB &= ~(1<<PB0);
}
}
int main(void)
{
set_cas_eeprom = eeprom_read_byte ((uint8_t)(0));
DDRB &= ~(1<<PB2); // vstup set času
DDRB &= ~(1<<PB3); // vstup pravý blinkr
DDRB &= ~(1<<PB4); // vstup levý blinkr
PORTB |= (1<<PB2) |(1<<PB3)|(1<<PB4); //zapnutí pull up rezistorů
DDRB |= (1<<PB0); // výstup levý blinkr
DDRB |= (1<<PB1); // výstup pravý blinkr
TCCR0B |= _BV(CS02); // nastaveni preddelicky na 1024 (CLK=fosc/1024/256 = [Hz], 1 / CLK = [s])
TIMSK0 |= _BV(TOIE0); // zapni preruseni: Timer Overflow interrupt
set_cas_docas = 0; // nastaveni globalnich promenych
set_cas = 0;
blinkr_levy = 0;
blinkr_pravy = 0;
sei(); // globalni povoleni preruseni
while (1);
}
[size=7][/code]
Napsal: 01 kvě 2020, 08:48
od Atlan
Co tak dat Rc clen na vstup.