www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

AtMega88 in timer interrupti
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.52
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Ned Okt 31, 2010 3:38 pm    Naslov sporočila:  AtMega88 in timer interrupti Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.52
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Ned Okt 31, 2010 11:12 pm    Naslov sporočila:   Odgovori s citatom

Sem preveril z osciloskopom kristal, sploh ni nobenega signala Rolling Eyes

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.01
Kraj: Medvode

PrispevekObjavljeno: Ned Okt 31, 2010 11:58 pm    Naslov sporočila:   Odgovori s citatom

Reset imaš vredu?
_________________
It's electric!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1714
Aktiv.: 7.23
Kraj: Ig

PrispevekObjavljeno: Pon Nov 01, 2010 12:01 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.52
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Pon Nov 01, 2010 2:37 pm    Naslov sporočila:   Odgovori s citatom

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 mi 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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.52
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Tor Nov 02, 2010 9:31 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 17.03
Kraj: Črnuče

PrispevekObjavljeno: Tor Nov 02, 2010 10:42 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.52
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Sre Nov 03, 2010 1:02 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
micabauc
Član
Član



Pridružen-a: Tor 03 Jun 2003 7:12
Prispevkov: 177
Aktiv.: 0.75
Kraj: Celje

PrispevekObjavljeno: Sre Nov 03, 2010 5:42 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.52
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Sre Nov 03, 2010 11:09 pm    Naslov sporočila:   Odgovori s citatom

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 mi 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 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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.52
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Sre Nov 03, 2010 11:50 pm    Naslov sporočila:   Odgovori s citatom

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 Twisted Evil

bom jutri naročil nove pa je Laughing
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.52
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Pet Nov 12, 2010 4:47 pm    Naslov sporočila:   Odgovori s citatom

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 Twisted Evil
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
MadMax
Član
Član



Pridružen-a: Pet 09 Sep 2005 22:16
Prispevkov: 4743
Aktiv.: 20.02

PrispevekObjavljeno: Pet Nov 12, 2010 8:59 pm    Naslov sporočila:   Odgovori s citatom

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 Twisted Evil


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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.52
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Sob Nov 13, 2010 6:28 pm    Naslov sporočila:   Odgovori s citatom

zakaj jaz?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
mucek
Član
Član



Pridružen-a: Tor 01 Avg 2006 10:47
Prispevkov: 5530
Aktiv.: 24.06
Kraj: Domzale

PrispevekObjavljeno: Sob Nov 13, 2010 7:06 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
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