www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3 ... 24, 25, 26
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3073
Aktiv.: 20.25
Kraj: Koroška Bela

PrispevekObjavljeno: Sob Nov 26, 2016 9:12 am    Naslov sporočila:   Odgovori s citatom

To je copy/paste iz mojega programa:
Koda:
#include <avr\io.h>
#include <avr\interrupt.h>
#include <util/delay.h>
#include <inttypes.h>
#include <stdio.h>
#include "lcd_lib.c"
#include "twi.c"
#include "definicije.h"
//#include "nrf24l01.c"
//#include "spi.c"


Tisti z <> so datoteke nekje v Atmelovem oz. WinAvr jevih direktorijih, tisti z " " pa so v mapi, kjer imam trenutni projekt.
Pa poskusi pisat datoteke brez dvojnih pik : lcd.lib.c ampak malo drugače, npr lcd_lib.c (ali pa s končnico .h)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
integrerc
Član
Član



Pridružen-a: Sob 23 Sep 2006 14:50
Prispevkov: 402
Aktiv.: 2.39
Kraj: Novo mesto

PrispevekObjavljeno: Sob Nov 26, 2016 11:57 am    Naslov sporočila:   Odgovori s citatom

Bom upošteval napisano lojzek.
Vprašal bi še, kakšen programator naj uporabim?
Do sedaj sem uporabljal Proggy od Svet elektronike, vendar pa mi v AVR studio 6 ne deluje.

_________________
Lep pozdrav!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3073
Aktiv.: 20.25
Kraj: Koroška Bela

PrispevekObjavljeno: Tor Feb 25, 2020 9:07 pm    Naslov sporočila:   Odgovori s citatom

Pozdravljeni,

Sedaj se mučim z eno težavico, ki jo sicer znam rešiti z nekaj if () stavki, ampak mislim da se da to lepše rešiti z XOR, vendar mi rešitev noče v glavo.

Torej, v enem bajtu imam dva bita, za katera me zanima, če sta enaka (oba 0 ali oba 1 - vrne recimo 1) ali različna - vrne recimo 0.

primeri- vsaka vrstica me zanima primerjava z "x" označenih bitov:
Koda:


   xx 
00011000 == 1
00000000 == 1
00010000 == 0
00001000 ==0


Gre se pa za priklop malega enkoderja, da bi ugotovil smer.

