Öntanuló AVR
Öntanuló AVR
Sziasztok,
Viszonylag új vagyok itt a fórumon, eddig igazából inkább csak olvasgattam. AVR programozással is nemrégen kezdtem el foglalkozni. Amiért nyitottam ezt az új témát az a következő lenne:
adott egy Atmega1284-es kontroller és szeretnék hozzá egy olyan programot csinálni ami a következőképpen működik, van 10db kapcsoló, amiknek az állapotát kellene figyelni, majd ennek megfelelően 10db relét ugyanilyen sorrendben és időzítéssel kapcsolgatni. Elvileg egy 'öntanuló' program lenne célom, ami képes lenne a 10db kapcsoló időbeli változásait regisztrálni és ugyanezt vissza adni a kimeneteken. Eddig jobbára Bascom-ban dolgozgattam, a relévezérlés és a bemenet olvasás nem jelent gondot, de a továbbiakra nézve nincs ötletem, hogy merre induljak.
Előre is köszönöm a segítséget!
Üdv.: Imi
Viszonylag új vagyok itt a fórumon, eddig igazából inkább csak olvasgattam. AVR programozással is nemrégen kezdtem el foglalkozni. Amiért nyitottam ezt az új témát az a következő lenne:
adott egy Atmega1284-es kontroller és szeretnék hozzá egy olyan programot csinálni ami a következőképpen működik, van 10db kapcsoló, amiknek az állapotát kellene figyelni, majd ennek megfelelően 10db relét ugyanilyen sorrendben és időzítéssel kapcsolgatni. Elvileg egy 'öntanuló' program lenne célom, ami képes lenne a 10db kapcsoló időbeli változásait regisztrálni és ugyanezt vissza adni a kimeneteken. Eddig jobbára Bascom-ban dolgozgattam, a relévezérlés és a bemenet olvasás nem jelent gondot, de a továbbiakra nézve nincs ötletem, hogy merre induljak.
Előre is köszönöm a segítséget!
Üdv.: Imi
Re: Öntanuló AVR
Ha 24h esemény kezelésre gondolsz?
Akkor szerintem kezdjed itt tanulást:
SD-Logger II. - Mi is az a Valós Idejű Óra (RTC - Real Time Clock)?
http://www.tavir.hu/sdlogger-2
Ha már az aktuális időpontokat eltudod tárolni, a feldolgozása utána következik.
Akkor szerintem kezdjed itt tanulást:
SD-Logger II. - Mi is az a Valós Idejű Óra (RTC - Real Time Clock)?
http://www.tavir.hu/sdlogger-2
Ha már az aktuális időpontokat eltudod tárolni, a feldolgozása utána következik.
Re: Öntanuló AVR
Helo,
Nem 24h-s rögzítésre gondoltam, hanem a következőre az egyszerűség kedvéért két darab kapcsolóval:
- a program futása szempontjából kell egy külön kapcsoló tanuló/normál üzemmód
- a kapcsoló "tanuló" állásában kellene figyelni a két darab kapcsolót (pl.: 1-est bekapcsolom, 2sec után lekapcsolom, 2-est bekapcsolom, 3sec után lekapcsolom)
- ezt a működést az AVR-nek el kellene tárolni és ha a kapcsolót visszaállítom "normál" módba akkor a kimeneteken levő reléket ugyanebben a sorrendben és időkkel aktiválja.
Nem 24h-s rögzítésre gondoltam, hanem a következőre az egyszerűség kedvéért két darab kapcsolóval:
- a program futása szempontjából kell egy külön kapcsoló tanuló/normál üzemmód
- a kapcsoló "tanuló" állásában kellene figyelni a két darab kapcsolót (pl.: 1-est bekapcsolom, 2sec után lekapcsolom, 2-est bekapcsolom, 3sec után lekapcsolom)
- ezt a működést az AVR-nek el kellene tárolni és ha a kapcsolót visszaállítom "normál" módba akkor a kimeneteken levő reléket ugyanebben a sorrendben és időkkel aktiválja.
Re: Öntanuló AVR
Minden féleképen kel valami időmérő eszköz?
A legegyszerűbb az előbbi RTC lenne.
A másik lehetőség Timer számlálót belőni 1 sec megszakításra, és számlálni a megszakításokat.
Tanuló üzemben figyeled, és valahol eltárolod a kapcsolók állapot változásának idejét.
Aztán vissza játszod.
A legegyszerűbb az előbbi RTC lenne.
A másik lehetőség Timer számlálót belőni 1 sec megszakításra, és számlálni a megszakításokat.
Tanuló üzemben figyeled, és valahol eltárolod a kapcsolók állapot változásának idejét.
Aztán vissza játszod.
Re: Öntanuló AVR
Valami időmérés mindenképpen kell, tudnom kellene, hogy melyik kapcsoló mennyi ideig volt aktiválva. A Timer jó ötletnek tűnik, a "tanuló/normál" kapcsolóval lehetne indítani és figyelni a megszakításokat. Sajnos még egyik-el sem dolgoztam, sem a Timer-el, sem a megszakítással.
Re: Öntanuló AVR
Egyszerűsítenék:
- gombok/kapcsolók beállítva
- rögzítés gomb, leállítás gomb.
Belül az első rögzítés gombnyomás indítja a rögzítést.
millis() startértéke elment
gombok beállítanak
rögzít megnyom
gombok állása, millis(most)-millis(start) elment EEPROM-ba
leállít gomb megnyom
gombok állása, millis(most)-millis(start) elment EEPROM-ba
És a visszajátszást ez alapján is meg lehet oldani
- gombok/kapcsolók beállítva
- rögzítés gomb, leállítás gomb.
Belül az első rögzítés gombnyomás indítja a rögzítést.
millis() startértéke elment
gombok beállítanak
rögzít megnyom
gombok állása, millis(most)-millis(start) elment EEPROM-ba
leállít gomb megnyom
gombok állása, millis(most)-millis(start) elment EEPROM-ba
És a visszajátszást ez alapján is meg lehet oldani
Re: Öntanuló AVR
Helo Róbert,
Sajnos nem hiszem, hogy ez a megoldás járható lenne, mert a "tanulási" idő alatt az egyes lábak szintjei időben változhatnak. Valószínűleg én nem tudom pontosan megfogalmazni, de csatoltam egy diagramot ami talán érthetőbb (3 db kapcsolóval). Ezt a működést kellene letárolni majd a kimeneten visszaadni. Ha jól sejtem a megszakítások felé kellene vennem az irányt, mert az Atmega1284 rendelkezik lábankénti megszakítással.
Sajnos nem hiszem, hogy ez a megoldás járható lenne, mert a "tanulási" idő alatt az egyes lábak szintjei időben változhatnak. Valószínűleg én nem tudom pontosan megfogalmazni, de csatoltam egy diagramot ami talán érthetőbb (3 db kapcsolóval). Ezt a működést kellene letárolni majd a kimeneten visszaadni. Ha jól sejtem a megszakítások felé kellene vennem az irányt, mert az Atmega1284 rendelkezik lábankénti megszakítással.
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Re: Öntanuló AVR
Ha még nem ismered? Keresd fel a régi fórum: http://avr.tavir.hu/
Bascom leírás illetve könyv!: http://avr.tavir.hu/modules.php?name=Co ... ies&cid=15
16. Megszakítások
32. Timer
Oldalakat!
Bascom leírás illetve könyv!: http://avr.tavir.hu/modules.php?name=Co ... ies&cid=15
16. Megszakítások
32. Timer
Oldalakat!
Re: Öntanuló AVR
1 elképzelés megvalósításához jóval többet kel tudni, mint amit te itt elárultál nekünk!
A pontos időzítéshez feltétlenül szükséges 1 külső kvarc beépítése!
Elsőre ennek az értékét kellene megválasztani!
Szempontok: Gyors legyen a rendszer vagy inkább kis fogyasztású?
Ha már az időzítésen van a hangsúly, az értéke olyan legyen, hogy 2 hatványával vissza osztható legyen pontos 1sec.
Lesz soros kommunikáció? Mert akkor ez is meghatározó szempont!
….
A pontos időzítéshez feltétlenül szükséges 1 külső kvarc beépítése!
Elsőre ennek az értékét kellene megválasztani!
Szempontok: Gyors legyen a rendszer vagy inkább kis fogyasztású?
Ha már az időzítésen van a hangsúly, az értéke olyan legyen, hogy 2 hatványával vissza osztható legyen pontos 1sec.
Lesz soros kommunikáció? Mert akkor ez is meghatározó szempont!
….
Re: Öntanuló AVR
Ki indulás 1 lehetséges megvalósításra.
Timer1 1Hz-es megszakításra belőve.
+ Pár lehetséges változó definiálása.
Véleményed?
Milyen irányban folytatnád?
Melyik port-on lesznek a kapcsolók?
Timer1 1Hz-es megszakításra belőve.
+ Pár lehetséges változó definiálása.
Kód: Egész kijelölése
' Atmega1284_01.bas
$regfile = "m1284def.dat" ' specify the used AVR
$crystal = 8000000 ' used crystal frequency
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'$baud = 19200 ' use baud rate 19200 baud
Const Maxv = 8 ' Feltételeztem kapcsolónként Max 8 váltást!?
' Tömbök Kn kapcsolásók Scounter idő értékeinek
Dim K1secW(Maxv) As Word
Dim K2secW(Maxv) As Word
Dim K3secW(Maxv) As Word
' Tömbök Kn kapcsolók aktuális szintjei 0/1
Dim K1level(Maxv) As Byte
Dim K2level(Maxv) As Byte
Dim K3level(Maxv) As Byte
' Kn átmeneti állapot számlálók kapcsolónként jelzik hol tartunk
dim K1index as Byte
dim K2index as Byte
dim K3index as Byte
' Kn állapot változás detektálása. régi érték(1), új érték(2)
Dim K1levelt(2) As Byte
Dim K2levelt(2) As Byte
Dim K3levelt(2) As Byte
' ATmega Timer/Counter/Prescaler Calculator
' https://et06.dunweber.com/atmega_timers/
Const Timer1pre = 31250 '1Hz kezdő érték
'The TIMER1 is a versatile 16 bit TIMER.
'This example shows how to configure the TIMER
'First like TIMER0 , it can be set to act as a TIMER or COUNTER
'Lets configure it as a TIMER that means that it will count and that
'the input is provided by the internal clock.
'The internal clock can be divided by 1,8,64,256 or 1024
Config Timer1 = Timer , Prescale = 256
On Timer1 Sec_counter
Dim Scounter as Word ' vagy inkább DWord?
Scounter = 0
Stop Timer1
TIMER1 = Timer1pre '1sec kezdő érték ?
Enable Interrupts
Enable Timer1
Start TIMER1
Do
' Folytasd
Loop
Sec_counter:
Stop Timer1
TIMER1 = Timer1pre '1Hz kezdő érték ?
Start Timer1
decr Scounter ' másodpec számláló
Return
End
Milyen irányban folytatnád?
Melyik port-on lesznek a kapcsolók?
Re: Öntanuló AVR
Előzőleg ajánlott „ATmega Timer/Counter/Prescaler Calculator”-hoz javítom a számítást:
Inkább ezt használd:
Download AVR calculator:
http://www.electronics-lab.com/downloads/mcu/002/
Kód: Egész kijelölése
Const Timer1pre = 65536 - 31250 '1Hz kezdő értékDownload AVR calculator:
http://www.electronics-lab.com/downloads/mcu/002/
Kód: Egész kijelölése
Const Timer1pre = &h85ee '1Hz kezdő érték 34286Re: Öntanuló AVR
Helo kapu48,
Csatoltam egy kapcsolási rajzot, a Max232 a soros kommunikációhoz még nincs rajta. A J1-J10-es csatlakozókra lenne a kapcsoló, ami 12V-ot ad a bemenetre, ezért tettem be a zenert (5V6) és az opto-s leválasztást. Amikor aktiválódik a kapcsoló a proci adott lába gnd-re kerül. A bemenetek a PA0-PA7 és a PB0, PB1. A kimenetekre egyenlőre led-ek vannak kötve, ezt majd kiváltom relével és a PC0-PC7 ill. PD6, PD7 port-on lesznek. Az órajelet szeretném 16Mhz-re választani. A PB3-ra kötött S1-es kapcsoló állása döntené el, hogy tanuló üzemmódban (PB3=1) van-e vagy normálban (PB3=0). Az S2-es nyomógomb indítaná a kimeneteket, ha "normál" üzemmódban van.
"Const Maxv = 8 ' Feltételeztem kapcsolónként Max 8 váltást" ez bőven elegendő. A kódrészlet alapján amit leírtál tömbökben tárolódna a lábak aktuális értéke és a hozzátartozó idő. Igazából a megszakítás részét nemigazán értem. Ahogy én gondolom, de javíts ki ha tévedek, az S1-es kapcsoló bekapcsolásakor (PB3=1) elindul a Timer1, alapesetben az öszes bemenet 1-es szinten van, ha pl. a PA0 lábon érkezik egy lefutóél az generál egy megszakítást és a Timer1 indítása óta eltelt idő ill. a bemenet állapota eltárolódik az erre a célra létrehozott tömb-ben. Viszont innetől nemtudom mi történik, ezen a lábon a következő változás felfutó él lesz aminek szintén generálnia kellene egy megszakítást és ismét tárolni kellene a az időt és az értéket.....
Csatoltam egy kapcsolási rajzot, a Max232 a soros kommunikációhoz még nincs rajta. A J1-J10-es csatlakozókra lenne a kapcsoló, ami 12V-ot ad a bemenetre, ezért tettem be a zenert (5V6) és az opto-s leválasztást. Amikor aktiválódik a kapcsoló a proci adott lába gnd-re kerül. A bemenetek a PA0-PA7 és a PB0, PB1. A kimenetekre egyenlőre led-ek vannak kötve, ezt majd kiváltom relével és a PC0-PC7 ill. PD6, PD7 port-on lesznek. Az órajelet szeretném 16Mhz-re választani. A PB3-ra kötött S1-es kapcsoló állása döntené el, hogy tanuló üzemmódban (PB3=1) van-e vagy normálban (PB3=0). Az S2-es nyomógomb indítaná a kimeneteket, ha "normál" üzemmódban van.
"Const Maxv = 8 ' Feltételeztem kapcsolónként Max 8 váltást" ez bőven elegendő. A kódrészlet alapján amit leírtál tömbökben tárolódna a lábak aktuális értéke és a hozzátartozó idő. Igazából a megszakítás részét nemigazán értem. Ahogy én gondolom, de javíts ki ha tévedek, az S1-es kapcsoló bekapcsolásakor (PB3=1) elindul a Timer1, alapesetben az öszes bemenet 1-es szinten van, ha pl. a PA0 lábon érkezik egy lefutóél az generál egy megszakítást és a Timer1 indítása óta eltelt idő ill. a bemenet állapota eltárolódik az erre a célra létrehozott tömb-ben. Viszont innetől nemtudom mi történik, ezen a lábon a következő változás felfutó él lesz aminek szintén generálnia kellene egy megszakítást és ismét tárolni kellene a az időt és az értéket.....
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Re: Öntanuló AVR
Helo Jimmi12!
Kapcsolási rajz kiegészítése!
AVCC-t is kösd össze a VCC-vel, különben az PortA nem kap tápfeszt!
A 100n kerámia szűrő kondikat elfelejteted!
Legyen a táp VCC – GND lábak közelében 100nF + 4.7uF tantál elkó.
És minden kapcsoló és nyomógomb (kimenet – GND)-re kötve a Prellezés csökkentésére!
Az S1 kapcsoló 1-es lábról R31-et kösd át az S1 2-es lábára, hogy a kapcsoló átváltása közben is fix H szint legyen a bemeneten (nem szabad lebegnie!)
Ugyan ez igaz minden kapcsolóra és nyomógombra!
És ne spórolj a 100n-kal!
Jól jött ez a rajz! Legalább már van elképzelésem mit is akarsz csinálni!
A Bascomom 2.0.7.7 Helpjében nem találtam a PCINTn kezeléséről útmutatást!
Ezért ezt majd az adatlapból kel regiszter szinten megoldani.
ATmega1284P Datasheet: http://www.atmel.com/images/doc8059.pdf
Leírás 67. oldal környékétől: Pin Change Interrupt.
(Majd próbálok mindenűt kommentezni! Amit nem értesz, azt kérdezd meg!)
FONTOS! A programom csak elméleti kivitelezés. Semmi garanciát nem vállalok rá!
Tesztelni, hibákat javítani neked kel! Ha elakadsz, jelentkezz és meg oldjuk!
A programot módosítom a leírásaid alapján!
És lépésenként felrakom ide, hogy egyeztetni tudjak veled!
Jó munkát!

