Klocka på en HD44870 kompatibel LCD frågor

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Är det möjligt att varierande inspänning påverkar tiden?

Ja, *om* det får kristallen/oscillatorn att ändra frekvens.
Om det är så är lite svårt att säga eftersom vi inte vet mer
om din koppling...
davegbg
Inlägg: 26
Blev medlem: 13 maj 2008, 00:14:41
Ort: Gbg

Inlägg av davegbg »

Jag har köpt en 32.768 kHz klockkristall från elfa (74-530-04) och keramiska 22 pF-kondensatorer.
Med dessa, en PIC18F4550 och Timer1-registret tänkte jag implementera en RTC i min krets.
Jag har läst manualen sidan 131 till processorn för att löda dit kristallen och kondensatorerna rätt men jag får inte klockan att fungera. Om detta beror på min kod eller "kopplingen" vet jag inte men C1 och C2 står i manualen att det ska vara 27pF, jag har 22pF. Kan det vara ett problem att de har för lågt värde i min koppling?
Dessutom undrar jag om det spelar någon roll vilket håll man vänder kristallen åt, alltså vilken pinne man löder dit på OSCI och OSCO eller om man kan vända det hur man vill. Och även kondensatorer spelar väl ingen roll vilket håll man vänder dom åt?

Här är koden om ngn orkar kolla och ev. hittar något fel där men som sagt jag är altlså mest orolig för att jag lött dit komponenterna fel / använt för "små" kondensatorer.

Kod: Markera allt

#define set(reg , bit) reg |= (1 << (bit));
#define clear(reg , bit) reg &= (0xFF - (1 << (bit)));

int main(void);
void blink_led(void);
void delay(unsigned int ms);

unsigned int hours, msecs;
char mins, secs;



void delay(unsigned int ms) {
  unsigned int stop = mins*60*1000 +
                      secs*1000 +
                      msecs +
                      ms;
                      
  while(stop - (mins*60*1000 + secs*1000 + msecs) > 0)
    ;
}

void blink_led(void) {
  PORTB = 1;
  delay(200);
  PORTB = 0;
}

int main(void) {
  char last_secs = 0;

  T1CON = 0x0F;            /* External clock, Asynchronous operation, Ext osc */
  set(PIE1 , TMR1IE);      /* Timer1 Interrupt enabled                        */
  clear(PIR1 , TMR1IF);    /* Clear Timer1 interrupt flag                     */

  TMR1H = 0xB8;            /* Preload for 10ms overflow                       */
  TMR1L = 0;
  
  hours=mins=secs=msecs = 0;
  PORTB = 0;

  do {
    if(secs != last_secs)
      blink_led();
  }
  while(1);
  
  return 0;
}

void interrupt(void) {
  msecs += 10;
  if(msecs == 1000) {
    msecs = 0;
    secs++;
    if(secs == 60) {
      secs = 0;
      mins++;
    }
      if(mins == 60) {
        mins = 0;
        hours++;
      }
  }
  
  TMR1H = 0xB8;            // Preload for 10ms overflow
}
[/url]
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> för att löda dit kristallen och kondensatorerna rätt

Så här i början kanske man inte ska löda alls.

> Dessutom undrar jag om det spelar någon roll vilket håll man vänder kristallen åt,

Nej.

> Och även kondensatorer spelar väl ingen roll vilket håll man vänder dom åt?

Rätt.
Användarvisningsbild
Patrick
Inlägg: 376
Blev medlem: 9 december 2007, 19:13:01
Ort: Uppsala
Kontakt:

Inlägg av Patrick »

Beror ju helt på vad för kondensatorer du pratar om :)
Sätter du en elektrolyt felvänt kan det bli en liten puff till mer rejäla skador :shock:
davegbg
Inlägg: 26
Blev medlem: 13 maj 2008, 00:14:41
Ort: Gbg

Inlägg av davegbg »

Det är keramiska kondensatorer.

Jag gjorde ett nytt program för testning. Enklare än det ovan;

Kod: Markera allt

int main(void) {
  TRISB = 0;
  PORTB = 0;
  
  T1CON = 0x0F;           /* External clock, Asynchronous operation, Ext osc */
  PIE1 |= 1;              /* Timer1 Interrupt enabled                        */
  PIR1 &= 0xFE;           /* Clear Timer1 interrupt flag                     */
  TMR1H = 0;
  TMR1L = 0;
  
  while(1)
    ;
  
  return 0;
}

void interrupt(void) {
  PORTB = 1;
}
Vid en interrupt skall LEDen på port B, bit 0, tändas. Ingenting händer vid uppstart, LEDen förblir släckt.

sodjan jag har lött allting hittils men jag har hört talas om labbplattor, är det smidigare och var kan jag få tag på sån, kanske lite tillbehör också som sladdar och grejer eller vad man nu använder.
Användarvisningsbild
slatte
Inlägg: 420
Blev medlem: 1 april 2008, 16:05:17
Ort: Jönköping

