Forum: Mikrocontroller und Digitale Elektronik Ratlosigkeit bei LCD


von Sebastian G. (Firma: HTL-Braunau) (sebo_htl)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin gerade dabei eine Stoppuhr mittels µC mit LCD zu realisieren. 
Soweit keine Probleme nur sobald ich die Timerkonfiguration usw. 
schreibe funktioniert das LCD nicht mehr. Hier die main Funkion. Wenn 
ich alles von TCCR0 bis OCR0 ausklammere läuft das Display. Im Anhang 
meine LCD Routinen. (Display an PORTA, ATmega16)

int main(void)
{
  TCCR0|=(1<<WGM01)|(1<<CS01);
  TIMSK|=(1<<OCIE0);
  MCUCR|=(1<<ISC10)|(1<<ISC11)|(1<<ISC00)|(1<<ISC01);
  GICR|=(1<<INT0)|(1<<INT1);
  OCR0=125;
  sei();
  char buffer[20];
  uint8_t i=0;

  lcd_init();

  lcd_set_position(1,0);
  lcd_puts(" FF Ma.Schmolln");
  while(1);
}

von HaraldDräger (Gast)


Lesenswert?

Sebastian Gerner schrieb:
> TCCR0|=(1<<WGM01)|(1<<CS01);
>   TIMSK|=(1<<OCIE0);
>   MCUCR|=(1<<ISC10)|(1<<ISC11)|(1<<ISC00)|(1<<ISC01);
>   GICR|=(1<<INT0)|(1<<INT1);
>   OCR0=125;

Kannst du jeweils kurz dazuschreiben, was die einzelnen Register bzw. 
Bits bedeuten, die du setzt?!

von spess53 (Gast)


Lesenswert?

Hi

>  TIMSK|=(1<<OCIE0);

Gibt es auch eine zugehörige Interruptroutine?

MfG spess

von Sebastian G. (htl_sebo)


Lesenswert?

Kann ich ;)

int main(void)
{
  TCCR0|=(1<<WGM01)|(1<<CS01);   //CTC Mode; Prescaler 8
  TIMSK|=(1<<OCIE0);            // Compare Match Interrupt enable
  MCUCR|=(1<<ISC10)|(1<<ISC11)|(1<<ISC00)|(1<<ISC01); //INT0 u. INT1 
sensing auf steigende Flanke
  GICR|=(1<<INT0)|(1<<INT1); enable INT0 und INT1
  OCR0=125;                  Compare Match bei 125
  sei();
  char buffer[20];
  uint8_t i=0;

  lcd_init();

  lcd_set_position(1,0);
  lcd_puts(" FF Ma.Schmolln");
  while(1);
}

von Sebastian G. (htl_sebo)


Lesenswert?

Ja die Routine gibt es: ISR(TIMER0_COMP_vect)

Mfg

von holger (Gast)


Lesenswert?

>Ja die Routine gibt es: ISR(TIMER0_COMP_vect)

Und was steht da drin?

Gibt es auch eine für INT0 und INT1?

Meine nächste Frage wirst du sicher raten können;)

von Sebastian G. (Firma: HTL-Braunau) (sebo_htl)


Lesenswert?

Gut dann gleich der Rest des Programmes (noch nicht fertig):

ISR(TIMER0_COMP_vect)
{
  ms++;

  if(ms==1000)
  {
    sek++;
    ms=0;
  }
}

ISR(INT0_vect)
{
  ms=0;
  sek=0;
  TCNT0=0;
  uhr_on=1;
}

ISR(INT1_vect)
{
  uhr_on=0;
}

von BattMan (Gast)


Lesenswert?

Sebastian Gerner schrieb:
> ISR(INT1_vect)
> {
>   uhr_on=0;
> }

Das wird Dir das Display vermutlich ausschalten....

von holger (Gast)


Lesenswert?

Sicher das das Programm für einen ATMEGA16 compiliert wurde?

von Sebastian G. (Firma: HTL-Braunau) (sebo_htl)


Lesenswert?

@BattMan

warum sollte das das LCD abschalten.

@holger

ja bin ich mir ;)

von BattMan (Gast)


Lesenswert?

Sebastian Gerner schrieb:
> warum sollte das das LCD abschalten.


Ich weiss ja nicht was uhr_on bewirken soll bzw. wo diese Variable
verwendet wird.

War nur eine Vermutung. Aus meiner Sicht ist der Code den Du gepostet 
hast
nicht vollständig(?).

von Sebastian G. (Firma: HTL-Braunau) (sebo_htl)


Lesenswert?

Wie oben erwähnt ist der Code noch nicht fertig

Sebastian Gerner schrieb:
> Gut dann gleich der Rest des Programmes (noch nicht fertig):

uhr_on wenn uhr_on auf Null geht wird abgestoppt. Variablenname ist 
eventuell etwas unglücklich gewählt.

Lg

von holger (Gast)


Lesenswert?

Ich sehe in deinem Code kein Problem.

Zwei Möglichkeiten weshalb das nicht funktioniert:

Es wird nicht der richtige Interruptvektor angesprungen,
falscher Controller eingestellt.

Eine Interruptroutine fummelt an PORTA rum.

von Sebastian G. (htl_sebo)


Lesenswert?

Habe jetz von PORTA auf PORTB gewechselt umd jetzt geht es....
Naja. Wird wohl ein interrupt am PORTA gefummelt haben.

von holger (Gast)


Lesenswert?

>Wird wohl ein interrupt am PORTA gefummelt haben.

Nicht in deinem Code. Ist AVCC angeschlossen?

von Georg G. (df2au)


Lesenswert?

Sebastian Gerner schrieb:
> Wird wohl ein interrupt am PORTA gefummelt haben.

Und die Moral von der Geschichte: Wenn du schnell Hilfe möchtest, poste 
das gesamte Projekt und keine Schnipsel.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.