 |
Elektroniikkafoorumi Keskustelufoorumi elektroniikkaharrastajille
|
| Näytä edellinen aihe :: Näytä seuraava aihe |
| Kirjoittaja |
Viesti |
StiNgeR Vanhempi jäsen

Liittynyt: 29 Tam 2007 Viestejä: 332 Paikkakunta: Tuusula
|
Lähetetty: Ma Maa 01, 2010 14:25 Viestin aihe: |
|
|
Noiden fusejen määrittely riippuu siitä millä ohjelmoi ohjelman kontrolleriin. Itse teen koodin ja käännän avrstudiolla mutta itse heksafileen paistan piirille ponyprogilla, jossa siis erikseen määritellään nuo fuse-bitit.
En ole ikinä mistään avrstudion asetuksista fuseja asetellut koska omalle ohjelmointikaapelille ei ole tukea avrstudiossa. Jos oma ohjelmointilaitteesi toimii suoraan avrstudion kautta, ne fuse-bititkin ilmeisesti asetellaan sieltä.
Erittäin yleinen ongelma on ollut juurikin kellofuset, useimmat luulevat että esimerkiksi koodissa oleva F_OSC=4000000UL -rivi riittää asettamaan kellotaajuuden 4MHz ja sitten ihmetellään kun ajastukset eivät toimi. |
|
| Takaisin alkuun |
|
 |
Lassivv Kokelas

Liittynyt: 27 Hel 2010 Viestejä: 8
|
Lähetetty: Ma Maa 01, 2010 14:39 Viestin aihe: |
|
|
Juuh niin muistelinkin hämärästi, että tuosta ohjelmasta millä ohjelma siirretään avr:lle asetellaan myös fuset. Tuollaista välilehteä on tullu ite räpellettyä pelkästään kyllä tuon frecuencyn puitteissa, muitten oon antanu olla noin kun ovat. Johon siis kirjoitettu 16000000hz
Jaahas väärällä sivulla olin fusejen perässä Noh fuses välilehti löyty nyt ainakin.
---------------------------------------------------------
Itse itselleni vastaten, näyttää tuolta AVR programming alta löytyvän nuo. Ei oo tässä töissä tota ohjelmaa, eikä oikein tauon puitteissa kerkee alkaa asentelemaankaan, niin täytyy noihin vanhoihin screenshotteihin turvautuu mitä sattuu tääl oleen
http://i5.aijaa.com/b/00718/5829760.png
Tuolla ylärivillä näyttäs olevan välisivu "fuses" sieltä varmaankin saa vaihdeltua kaiken tarpeellisen Onkohan siellä jotain arvoja mitkä kannattaa heti tarkistaa, mitkä vois aiheuttaa tuota sekoilua ton näytön toimimattomuudessa? Ilmeisesti ainakin tuo prosessorin omaan kiteen 16mhz valinta. Onko vielä jotain muita tärkeitä? |
|
| Takaisin alkuun |
|
 |
L18 Jäsen

Liittynyt: 06 Maa 2009 Viestejä: 85
|
Lähetetty: Ma Maa 01, 2010 15:46 Viestin aihe: |
|
|
| Yks juttu tossa ohjelmassa muuten ihmetytti, saattaa olla ihan normaaliakin, kun en AVR:n sielunelämään kovin paljon ole kyllä perehtynyt. Eli main -funktiossa ei ole kuin kutsu tuohon ioinit -funktioon, mutta sen jälkeen tulee heti return 0? Mitäs AVR tekee tuossa tapauksessa? |
|
| Takaisin alkuun |
|
 |
JKN Vanhempi jäsen

