Skocz do zawartości

[C] Atmeag8 i czujnik inkrementacji


AVRHobby

Pomocna odpowiedź

Witam, mam problem ze zrozumieniem tego jak powinien być napisany kod dla takiego czujnika, nigdy nie pobierałem informacji z zewnątrz oprócz obsługi przycisku więc na tym się wzorowałem jednak nie ma reakcji ze strony uC.

KOD:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define LED_PIN (1<<PD0)
#define LED_ON PORTD &= ~LED_PIN
#define LED_OFF PORTD |= LED_PIN	
#define LED_TOG PORTD ^= LED_PIN
#define OUT_1_PIN (1<<PD2)
int main() {
DDRD |= LED_PIN;
//PORTD |= OUT_1_PIN;
while(1){
LED_ON;
if(!(PIND & OUT_1_PIN)){
	_delay_ms(80);
	if(!(PIND & OUT_1_PIN)){
			LED_OFF;
	}
}
 }
}

dodana jest biblioteka

#include <avr/interrupt.h>

ponieważ próbowałem sił z przerwaniami jednak moja wiedza jest zbyt mała jak na przerwania jeszcze

mógłby mi ktoś pomóc? podpowiedzieć? jak to ugryźć?

znalazłem podobne jednak napisane dla arduino nic mi to nie daje ponieważ nie znam języka dla Arduino. klik

Link do komentarza
Share on other sites

Najlepiej bedzie jesli zamieścisz schemat. Taki czujnik postaraj sie obsłużyc jak zwykły przycisk.

*ustaw diode jako wyjscie (DDRD |= (1<

*wyłącz ją PORTD |= (0<

*ustaw czujnik jako wejscie (DDRD |= (0<

*włącz na nim rezystor podciągajacy(pull-up), czyli np. PORTD |= (1<

Oczywiscie nie wiem dokładnie gdzie masz podpięte te rzeczy, wiec podałem przykład

potem sprawdasz warunkiem czy przycisk jest wcisnięty. Pamiętaj, że warunek sie wykona jeśli będzie prawdą (1).

Jesli warunek spełniony PORTD |= (1<

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

mam tu schemat

0195.png

tylko zaznaczam że ten jest dla arduino ale ja podpinam to pod usbasp i pisze w czystym C a nie pod arduino

dodam:

PD2 - wejście S1

PD3 - wejście S2

PD0 - LED

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

Myślę, że ten kod powinien działać.

Zasada jest taka jeśli tarcza będzie sie krecic w lewo dioda zapali się, natomiast jeśli będzie to obrót w prawo zgaśnie. (lub vice-versa 😃)

Nie mam 100% pewności, że bedzie działał.

Acha program pisany na ATmege 8.

/////////////OBSŁUGA_ENKODERA///////////////////

#include <avr/io.h>
#include <util/delay.h> 
#include <avr/interrupt.h>



int main()
{
/////////////////KONFIGURACJA_WE/WY///////////////////////////
#define IN_1	(1<<PB2)
#define IN_2	(1<<PB3)
#define LED		(1<<PD0)
#define LED_ON	PORTD |=LED		//włącz diode
#define LED_OFF	PORTD &= ~LED 	//wyłącz diode
DDRD |= (0<<IN_1)|(0<<IN_2);	// piny enkodera jako wejscie
DDRD |= (1<<LED); //dioda jako wyjscie
PORTD|= (1<<IN_1)|(1<<IN_2);	//załączenie pull-up

//////////////////////////////////////////////////////////////


////////////////////KONFIGURACJA_PRZERWANIA/////////////////
GICR |= (1<<INT0);	//aktywujemy przerwanie INT0
MCUCR |= (1<<ISC00)|(0<<ISC01);	//wyzwalanie dwoma zboczami
sei();	//zezwolenie na globalne przerwania
////////////////////////////////////////////////////////////


while(1)
{	

}
}

ISR(INT0_vect)
{
//przerwanie na INT0 wyzwolone zboczem narastającym/opadającym 
//sprawdzi czy wejscie IN_2 ma stan niski czy wysoki
if(PIND & (1<<IN_2))	LED_ON;	//jesli IN_2 ma stan wysoki to zapal diode
else LED_OFF;     //w przeciwnym razie zgaś LED



}

Sprawdziłem na kolokwialnej symulacji (bez stosu etc) w asemblerze i działa

.include "m32def.inc"
.cseg
.org 0x000
rjmp reset
.org 0x002
rjmp przerwanie_int0


reset:

ldi r16, (0<<DDD2)|(0<<DDD3)|(1<<DDD0)
out DDRD, r16
ldi r16, (1<<PB2)|(1<<PB3)
out PORTD, r16

ldi r16, (1<<INT0)
out GICR, r16
ldi r16, (1<<ISC00)|(0<<ISC01)
out MCUCR, r16
sei
rjmp reset


przerwanie_int0:

in r16, PIND
cpi r16, 4
brne skok
reti

skok:
rjmp skok

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.