Kapcsolási rajz kiegészítése!
AVCC-t is kösd össze a VCC-vel, különben az PortA nem kap tápfeszt!
A 100n kerámia szűrő kondikat elfelejteted!
Legyen a táp VCC – GND lábak közelében 100nF + 4.7uF tantál elkó.
És minden kapcsoló és nyomógomb (kimenet – GND)-re kötve a Prellezés csökkentésére!
Az S1 kapcsoló 1-es lábról R31-et kösd át az S1 2-es lábára, hogy a kapcsoló átváltása közben is fix H szint legyen a bemeneten (nem szabad lebegnie!)
Ugyan ez igaz minden kapcsolóra és nyomógombra!
És ne spórolj a 100n-kal!
Jól jött ez a rajz! Legalább már van elképzelésem mit is akarsz csinálni!
A Bascomom 2.0.7.7 Helpjében nem találtam a PCINTn kezeléséről útmutatást!
Ezért ezt majd az adatlapból kel regiszter szinten megoldani.
ATmega1284P Datasheet: http://www.atmel.com/images/doc8059.pdf
Leírás 67. oldal környékétől: Pin Change Interrupt.
(Majd próbálok mindenűt kommentezni! Amit nem értesz, azt kérdezd meg!)
FONTOS! A programom csak elméleti kivitelezés. Semmi garanciát nem vállalok rá!
Tesztelni, hibákat javítani neked kel! Ha elakadsz, jelentkezz és meg oldjuk!
A programot módosítom a leírásaid alapján!
És lépésenként felrakom ide, hogy egyeztetni tudjak veled!
Jó munkát!
Re: Öntanuló AVR
PCINT a Bascom samples alatt ott van.
Re: Öntanuló AVR
Ez a kapcs. rajz már rézbe véset?
Lehetne módosítani?
Az S2 gombot is valamely INT0 (PD2) vagy INT1 (PD3) képes bemenetre kellene kötni!?
A könnyebb programozás céljából.
Az RS232-nek maradnak az PD0, PD1. Majd jól jön a hiba keresésnél!
Kellene 1 LED az 1Hz detektálására, PD.5-re gondoltam!?
Lehetne módosítani?
Az S2 gombot is valamely INT0 (PD2) vagy INT1 (PD3) képes bemenetre kellene kötni!?
A könnyebb programozás céljából.
Az RS232-nek maradnak az PD0, PD1. Majd jól jön a hiba keresésnél!
Kellene 1 LED az 1Hz detektálására, PD.5-re gondoltam!?
