mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer und LCD vertragen sich nicht


Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hall,

ich habe zurzeit Probleme mit diesem Quelltext.
Der Int geht aber das lcd nicht, er geht einfach nicht in die LCDuhr() 
Fkt
wenn ich aber jetzt den Timer auskommentiere dann geht das lcd wie 
gewollt,
ich versehe das nicht. Das lcd ist an portb und der timer an portd



#define F_CPU 16000000L
 

#include <avr/io.h>
#include <util/delay.h>

#include <avr/interrupt.h>
#include "lcd-routines.h"
#include "lcd-routines.c.h"
#include <stdlib.h>


int sekunde,stunde,minute=0;

char Buffer[10];

int i=1;





int main(void){

DDRB=0xFF;
DDRA=0b11111000;

DDRC=0xFF;

DDRD=0xFF;




//Timer 0 8 bit
  TCCR0 = TCCR0 | ( 1 << CS00 ); // Teiler: 1024
  TIMSK = ( 1 << TOIE0 );         // Overflow Interrupt einschalten
//__________________________________________________________________________
sei();


for(;;){
LCDuhr();}
}

void LCDuhr(){
sekunde++;
 set_cursor(13,1);
itoa( sekunde, Buffer, 10 ); 
lcd_string( Buffer );
set_cursor(9,1);
itoa( minute, Buffer, 10 ); 
lcd_string( Buffer );
 set_cursor(7,1);
itoa( stunde, Buffer, 10 ); 
lcd_string( Buffer );
 
set_cursor(0,1);
lcd_string("Zeit:");
}



ISR(TIMER0_OVF_vect )
{ PORTD^=(1<<PD2);
_delay_ms(200);
}




Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch, der geht schon in die Funktion LCDuhr(), muss aber sofort darauf 
einen Interrupt bearbeiten, 200ms(!!!!) nix tun, dann einen 
Assembler-Befehl von LCDuhr() bearbeiten, dann wieder einen Interrupt, 
200ms warten, 1 Befehl von LCDuhr(), Interrupt....

D.h. der bearbeitet die Funktion LCDuhr() schon, nur eben unsagbar 
laaannngssaaamm, weil sofort wieder ein Interrupt kommt. Schon während 
des 200ms-Delay wird ein neuer Interrupt generiert. Sowas
>_delay_ms(200);
gehört nicht in eine Interrupt-Routine.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK danke also delay habe ich weggenommen, dabei entdeckt, das ich 
vergessen hatte das lcd zu initialisieren.

Nun geht das LCD aber in den Interrupt geht er nicht mehr rein. Hab das 
toggeln an einem oszi überprüft und es ist nicht mehr da.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hab das toggeln an einem oszi überprüft und es ist nicht mehr da.

Das verschwindet nicht wenn du das _delay_ms(200)
rausnimmst. Dreh mal an der Zeitbasis.

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger wrote:
>>Hab das toggeln an einem oszi überprüft und es ist nicht mehr da.
>
> Das verschwindet nicht wenn du das _delay_ms(200)
> rausnimmst. Dreh mal an der Zeitbasis.

Warum soll ich denn bei Low Signal die Zeitbasis ändern,aber hab ich 
gemacht 0 bleibt 0:-)


das der int verschwindet war ja mein eigentliches Problem hatte ein 
langes programm und habe das jetzt stück für stück abgespeckt, um die 
fehlerquelle zu finden und dabei ist jetzt dieses oben gepostete 
programm entstanden.


ich habe ja auch testweise mal eine endlosschleife in den interrupt 
gepackt,da der rechner nicht stehen bleibt , gehe ich davon aus, das er 
nicht in die routine geht.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
( 1 << CS00 ); // Teiler: 1024

ergibt als Takt aber clk/1

daraus folgt am PD2 eine Frequenz von 62,5kHz (falls der Quartz korrekt 
angewählt ist)

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich messe aber nicht glaube mir das doch bitte, ich verstehe es ja 
auch nicht und deshalb habe ich hier nach hilfe gesucht

Autor: Marco M. (marco1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Topic closed

____________________________________________________________________

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.