moj primer, ki me muči:
Koda:
SIGNAL (INT1_vect)
{   
//bitno preverjanje bitov enkoderja
   //Enaka == ena smer, različna == druga smer

if (PIND & (1 << PD3) ^ PIND & (1 << PD4))
   ++Gor;
   else ++Dol;
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 13746
Aktiv.: 77.72
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Feb 25, 2020 9:18 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
Gre se pa za priklop malega enkoderja, da bi ugotovil smer.


V C-ju ti ne znam pomagat. V assemblerju jaz naredim tako da "eno sled" enkoderja dam na pin zunanje prekinitve. Recimo, da se prekinitev sproži ob padajoči fronti. V prekinitveni rutini pa preverjam stanje drugega vhoda. Visoko stanje ena smer nizko stanje druga smer.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3073
Aktiv.: 20.25
Kraj: Koroška Bela

PrispevekObjavljeno: Tor Feb 25, 2020 10:21 pm    Naslov sporočila:   Odgovori s citatom

Ja, saj tako sem imel pri prejšnjem enkoderju.
Je bil očitno drugačen - ker je vgrajen in v uporabi, pa ne morem preverit. In njegov "program" je lepo deloval.

Ta pa ima pri zasuku enkoderja za en zob levo najprej spremembo izhoda A na 1, ki ji sledi B na 1. Pri drugem zobu vrtenja v levo pa se A spremeni na 0 in ji sledi B na 0.
Tako jih moram preverjat pri "enkah" ki jim sledijo enke, in "nulah" ki jim sledijo nule. Drugače moraš za spremembo dveh številk zavrteti za 4 zobce.

Mislil sem na XOR, kajti obe enaki vrednosti bitov pomenita eno smer, različni pa drugo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 856
Aktiv.: 8.67
Kraj: Črnomelj

PrispevekObjavljeno: Tor Feb 25, 2020 11:07 pm    Naslov sporočila:   Odgovori s citatom

Naredi nasko ki ima oba bita na 1 in potem rezultat registra primerjaj z masko.

If ((register & maska) == maska)

Nastavi masko na oba bita 1 in boš vedel kdaj sta oba na 1.

_________________
Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 13746
Aktiv.: 77.72
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Feb 25, 2020 11:17 pm    Naslov sporočila:   Odgovori s citatom

Vsi enkoderji - tudi industrijski (vsaj tiste, ki jih poznam) imajo sled A in B zamaknjeno za 90° industrijski imajo običajno še sled "Z" ter vse signale tudi negirane.
Za določetev smeri vrtenja pač vzameš eno sled in jo primerjaš z drugo v trenutku, ko se ta spremeni torej če je pri dvigajoči fronti stanje visoko pri padajoči pa nizko se je zavrtelo za en "zob" v eno stran, če je stanje pri dvigajoči enako padajoči se je ostalo na istem mestu enako gre za drugo stran.
Tukaj je lepa simulacija.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3073
Aktiv.: 20.25
Kraj: Koroška Bela

PrispevekObjavljeno: Sre Feb 26, 2020 11:47 am    Naslov sporočila:   Odgovori s citatom

@tilzor: to bom pa poskusil, ker tak primer mislim da je večkrat uporaben. Vse take uporabne stvari si po preizkusu zapišem in kasneje laže najdem. Take enostavne rešitve včasih človek niti ne opazi.

@Silvo, tisto simulacijo na Wikiju sem že videl. In moj tudi dela tako, če ga preizkusim z lučkami.

Nekako sem pa tudi slutil, da me malo debouncing heca. Sem ga hotel kasneje reševati.
Zato sem se pa lotil "kopanja" po načrtih naprave, kjer do sedaj uporabljam prvi in edini enkoder Ter videl, da imam hardverski debouncing (R+C). Ta ploščica, ki sem jo kupil ima pa samo pullup upore. Torej najprej hardver urediti, nato pa naprej. Mogoče bo že preizkušena rešitev delovala.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3073
Aktiv.: 20.25
Kraj: Koroška Bela

PrispevekObjavljeno: Sre Feb 26, 2020 11:57 am    Naslov sporočila:   Odgovori s citatom

Evo, tule je delujoča koda in delujoča shema. Samo ne vem, katero verzijo sem (že) uporabil.... Think
Koda:
//prekinitev - vrtenje enkoderja
SIGNAL (INT1_vect)
{
if (PIND & (1 << PD4))
   ++Gor;
   else ++Dol;
Neaktiv = 0;
}



Enkoder.PNG
 Opis:

Download
 Ime datoteke:  Enkoder.PNG
 Velikost datoteke:  14.57 KB
 Downloadano:  5 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3073
Aktiv.: 20.25
Kraj: Koroška Bela

PrispevekObjavljeno: Sre Feb 26, 2020 2:33 pm    Naslov sporočila:   Odgovori s citatom

Rešitev... Najprej hardverski debounce, potem je koda prejšnjega posta začela delat. Sprememba števca na vsak drugi zobec (res imam prejšnji enkoder drugačen Think )
Zanjo je bila prekinitev INT1 nastavljena na padajoči rob signala...


Tole je pa nova delujoča koda:

Koda:
//prekinitev - vrtenje enkoderja
SIGNAL (INT1_vect)
{   
if (!(PIND & (1 << PD3)) && PIND & (1 << PD4) || PIND & (1 << PD3) && !(PIND & (1 << PD4)))
   ++Gor;
   else  ++Dol;
Neaktiv = 0;
}


Zanjo je treba pa nastaviti PinChange interupt na INT1

Samo nisem imel 10n kondijev, pa sem dal 100n. in ne moreš vrteti prehitro Smile debounce premočan... bom to uredil

Hvala za debato in pomoč.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3 ... 24, 25, 26
Stran 26 od 26

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 89 dni


Powered by phpBB © 2001, 2005 phpBB Group