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


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Ned Okt 31, 2010 3:38 pm Naslov sporočila: AtMega88 in timer interrupti |
|
|
No, po dveh dnevih matranja brez uspeha sem so odločil, da vas vprašam, kaj bi lahko bilo narobe s to kodo...
Koda: |
#include <avr/io.h> // header file
#include <avr/delay.h>
#include <avr/interrupt.h>
int counter=0;
int x[4][4]; //format: 4 x R G B UV
ISR(TIMER1_COMPB_vect)
{
counter++;
if(counter>=4)
{
counter=0;
}
switch(counter)
{
case 0:PORTC=0b00000100;break;
case 1:PORTC=0b00001000;break;
case 2:PORTC=0b00010000;break;
case 3:PORTC=0b00100000;break;
}
OCR0A=x[counter][0]; //red
OCR0B=x[counter][1]; //green
OCR2A=x[counter][2]; //blue
OCR2B=x[counter][3]; //uv
}
int i=0,j=0;
int main()
{
DDRD=0b01101000;
DDRB=0b00001000;
DDRC=0b00111100; //tranzistor za preklaplanje segmentov
TCCR1B |= (1 << WGM12); // CTC mode
TIMSK1 |= (1 << OCIE1A);
OCR1B = 10; // Nastima kdaj se timer resetera in poklice interrupt
TCCR1B |= (1 << CS10) | (1 << CS11); // prescaler 64x
TCCR0A |=(1 << COM0A1) | (1 << COM0B1) | (1 << WGM00) | (1 << WGM01);
TCCR0B |=(1 << WGM02) | (1 << CS00);
TCCR2A |=(1 << COM2A1) | (1 << COM2B1) | (1 << WGM20) | (1 << WGM21);
TCCR2B |=(1 << WGM22) | (1 << CS20);
PORTC=0b00000100;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{ x[i][j]=255; }
sei();
while(1)
{
}
return 0;
}
|
No, da malo obrazložim kaj naj bi ta koda delala.
Imam 4x RGB LED in 4x UV LED. In to je multiplexirano tako 4-kratno, tako da naenkrat sveti samo 1 RGB LED in UV LED, vse 4 so povezane na PWM porte.
Interrupt pa prižiga in ugaša tranzistorje po vrstnem redu in poda nove vrednosti za PWM porte (OCRnx) iz tabele x[4][4]. Naj omenim, da ima mikrokontroler povezan kristal 10Mhz, in vključene vse potrebne fuse bite, tako da to vem da ni problem. Timer 1 B je odgovoren za interrupte, timer 0 in timer 2 pa za generiranje pwm signala.
Pa da še povem, kaj koda trenutno dela:
Nič, samo ena RGB in UV LEDica svetita. To je pa tudi vse. PWM mi tudi ne deluje, ker ko zapolnem tabelo x[4][4] naprimer z vrednostjo 150, LEDici isto svetita kot pri 255.
Se komu kaj sanja zakaj mi to počne? |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Ned Okt 31, 2010 11:12 pm Naslov sporočila: |
|
|
Sem preveril z osciloskopom kristal, sploh ni nobenega signala
Kako je to možno? Fuse biti so sprogramirani, kristal pa ima še 2 22pf kondenzatorja, ki sta tudi priključena v zemljo...
kaj bi lahko še bilo narobe? |
|
Nazaj na vrh |
|
 |
Domenius Član



Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.01 Kraj: Medvode
|
Objavljeno: Ned Okt 31, 2010 11:58 pm Naslov sporočila: |
|
|
Reset imaš vredu? _________________ It's electric! |
|
Nazaj na vrh |
|
 |
