Darki89
30.04.2009, 15:53
Hi, ich hab ein komisches Problem: Wenn timer1 überläuft, sollen auf meinen 7 Segment Anzeigen nur 0en angezeigt werden. Das klappt auch. Nur das geniale ist jetzt, lösche ich die Einstellungen für timer2 (!) wird garnix angezeigt. Lösch ich die Einstellung timer1, hat das nur positives: Die Anzeige blinkt nichtmehr (was sie vorher tut im ca 1,5sec takt). Aber warum?
edit: So, ich hab mittlerweile neue Erkenntnisse: Wenn ich Die Einstellung für den Prescaler von Timer1 rausnehme, blinkt die Anzeige nichtmehr. Nehm ich allerdings die Einstellung für den Prescaler von Timer2 raus und lass die von Timer1 drin, dann wird garnichts angezeigt. Der Timer2 scheint auch kein Interrupt auszulösen, ich hab den Code ein wenig geändert und wollte nur eine 1 und eine 2 anzeigen lassen, für die Timer halt, aber es wurde immernur die 1 angezeigt.
In der I/O View von AVRStudio sind alle Prescaler richtig, die häcken sind auch an den richtigen stellen (Overflow Intterupt Enable etc) aber trotzdem klappt es nicht :/ ich werd noch wahnsinnig!
Aus Platzgründen hab ich unwichtiges weggekürzt
#define F_CPU 4000000
[Zuweisung von Ports zu den Segmenten]
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
[haufenweise Zuweisungen mit int, volatile, etc]
int main(void)
{
sei();
GIMSK |= (1<<INT1); // Externer Interrupt an Pin INT1 Aktivieren
MCUCR |= (1<<ISC11)|(1<<ISC10); // Externer Interrupt auf Steigender Flanke
TIMSK |= (1<<TOIE1); // Interrupt aktivieren für Overflow, Timer1 (16bit)
TCCR1B |= (1<<CS11)|(1<<CS10); // 64 Prescaler
TIMSK |= (1<<TOIE2); // Interrupt aktivieren für Overflow, Timer2 (8Bit)
TCCR2 |= (1<<CS22)|(1<<CS21)|(1<<CS20); // 1024 Prescaler
DDRB = 0b11111111;
DDRC = 0b11111111;
DDRD = 0b11110111; // Der 4 Letzte ist INT1, Externer Interrupt
PORTB = 0b00000000;
PORTC = 0b00000000;
if (init == 0) {
ziffer[0]= (1<<PB1);
ziffer[1]= (1<<PB2);
ziffer[2]= (1<<PB3);
ziffer[3]= (1<<PB4);
init = 1;
}
while(1) {
n++;
if (n >=4) {
n = 0;
}
if (error == 1) {
output[0] = 0b00111111;
output[1] = 0b00111111;
output[2] = 0b00111111;
output[3] = 0b00111111;
output[4] = 0b00111111;
}
PORTB = ziffer[n];
PORTC = output[n];
_delay_us(100);
PORTB = 0b00000000;
PORTC = 0b00000000;
}
}
ISR (INT1_vect) { //Externer Interrupt
error = 0;
PORTB = 0b00000000;
PORTC = 0b00000000;
timer = TCNT1;
TCNT1 = 0;
[Berechnungen, rausgekürzt]
}
ISR(TIMER1_OVF_vect) {
error = 1;
}
Mein Zweites Problem sind die FuseBits. Forensuche hab ich genutzt, aber irgendwie nichts passendes gefunden.
ich wollte einen externen 16Mhz Quarz am Mega16 mit 2mal 22pF Kondensatoren ans laufen bringen. Leider aber stellte er sich dann tot -.-
Im AVR Studio habe ich eingestellt "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 64 ms" Ist doch wohl der richtige? CKOPT war dabei mal auf 0 und mal auf 1.
was ist denn jetzt richtig? Ich will den nicht nochmal wiederbeleben müssen ;)
edit: So, ich hab mittlerweile neue Erkenntnisse: Wenn ich Die Einstellung für den Prescaler von Timer1 rausnehme, blinkt die Anzeige nichtmehr. Nehm ich allerdings die Einstellung für den Prescaler von Timer2 raus und lass die von Timer1 drin, dann wird garnichts angezeigt. Der Timer2 scheint auch kein Interrupt auszulösen, ich hab den Code ein wenig geändert und wollte nur eine 1 und eine 2 anzeigen lassen, für die Timer halt, aber es wurde immernur die 1 angezeigt.
In der I/O View von AVRStudio sind alle Prescaler richtig, die häcken sind auch an den richtigen stellen (Overflow Intterupt Enable etc) aber trotzdem klappt es nicht :/ ich werd noch wahnsinnig!
Aus Platzgründen hab ich unwichtiges weggekürzt
#define F_CPU 4000000
[Zuweisung von Ports zu den Segmenten]
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
[haufenweise Zuweisungen mit int, volatile, etc]
int main(void)
{
sei();
GIMSK |= (1<<INT1); // Externer Interrupt an Pin INT1 Aktivieren
MCUCR |= (1<<ISC11)|(1<<ISC10); // Externer Interrupt auf Steigender Flanke
TIMSK |= (1<<TOIE1); // Interrupt aktivieren für Overflow, Timer1 (16bit)
TCCR1B |= (1<<CS11)|(1<<CS10); // 64 Prescaler
TIMSK |= (1<<TOIE2); // Interrupt aktivieren für Overflow, Timer2 (8Bit)
TCCR2 |= (1<<CS22)|(1<<CS21)|(1<<CS20); // 1024 Prescaler
DDRB = 0b11111111;
DDRC = 0b11111111;
DDRD = 0b11110111; // Der 4 Letzte ist INT1, Externer Interrupt
PORTB = 0b00000000;
PORTC = 0b00000000;
if (init == 0) {
ziffer[0]= (1<<PB1);
ziffer[1]= (1<<PB2);
ziffer[2]= (1<<PB3);
ziffer[3]= (1<<PB4);
init = 1;
}
while(1) {
n++;
if (n >=4) {
n = 0;
}
if (error == 1) {
output[0] = 0b00111111;
output[1] = 0b00111111;
output[2] = 0b00111111;
output[3] = 0b00111111;
output[4] = 0b00111111;
}
PORTB = ziffer[n];
PORTC = output[n];
_delay_us(100);
PORTB = 0b00000000;
PORTC = 0b00000000;
}
}
ISR (INT1_vect) { //Externer Interrupt
error = 0;
PORTB = 0b00000000;
PORTC = 0b00000000;
timer = TCNT1;
TCNT1 = 0;
[Berechnungen, rausgekürzt]
}
ISR(TIMER1_OVF_vect) {
error = 1;
}
Mein Zweites Problem sind die FuseBits. Forensuche hab ich genutzt, aber irgendwie nichts passendes gefunden.
ich wollte einen externen 16Mhz Quarz am Mega16 mit 2mal 22pF Kondensatoren ans laufen bringen. Leider aber stellte er sich dann tot -.-
Im AVR Studio habe ich eingestellt "Ext. Crystal/Resonator High Freq.; Start-up time: 258 CK + 64 ms" Ist doch wohl der richtige? CKOPT war dabei mal auf 0 und mal auf 1.
was ist denn jetzt richtig? Ich will den nicht nochmal wiederbeleben müssen ;)