Bascom-AVR

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

Post Reply
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Bascom-AVR

Post by Maki »

Pozdrav !
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
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Bascom-AVR

Post by Maki »

Problem rješen :lol:
Evo kako je to rješeno. Rješenje sam preuzeo sa ove stranice http://www.svet-el.si/english/index.php ... er-and-lcd

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 B
Pwm1a = B
Waitms 100
Cls
Goto Glavna

Dekoder:
A = Encoder(pind.0 , Pind.2 , Dol , Gor , 1)
Return

Dol:
Decr B
Return

Gor:
Incr B
Return
juremm
Pocetnik na forumu
Pocetnik na forumu
Posts: 26
Joined: 24-09-2010, 07:54

Re: Bascom-AVR

Post by juremm »

Maki,

lijepo je vidjeti, što kod iz moje www stranice nekome dobro služi :D

Na blogu objavljujem novosti kad uhvatim vrijeme i nešto napišem...

Pozdrav!
Jure
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Bascom-AVR

Post by Maki »

Bok,
nije me bilo u ovim vodama :roll: ...
Malo sam se igrao sa ADC-om mege8 i naišao na jedna problem :)
On izmjeri vrijednost samo pri uključenju mege na napajanje, poslije ne reagira na potenciometar.
Znači samo resetiranjem očita vrijednost i to jedanput.
Znam da postoji gotova naredba za Bascom, ali volio bih dokučiti gdije griješim.
Da napomenem sa gotovom narednom Bascoma sve radi OK, ali volio bih rješiti na ovaj način sa registrima i čekajući zastavicu.
Ako netko može pogledati kod i reči svoje mišljene ili savijet.
Ukoliko trebate još informacija, recite.

Code: Select all

$regfile = "m8adef.dat".
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32

Dim A As Byte

Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , Rs = Portd.2 , E = Portd.3
Config Lcd = 16x2

'Omogučujem ADC te sam postavio predskaler na 128
'kako bi frekvencija ADC-a bila 125kHz
'isključen je interrupt, čekam zastavicu
Adcsra.7 = 1
Adcsra.5 = 0
Adcsra.4 = 0
Adcsra.3 = 0
Adcsra.2 = 1
Adcsra.1 = 1
Adcsra.1 = 1

'Podesio sam unutarnji referenti izvor i ostavio sam
'po defoltu spremanje rezultata
Admux.7 = 1
Admux.6 = 1
Admux.5 = 0

'Ovdije biram kanale
'Na kanalu ADC1 mi se nalazi potenciometar od 10k s kojim je u seriju spojen
'otpornik od 10k, otpronik je spojen na +5V, a potenciometar u seriju sa njim
'na masu, gdije sam srednji izvod pota spojio na PORTC.1
Admux.3 = 0
Admux.2 = 0
Admux.1 = 0
Admux.0 = 1
Adcsra.6 = 1


'Ovo bi trebala biti jednostavna petlja za mjerenje
'Na displeju mi ispisuje vrijednos registra ADCL
Pocetak:
If Adcsra.4 = 1 Then
   A = Adcl
   Adcsra.4 = 0
   Admux.3 = 0
   Admux.2 = 0
   Admux.1 = 0
   Admux.0 = 1
   Adcsra.6 = 1
End If
Lcd "A= " ; A ; "   "
Lowerline
Lcd "A= " ; A ; "    "
Home
Goto Pocetak
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Bascom-AVR

Post by Maki »

juremm wrote:Maki,

lijepo je vidjeti, što kod iz moje www stranice nekome dobro služi :D

Na blogu objavljujem novosti kad uhvatim vrijeme i nešto napišem...

Pozdrav!
Jure
Da, nekako sam naišao na to i pomoglo je :wink:
Hvala.

Edit:
Ovo gore moje pitanjce još uvijek vrijedi...
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Bascom-AVR

Post by Maki »

Hahaha, evo rjiših problem :lol:
Ah, nisam isčitavao registre kao što piše u datasheetu :oops:
Evo sad radi :)

Code: Select all

$regfile = "m8adef.dat".
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32

Dim A As Byte , B As Byte

Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , Rs = Portd.2 , E = Portd.3
Config Lcd = 16x2

'Omogučujem ADC te sam postavio predskaler na 128
'kako bi frekvencija ADC-a bila 125kHz
'isključen je interrupt, čekam zastavicu
Adcsra.7 = 1
Adcsra.5 = 0
Adcsra.4 = 0
Adcsra.3 = 0
Adcsra.2 = 1
Adcsra.1 = 1
Adcsra.1 = 1

'Podesio sam unutarnji referenti izvor i ostavio sam
'po defoltu spremanje rezultata
Admux.7 = 1
Admux.6 = 1
Admux.5 = 0

'Ovdije biram kanale
'Na kanalu ADC1 mi se nalazi potenciometar od 10k s kojim je u seriju spojen
'otpornik od 10k, otpronik je spojen na +5V, a potenciometar u seriju sa njim
'na masu, gdije sam srednji izvod pota spojio na PORTC.1
Admux.3 = 0
Admux.2 = 0
Admux.1 = 0
Admux.0 = 1
Adcsra.6 = 1


'Ovo bi trebala biti jednostavna petlja za mjerenje
'Na displeju mi ispisuje vrijednos registra ADCL
Pocetak:
If Adcsra.4 = 1 Then
   A = Adcl
   B = Adch
   Adcsra.4 = 0
   Admux.3 = 0
   Admux.2 = 0
   Admux.1 = 0
   Admux.0 = 1
   Adcsra.6 = 1
End If
Lcd "A= " ; A ; "   "
Lowerline
Lcd "B= " ; B ; "    "
Home
Goto Pocetak


Post Reply