Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

USART - atmega porovnání textového řetězce
Jdi na stránku Předchozí  1, 2
 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3698
Bydliště: Praha

PříspěvekZaslal: čt květen 09 2024, 12:52    Předmět: Citovat

mhepp napsal(a):
A není problém v té proměnné i?

Není, i je statická a proto si uchovává svou hodnotu i mezi jednotlivými spuštěními interruptové rutiny.

V principu je špatně, pokud se něco v main() porovnává a zároveň na pozadí v přerušení se s těmito daty manipuluje. Proměnná prijato je v pořádku, nemá cenu provnávat dokola nehotová data. Ale jak testování prijato tak strcmp() by se mělo provádět s vypnutým přerušením od UART. A po otestování zprávy na ON se nastaví prijato na 0 a terpve pak se povolí přerušení. V operačních systémech máme k dispozici kritické sekce nebo mutexy, tady si musíme vystačit s vypínáním/zapínámí přerušení.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
mhepp



Založen: Aug 16, 2017
Příspěvky: 119

PříspěvekZaslal: čt květen 09 2024, 13:00    Předmět: Citovat

OK... Z céčka jsem už trochu vypadl. Očividně si to musím oživit.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Nearduinista



Založen: May 08, 2024
Příspěvky: 22

PříspěvekZaslal: čt květen 09 2024, 13:58    Předmět: Citovat

Dumitru napsal(a):
Nearduinista napsal(a):
Dumitru napsal(a):
neviem koľko trvá kym sa funkcia strcmp vykoná ale v prvom prípade ju voláš dookola v maine a ako už som písal ak pošleš „on\r\n“ tak sa do bufra uloží zaprava[0] = „o“ a zaprava[1] = „n“ potom „\r“ zaprava[2] = „\0“ vynuluje i=0 a „\n“ do zprava[i=0] kde je uložene „o“ prepíše na „\0“ a ak strcmp tráva dlhšie ako prijatie jedného znaku tak potom to nesedí v druhom prípade spustíš strcmp len raz pravé vtedy keď sprava je korektná.


Tož mě to taky napadlo, tak jsem se to pro zkoušku jal vyřešit takhle. A furt to nejede hm...



kód:
ISR(USART_RX_vect)
{
static int i=0;
prijaty_znak = UDR;

 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 { 
  zprava[i]=prijaty_znak;
  i++;
 }
 else
 {
  if(i>0)
  {
   zprava[i]='\0';   
  }
    i=0;
 }
}


a sisi isty ze tam chodia znaky \r a \n inak sa ty tam nikdy nedostane \0


skus takto

kód:

volatile char zprava[16];
ISR(USART_RX_vect)
{
static int i=0;
prijaty_znak = UDR;

 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 { 
  zprava[i]=prijaty_znak;
  i++;
 zprava[i] = '\0';
 }
 else
 {
  if(i>0)
  {
   zprava[i]='\0';   
  }
    i=0;
 }
}


a v maine

kód:


if (strcmp((char *)zprava,(char *)"on\0") == 0)


Ne prostě to fungovat nebude, tohle vypadalo nadějně, ale furt stejný. Přidával jsem si tam echo zpátky a co jsem odeslal to jsem dostal.
Zajímavý když dám před to zpoždění nejmíň 40ms, tak funguje.

kód:
   

while(1)
 {
 _delay_ms(40);

if (strcmp((char *)zprava,(char *)"on\0") == 0) 
            {
             PORTA |=(1<<PORTA1);         
         }
   
       
 }
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Nearduinista



Založen: May 08, 2024
Příspěvky: 22

PříspěvekZaslal: čt květen 09 2024, 14:08    Předmět: Citovat

mtajovsky napsal(a):
mhepp napsal(a):
A není problém v té proměnné i?

Není, i je statická a proto si uchovává svou hodnotu i mezi jednotlivými spuštěními interruptové rutiny.

V principu je špatně, pokud se něco v main() porovnává a zároveň na pozadí v přerušení se s těmito daty manipuluje. Proměnná prijato je v pořádku, nemá cenu provnávat dokola nehotová data. Ale jak testování prijato tak strcmp() by se mělo provádět s vypnutým přerušením od UART. A po otestování zprávy na ON se nastaví prijato na 0 a terpve pak se povolí přerušení. V operačních systémech máme k dispozici kritické sekce nebo mutexy, tady si musíme vystačit s vypínáním/zapínámí přerušení.


Takže použít něco jako ATOMIC_BLOCK??
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
asdf



Založen: Oct 06, 2022
Příspěvky: 316

PříspěvekZaslal: čt květen 09 2024, 15:15    Předmět: Citovat

A nemůže to být tak, že ta fce strcmp() na začátku provede strlen(), aby věděla, jak je to dlouhé, a na tom se zasekne, protože nemůže najít nikde nulu? Takže bych jen tak na zkoušku dal do main před ten while něco jako:
kód:
zprava[15] = 0;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Nearduinista



Založen: May 08, 2024
Příspěvky: 22

PříspěvekZaslal: čt květen 09 2024, 16:00    Předmět: Citovat