Liittynyt: 14 Tam 2007 Viestejä: 377 Paikkakunta: Helsinki
|
Lähetetty: Ma Maa 01, 2010 23:13 Viestin aihe: |
|
|
| L18 kirjoitti: | | Eli main -funktiossa ei ole kuin kutsu tuohon ioinit -funktioon, mutta sen jälkeen tulee heti return 0? Mitäs AVR tekee tuossa tapauksessa? |
Tämä ei ole kontrollerin vaan kääntäjän ominaisuus. En tunne AVR:n kääntäjää tarkemmin, mutta ainakin SDCC tuottaa main-funktiossa olevasta return-lauseesta ikuisen loopin, siis jotain:
loop1: JMP loop1
Oletan, että AVR:n kääntäjä toimii samoin. Tämän voi tarkistaa ottamalla kääntäjän tuottaman assemblylistauksen ulos. Tässä tapauksessa tuo on ihan ok ratkaisu, kun kaikki tekeminen on keskeytyspalveluissa.
| Lainaus: | | Mahtaisko kellään olla intoa suunnitella/tehdä joku luuranko systeemi missä mittaus ja tarkkuus oltas saatu mahdollisimman hyvää balanssiin näillä osilla |
Tuo rakenne olisi aika helppo korjata: kaikki mittauksia ja tulostuksia suorittava koodi pois keskeytyspalvelusta ja omaksi funktiokseen. Keskeytyspalveluun vain ajan laskenta ja flagi, jonka palvelu asettaa sekunnin välein. Pääohjelmaan ikuinen looppi, joka odottaa flagin asettumista ja kutsuu em. funktiota, jossa tehdään mittaukset ja tulostukset. Näin toiminnallisuus pysyy samana, mutta keskeytyksiä ei hukata, jolloin mittaukset ja tulostukset suoritetaan tarkasti sekunnin välein. Eikä koodi ole enää kriittinen sille, kestääkö mittausten ja tulostusten suorittaminen kauemman kuin keskeytysväli. |
|
| Takaisin alkuun |
|
 |
Lassivv Kokelas

Liittynyt: 27 Hel 2010 Viestejä: 8
|
Lähetetty: Su Maa 07, 2010 15:01 Viestin aihe: |
|
|
| JKN kirjoitti: |
Ohjelman toiminta näkyy pyörivän täysin sen varassa, että INT0-keskeytyspalvelussa käydään riittävän tiheän tahtiin (32768 kertaa sekunnissa). DS1307:n hommana on generoida tätä taajuutta INT0:aan. Jos on oskilloskooppi käytettävissä, kannattaa varmistaa, että kontrollerin nastassa 16 näkyy 32.768 kHz kanttiaalto. Jos ei ole, niin debuggerilla voisi varmistaa, että keskeytyspalvelussa yleensäkin käydään.
Nuo viiveiden omituisuudet saattavat johtua vain siitä, että ms-viiveellä ei pysty tekemään noin pitkiä viiveitä (20 s), joku laskuri vuotaa yli ja lyhentää viiivettä tavoitellusta. Riippuu viivekirjaston sisäisestä toteutuksesta, en tunne sitä tarkemmin.
Yleensä tuollaista, että kaikki asiat tehdään keskeytyspalvelussa, pidetään huonona ohjelmointityylinä. Tuon toimivuus epäilyttää, koska palvelussa suoritetaan useita printf-lauseita ja kuitenkaan keskeytyspalvelu ei saisi kestää yli 300 us, muuten hukataan keskeytyksiä. Tuo ei voi toimia oikein. Mutta tuo hölmöily ei kylläkään aiheuta noita havaitsemiasi ongelmia, se tuottaa ainoastaan virheellisiä tuloksia. |
Noniin nyt saatu vihdoin testailtua noita, oskilloskoopin mukaan int0 nastaan tulee oikeaa kanttiaaltoa.
Viiveitä koitin muuttaa, muutin kaikki delayt tuplasti pitemmäksi lcd:hen liittyen, mutta silti ei näyttö alkanu pelaan. Näytölle saatu muutaman kerran tekstit näkyviin, mutta sekään ei onnistu kun vanhalla resetin rämppäyksellä ja kellotaajuudeksi pitää olla säädetty 4mhz (16mhz kide).
Pitääköhän jotain fuseja tms. muuttaa kun on vaihdettu ennen 4mhz kiteellä olevalle mega32:lle --> 16mhz kide. Makefile välilehteen toki vaihdettu 16000000hz vanhan 4:n tilalle?
------------------------------------------------------------------------
Tälläinen pätkä tuolta hd44780.c iski silmään:
| Koodi: | /*
* Guarantee at least 500 ns of pulse width. For high CPU
* frequencies, a delay loop is used. For lower frequencies, NOPs
* are used, and at or below 1 MHz, the native pulse width will
* already be 1 us or more so no additional delays are needed.
*/
#if F_CPU > 4000000UL
_delay_us(0.5);
#else
/*
* When reading back, we need one additional NOP, as the value read
* back from the input pin is sampled close to the beginning of a
* CPU clock cycle, while the previous edge on the output pin is
* generated towards the end of a CPU clock cycle.
*/
if (readback)
__asm__ volatile("nop");
# if F_CPU > 1000000UL
__asm__ volatile("nop");
# if F_CPU > 2000000UL
__asm__ volatile("nop");
__asm__ volatile("nop");
# endif /* F_CPU > 2000000UL */
# endif /* F_CPU > 1000000UL */
#endif |
Mahtaako tuolla olla mitään merkitystä koodin toiminnan kannalta, ainakin jos makefileen määrittää 4mhz niin näyttöön saa tietyllä resetin naksuttelulla oikean "käyttöliittymän", mutta sekään ei pikasella testillä reagoinu esim. nopeus signaalin nastan +5v pulsseihin.
Fuse välilehdellä ei tuntunu olevan mitään kellotaajuuteen viittavaa: http://img532.imageshack.us/img532/3253/fusesg.png
Melkosen erikoiselta alkaa jo vaikuttamaan, kun millään saa edes näytön tekstejä näkymään, vaikka ne kuitenkin resetillä kikkaillen saa näkyviin  |
|
| Takaisin alkuun |
|
 |