Inlägg av slatte »

Du har glömt att aktivera Global Interrupt enable GIE = 1; det är vad jag ser när jag klollar snabbt på det ialf :-) vad är det för kompilator du kör med ?
Senast redigerad av slatte 6 juli 2008, 23:20:50, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Du har glömt att aktivera Global Interrupt enable GIE...

Och PEIE.
Se schemat "INTERRUPT LOGIC" i databladet.

> Beror ju helt på vad för kondensatorer du pratar om

Eftersom det är lastkondensatorer till en kristall, så är
det väl ganska uppenbart.

> Jag gjorde ett nytt program för testning. Enklare än det ovan;

Helt rätt !
Fortsätt med det tills det fungerar. Förenkla, förenkla...
davegbg
Inlägg: 26
Blev medlem: 13 maj 2008, 00:14:41
Ort: Gbg

Inlägg av davegbg »

Yeeeees!!
Funkar nu med PEIE och GIE. "Interrupt logic" - schemat var riktigt användbart också, tack för det.

Det är ett konstigt problem dock..

I min interrupt-rutin i mikroC fungerar det inte att tilldela PORTB en variabel, konstanttilldelning funkar dock galant. Någon som har någon aning om varför? Var duktigt irriterande innan jag kom på vad som krånglade.

Nedan först en fungerande interrupt-rutin, därefter en icke-fungerande;

Kod: Markera allt

//Fungerar
void interrupt(void) {
  if(aap)
    PORTB = 1;
  else
    PORTB = 0;
  aap = !aap;
  TMR1H = 0x80;
  PIR1 &= 0xFE;
}

//Fungerar ej
void interrupt(void) {
  PORTB = aap;
  aap = !aap;
  TMR1H = 0x80;
  PIR1 &= 0xFE;
}
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> "Interrupt logic" - schemat var riktigt användbart också, tack för det.

Förvånad ? Det finns där av en anledning... :-)

Hur är aap definierad ?
davegbg
Inlägg: 26
Blev medlem: 13 maj 2008, 00:14:41
Ort: Gbg

Inlägg av davegbg »

Hur är aap definierad ?
Har inte tillgång till koden nu men det var nog unsigned long.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Finns det någon som helst anledning att ha den större en en 8 bit byte/char ?
davegbg
Inlägg: 26
Blev medlem: 13 maj 2008, 00:14:41
Ort: Gbg

Inlägg av davegbg »

Inte i koden ovan, men även om jag kunde haft en char så SKA ju även längre heltalstyper fungera, eller hur?
Och koden ovan hör till min felsökningskod där jag testar om det är tilldelning av variabelnamn till portar som inte fungerar, vilket verkar vara fallet.
Ska testa med unsigned char när jag har möjlighet, återkommer..
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Inlägg av jesse »

!aap blir antagligen -1 (dvs 0xFFFFFFFF) , inte 1.

vad händer om du skriver

PORTB = aap && 1 ; // && = bitvis AND
davegbg
Inlägg: 26
Blev medlem: 13 maj 2008, 00:14:41
Ort: Gbg

Inlägg av davegbg »

>>sodjan Att definiera aap som unsigned char gör ingen skillnad

>>jesse ! är logisk negation. Enligt mikroC-manualen blir !0x1234 = 0.
!0 bör således bli 1, eller hur?

&& är logisk AND och & är bitvis AND. Jag testade det du skrev iaf och det fungerade inte.


Här kommer en testkod som inte gör något vettigt, det är ju som sagt en testkod :) .
I kort sätts aap till 1, sedan körs en loop i evighet i väntan på interrupt. I interrupten skall PORTB sättas till aap, alltså 1, men det fungerar inte.

Kod: Markera allt

int main(void);
void interrupt(void);

unsigned long int ticker;
unsigned char aap;

int main(void) {
  ticker = 0;

  TRISB = 0;
  PORTB = 0;
  aap = 1;

  TMR0H = 0;              /* Clear Timer0 register                      */
  TMR0L = 0;
  T0CON   = 0x88;         /* Internal clock, no prescaler, 8MHz, 18-bit */
  INTCON &= 0xFB;         /* Clear T0IF                                 */
  INTCON |= 0xA0;         /* Set T0IE and GIE                           */

  while(1) {
    ;
  }

  return 0;
}

void interrupt(void) {
  ticker++;
  if(ticker % 5 == 0) {
    PORTB = aap;
  }

  INTCON &= 0xFB;         /* Clear T0IF                                 */
}
Kanske jag inte nämnt med en diods anod är kopplad till PORTB : 0 och katoden till VSS (ground).
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Du har stängt av alla analoga funktioner (om några) ?

> en diods anod är kopplad till PORTB : 0 och katoden till VSS (ground).

Motstånd ??
Skriv svar