asdf napsal(a):
A nemůže to být tak, že ta fce strcmp() na začátku provede strlen(), aby věděla, jak je to dlouhé, a na tom se zasekne, protože nemůže najít nikde nulu? Takže bych jen tak na zkoušku dal do main před ten while něco jako:
kód:
zprava[15] = 0;


Tohleto záhadně funguje, ale proč když to moc smysl nedává, spíš už mi připadá, že se přerušení s hlavním programem nedokáže synchronizovat dostatečně rychle a tím, že před to dám nějakou část kódu tak tím dám čas aby se příkaz strcmp dokázal vyhodnotit, nic moc už mě nenapadá.

kód:

   while(1)
 {
zprava[15]='\0';

if (strcmp(zprava,"on") == 0) 
            {
             PORTA |=(1<<PORTA1);         
         }
     else  PORTA &=~(1<<PORTA1);
 }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Dumitru



Založen: Dec 11, 2015
Příspěvky: 188
Bydliště: Slovensko,Bratislava

PříspěvekZaslal: čt květen 09 2024, 22:03    Předmět: Citovat

Bohužiaľ odpoveď už sme dostali

rnbw napsal(a):
V skompilovanom kod mozno ani ziadny strcmp nebude, pretoze kompilator usudi, ze dana podmienka sa nemoze nikdy splnit a pri optimalizacii ho odstrani.


a mal pravdu dneska som napísal presne ten kod čo sme mali naposledy pod Atmegu168 a tiež to nefungovalo

kód:
volatile char zprava[16];
ISR(USART_RX_vect)
{
static int i=0;
prijaty_znak = UDR;

 if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
 {
  zprava[i]=prijaty_znak;
  i++;
 zprava[i] = '\0';
 }
 else
 {
  if(i>0)
  {
   zprava[i]='\0';   
  }
    i=0;
 }
}


kód:
if (strcmp((char *)zprava,(char *)"on\0") == 0)


potom som zistil že if compilator zahadzuje a tak som vypnul optimizacie

kód:

#pragma GCC optimize ("Og") // vypnutie optimizacii
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <string.h>


a potom to fungovalo korektne


ako náhle sa v nekonečnom cykle nachádza aj akýkoľvek iný kód potom compilator ten if nezahodí a preto ty to funguje keď tam čokoľvek dopíšeš iné


Je to zaujímavý prípad Smile - Rolling Eyes


Každopádne ale takto kontrolovať nie je správne , skús si napísať detekciu že prišli ukončovacie znaky \r\n a až potom kontroluj pomocou strcmp poprípade aj vynuluj už skontrolovane dáta, a tak tiež kontroluj aby ty premenná zprava nepretiekla.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Nearduinista



Založen: May 08, 2024
Příspěvky: 22

PříspěvekZaslal: pá květen 10 2024, 15:19    Předmět: Citovat

Tak jsem to šel zkusit a nic, říkám si to je v prd... Ale zjistil jsem ,že při překladu mi to vyhodilu hlášku :c:50: warning: ignoring #pragma GCC optimize
Takže jsem otevřel makefile a našel jsem tam tohle

kód:
# Optimization level, can be [0, 1, 2, 3, s].
#     0 = turn off optimization. s = optimize for size.
#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s


To jsem tedy přepsal na nulu a hle už to funguje. Je tedy potom otázka jestli optimalizovat nabo ne a k čemu to vlastně slouží? Když to může udělat problém.
Na tohle bych v životě sám nepřišel, že to je překladem, takže to je pro mě novinka. Moc děkuji za spolupráci.

Určitě je to takhle nesmysl, si jen hraju abych zjistil co a jak funguje nebo ne. Právě tohle jsem řešil asi týden. Protože logicky by to jako fungovat mělo. Samozřejmě je to k ničemu program, ale hodně mě to naučilo.

Jinak jsem ten příjem o něco vylepšil, ještě tam dodělat nějaký to přetečení a bude to asi ok.

kód:
ISR(USART_RX_vect)
{
char prijaty_znak;
static uint8_t i=0;

prijaty_znak = UDR;
UDR=prijaty_znak;

 if(prijato==0)
 {
   if((prijaty_znak != '\n') && (prijaty_znak!='\r'))
   {
   zprava[i]=prijaty_znak;
   i++;
   }
   else
   {
   zprava[i]='\0';   
   i=0;
   prijato=1;
   }
 }
}


Naposledy upravil Nearduinista dne pá květen 10 2024, 18:29, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rnbw



Založen: Mar 21, 2006
Příspěvky: 34853
Bydliště: Bratislava

PříspěvekZaslal: pá květen 10 2024, 15:35    Předmět: Citovat

Optimalizovat ano, ale neprogramovat ako prasa.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
samec



Založen: Dec 19, 2017
Příspěvky: 4645

PříspěvekZaslal: pá květen 10 2024, 20:14    Předmět: Citovat

Nearduinista napsal(a):
Právě tohle jsem řešil asi týden.
Vyhoď prvých 5 či 6, či koľko ich tam teraz máš riadkov (tie s #...) a začni programovať. Skôr sa tak dopracuješ k funkčnému výsledku.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2
Strana 2 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.20 sekund