StiNgeR Vanhempi jäsen

Liittynyt: 29 Tam 2007 Viestejä: 332 Paikkakunta: Tuusula
|
Lähetetty: Su Maa 07, 2010 15:34 Viestin aihe: |
|
|
SUT_CKSEL vaikuttaa ainakin kelloihin. Siitähän ilmeisesti voi dropdown-valikosta valita sille eri arvoja.
Jotenkin vähän sekavalta mun silmään näyttää tuo fuses-välilehti, itse olen oppinut PonyProgin fuse-dialogin. Jotkut taas sanovat PonyProgin fuse-valintoja hankalaksi. |
|
| Takaisin alkuun |
|
 |
L18 Jäsen

Liittynyt: 06 Maa 2009 Viestejä: 85
|
Lähetetty: Ti Maa 09, 2010 22:32 Viestin aihe: |
|
|
| Koodi: | hd44780_init(void)
{
HD44780_DDR = _BV(HD44780_RS) | _BV(HD44780_RW) | _BV(HD44780_E)
| HD44780_DATABITS;
_delay_ms(15); /* 40 ms needed for Vcc = 2.7 V */
hd44780_outnibble(HD44780_FNSET(1, 0, 0) >> 4, 0);
_delay_ms(4.1);
hd44780_outnibble(HD44780_FNSET(1, 0, 0) >> 4, 0);
_delay_ms(0.1);
hd44780_outnibble(HD44780_FNSET(1, 0, 0) >> 4, 0);
hd44780_wait_ready();
|
Tossa LCD initissä on muuten noi viiveet just sen minimin mikä HD44780 datasheetissä mainitaan, että ehkä kannattaa muuttaa nuo varmuuden vuoksi esim.
| Koodi: |
hd44780_init(void)
{
HD44780_DDR = _BV(HD44780_RS) | _BV(HD44780_RW) | _BV(HD44780_E)
| HD44780_DATABITS;
_delay_ms(20); /* 40 ms needed for Vcc = 2.7 V */
hd44780_outnibble(HD44780_FNSET(1, 0, 0) >> 4, 0);
_delay_ms(5);
hd44780_outnibble(HD44780_FNSET(1, 0, 0) >> 4, 0);
_delay_ms(0.2);
hd44780_outnibble(HD44780_FNSET(1, 0, 0) >> 4, 0);
hd44780_wait_ready();
|
|
|
| Takaisin alkuun |
|
 |
|
|
Et voi kirjoittaa uusia viestejä tässä foorumissa Et voi vastata viesteihin tässä foorumissa Et voi muokata viestejäsi tässä foorumissa Et voi poistaa viestejäsi tässä foorumissa Et voi äänestää tässä foorumissa
|
|