Budući da se lagano upoznavam sa Bascom-om (konkretno za AVR) otvaram temu kako bi mogao postaviti pitanja vezana uz njega. Naravno i drugi mogu postavljat pitanja
Trenutno se igram sa ATmega8. Kao što neki već znaju u planu mi je izraditi laboratorijsko napajanje kontrolirano putem MCU-a i želio bih iskoristiti rotary encodere. Tu nailazim na problem.
U mom slučaju radi se o rotary encoderu EC12, ima dvije "faze" te zajdničku masu. Spojio sam ga sa ATmega8 tako da sam mu fazu A spojio na INT0,dok fazu B na portd.0. Na svaku fazu sam dodao pull up otpornike od 10k, a zajednički vod spojio na masu.
INT0 je podešen da se aktivira na padajući brid te ukoliko se u tom trenutku zatekne logička jedinica na PORTD.0 poveča varijablu A za jedan, a u suprotnom smanji za jedan.
Problem je u tome što on stalno samnjuje vrijednost varijable A.
Vrijednost varijable A se ispisjue na LCD-u te se pomoču nje mjenja duty od PWM-a.
Ako neko može malo pogledat kod, je sam li pogriješio negdje ili bi to trebalo drugačije odradit.
Kod:
Code: Select all
$regfile = "m8adef.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config Portb = Output
Config Portd.0 = Input , Portd.1 = Input , Portd.2 = Input , Portd.3 = Input , Portd.4 = Input , Portd.5 = Input
Config Portd.6 = Output , Portd.7 = Output
Config Portc = Input
Dim A As Word , B As Word
A = 1000
B = 1000
Config Lcdpin = Pin , Db4 = Portb.0 , Rs = Portd.6 , E = Portd.7 , Db7 = Portb.3 , Db6 = Portb.4 , Db5 = Portb.5
Config Lcd = 16x2
Config Timer1 = Pwm , Pwm = 10 , Compare_a_pwm = Clear_down , Compare_b_pwm = Clear_down , Prescale = 1
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Dekoder
Cls
Glavna:
Lcd A
Pwm1a = A
Waitms 100
Cls
Goto Glavna
Dekoder:
Waitms 1
If Portd.0 = 1 Then Incr A Else Decr A
Return