Timer und LCD vertragen sich nicht

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

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 #970333
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.
OP #970358
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren