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


von Marco M. (marco1987)


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
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Marco M. (marco1987)


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.

von holger (Gast)


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.

von Marco M. (marco1987)


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.

von Matthias L. (Gast)


Lesenswert?

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)

von Marco M. (marco1987)


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

von Marco M. (marco1987)


Lesenswert?

Topic closed

____________________________________________________________________

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.