Pomoc s programem

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
FHonza
Příspěvky: 1443
Registrován: 20 lis 2012, 00:00
Bydliště: Praha

#16 Příspěvek 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);
Uživatelský avatar
Zmije
Příspěvky: 1691
Registrován: 30 čer 2005, 00:00
Bydliště: Pardubický kraj

#17 Příspěvek 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.
Uživatelský avatar
reher64
Příspěvky: 24
Registrován: 09 črc 2013, 00:00

#18 Příspěvek 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.
Uživatelský avatar
Zmije
Příspěvky: 1691
Registrován: 30 čer 2005, 00:00
Bydliště: Pardubický kraj

#19 Příspěvek 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
Uživatelský avatar
reher64
Příspěvky: 24
Registrován: 09 črc 2013, 00:00

#20 Příspěvek 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]
Přílohy
image1.jpeg
frekvence na vstup
frekvence na vstup
image0.jpeg
délka spouštěcího signálu
délka spouštěcího signálu
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#21 Příspěvek od Atlan »

Co tak dat Rc clen na vstup.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“