RGorazd Član


Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1714 Aktiv.: 7.23 Kraj: Ig
|
Objavljeno: Pon Nov 01, 2010 12:01 pm Naslov sporočila: |
|
|
Hmmm, a pa si siguren, da so fuse biti pravilno konfigurirani? S čim programiraš? Dude, Ponny, ali kaj tretjega?
Tukaj je link do fuse kalkulatorja:
http://www.engbedded.com/fusecalc/
Jaz bi najprej to preveril, če fuse biti štimajo, bi zamenjal kristal, nazadnje pa mikrokontroler. Sicer pa: A mikrokontroler lahko ponovno reprogramiraš? Ti pusti? Če je tako, potem uC dobiva nek clock od nekje, kar nakazuje na napačno konfiguracijo fuse-bitov.
Še to. Naloži program, ki ti bo samo blinkal eno od ledic (naprimer na 1s) tako boš tudi videl, s kakim taktom ti vse skupaj dela.
LP G _________________ .
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._| |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Pon Nov 01, 2010 2:37 pm Naslov sporočila: |
|
|
No stvar je sledeča, reset je vredu, samo pri programatorju sem skuril reset tako da moram držati reset tipko pri mikrokontrolerju, in stvar dela (preiskušeno na veliko kontrolerjih). Tako da programator dela vredu.
Programator mikrokontroler zazna, in lahko tudi programiram na njega. Zdele sem prebral fuse bite, in so bili isti, kot na temu spletnem kalkulatorju.
No ja, zdaj sem podal preprost program na mikrokontroler in program ne dela oziroma dela vsakič drugače - po svoje. Program pa naj bi samo prižigal in ugašal LEDico... ampak v tem primeru skos sveti ali pa je skos ugasnjena.
Torej se po pojem ura zaustavi naključno.
Bom zamenjal kristale in še kondenzatorje.
Se mi splača tudi dati pull-up / pull-down upore zaradi kakih možnih motenj? |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Tor Nov 02, 2010 9:31 pm Naslov sporočila: |
|
|
No ja ugotovil sem eno stvar, mikrokontroler začne delati naročeno, ampak zelo pozno... 5-10 minut, ne vem tocno ker ko resetiram se nič ne premakne, potem pa ko pridem nazaj (pustim prižgano nekaj časa) pa LEDica utripa, ko pa reseteram, pa spet nič od nič.
na žalost sem nekaj z osciloskopom šaril po vezju zraven kristala in nekaj skuril ali nekaj podobnega, sumim na kratek stik, ker je vezje narejeno na še preluknjani PCB plošči. |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.02 Kraj: Črnuče
|
Objavljeno: Tor Nov 02, 2010 10:42 pm Naslov sporočila: |
|
|
Takole preko palca bi moral pogledati kaj je z kristalom. Če je dober, kondenzatorji okoli kristala niso ustrezni. Ker kot kaže kristal od začetka ni deloval potem pa je... _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Sre Nov 03, 2010 1:02 am Naslov sporočila: |
|
|
No, ugotovil sem, da če disablam fuse bit "divide clock by 8 internally" programi začnejo delovati šlampasto in nastane kar nekaj in nato se program ustavi...
če je fuse bit "divide clock by 8 internally" vključen, deluje brezhibno... ampak kje je potem cilj kristala?
Aja za informacijo, zamenjal sem tudi kondenzatorja in kristal (zdaj je 16Mhz), še preden sem ugotovil za ta fuse bit problem.
no ja, grem jaz sprobat zdaj originalni program...
UPDATE: program dela! (vsaj glede multiplexiranja), zdaj pa še PWM zrihtat. |
|
Nazaj na vrh |
|
 |
micabauc Član


