 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
xklemen Član


Pridružen-a: Ned 10 Jan 2010 10:55 Prispevkov: 35 Aktiv.: 0.19 Kraj: Novo mesto
|
Objavljeno: Ned Jan 10, 2010 11:24 am Naslov sporočila: ATtiny26 in PWM |
|
|
Pozdravljeni!
Pred mescom dni sem se lotil osvetlitve domačega stopnišča z uporabo LED diod, uporabil sem Arduino ploščico z ATmega328 in sprogramiral v Bacumu.
Program:
Senzor na prvi stopnici zazna tvoj prihod, nažgle LED za 15s, in jih nato z PWM ugaša 7s.
Ena slikca kako izgleda Stopnice še niso dokončan
Po enem mesecu sem ugotovil, da je le škoda porabiti 32kb prostora, za nažiganje ledic, in hočem zamenjati ATmega328 za ATtiny26, ki ima tudi 2 PWM kanala.
Vendar ista koda javi napako pri prevajanju
Error : 12 Line : 4 Unknown CONFIG parameter [PWM], in file :....
Bascom koda:
Koda: |
$regfile = "attiny26.DAT"
$crystal = 1000000
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
Enable Timer1
Dim W As Word
Config Debounce = 20
Config Portb.6 = Input
Config Portb.1 = Output
Config Portb.3 = Output
Reset Portb.6
Ocr1a = 255
Ocr1a = 255
Zacetek:
Goto Naziga
Do
Debounce Pinb.6 , 1 , Naziga
Loop
Naziga:
W = 255
Do
Ocr1a = W
Ocr1a = W
W = W - 5
If W = 0 Then Goto Sveti
Waitms 30
Loop
Sveti:
Do
Ocr1a = 0
Ocr1a = 0
Waitms 15000
Goto Ugasa
Loop
Ugasa:
W = 0
Do
Ocr1a = W
Ocr1a = W
W = W + 1
If W = 256 Then Goto Zacetek
Waitms 30
Loop |
Zahvaljujem se vam za pomoč! _________________ Lp, Klemen
http://www.klemenbercko.net/ |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.23 Kraj: Ig
|
Objavljeno: Ned Jan 10, 2010 12:56 pm Naslov sporočila: |
|
|
Kolikor se jaz spomnim, ima Bascom en bug kar se tiče PWM in Tiny26. Rešitvi sta dve: Ročno nastavi registre za PWM (poglej datasheet) ali pa napravi SW PWM s pomočjo timerja. Nekoč, daleč nazaj sem tudi sam naredil nekaj podobnega. Sicer koda, ki je spodaj uporablja ADC, s katerim sem nastavljal število vrtljajev nekega motorja, ne spomnim se več, pol sem poskusil še z led...no vsekakor. Prednost SW PWM (sploh če Tinyja uporabljaš samo za led) je v tem, da lahko generiraš več kanalov. Sama teorija SW PWM je pa v tem. Vzameš timer, mu daš vrednost 100 (100%) in potem bereš vrednost in jo primerjaš s svojo nastavljeno. Dokler je vrednost timerja manjša od nastavljene je LED vklopljena, ko pa vrednost timerja preseže nastavljeno vrednost, jo izklopiš... 100 je fajn vrednst, ker lahko določaš PWM kar v %...
Še moja koda:
Koda: |
'------------------------------------------------------------
' ATTINY26 PWM LED dimmer
'------------------------------------------------------------
'$sim
$regfile = "at26def.dat"
$crystal = 8000000
Config Timer0 = Timer , Prescale = 64
Config Adc = Single , Prescaler = Auto
Enable Interrupts
Enable Timer0
Start Timer0
Config Pinb.3 = Output
Dim W As Integer , X As Integer
On Timer0 Timer0isr
Zacetek:
Do
If W > Timer0 Then
Portb.3 = 0
Else
Portb.3 = 1
End If
'If W = 0 Then
' Goto Konec
' End If
Loop
'Konec:
'Portb.3 = 1
'Goto Zacetek
Timer0isr:
Start Adc
X = Getadc(2)
W = X / 4
Stop Adc
Return
|
LP G _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Ned Jan 10, 2010 1:00 pm Naslov sporočila: |
|
|
Kot je povedal Gorazd, lahko ročno nastaviš registre.
En primer za to je:
Koda: |
1.
' Diese Anwendung steuert 2 LED am PB1 & PB3 am ATtiny26 heller und dunkler mit PWM
2.
'
3.
$regfile = "attiny26.dat" ' specify the used micro
4.
$crystal = 4000000
5.
Dim Pwmval As Byte ' Helligkeit dere LED
6.
Config Portb.1 = Output ' Augang OC1A (Timer/Counter1 PWM Output A,
7.
Config Portb.3 = Output ' OC1B (Timer/Counter1 PWM Output B
8.
Config Porta.0 = Input ' Schlater 1 Dunkler
9.
Config Porta.1 = Input ' Schlater 2 Heller
10.
Tccr1a = &B10100011 ' This sets the PWM1a and PWM1b to clear on match of Ocr1a and Ocr1b.
11.
Tccr1b = &B00000101
12.
'Tccr1b = &B00001001
13.
'This sets the TMR1 clock to be PCK/256, which at 8MHz = about 31KHz.
14.
'You'll want to set this to something you want, you can got all the way
15.
'to /16384 with &B00001111
16.
Ocr1c = 255
17.
'Regardless of what the data sheet says, if you don't set this register
18.
'to be 255, the PWM won't come on properly (which may be what is biting
19.
'you). This register sets the overall period of the PWM module, there
20.
'are bits turning a match on and off for this register, but no matter how
21.
'you set them, they turn it on (bug in the chip.)
22.
23.
Porta.0 = 1 : Porta.1 = 1
24.
Pwmval = 254 ' Helligkeit auf 1 setzen
25.
Ocr1a = Pwmval '' set the PWM duty cycle 128 for 50%
26.
Ocr1b = Pwmval '' set the PWM duty cycle 255 for 100%
27.
Do
28.
If Pina.0 = 0 Then ' Schalter Dunkler
29.
If Pwmval < 255 Then Incr Pwmval
30.
Waitms 5
31.
Ocr1a = Pwmval
32.
Ocr1b = Pwmval
33.
End If
34.
If Pina.1 = 0 Then ' Schalter Heller
35.
If Pwmval > 1 Then Decr Pwmval
36.
Waitms 5
37.
Ocr1a = Pwmval
38.
Ocr1b = Pwmval
39.
End If
40.
Loop |
Vlado |
|
Nazaj na vrh |
|
 |
xklemen Član


Pridružen-a: Ned 10 Jan 2010 10:55 Prispevkov: 35 Aktiv.: 0.19 Kraj: Novo mesto
|
Objavljeno: Ned Jan 10, 2010 2:14 pm Naslov sporočila: |
|
|
Zahvaljujem se vama za hiter odgovor, čeprav je nedelja
RGorazd je napisal/a: |
Koda: |
'------------------------------------------------------------
' ATTINY26 PWM LED dimmer
'------------------------------------------------------------
'$sim
$regfile = "at26def.dat"
$crystal = 8000000
Config Timer0 = Timer , Prescale = 64
Config Adc = Single , Prescaler = Auto
Enable Interrupts
Enable Timer0
Start Timer0
Config Pinb.3 = Output
Dim W As Integer , X As Integer
On Timer0 Timer0isr
Zacetek:
Do
If W > Timer0 Then
Portb.3 = 0
Else
Portb.3 = 1
End If
'If W = 0 Then
' Goto Konec
' End If
Loop
'Konec:
'Portb.3 = 1
'Goto Zacetek
Timer0isr:
Start Adc
X = Getadc(2)
W = X / 4
Stop Adc
Return
|
LP G |
Vaša koda deluje, vendar nemorem ledice ugasniti do konca, še vedno sveti na recimo 30% in žmiga (se opazi), ali je rešitev za to?
Pri kodi od vas Vlado pa napiše napako in sicer:
Koda: |
Error: 242 Line: 12 Source variable does not match the target variable [TCCR1A = &B10100011]
Error: 242 Line: 13 Source variable does not match the target variable [TCCR1B = &B00000101]
|
V bascumu sem bol začetnik, tako da..  _________________ Lp, Klemen
http://www.klemenbercko.net/ |
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Ned Jan 10, 2010 3:04 pm Naslov sporočila: |
|
|
Problem je v tem da Bascom pozna Timer1 kot 16 bitni, ATtiny26 ima dva 8 bitna Timer-ja.
V kodi ki sem jo poslal odstrani "AMP;" v vrsticah kjer prijavi napako in poskusi
znova.
Citiram: |
Tccr1a = &B10100011 |
Tccr1a=&B10100011
Vlado |
|
Nazaj na vrh |
|
 |
xklemen Član


Pridružen-a: Ned 10 Jan 2010 10:55 Prispevkov: 35 Aktiv.: 0.19 Kraj: Novo mesto
|
Objavljeno: Ned Jan 10, 2010 5:23 pm Naslov sporočila: |
|
|
Sedaj pa prevede, vendar ko določam "Ocr1a = x" in spreminjam x ledica le skos sveti
Koda: |
$regfile = "attiny26.dat"
$crystal = 4000000
Dim X As Byte
Config Portb.1 = Output
Config Portb.3 = Output
Tccr1a = &B10100011
Tccr1b = &B10100011
Do
For X = 0 To 255 Step 5
Ocr1a = X
Ocr1b = X
Waitms 30
Next X
For X = 255 To 0 Step 1
Ocr1a = X
Ocr1b = X
Waitms 30
Next X
Loop |
_________________ Lp, Klemen
http://www.klemenbercko.net/ |
|
Nazaj na vrh |
|
 |
xklemen Član


Pridružen-a: Ned 10 Jan 2010 10:55 Prispevkov: 35 Aktiv.: 0.19 Kraj: Novo mesto
|
Objavljeno: Tor Jan 12, 2010 7:57 pm Naslov sporočila: |
|
|
Očitno nebom dobil odgovora na moj problem  _________________ Lp, Klemen
http://www.klemenbercko.net/ |
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Tor Jan 12, 2010 9:45 pm Naslov sporočila: |
|
|
Klemen,
nimam ATT26 da bi preizkusil.
Še enkrat poglej primer ki sem ga poslal in najprej preizkusi njega brez popravkov, potem pa predeluj program naprej.
Koda: |
Tccr1a = &B10100011
Tccr1b = &B10100011 |
To ne bo dobro, vzemi datashet in poglej ali je to pravilno.
Vlado |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 494 dni
Powered by phpBB © 2001, 2005 phpBB Group
|