megszakítások !! egy pici elakadás!

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Kód: Egész kijelölése

.
.
.
do
.
.
.
.
   if vanszenzor=1 then exitdo
loop
.
.
.
Avatar
paroh
Biztosítékgyilkos
Hozzászólások: 51
Csatlakozott: 2009. május 21. csütörtök, 6:00

Hozzászólás Szerző: paroh »

Próbálgattam, ha lehúzom a szenzort és visszadugom akkor folytatja a programot, ami jó is, mert ezt szerettem volna.
Viszont most azt csinálja, hogy a relé lába (Portb5) villog és nem konstans, alacsony a jelszintje. Azt vettem észre, hogy egy másik résznél, ahol a hőmérséklet kiszámítása van megadva, előtte a 20msec-os késleltetést (waitms 20) változtatom, akkor ez a villogás is változik.

A Portb.5-ös lábán a villogás hogy lehetne megszüntetni?

Most így néz ki a kód:

Kód: Egész kijelölése

     Do
If Temp = 300 Then
      Set Portb.7
      Set Portb.5
      Locate 1 , 3
      Lcd " Err  "
      Portb.5 = 0
      Portb.7 = 0
     If Temp <= 301 And Temp >= 299 Then Exit Do
    Loop
End If


Egy másik kérdésem is lenne, mégpedig az lcd-n a mért értéket kijelzés hogy lehetne kiíratni egész számokkal, illetve 0.1 pontossággal?


Köszönöm előre is!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

portb.5-t ott villogtatod.....

Kiiras: format() ill fusing() függvényeket lesd meg....
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Te magad villogtatod!
A Set Portb.5 és Portb.5 = 1 Ugyan az a műveltet csak más a neve

Reset Portb.5 és Portb.5 = 0 Ugyszintén!

:lol:
Avatar
albatrosz100
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2010. november 18. csütörtök, 7:00

Hozzászólás Szerző: albatrosz100 »

Sziasztok !

Van egy "m168def.dat" ilyen csipem és INT0 - ra egy megszakítás rutin

A Bscom 16 fejezet -ben (megszakítások) van egy olyan utasítás hogy Gifr = 64 ezzel kellene kiküszöbölni hogy kétszer fosson le a megszakítás rutin.
Nekem a fordító nem ismeri ennél a csipnél.

Mit kell csináljak hogy működjön? Vagy hogyan lehet megkerülni?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Meg kel nézni a m168 adatlapján a megszakításkezelést.
Valószínűleg itt más a neve a regiszternek!
8)

73. oldal:
EIFR – External Interrupt Flag Register
• Bit 7..2 – Res: Reserved Bits
These bits are unused bits in the ATmega48P/88P/168P/328P, and will always read as zero.
• Bit 1 – INTF1: External Interrupt Flag 1
When an edge or logic change on the INT1 pin triggers an interrupt request, INTF1 becomes set
(one). If the I-bit in SREG and the INT1 bit in EIMSK are set (one), the MCU will jump to the corresponding
Interrupt Vector. The flag is cleared when the interrupt routine is executed.
Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared
when INT1 is configured as a level interrupt.
• Bit 0 – INTF0: External Interrupt Flag 0
When an edge or logic change on the INT0 pin triggers an interrupt request, INTF0 becomes set
(one). If the I-bit in SREG and the INT0 bit in EIMSK are set (one), the MCU will jump to the corresponding
Interrupt Vector. The flag is cleared when the interrupt routine is executed.
Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared
when INT0 is configured as a level interrupt.
:roll:

Kód: Egész kijelölése

Eifr.INTF0 = 0
Avatar
albatrosz100
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2010. november 18. csütörtök, 7:00

Hozzászólás Szerző: albatrosz100 »

Hálás köszönet !

Így már működik.
Avatar
albatrosz100
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2010. november 18. csütörtök, 7:00

Hozzászólás Szerző: albatrosz100 »

Van még egy problémám !

Az int0 begszakításon nyómógomb van és prelleg a megszakításom így néz ki:

Waitms 50
If Portd.2 = 0 Then... lenyomva a gomb
Else... elengedve a gomb
Eifr.intf0 = 1
Return

De minden ötödik - tizedik megnyomáskor és elengedéskor 2 szer fut le.
Tehát nem mindig fut kétszer.


Az int0 ha jól tudom a D2 lábon van ezét vizsgáltam azt a lábat.
Úgy tűnik nekem hogy talán másképpen kellene rá hivatkozni de nem tudom hogyan tegyem ezt ?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Hogy ezt megoldjuk neked, látni kellene hogyan állítottad be az INT-et, és a gombod L vagy H-t kapcsol?!
Bővebben itt: http://avr.tavir.hu/modules.php?name=Co ... age&pid=18
CONFIG INTx = state

state
LOW LEVEL to generate an interrupt while the pin is held low. Holding the pin low will generate an interrupt over and over again.

FALLING to generate an interrupt on the falling edge.

RISING to generate an interrupt on the rising edge.

CHANGE to generate an interrupt on the change of the edge. Not all microprocessors support CHANGE.