Pridružen-a: Tor 03 Jun 2003 7:12 Prispevkov: 177 Aktiv.: 0.75 Kraj: Celje
|
Objavljeno: Sre Nov 03, 2010 5:42 pm Naslov sporočila: |
|
|
Hja program ni vredu. Prvi interupt se zgodi kdaj? Po mojem, ko števec preleti čez cel svoj obseg. To pa traja. Drugač pa: v interupt rutini delat čimmanj, pa nastavitev števca naredit pred prvim štartom, pa bo OK. |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Sre Nov 03, 2010 11:09 pm Naslov sporočila: |
|
|
micabauc, zdaj sem uredil interrupte in PWMje, tako da uspešno fade in/outam vse LEDice hkrati.
Koda: |
#include <avr/io.h> // header file
#include <avr/delay.h>
#include <avr/interrupt.h>
int counter=0;
int x[4][4]; //format: 4 x R G B UV
ISR(TIMER1_COMPA_vect)
{
counter++;
if(counter>=4)
{
counter=0;
}
switch(counter)
{
case 0:PORTC=0b00000100;break;
case 1:PORTC=0b00001000;break;
case 2:PORTC=0b00010000;break;
case 3:PORTC=0b00100000;break;
}
OCR0A=x[counter][0]; //red
OCR0B=x[counter][1]; //green
OCR2A=x[counter][2]; //blue
OCR2B=x[counter][3]; //uv
}
int i=0,j=0;
int main()
{
DDRD=0b01101000;
DDRB=0b00001000;
DDRC=0b00111100; //tranzistor za preklaplanje segmentov
PORTD=0b01101000;
PORTB=0b00001000;
TIMSK1 |= (1 << OCIE1A);
OCR1A = 50; // Nastima kdaj se timer resetera in poklice interrupt
TCCR1B |= (1 << CS10) | (1 << CS11) | (1 << WGM12); // prescaler 64x
TCCR0A |=(1 << WGM00) | (1 << WGM01) | (1<<COM0A1) | (1<<COM0B1);
TCCR0B |=(1 << CS00);
TCCR2A |=(1 << WGM20) | (1 << WGM21) | (1<<COM2A1) | (1<<COM2B1);
TCCR2B |=(1 << CS20);
PORTC=0b00000100;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{ x[i][j]=255; }
sei();
while(1)
{
while(!(x[3][3]==0))
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
x[i][j]--;
}
_delay_ms(10);
}
while(!(x[3][3]==255))
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
x[i][j]++;
}
_delay_ms(10);
}
}
return 0;
}
|
Sedaj imam pa še vedno sledeči problem, in to je nestabilna ura oziroma nestabilen cel kontroler..., program se po parih nepričakovanih utripov LEDic zažene in deluje tako kot mora ali pa še naprej utripa LEDice (v programu tega sploh ni napisano) in kar naenkrat se zaustavi nekje...
Mogoče mi kontroler ne dela brez sprogramiranega "divide clock by 8" zato, ker ga prehitra nestabilna ura(16Mhz) enostavno po domače povedano z*ebe, medtem ko 2Mhz(16Mhz/8) uro še nekako preživi.
No, od nekdaj mi je znano, da imam v moji sobi "ground loop" problem, recimo ko prižgem spajkalnik se zasliši pok na domačem kinu, in tako dalje...bi lahko to prispevalo problemu kljub temu da vezje napajam z laboratorijskega napajalnika?
Pa če kaj pomaga, program na mikrokontrolerju se uspešno zažene v večjih primerih če je priklopljen na programator, sumim zato ker ima programator bolj stabilni GND, vsaj je od račulniškega USBja. |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Sre Nov 03, 2010 11:50 pm Naslov sporočila: |
|
|
Odlično, po skoraj 100% uspehu sem ponesreči sprogramiral fuse bite za interni 128kHz oscilator, torej se je ta AtMega88 pridružil mrtvemu AtMega32
bom jutri naročil nove pa je  |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Pet Nov 12, 2010 4:47 pm Naslov sporočila: |
|
|
eto, da povem. Problem s kristalom sem zrihtal, in zdaj dela normalno na polnih 16Mhz. Kaj sem naredil? Pred volt. regulatorjem sem vmes dodal 1nF kondenzator, po volt.regulatorju sem pa dal 10nF kondenzator.
Tako da opozorilo, stabiliziran laboratorijski usmernik ni vedno stabiliziran  |
|
Nazaj na vrh |
|
 |
MadMax Član


Pridružen-a: Pet 09 Sep 2005 22:16 Prispevkov: 4743 Aktiv.: 20.02
|
Objavljeno: Pet Nov 12, 2010 8:59 pm Naslov sporočila: |
|
|
PC_Master je napisal/a: |
eto, da povem. Problem s kristalom sem zrihtal, in zdaj dela normalno na polnih 16Mhz. Kaj sem naredil? Pred volt. regulatorjem sem vmes dodal 1nF kondenzator, po volt.regulatorju sem pa dal 10nF kondenzator.
Tako da opozorilo, stabiliziran laboratorijski usmernik ni vedno stabiliziran  |
Po tem sklepam, da imaš "stabiliziran laboratorijski" napajalnik nastavljen na ene 12V, na vezju kjer je procesorček pa imaš za slednjega še kak 7805, ko pišeš o volt. regulatorju, kateremu si prilepil "dodatno opremo" v obliki kondenzatorjev?
Če je tako, potem ga serješ ti, ne pa stabiliziran laboratorijski napajalnik. |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.52 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Sob Nov 13, 2010 6:28 pm Naslov sporočila: |
|
|
zakaj jaz? |
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5530 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Sob Nov 13, 2010 7:06 pm Naslov sporočila: |
|
|
Verjetno zato, ker 7805 po datasheetu ZAHTEVA te kondenzatorje in brez njih ne deluje stabilno.
LP,g _________________ ...lahko pa se tudi motim ... |
|
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
|