Timer und LCD vertragen sich nicht

OP #970328
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

1
#define F_CPU 16000000L
2
 
3

4
#include <avr/io.h>
5
#include <util/delay.h>
6

7
#include <avr/interrupt.h>
8
#include "lcd-routines.h"
9
#include "lcd-routines.c.h"
10
#include <stdlib.h>
11

12

13
int sekunde,stunde,minute=0;
14

15
char Buffer[10];
16

17
int i=1;
18

19

20

21

22

23
int main(void){
24

25
DDRB=0xFF;
26
DDRA=0b11111000;
27

28
DDRC=0xFF;
29

30
DDRD=0xFF;
31

32

33

34

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

41

42
for(;;){
43
LCDuhr();}
44
}
45

46
void LCDuhr(){
47
sekunde++;
48
 set_cursor(13,1);
49
itoa( sekunde, Buffer, 10 ); 
50
lcd_string( Buffer );
51
set_cursor(9,1);
52
itoa( minute, Buffer, 10 ); 
53
lcd_string( Buffer );
54
 set_cursor(7,1);
55
itoa( stunde, Buffer, 10 ); 
56
lcd_string( Buffer );
57
 
58
set_cursor(0,1);
59
lcd_string("Zeit:");
60
}
61

62

63

64
ISR(TIMER0_OVF_vect )
65
{ PORTD^=(1<<PD2);
66
_delay_ms(200);
67
}
Moderator (Firma: Titel) Persönliche Seite
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.
OP
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.
Gast
>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.
OP
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.
Gast
1
( 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)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.