Ha ezt belövöd, akkor már tudod, hogy éppen lenyomták vagy elengedték a gombot.
Ha csak ritkán prelez tegyél több várakozást, ha makacsabb a hiba akkor kicsit bonyolultabb.
De megoldható!
És minden kapcsoló jelegű eszközhöz kel párhuzamosan GND-re 100n kerámia kondenzátor .
8)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

És az INT esetén még a Stack kérdés is bejátszhat.
SUB-ból lép ki? Valami szűken van méretezve?
Avatar
albatrosz100
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2010. november 18. csütörtök, 7:00

Hozzászólás Szerző: albatrosz100 »

Sajnos nem vagyok nagy elekronikai szakember. Kondi az nincsen bekötve, 2.5 ómos felhózó ellenállás van rákötve, és a nyomógomb a GND -re.

Kicsit lejátszadoztam vele, és ezt a kódot futtattam :

$crystal = 16000000 'orajel
$regfile = "m168def.dat" 'chip
$baud = 9600

Config Portd.6 = Input
Config Int0 = Falling

On Int0 Megszak
Enable Interrupts
Enable Int0

Dim Pr1 As Word
Dim Pr2 As Word
Dim Pr3 As Word
Dim Prel As Word

Do
Ujra:
Pr1 = 0
Pr2 = 0
Pr3 = 0
Input "A prell ? " , Prel
Ujra2:

Waitms 1000

If Portd.6 = 1 Then
Goto Ujra
Else
Goto Ujra2
End If

Loop

Megszak:
Incr Pr1
Print
Print " megszak " ; Pr1
Waitms Prel
If Portd.2 = 0 Then
Incr Pr2
Print "valos megszakitas " ; Pr2
Else
Incr Pr3
Print "valótlan megszakitas " ; Pr3
End If
Eifr.intf0 = 1
Return
End

Beállítottam a prel értékét jó nagyra: 2000-re hogy jobban lássam mi történik .
Ha lenyomtam a gombot rendesen kiírja a "valos megszakitas" a gomb továbra is nyomva tartottam majd elengedtem. Tehát már nincsen nyomva a gomb és 2 másodperc múlva újból kiírta a "valos megszakitas"
Persze újból csak körülbelül minden ötödikre.
A "valótlan megszakitas " egyetlen egyszer sem került kiírásra !
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Megszakítást általában valami külső eszköz szokott kérni!
Ha mégis nyomógobbal akarsz kísérletezni, legalább a minimális illesztést be kellene tartani!
Nehezen találtam rá példát. De ezen a rajzon a reset gomb bekötését sasold meg:
http://avr.tavir.hu/images/contents/an/ ... ematic.jpg
Nálad a 2.5ohm felhúzó gondolom tévedés?
8)
Mikor elengeded a gombot akkor prelez, ezért kel a kondi.
Ahogy a rajzon is van. de ne nyomjad hosszan!

:wink:
Avatar
albatrosz100
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2010. november 18. csütörtök, 7:00

Hozzászólás Szerző: albatrosz100 »

Köszönöm !
Igen elírtam 2.5 K ohm volt eredetileg 10 K volt, de lecseréltem mert először arra gyanakodtam.

Megnéztem a rajzot, így már értem hogyan kellene!

A 100n kondit minden egyéb nyomógombon, végállás kapcsolón, szóval ami prelleg, rakni kell ?
Avatar
albatrosz100
Újonc
Újonc
Hozzászólások: 14
Csatlakozott: 2010. november 18. csütörtök, 7:00

Hozzászólás Szerző: albatrosz100 »

Ráraktam a kondit így már alakul bár még mindig van mikor 2* fut le de csak kb. minden 20. 30. esetben. gondolom a kondi kapacitás növelésével az a pici is eltűnik!
Viszont van egy új problémám! Ami eléggé alap dolog, és már vagy 1000* átnéztem. Van rajta még nyomógomb és valamiért nem olvassa be az állapotát, és ezért nem megy a megszakításnál sem az
If Port.2 = 0 Then sornál sem.

Config Portd.3 = Input 'itt adom meg hogy bemenet legyen'

Később
If Portd.3 = 0 Then hivatkozok rá és az eredmény mindig 0

10K felhúzó ellenállás van rajta.
ellenőrzésnek kötöttem ledet a lábra, hogy lássam tényleg mi az állapota.
Az működik, ha nincs megnyomva a gomb akkor a led világít ha megnyomom a gombot (nem a megszakításét hanem a D3-at) akkor nem világít a led.

A portd.3 minden állapotban 0 eredményt ad

raktam hozzá egy ilyen sort :

portd.3 = 1

Ezután a led továbbra is jól mutat, de a port állapota mindig 1 lesz

Lehet hogy egy hülye alapkérdés az egész! Átnéztem amennyire csak tudtam de nem tudtam megtalálni a hibámat.
Meg tudná mondani valaki mit hagyok ki?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Láb állapota: Pinx.y
Kimenet állapota/felhúzóellenállás: Portx.y
http://avr.tavir.hu/modules.php?name=Co ... age&pid=54
Válasz küldése